KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > rmi > server > RemoteRefReliable


1 package org.sapia.ubik.rmi.server;
2
3 import java.io.IOException JavaDoc;
4 import java.io.ObjectInput JavaDoc;
5 import java.io.ObjectOutput JavaDoc;
6 import java.lang.reflect.Method JavaDoc;
7 import java.lang.reflect.Proxy JavaDoc;
8
9 import javax.naming.NamingException JavaDoc;
10
11 import org.sapia.ubik.net.ServerAddress;
12 import org.sapia.ubik.rmi.naming.ServiceLocator;
13
14
15 /**
16  * A stub handler that manages reconnecting to another server instance
17  * provided a method call fails.
18  *
19  * <dl>
20  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
21  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
22  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
23  * </dl>
24  */

25 public class RemoteRefReliable extends RemoteRefEx implements HealthCheck {
26   static final long serialVersionUID = 1L;
27   protected String JavaDoc _url;
28
29   /**
30    * Constructor for StubHandlerReliable.
31    */

32   public RemoteRefReliable() {
33     super();
34   }
35
36   /**
37    * Creates an instance of this class, with the given object and host
38    * identifiers.
39    *
40    * @param oid an <code>OID</code>
41    * @param serverAddress a <code>ServerAddress</code>
42    *
43    */

44   public RemoteRefReliable(OID oid, ServerAddress serverAddress) {
45     super(oid, serverAddress);
46   }
47
48   /**
49    * Sets this handler's server URL.
50    *
51    * @param url a URL string.
52    */

53   public void setUp(String JavaDoc url) {
54     _url = url;
55   }
56
57   /**
58    * @see java.lang.reflect.InvocationHandler#invoke(Object, Method, Object[])
59    */

60   public Object JavaDoc invoke(Object JavaDoc obj, Method JavaDoc toCall, Object JavaDoc[] params)
61     throws Throwable JavaDoc {
62     try {
63       return super.invoke(obj, toCall, params);
64     } catch (java.rmi.RemoteException JavaDoc e) {
65       if (_url != null) {
66         return doFailOver(obj, toCall, params, e);
67       } else {
68         throw e;
69       }
70     }
71   }
72
73   /**
74    * @see java.io.Externalizable#readExternal(ObjectInput)
75    */

76   public void readExternal(ObjectInput JavaDoc in)
77     throws IOException JavaDoc, ClassNotFoundException JavaDoc {
78     super.readExternal(in);
79     _url = (String JavaDoc) in.readObject();
80   }
81
82   /**
83    * @see java.io.Externalizable#writeExternal(ObjectOutput)
84    */

85   public void writeExternal(ObjectOutput JavaDoc out) throws IOException JavaDoc {
86     super.writeExternal(out);
87     out.writeObject(_url);
88   }
89
90   /**
91    * @see org.sapia.ubik.rmi.server.RemoteRefEx#onShutdown(Object, Method, Object[])
92    */

93   protected Object JavaDoc onShutdown(Object JavaDoc proxy, Method JavaDoc toCall, Object JavaDoc[] params)
94     throws Throwable JavaDoc {
95     return doFailOver(proxy, toCall, params, new ShutdownException());
96   }
97
98   /**
99    * Implements fail-over logic.
100    */

101   protected synchronized Object JavaDoc doFailOver(Object JavaDoc obj, Method JavaDoc toCall,
102     Object JavaDoc[] params, Throwable JavaDoc err) throws Throwable JavaDoc {
103     try {
104       Object JavaDoc remote = ServiceLocator.lookup(_url);
105
106       if (remote instanceof Stub && Proxy.isProxyClass(remote.getClass())) {
107         try {
108           ///////////
109
//This section might need a better synchronization pattern...
110
synchronized (_lock) {
111             ServerAddress newAddr = ((RemoteRef) Proxy.getInvocationHandler(remote)).getServerAddress();
112             _oid = ((RemoteRef) Proxy.getInvocationHandler(remote)).getOid();
113
114             if (!newAddr.equals(_serverAddress)) {
115               _serverAddress = newAddr;
116               initPool(true);
117             } else {
118               _pool.clear();
119             }
120           }
121
122           Hub.clientRuntime.gc.register(_serverAddress, _oid, this);
123         } catch (ClassCastException JavaDoc e) {
124           throw err;
125         }
126
127         return super.invoke(obj, toCall, params);
128       } else {
129         throw err;
130       }
131     } catch (NamingException JavaDoc e) {
132       throw err;
133     }
134   }
135 }
136
Popular Tags