source: trunk/gcc/libjava/gnu/java/rmi/server/UnicastRef.java@ 2446

Last change on this file since 2446 was 1392, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 7.7 KB
Line 
1/*
2 Copyright (c) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc.
3
4This file is part of GNU Classpath.
5
6GNU Classpath is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Classpath is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Classpath; see the file COPYING. If not, write to the
18Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
1902111-1307 USA.
20
21Linking this library statically or dynamically with other modules is
22making a combined work based on this library. Thus, the terms and
23conditions of the GNU General Public License cover the whole
24combination.
25
26As a special exception, the copyright holders of this library give you
27permission to link this library with independent modules to produce an
28executable, regardless of the license terms of these independent
29modules, and to copy and distribute the resulting executable under
30terms of your choice, provided that you also meet, for each linked
31independent module, the terms and conditions of the license of that
32module. An independent module is a module which is not derived from
33or based on this library. If you modify this library, you may extend
34this exception to your version of the library, but you are not
35obligated to do so. If you do not wish to do so, delete this
36exception statement from your version. */
37
38package gnu.java.rmi.server;
39
40import java.rmi.Remote;
41import java.rmi.RemoteException;
42import java.rmi.server.RemoteRef;
43import java.rmi.server.RMISocketFactory;
44import java.rmi.server.RMIClientSocketFactory;
45import java.rmi.server.RMIServerSocketFactory;
46import java.rmi.server.RemoteObject;
47import java.rmi.server.RemoteCall;
48import java.rmi.server.UnicastRemoteObject;
49import java.rmi.server.Operation;
50import java.rmi.server.ObjID;
51import java.rmi.server.UID;
52import java.lang.reflect.Method;
53import java.io.ObjectOutput;
54import java.io.ObjectInput;
55import java.io.IOException;
56import java.net.Socket;
57import java.net.InetAddress;
58import java.io.BufferedInputStream;
59import java.io.BufferedOutputStream;
60import java.io.ObjectInputStream;
61import java.io.ObjectOutputStream;
62import java.io.DataInputStream;
63import java.io.DataOutputStream;
64
65import java.lang.reflect.InvocationTargetException;
66
67public class UnicastRef
68 implements RemoteRef, ProtocolConstants {
69
70public ObjID objid;
71UnicastConnectionManager manager;
72
73/**
74 * Used by serialization, and let subclass capable of having default constructor
75 */
76//private
77UnicastRef() {
78}
79
80public UnicastRef(ObjID objid, String host, int port, RMIClientSocketFactory csf) {
81 this(objid);
82 manager = UnicastConnectionManager.getInstance(host, port, csf);
83}
84
85public UnicastRef(ObjID objid) {
86 this.objid = objid;
87}
88
89public Object invoke(Remote obj, Method method, Object[] params, long opnum) throws Exception {
90 // Check if client and server are in the same VM, then local call can be used to
91 // replace remote call, but it's somewhat violating remote semantic.
92 Object svrobj = manager.serverobj;
93 if(svrobj != null){
94 //local call
95 Object ret = null;
96 try{
97 ret = method.invoke(svrobj, params);
98 }catch(InvocationTargetException e){
99 throw (Exception)e.getTargetException();
100 }
101 //System.out.println("\n\n ***** local call: " + method + "\nreturn: " + ret + "\n\n");
102 return ret;
103 }
104 //System.out.println("***************** remote call:" + manager.serverPort);
105 return (invokeCommon(obj, method, params, -1, opnum));
106}
107
108private Object invokeCommon(Remote obj, Method method, Object[] params, int opnum, long hash) throws Exception {
109 UnicastConnection conn;
110 try {
111 conn = manager.getConnection();
112 }
113 catch (IOException e1) {
114 throw new RemoteException("connection failed to host: " + manager.serverName, e1);
115 }
116
117 ObjectOutputStream out;
118 DataOutputStream dout;
119 try {
120 dout = conn.getDataOutputStream();
121 dout.writeByte(MESSAGE_CALL);
122
123 out = conn.getObjectOutputStream();
124
125 objid.write(out);
126 out.writeInt(opnum);
127 out.writeLong(hash);
128
129 // must handle primitive class and their wrapper classes
130 Class clss[] = method.getParameterTypes();
131 for(int i = 0; i < clss.length; i++)
132 ((RMIObjectOutputStream)out).writeValue(params[i], clss[i]);
133
134 out.flush();
135 }
136 catch (IOException e2) {
137 throw new RemoteException("call failed: ", e2);
138 }
139
140 int returncode;
141 Object returnval;
142 DataInputStream din;
143 ObjectInputStream in;
144 UID ack;
145 try {
146 din = conn.getDataInputStream();
147
148 if ((returncode = din.readUnsignedByte()) != MESSAGE_CALL_ACK) {
149 conn.disconnect();
150 throw new RemoteException("Call not acked:" + returncode);
151 }
152
153 in = conn.getObjectInputStream();
154 returncode = in.readUnsignedByte();
155 ack = UID.read(in);
156
157 Class cls = method.getReturnType();
158 if(cls == Void.TYPE){
159 returnval = null;
160 in.readObject();
161 }else
162 returnval = ((RMIObjectInputStream)in).readValue(cls);
163
164 }
165 catch (IOException e3) {
166 //for debug: e3.printStackTrace();
167 throw new RemoteException("call return failed: ", e3);
168 }
169
170 /* if DGCAck is necessary??
171 //According to RMI wire protocol, send a DGCAck
172 // to indicate receiving return value
173 dout.writeByte(MESSAGE_DGCACK);
174 ack.write(dout);
175 out.flush();
176 */
177
178 manager.discardConnection(conn);
179
180 if (returncode != RETURN_ACK && returnval != null) {
181 throw (Exception)returnval;
182 }
183
184 return (returnval);
185}
186
187/**
188 * @deprecated
189 */
190public RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash) throws RemoteException {
191 UnicastConnection conn;
192
193 try {
194 conn = manager.getConnection();
195 }
196 catch (IOException e1) {
197 throw new RemoteException("connection failed to host: " + manager.serverName, e1);
198 }
199
200 //obj: useless?
201
202 return (new UnicastRemoteCall(conn, objid, opnum, hash));
203}
204
205/**
206 * @deprecated
207 */
208public void invoke(RemoteCall call) throws Exception {
209 UnicastRemoteCall c = (UnicastRemoteCall)call;
210 call.executeCall();
211}
212
213/**
214 * @deprecated
215 */
216public void done(RemoteCall call) throws RemoteException {
217 UnicastRemoteCall c = (UnicastRemoteCall)call;
218 try{
219 c.done();
220 } catch(IOException e){}
221 UnicastConnection conn = c.getConnection();
222 manager.discardConnection(conn);
223}
224
225public void writeExternal(ObjectOutput out) throws IOException {
226 if (manager == null) {
227 throw new IOException("no connection");
228 }
229 manager.write(out);
230 objid.write(out);
231 // This byte is somewhat confusing when interoperating with JDK
232 out.writeByte(0); //RETURN_ACK);
233}
234
235public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
236 manager = UnicastConnectionManager.read(in);
237 objid = ObjID.read(in);
238 byte ack = in.readByte();
239 // This byte is somewhat confusing when interoperating with JDK
240 if (ack != RETURN_ACK && ack != 0/*jdk ack value*/) {
241 throw new IOException("no ack found");
242 }
243}
244
245public boolean remoteEquals(RemoteRef ref) {
246 throw new Error("Not implemented");