1 package org.sapia.regis.remote; 2 3 import java.io.IOException ; 4 import java.util.Collections ; 5 import java.util.HashMap ; 6 import java.util.Map ; 7 import java.util.Properties ; 8 9 import javax.naming.InitialContext ; 10 11 import org.sapia.regis.Registry; 12 import org.sapia.ubik.mcast.AsyncEventListener; 13 import org.sapia.ubik.mcast.EventChannel; 14 import org.sapia.ubik.mcast.RemoteEvent; 15 import org.sapia.ubik.rmi.Consts; 16 import org.sapia.ubik.rmi.naming.remote.RemoteInitialContextFactory; 17 import org.sapia.ubik.rmi.server.Hub; 18 import org.sapia.ubik.rmi.server.invocation.ServerPostInvokeEvent; 19 import org.sapia.ubik.rmi.server.invocation.ServerPreInvokeEvent; 20 21 38 public class RegistryExporter implements RemoteConsts, AsyncEventListener{ 39 40 public static final String PUBLISH = "org.sapia.regis.remote.pub"; 41 public static final String DISCO = "org.sapia.regis.remote.disco"; 42 43 private RemoteRegistry _reg; 44 private boolean _peerToPeer = false; 45 private EventChannel _channel; 46 private Object _stub; 47 private Map _peers = Collections.synchronizedMap(new HashMap ()); 48 private String _domain = Consts.DEFAULT_DOMAIN; 49 50 public RegistryExporter(Registry reg, Properties bootstrapProps){ 51 _reg = new RemoteRegistry(new Authenticator(USERNAME, PASSWORD), reg, bootstrapProps); 52 } 53 54 public RegistryExporter(String username, String password, Registry reg, Properties bootstrapProps){ 55 _reg = new RemoteRegistry(new Authenticator(username, password), reg, bootstrapProps); 56 } 57 58 62 public void setPeerToPeer(boolean peerToPeer){ 63 _peerToPeer = peerToPeer; 64 } 65 66 69 public void setDomain(String domain){ 70 _domain = domain; 71 } 72 73 76 public void close(){ 77 if(_channel != null){ 78 _channel.close(); 79 } 80 _reg.close(); 81 } 82 83 107 public void bind(int port) throws Exception { 108 SessionInterceptor interceptor = new SessionInterceptor(_reg); 109 System.out.println("Binding server to port: " + port); 110 Hub.serverRuntime.addInterceptor(ServerPreInvokeEvent.class, interceptor); 111 Hub.serverRuntime.addInterceptor(ServerPostInvokeEvent.class, interceptor); 112 _stub = Hub.exportObject(_reg, port); 113 publish(System.getProperties()); 114 } 115 116 151 public void bind(String jndiName, Properties props) throws Exception { 152 SessionInterceptor interceptor = new SessionInterceptor(_reg); 153 Hub.serverRuntime.addInterceptor(ServerPreInvokeEvent.class, interceptor); 154 Hub.serverRuntime.addInterceptor(ServerPostInvokeEvent.class, interceptor); 155 props.setProperty(InitialContext.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); 156 InitialContext ctx = new InitialContext (props); 157 _stub = Hub.exportObject(_reg); 158 ctx.bind(jndiName, _reg); 159 ctx.close(); 160 publish(props); 161 } 162 163 private void publish(Properties props) throws IOException { 164 if(_peerToPeer){ 165 String mcastHost = props.getProperty(Consts.MCAST_ADDR_KEY, Consts.DEFAULT_MCAST_ADDR); 166 int mcastPort = Integer.parseInt(props.getProperty(Consts.MCAST_PORT_KEY, ""+Consts.DEFAULT_MCAST_PORT)); 167 _channel = new EventChannel(_domain, mcastHost, mcastPort); 168 _channel.registerAsyncListener(PUBLISH, this); 169 _channel.registerAsyncListener(DISCO, this); 170 _channel.start(); 171 _channel.dispatch(PUBLISH, _stub); 172 _reg.setPeers(_peers); 173 } 174 } 175 176 public void onAsyncEvent(RemoteEvent evt) { 177 if(evt.getType().equals(PUBLISH)){ 178 try{ 179 ServerDebug.debug(this, "New peer was published"); 180 synchronized(_peers){ 181 if(!_peers.containsKey(evt.getNode())){ 182 _peers.put(evt.getNode(), evt.getData()); 183 } 184 _channel.dispatch(DISCO, _stub); 185 } 186 }catch(IOException e){ 187 e.printStackTrace(); 188 } 189 } 190 else if(evt.getType().equals(DISCO)){ 191 try{ 192 ServerDebug.debug(this, "Discovered peer"); 193 synchronized(_peers){ 194 if(!_peers.containsKey(evt.getNode())){ 195 _peers.put(evt.getNode(), evt.getData()); 196 } 197 } 198 }catch(IOException e){ 199 e.printStackTrace(); 200 } 201 } 202 } 203 } 204 | Popular Tags |