package org.qi4j.entitystore.rmi; import org.qi4j.api.common.AppliesTo; import org.qi4j.api.configuration.Configuration; import org.qi4j.api.injection.scope.This; import org.qi4j.api.service.Activatable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; /** * Create and delegate to a RMI registry. */ @AppliesTo( { Registry.class, Activatable.class } ) public class RegistryMixin implements InvocationHandler, Activatable { Registry registry; @This Configuration<RegistryConfiguration> config; public void activate() throws Exception { try { Integer port = config.configuration().port().get(); registry = LocateRegistry.createRegistry( port ); } catch( RemoteException e ) { registry = LocateRegistry.getRegistry(); } } public void passivate() throws Exception { for( String boundService : registry.list() ) { registry.unbind( boundService ); } UnicastRemoteObject.unexportObject( registry, true ); } public Object invoke( Object o, Method method, Object[] objects ) throws Throwable { return method.invoke( registry, objects ); } }