KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > rmi > naming > remote > proxy > BindingCache


1 package org.sapia.ubik.rmi.naming.remote.proxy;
2
3 import java.io.Externalizable JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.io.ObjectInput JavaDoc;
6 import java.io.ObjectOutput JavaDoc;
7 import java.lang.ref.SoftReference JavaDoc;
8 import java.lang.reflect.InvocationHandler JavaDoc;
9 import java.lang.reflect.Proxy JavaDoc;
10 import java.util.ArrayList JavaDoc;
11 import java.util.Collections JavaDoc;
12 import java.util.List JavaDoc;
13
14 import javax.naming.Context JavaDoc;
15 import javax.naming.NamingException JavaDoc;
16
17 import org.sapia.ubik.mcast.DomainName;
18 import org.sapia.ubik.rmi.server.Stub;
19 import org.sapia.ubik.rmi.server.StubInvocationHandler;
20
21
22 /**
23  * @author Yanick Duchesne
24  *
25  * <dl>
26  * <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>
27  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
28  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
29  * </dl>
30  */

31 public class BindingCache implements Externalizable JavaDoc {
32   private List JavaDoc _services = Collections.synchronizedList(new ArrayList JavaDoc());
33
34   public BindingCache() {
35   }
36
37   public synchronized void add(String JavaDoc domainName, String JavaDoc name, Object JavaDoc o) {
38     _services.add(new BoundRef(domainName, name, o));
39   }
40
41   public synchronized List JavaDoc cachedRefs() {
42     return _services;
43   }
44
45   public void copyTo(Context JavaDoc ctx, DomainName domain) {
46     BoundRef ref;
47
48     for (int i = 0; i < _services.size(); i++) {
49       ref = (BoundRef) _services.get(i);
50
51       if (ref.obj == null) {
52         continue;
53       }
54
55       try {
56         if ((ref.domainName != null) && domain.contains(ref.domainName)) {
57           ctx.rebind(ref.name, ref.obj);
58         }
59       } catch (NamingException JavaDoc e) {
60         //noop;
61
}
62     }
63   }
64
65   public void readExternal(ObjectInput JavaDoc in)
66     throws IOException JavaDoc, ClassNotFoundException JavaDoc {
67     _services = (List JavaDoc) in.readObject();
68   }
69
70   public void writeExternal(ObjectOutput JavaDoc out) throws IOException JavaDoc {
71     BoundRef ref;
72
73     synchronized (_services) {
74       for (int i = 0; i < _services.size(); i++) {
75         ref = (BoundRef) _services.get(i);
76
77         if (ref.isNull()) {
78           _services.remove(i);
79           --i;
80         }
81       }
82     }
83
84     out.writeObject(_services);
85   }
86
87   public static class BoundRef implements Externalizable JavaDoc {
88     public String JavaDoc name;
89     public Object JavaDoc obj;
90     public DomainName domainName;
91
92     /**
93      * Do not use this constructor; meant for externalization.
94      */

95     public BoundRef() {
96     }
97
98     BoundRef(String JavaDoc domainName, String JavaDoc name, Object JavaDoc o) {
99       this.domainName = DomainName.parse(domainName);
100       this.name = name;
101       this.obj = new SoftReference JavaDoc(o);
102     }
103
104     public void readExternal(ObjectInput JavaDoc in)
105       throws IOException JavaDoc, ClassNotFoundException JavaDoc {
106       this.name = in.readUTF();
107       this.obj = in.readObject();
108       this.domainName = (DomainName) in.readObject();
109     }
110
111     public void writeExternal(ObjectOutput JavaDoc out) throws IOException JavaDoc {
112       out.writeUTF(name);
113
114       Object JavaDoc toWrite;
115
116       if (obj instanceof SoftReference JavaDoc) {
117         toWrite = ((SoftReference JavaDoc) obj).get();
118       } else {
119         toWrite = obj;
120       }
121
122       if (toWrite instanceof Stub && Proxy.isProxyClass(toWrite.getClass())) {
123         InvocationHandler JavaDoc handler = Proxy.getInvocationHandler(toWrite);
124
125         if (handler instanceof StubInvocationHandler) {
126           toWrite = ((StubInvocationHandler) handler).toStubContainer(toWrite);
127         }
128       }
129
130       out.writeObject(toWrite);
131       out.writeObject(domainName);
132     }
133
134     public boolean isNull() {
135       if (obj == null) {
136         return true;
137       }
138
139       if (obj instanceof SoftReference JavaDoc) {
140         return ((SoftReference JavaDoc) obj).get() == null;
141       }
142
143       return false;
144     }
145   }
146 }
147
Popular Tags