diff options
| author | Mark Wielaard <mark@klomp.org> | 2002-10-31 18:35:20 +0000 |
|---|---|---|
| committer | Mark Wielaard <mark@klomp.org> | 2002-10-31 18:35:20 +0000 |
| commit | cd7775b47a1f77eb774ff6ecfc6518a4231b636e (patch) | |
| tree | f12da6efc0976abdd9afcb1a48191c87f7cbd603 /gnu/java/rmi/server/UnicastRef.java | |
| parent | 16932d0c5c2cccf533af93f66464b7836b3bb269 (diff) | |
| download | classpath-cd7775b47a1f77eb774ff6ecfc6518a4231b636e.tar.gz | |
Merge Orp RMI patches from Wu Gansha <gansha.wu@intel.com>
* configure.in (AC_OUTPUT): Add javax/rmi/Makefile,
* gnu/javax/Makefile, gnu/javax/rmi/Makefile,
javax/rmi/CORBA/Makefile and gnu/javax/rmi/CORBA/Makefile.
* javax/.cvsignore: New File.
* javax/Makefile.am (SUBDIRS): Add rmi.
* javax/rmi/.cvsignore: New File.
* javax/rmi/Makefile.am: New file.
* javax/rmi/CORBA/.cvsignore: New file.
* javax/rmi/CORBA/Makefile.am: New file.
* gnu/Makefile.am (SUBDIRS): Add javax.
* gnu/javax/.cvsignore: New file.
* gnu/javax/Makefile.am: New file.
* gnu/javax/rmi/.cvsignore: New file.
* gnu/javax/rmi/Makefile.am: New file.
* gnu/javax/rmi/CORBA/.cvsignore: New file.
* gnu/javax/rmi/CORBA/Makefile.am: New file.
* java/rmi/MarshalledObject.java (equals): Check hashcode first.
* java/rmi/server/RMIClassLoader.java (MyClassLoader): Create/Use
annotation.
(loadClass): Take String as codebases.
(getClassAnnotation): Use MyClassLoader annotations.
* java/rmi/server/UnicastRemoteObject.java (UnicastRemoteObject):
call exportObject(this).
* gnu/java/rmi/RMIMarshalledObjectOutputStream.java
(RMIMarshalledObjectOutputStream): set locBytesStream and locStream.
(setAnnotation): Don't set locBytesStream and locStream.
(replaceObject): Removed.
(flush): Don't test locStream.
(getLocButes): LikeWise.
* gnu/java/rmi/dgc/DGCImpl.java: extends UnicastServerRef.
(leaseCache): New field.
(dirty): Use leaseCache.
(LeaseRecord): New inner class.
* gnu/java/rmi/registry/RegistryImpl.java (RegistryImpl): Don't
explicitly call exportObject().
* gnu/java/rmi/registry/RegistryImpl_Stub.java: set useNewInvoke to
false to communicate with Sun JDK130.
* gnu/java/rmi/server/ConnectionRunnerPool.java: Add CPU comment.
* gnu/java/rmi/server/RMIObjectInputStream.java
(UnicastConnectionManager): Removed field.
* gnu/java/rmi/server/RMIObjectOutputStream.java (replaceObject):
Use UnicastServer.getExportedRef().
* gnu/java/rmi/server/UnicastConnection.java (reviveTime): New field.
(expireTime): Likewise.
(CONNECTION_TIMEOUT): Likewise.
(disconnect): Call sock.close().
(isExpired): New method.
(resetTime): Likewise.
(run): Use do while loop and catch Exception for discardConnection().
* gnu/java/rmi/server/UnicastConnectionManager.java: Pool connections.
* gnu/java/rmi/server/UnicastRef.java: Lots of changes.
* gnu/java/rmi/server/UnicastRemoteCall.java: Lots of changes.
* gnu/java/rmi/server/UnicastServer.java (refcache): New field.
(exportObject): Use refcache.
(unexportObject): Likewise.
(getExportedRef): New method.
* gnu/java/rmi/server/UnicastServerRef.java (UnicastServerRef): New
constructor.
(exportObject): Save manager.serverobj.
(getStub): New method.
* javax/rmi/PortableRemoteObject.java: New file.
* gnu/javax/rmi/PortableServer.java: Likewise.
* javax/rmi/CORBA/ClassDesc.java: New file.
* javax/rmi/CORBA/PortableRemoteObjectDelegate.java: Likewise.
* javax/rmi/CORBA/Stub.java: Likewise.
* javax/rmi/CORBA/StubDelegate.java: Likewise.
* javax/rmi/CORBA/Tie.java: Likewise.
* javax/rmi/CORBA/Util.java: Likewise.
* javax/rmi/CORBA/UtilDelegate.java: Likewise.
* javax/rmi/CORBA/ValueHandler.java: Likewise.
* gnu/javax/rmi/CORBA/DelegateFactory.java: Likewise.
* gnu/javax/rmi/CORBA/GetDelegateInstanceException.java: Likewise.
* gnu/javax/rmi/CORBA/PortableRemoteObjectDelegateImpl.java: Likewise.
* gnu/javax/rmi/CORBA/StubDelegateImpl.java: Likewise.
* gnu/javax/rmi/CORBA/UtilDelegateImpl.java: Likewise.
* gnu/javax/rmi/CORBA/ValueHandlerImpl.java: Likewise.
* javax/rmi/BAD_OPERATION.java: Stub class.
* javax/rmi/ORB.java: Likewise
* javax/rmi/CORBA/ObjectImpl.java: Likewise
* javax/rmi/CORBA/SystemException.java: Likewise.
Diffstat (limited to 'gnu/java/rmi/server/UnicastRef.java')
| -rw-r--r-- | gnu/java/rmi/server/UnicastRef.java | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/gnu/java/rmi/server/UnicastRef.java b/gnu/java/rmi/server/UnicastRef.java index d6cda49c6..9ab020db6 100644 --- a/gnu/java/rmi/server/UnicastRef.java +++ b/gnu/java/rmi/server/UnicastRef.java @@ -1,5 +1,5 @@ /* - Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (c) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -62,6 +62,8 @@ import java.io.ObjectOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.lang.reflect.InvocationTargetException; + public class UnicastRef implements RemoteRef, ProtocolConstants { @@ -69,9 +71,10 @@ public ObjID objid; UnicastConnectionManager manager; /** - * Used by serialization. + * Used by serialization, and let subclass capable of having default constructor */ -private UnicastRef() { +//private +UnicastRef() { } public UnicastRef(ObjID objid, String host, int port, RMIClientSocketFactory csf) { @@ -84,6 +87,21 @@ public UnicastRef(ObjID objid) { } public Object invoke(Remote obj, Method method, Object[] params, long opnum) throws Exception { + // Check if client and server are in the same VM, then local call can be used to + // replace remote call, but it's somewhat violating remote semantic. + Object svrobj = manager.serverobj; + if(svrobj != null){ + //local call + Object ret = null; + try{ + ret = method.invoke(svrobj, params); + }catch(InvocationTargetException e){ + throw (Exception)e.getTargetException(); + } + //System.out.println("\n\n ***** local call: " + method + "\nreturn: " + ret + "\n\n"); + return ret; + } + //System.out.println("***************** remote call:" + manager.serverPort); return (invokeCommon(obj, method, params, -1, opnum)); } @@ -107,18 +125,7 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu objid.write(out); out.writeInt(opnum); out.writeLong(hash); - /* - if (params != null) { - for (int i = 0; i < params.length; i++) { - if (params[i] instanceof UnicastRemoteObject) { - out.writeObject(UnicastRemoteObject.exportObject((UnicastRemoteObject)params[i])); - } - else { - out.writeObject(params[i]); - } - } - } - */ + // must handle primitive class and their wrapper classes Class clss[] = method.getParameterTypes(); for(int i = 0; i < clss.length; i++) @@ -137,26 +144,30 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu UID ack; try { din = conn.getDataInputStream(); - if (din.readUnsignedByte() != MESSAGE_CALL_ACK) { - throw new RemoteException("Call not acked"); + + if ((returncode = din.readUnsignedByte()) != MESSAGE_CALL_ACK) { + conn.disconnect(); + throw new RemoteException("Call not acked:" + returncode); } in = conn.getObjectInputStream(); - returncode = in.readUnsignedByte(); ack = UID.read(in); - //returnval = in.readObject(); + Class cls = method.getReturnType(); if(cls == Void.TYPE){ returnval = null; + in.readObject(); }else returnval = ((RMIObjectInputStream)in).readValue(cls); + } catch (IOException e3) { + //for debug: e3.printStackTrace(); throw new RemoteException("call return failed: ", e3); } - /* if DGCAck is necessary + /* if DGCAck is necessary?? //According to RMI wire protocol, send a DGCAck // to indicate receiving return value dout.writeByte(MESSAGE_DGCACK); @@ -166,7 +177,7 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu manager.discardConnection(conn); - if (returncode != RETURN_ACK) { + if (returncode != RETURN_ACK && returnval != null) { throw (Exception)returnval; } @@ -177,7 +188,18 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu * @deprecated */ public RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash) throws RemoteException { - return (new UnicastRemoteCall(obj, opnum, hash)); + UnicastConnection conn; + + try { + conn = manager.getConnection(); + } + catch (IOException e1) { + throw new RemoteException("connection failed to host: " + manager.serverName, e1); + } + + //obj: useless? + + return (new UnicastRemoteCall(conn, objid, opnum, hash)); } /** @@ -185,15 +207,19 @@ public RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash */ public void invoke(RemoteCall call) throws Exception { UnicastRemoteCall c = (UnicastRemoteCall)call; - Object ret = invokeCommon((Remote)c.getObject(), (Method)null, c.getArguments(), c.getOpnum(), c.getHash()); - c.setReturnValue(ret); + call.executeCall(); } /** * @deprecated */ public void done(RemoteCall call) throws RemoteException { - /* Does nothing */ + UnicastRemoteCall c = (UnicastRemoteCall)call; + try{ + c.done(); + } catch(IOException e){} + UnicastConnection conn = c.getConnection(); + manager.discardConnection(conn); } public void writeExternal(ObjectOutput out) throws IOException { |
