package platform.servicesregister;
/**
* Register services accessible by the platform.
* A service is registered under a symbolic name and associated to an object
* from which methods can be called.<br>
* The class ServicesRegisterManager is static and can't be instantiated,
* it offers methods for:<br>
* <ul>
* <li> Register a service by a name associated to the object which provides the service.
* If the service is allready registered a ServiceInUseException is raised.
* <li> Unregistrer a service indicated by its name.
* If the service is not registered a ServiceClosedException is raised.
* <li> Look for a service indicated by its name;
* return the object which provides this service.
* If the service is not registered a ServiceClosedException is raised.
* <li> Wait for a service indicated by its name to be available;
* returns the object which provides this service.
* If the service is not yet registered requester is suspended on a semaphore
* until the service becomes available.
*
* @author Dalmau
*/
// Permet d'enregistrer un objet sous un nom pour le retrouver
// Remplace le mecanisme d'enregistreur dee services (InterIsolateServer) de squawk
public class ServicesRegisterManager extends ServicesRegister {
// Methode d'enregistrement d'un service
/**
* Register a service
*
* @param name name of the service
* @param service Object which provides this service
* @throws ServiceInUseException Exception raised if the service is already registered
*/
static public void registerService(String name, Object service) throws ServiceInUseException {
synchronized(ServicesRegisterManager.class) { // semaphore sur lequel se bloquent ceux qui attendent un service
try {
lookForService(name); // verifier que ce service n'existe pas deje
throw new ServiceInUseException("Service "+name+" deja inscrit");
}
catch (ServiceClosedException sce) { // le service n'existait pas deje
enregistrement.put(name, service); // l'enregistrer
//System.out.println("enregistrement du service : "+name+" assure par : "+service.getClass().getName());
}
ServicesRegisterManager.class.notifyAll(); // debloquer ceux qui attendent un service
}
}
// Methode de desenregistrement d'un service
/**
* Remove a service
*
* @param name name of the service to remove
* @throws ServiceClosedException Exception if the service is not registered
*/
static public synchronized void removeService(String name) throws ServiceClosedException {
if (enregistrement.containsKey(name)) enregistrement.remove(name); // s'il existe l'enlever
else throw new ServiceClosedException(); // sinon c'est une erreur
}
// Methodes qui attendent qu'un service soit enregistre
/**
* This method is used by the PF for accessing internal services
* Wait for a service. The requester is suspended on a semaphore
* until the service exists.
*
* @param name Name of the service to wait for
* @return The object providing this service
*/
static public Object platformWaitForService(String name) {
try { return waitForService(name); }
catch (InterruptedException ie) { return null; }
}
}