summaryrefslogtreecommitdiff
path: root/gnu/java/rmi/server/UnicastRef.java
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2002-10-31 18:35:20 +0000
committerMark Wielaard <mark@klomp.org>2002-10-31 18:35:20 +0000
commitcd7775b47a1f77eb774ff6ecfc6518a4231b636e (patch)
treef12da6efc0976abdd9afcb1a48191c87f7cbd603 /gnu/java/rmi/server/UnicastRef.java
parent16932d0c5c2cccf533af93f66464b7836b3bb269 (diff)
downloadclasspath-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.java76
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 {