1:
37:
38: package ;
39:
40: import ;
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48:
49: public abstract class RemoteObject
50: implements Remote, Serializable {
51:
52: private static final long serialVersionUID = -3215090123894869218l;
53:
54: protected transient RemoteRef ref;
55:
56: private static final WeakHashMap stubs = new WeakHashMap();
57:
58: protected RemoteObject() {
59: this(null);
60: }
61:
62: protected RemoteObject(RemoteRef newref) {
63: ref = newref;
64: }
65:
66: public RemoteRef getRef() {
67: return (ref);
68: }
69:
70: synchronized static void addStub(Remote obj, Remote stub)
71: {
72: stubs.put(obj, stub);
73: }
74:
75: synchronized static void deleteStub(Remote obj)
76: {
77: stubs.remove(obj);
78: }
79:
80: public static Remote toStub(Remote obj) throws NoSuchObjectException
81: {
82: Remote stub = (Remote)stubs.get(obj);
83:
84: if (stub == null)
85: throw new NoSuchObjectException(obj.getClass().getName());
86:
87: return stub;
88: }
89:
90: public int hashCode() {
91: if (ref == null) {
92: return (0);
93: }
94: else {
95: return (ref.hashCode());
96: }
97: }
98:
99: public boolean equals(Object obj) {
100:
101: return (this == obj);
102: }
103:
104: public String toString()
105: {
106: if (ref == null)
107: return getClass ().toString ();
108: return (ref.toString ());
109: }
110:
111: private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
112: {
113: String cname = in.readUTF();
114: if (!cname.equals(""))
115: {
116: if (cname.equals ("UnicastRef2"))
117: {
118:
119: cname = "UnicastRef";
120: in.read ();
121: }
122:
123: cname = RemoteRef.packagePrefix + '.' + cname;
124: try
125: {
126: Class cls = Class.forName(cname);
127: ref = (RemoteRef)cls.newInstance();
128: }
129: catch (InstantiationException e1)
130: {
131: throw new UnmarshalException("failed to create ref", e1);
132: }
133: catch (IllegalAccessException e2)
134: {
135: throw new UnmarshalException("failed to create ref", e2);
136: }
137: ref.readExternal(in);
138: }
139: else
140: {
141: ref = (RemoteRef)in.readObject();
142: }
143: }
144:
145: private void writeObject(ObjectOutputStream out) throws IOException, ClassNotFoundException {
146: if (ref == null) {
147: throw new UnmarshalException("no ref to serialize");
148: }
149: String cname = ref.getRefClass(out);
150: if (cname != null && cname.length() > 0) {
151: out.writeUTF(cname);
152: ref.writeExternal(out);
153: }
154: else {
155: out.writeUTF("");
156: out.writeObject(ref);
157: }
158: }
159:
160: }