1 package org.sapia.ubik.rmi.naming.remote.discovery; 2 3 import java.io.IOException ; 4 import java.rmi.RemoteException ; 5 import java.util.ArrayList ; 6 import java.util.Collections ; 7 import java.util.List ; 8 import java.util.Properties ; 9 10 import javax.naming.Context ; 11 import javax.naming.NamingException ; 12 13 import org.sapia.archie.Name; 14 import org.sapia.archie.impl.AttributeNameParser; 15 import org.sapia.archie.impl.AttributeNamePart; 16 import org.sapia.archie.impl.DefaultNameParser; 17 import org.sapia.ubik.mcast.AsyncEventListener; 18 import org.sapia.ubik.mcast.EventChannel; 19 import org.sapia.ubik.mcast.RemoteEvent; 20 import org.sapia.ubik.net.TCPAddress; 21 import org.sapia.ubik.rmi.naming.ServiceLocator; 22 import org.sapia.ubik.rmi.naming.remote.Consts; 23 import org.sapia.ubik.rmi.naming.remote.RemoteContext; 24 import org.sapia.ubik.rmi.naming.remote.archie.SyncPutEvent; 25 import org.sapia.ubik.rmi.naming.remote.proxy.ContextResolver; 26 import org.sapia.ubik.rmi.naming.remote.proxy.DefaultContextResolver; 27 import org.sapia.ubik.rmi.naming.remote.proxy.LocalContext; 28 29 40 public class DiscoveryHelper implements AsyncEventListener { 41 protected EventChannel _channel; 42 private List _svclisteners = Collections.synchronizedList(new ArrayList ()); 43 private List _jndiListeners = Collections.synchronizedList(new ArrayList ()); 44 private ContextResolver _resolver = new DefaultContextResolver(); 45 46 49 public DiscoveryHelper(EventChannel ec) { 50 _channel = ec; 51 initChannel(); 52 } 53 54 60 public DiscoveryHelper(String domain) throws IOException { 61 _channel = new EventChannel(domain, 62 org.sapia.ubik.rmi.Consts.DEFAULT_MCAST_ADDR, 63 org.sapia.ubik.rmi.Consts.DEFAULT_MCAST_PORT); 64 _channel.start(); 65 initChannel(); 66 } 67 68 76 public DiscoveryHelper(String domain, String mcastAddr, int mcastPort) 77 throws IOException { 78 _channel = new EventChannel(domain, 79 mcastAddr, mcastPort); 80 _channel.start(); 81 initChannel(); 82 } 83 84 88 public void setContextResolver(ContextResolver res){ 89 _resolver = res; 90 } 91 92 97 public synchronized void addServiceDiscoListener(ServiceDiscoListener listener) { 98 if(!_svclisteners.contains(listener)){ 99 _svclisteners.add(listener); 100 } 101 } 102 103 108 public synchronized void removeServiceDiscoListener(ServiceDiscoListener listener) { 109 List listeners = new ArrayList (_svclisteners); 110 listeners.remove(listener); 111 _svclisteners = listeners; 112 } 113 114 119 public synchronized void addJndiDiscoListener(JndiDiscoListener listener) { 120 if(!_jndiListeners.contains(listener)){ 121 _jndiListeners.add(listener); 122 try{ 123 _channel.dispatch(Consts.JNDI_CLIENT_PUBLISH, ""); 124 }catch(IOException e){} 125 } 126 } 127 128 133 public synchronized void removeJndiDiscoListener(JndiDiscoListener listener) { 134 List listeners = new ArrayList (_jndiListeners); 135 listeners.remove(listener); 136 _jndiListeners = listeners; 137 } 138 139 142 public void onAsyncEvent(RemoteEvent evt) { 143 TCPAddress tcp; 144 145 try { 146 if (evt.getType().equals(Consts.JNDI_SERVER_PUBLISH) 147 || evt.getType().equals(Consts.JNDI_SERVER_DISCO)) { 148 tcp = (TCPAddress) evt.getData(); 149 150 Context remoteCtx = (Context ) _resolver.resolve(tcp); 151 152 List listeners = new ArrayList (_jndiListeners); 153 154 158 if(remoteCtx instanceof RemoteContext){ 159 try{ 160 remoteCtx = new LocalContext(getJndiURI(tcp), (RemoteContext)remoteCtx); 161 }catch(NamingException e){ 162 e.printStackTrace(); 163 return; 164 } 165 } 166 for (int i = 0; i < listeners.size(); i++) { 167 ((JndiDiscoListener) listeners.get(i)).onJndiDiscovered(remoteCtx); 168 } 169 } else if (evt.getType().equals(SyncPutEvent.class.getName())) { 170 SyncPutEvent bevt = (SyncPutEvent) evt.getData(); 171 Object obj; 172 173 try { 174 ServiceDiscoListener listener; 175 Properties props; 176 String name; 177 Name nameObj = bevt.getNodePath().add(bevt.getName()); 178 179 if (bevt.getName() instanceof AttributeNamePart) { 180 props = ((AttributeNamePart) bevt.getName()).getAttributes(); 181 name = new AttributeNameParser().asString(nameObj); 182 } else { 183 props = new Properties (); 184 name = new DefaultNameParser().asString(nameObj); 185 } 186 187 ServiceDiscoveryEvent sevt = new ServiceDiscoveryEvent(props, name, 188 bevt.getValue()); 189 190 List listeners = new ArrayList (_svclisteners); 191 for (int i = 0; i < listeners.size(); i++) { 192 listener = (ServiceDiscoListener) listeners.get(i); 193 listener.onServiceDiscovered(sevt); 194 } 195 } catch (IOException e) { 196 e.printStackTrace(); 197 } catch (ClassNotFoundException e) { 198 e.printStackTrace(); 199 } 200 } 201 } catch (RemoteException e) { 202 e.printStackTrace(); 203 } catch (IOException e) { 204 e.printStackTrace(); 205 } 206 } 207 208 211 public synchronized void close() { 212 _channel.close(); 213 } 214 215 218 public synchronized EventChannel getChannel() { 219 return _channel; 220 } 221 222 void initChannel() { 223 _channel.registerAsyncListener(Consts.JNDI_SERVER_PUBLISH, this); 224 _channel.registerAsyncListener(Consts.JNDI_SERVER_DISCO, this); 225 _channel.registerAsyncListener(SyncPutEvent.class.getName(), this); 226 } 227 228 229 protected String getJndiURI(TCPAddress addr){ 230 return new StringBuffer (ServiceLocator.UBIK_SCHEME) 231 .append("://") 232 .append(addr.getHost()) 233 .append(":") 234 .append(addr.getPort()).toString(); 235 } 236 } 237 | Popular Tags |