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:
124:
125: cname = "gnu.java.rmi.server." + cname;
126: try
127: {
128: Class cls = Class.forName(cname);
129: ref = (RemoteRef)cls.newInstance();
130: }
131: catch (InstantiationException e1)
132: {
133: throw new UnmarshalException("failed to create ref", e1);
134: }
135: catch (IllegalAccessException e2)
136: {
137: throw new UnmarshalException("failed to create ref", e2);
138: }
139: ref.readExternal(in);
140: }
141: else
142: {
143: ref = (RemoteRef)in.readObject();
144: }
145: }
146:
147: private void writeObject(ObjectOutputStream out) throws IOException, ClassNotFoundException {
148: if (ref == null) {
149: throw new UnmarshalException("no ref to serialize");
150: }
151: String cname = ref.getRefClass(out);
152: if (cname != null && cname.length() > 0) {
153: out.writeUTF(cname);
154: ref.writeExternal(out);
155: }
156: else {
157: out.writeUTF("");
158: out.writeObject(ref);
159: }
160: }
161:
162: }