import java.rmi.RMISecurityManager; import com.sun.jini.start.NonActivatableServiceDescriptor; import com.sun.jini.start.ServiceDescriptor; import net.jini.config.Configuration; import net.jini.config.ConfigurationException; import net.jini.config.ConfigurationProvider; import net.jini.core.entry.Entry; import net.jini.discovery.DiscoveryEvent; import net.jini.discovery.DiscoveryListener; import net.jini.discovery.LookupDiscovery; import net.jini.lease.LeaseRenewalManager; import net.jini.lookup.JoinManager; import net.jini.lookup.entry.Name; import net.jini.lookup.entry.ServiceInfo; public class ServerLookup implements DiscoveryListener { // C'est une méthode de l'interface DiscoveryListner invoque une // fois qu'un ou plusieurs Lookupservice on été découverts. public void discovered(DiscoveryEvent de) { try { System.out.println("Lookup Service Found"); // Instanciation de l'objet Bonjour HelloWordImpl hello = new HelloWordImpl("Salut!"); // Initialisation des attibues du service. Name nameEntry = new Name("Bonjour"); ServiceInfo serviceInfo = new ServiceInfo("Nom du service", "Fabricant du service", "Fournisseur du service", "Version du service", "Model du service", "Numero du serie"); Entry aeAttributes[] = new Entry[] { nameEntry, serviceInfo }; // Instanciation d'un objet LookupDiscovery pour effectuer la // découverte en multicast LookupDiscovery ld = new LookupDiscovery(LookupDiscovery.ALL_GROUPS); // Enregistrement du service new JoinManager(hello, aeAttributes,hello, ld, new LeaseRenewalManager()); } catch (Exception e) { System.out.println(e.getMessage()); } } // C'est une méthode de l'interface DiscoveryListner qui est invoque une // fois qu'un ou plusieurs Lookupservice on été détruis. public void discarded(DiscoveryEvent de) { } public static void main(String[] argv) { ServerLookup myServer = new ServerLookup(); try { // Security Manager pour que le classe loader puisse charger des // classes System.setSecurityManager(new RMISecurityManager()); // Instanciation d'un objet LookupLocator pour effectuer la // découverte en multicast et l'ajout d'un « Listener » qui permet // de récupèrer les événements de DiscoveryEvent. LookupDiscovery ld = new LookupDiscovery(LookupDiscovery.ALL_GROUPS); ld.addDiscoveryListener(myServer); // Instanciationdu thraed LookupServiceThread qui va creer un // lookupservice LookupServiceThread ls1 = new LookupServiceThread(argv); ls1.start(); } catch (Exception e) { System.out.println(e.getMessage()); } } } class LookupServiceThread extends Thread { //represente la configuration du lookup service String[] configfile; public LookupServiceThread(String[] configfile) { this.configfile = configfile; } public void run() { try { LookupServiceCreator lsp = new LookupServiceCreator(configfile); } catch (Exception e) { System.out.println(e.getMessage()); } } } class LookupServiceCreator implements ServiceDescriptor { private Object service; private Configuration config; public LookupServiceCreator(String[] args) throws Exception { config = ConfigurationProvider.getInstance(args); service = create(config); } // Methode create qui retourn un Loockupservice pour une // configuration données public Object create(Configuration config) throws Exception{ Object c = new Object(); String codebase = null; String policy = null; String classpath = null; String[] serverConfigArgs = null; ServiceDescriptor desc = null; try { codebase = (String) config.getEntry("ServiceDescription", "codebase", String.class); policy = (String) config.getEntry("ServiceDescription", "policy", String.class); classpath = (String) config.getEntry("ServiceDescription", "classpath", String.class); serverConfigArgs = (String[]) config.getEntry("ServiceDescription", "serverConfigArgs", String[].class); desc = (ServiceDescriptor) new NonActivatableServiceDescriptor( codebase, policy, classpath, "com.sun.jini.reggie.TransientRegistrarImpl", serverConfigArgs); c = desc.create(config); } catch (Exception e) { System.out.println(e.getMessage()); } return c; } }