home *** CD-ROM | disk | FTP | other *** search
- package sun.rmi.server;
-
- import java.io.ByteArrayOutputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.ObjectInput;
- import java.io.ObjectOutput;
- import java.io.PrintStream;
- import java.lang.ref.SoftReference;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.rmi.MarshalException;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- import java.rmi.ServerError;
- import java.rmi.ServerException;
- import java.rmi.UnmarshalException;
- import java.rmi.server.LogStream;
- import java.rmi.server.RemoteCall;
- import java.rmi.server.RemoteRef;
- import java.rmi.server.RemoteServer;
- import java.rmi.server.RemoteStub;
- import java.rmi.server.ServerNotActiveException;
- import java.rmi.server.ServerRef;
- import java.rmi.server.Skeleton;
- import java.rmi.server.SkeletonNotFoundException;
- import java.security.AccessController;
- import java.security.DigestOutputStream;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Collections;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.WeakHashMap;
- import sun.rmi.transport.LiveRef;
- import sun.rmi.transport.Target;
- import sun.rmi.transport.tcp.TCPTransport;
- import sun.security.action.GetBooleanAction;
-
- public class UnicastServerRef extends UnicastRef implements ServerRef, Dispatcher {
- private static final long serialVersionUID = -7384275867073752268L;
- private static final boolean wantExceptionLog = (Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.rmi.server.exceptionTrace"));
- private transient Skeleton skel;
- private transient Map methodTable = null;
- private static Map methodTableCache = new WeakHashMap(11);
- private static Map withoutSkeletons = Collections.synchronizedMap(new WeakHashMap(11));
- // $FF: synthetic field
- static Class class$java$rmi$Remote;
-
- public UnicastServerRef() {
- }
-
- public UnicastServerRef(LiveRef var1) {
- super(var1);
- }
-
- public UnicastServerRef(int var1) {
- super(new LiveRef(var1));
- }
-
- public RemoteStub exportObject(Remote var1, Object var2) throws RemoteException {
- return this.exportObject(var1, var2, false);
- }
-
- public RemoteStub exportObject(Remote var1, Object var2, boolean var3) throws RemoteException {
- RemoteStub var4 = this.setSkeleton(var1);
- Target var5 = new Target(var1, this, var4, super.ref.getObjID(), var3);
- super.ref.exportObject(var5);
- this.methodTable = getMethodTable(var1.getClass());
- return var4;
- }
-
- public String getClientHost() throws ServerNotActiveException {
- return TCPTransport.getClientHost();
- }
-
- public RemoteStub setSkeleton(Remote var1) throws RemoteException {
- if (!withoutSkeletons.containsKey(var1.getClass())) {
- try {
- this.skel = RemoteProxy.getSkeleton(var1);
- } catch (SkeletonNotFoundException var3) {
- withoutSkeletons.put(var1.getClass(), (Object)null);
- }
- }
-
- return RemoteProxy.getStub(var1, this.getClientRef());
- }
-
- public void dispatch(Remote var1, RemoteCall var2) throws IOException {
- try {
- long var4;
- ObjectInput var41;
- try {
- var41 = var2.getInputStream();
- int var3 = var41.readInt();
- if (var3 >= 0) {
- if (this.skel != null) {
- this.oldDispatch(var1, var2, var3);
- return;
- }
-
- throw new UnmarshalException("skeleton class not found but required for client version");
- }
-
- var4 = var41.readLong();
- } catch (Exception var38) {
- throw new UnmarshalException("error unmarshalling call header", var38);
- }
-
- MarshalInputStream var42 = (MarshalInputStream)var41;
- var42.skipDefaultResolveClass();
- Method var8 = (Method)this.methodTable.get(new Long(var4));
- if (var8 == null) {
- throw new UnmarshalException("invalid method hash");
- } else {
- this.logCall(var1, var8);
- Class[] var9 = var8.getParameterTypes();
- Object[] var10 = new Object[var9.length];
-
- try {
- this.unmarshalCustomCallData(var41);
-
- for(int var11 = 0; var11 < var9.length; ++var11) {
- var10[var11] = UnicastRef.unmarshalValue(var9[var11], var41);
- }
- } catch (IOException var35) {
- throw new UnmarshalException("error unmarshalling arguments", var35);
- } catch (ClassNotFoundException var36) {
- throw new UnmarshalException("error unmarshalling arguments", var36);
- } finally {
- var2.releaseInputStream();
- }
-
- Object var43;
- try {
- var43 = var8.invoke(var1, var10);
- } catch (InvocationTargetException var34) {
- throw var34.getTargetException();
- }
-
- try {
- ObjectOutput var12 = var2.getResultStream(true);
- Class var13 = var8.getReturnType();
- if (var13 != Void.TYPE) {
- UnicastRef.marshalValue(var13, var43, var12);
- }
-
- } catch (IOException var33) {
- throw new MarshalException("error marshalling return", var33);
- }
- }
- } catch (Throwable var39) {
- Object var6 = var39;
- this.logCallException(var39);
- ObjectOutput var7 = var2.getResultStream(false);
- if (var39 instanceof Error) {
- var6 = new ServerError("Error occurred in server thread", (Error)var39);
- } else if (var39 instanceof RemoteException) {
- var6 = new ServerException("RemoteException occurred in server thread", (Exception)var39);
- }
-
- var7.writeObject(var6);
- } finally {
- var2.releaseInputStream();
- var2.releaseOutputStream();
- }
- }
-
- protected void unmarshalCustomCallData(ObjectInput var1) throws IOException, ClassNotFoundException {
- }
-
- public void oldDispatch(Remote var1, RemoteCall var2, int var3) throws IOException {
- try {
- long var4;
- ObjectInput var16;
- try {
- var16 = var2.getInputStream();
- var4 = var16.readLong();
- } catch (Exception var13) {
- throw new UnmarshalException("error unmarshalling call header", var13);
- }
-
- this.logCall(var1, this.skel.getOperations()[var3]);
- this.unmarshalCustomCallData(var16);
- this.skel.dispatch(var1, var2, var3, var4);
- } catch (Throwable var14) {
- Object var6 = var14;
- this.logCallException(var14);
- ObjectOutput var7 = var2.getResultStream(false);
- if (var14 instanceof Error) {
- var6 = new ServerError("Error occurred in server thread", (Error)var14);
- } else if (var14 instanceof RemoteException) {
- var6 = new ServerException("RemoteException occurred in server thread", (Exception)var14);
- }
-
- var7.writeObject(var6);
- } finally {
- var2.releaseInputStream();
- var2.releaseOutputStream();
- }
-
- }
-
- private void logCall(Remote var1, Object var2) {
- PrintStream var3 = RemoteServer.getLog();
- if (var3 != null) {
- String var4;
- try {
- var4 = this.getClientHost();
- } catch (ServerNotActiveException var6) {
- var4 = "(local)";
- }
-
- var3.println("[" + var4 + ": " + var1.getClass().getName() + super.ref.getObjID().toString() + ": " + var2 + "]");
- }
- }
-
- private void logCallException(Throwable var1) {
- PrintStream var2 = RemoteServer.getLog();
- if (var2 != null) {
- synchronized(var2) {
- try {
- var2.print("[" + this.getClientHost() + "] ");
- } catch (ServerNotActiveException var10) {
- }
-
- var2.print("exception: ");
- var1.printStackTrace(var2);
- }
- }
-
- if (wantExceptionLog) {
- PrintStream var3 = System.err;
- synchronized(var3) {
- var3.println();
-
- try {
- String var12 = this.getClientHost();
- } catch (ServerNotActiveException var8) {
- String var5 = "(local)";
- }
-
- var3.println("Exception dispatching call to " + super.ref.getObjID() + " in thread \"" + Thread.currentThread().getName() + "\" at " + new Date() + ":");
- var1.printStackTrace(var3);
- }
- }
-
- }
-
- public String getRefClass(ObjectOutput var1) {
- if (var1 instanceof MarshalOutputStream) {
- throw new InternalError("UnicastServerRef.writeExternal: server reference written to MarshalOutputStream");
- } else {
- return "UnicastServerRef";
- }
- }
-
- protected RemoteRef getClientRef() {
- return new UnicastRef(super.ref);
- }
-
- public void writeExternal(ObjectOutput var1) throws IOException {
- if (var1 instanceof MarshalOutputStream) {
- throw new InternalError("UnicastServerRef.writeExternal: server reference written to MarshalOutputStream");
- }
- }
-
- public void readExternal(ObjectInput var1) throws IOException, ClassNotFoundException {
- super.ref = null;
- this.skel = null;
- }
-
- private static Map getMethodTable(Class var0) {
- Map var2 = methodTableCache;
- SoftReference[] var1;
- synchronized(var2) {
- var1 = (SoftReference[])methodTableCache.get(var0);
- if (var1 == null) {
- var1 = new SoftReference[]{null};
- methodTableCache.put(var0, var1);
- }
- }
-
- synchronized(var1) {
- Map var4 = null;
- if (var1[0] != null) {
- var4 = (Map)var1[0].get();
- }
-
- if (var4 == null) {
- var4 = createMethodTable(var0);
- var1[0] = new SoftReference(var4);
- }
-
- return var4;
- }
- }
-
- private static Map createMethodTable(Class var0) {
- HashMap var1 = new HashMap(11);
-
- for(Class var2 = var0; var2 != null; var2 = var2.getSuperclass()) {
- Class[] var3 = var2.getInterfaces();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if ((class$java$rmi$Remote == null ? (class$java$rmi$Remote = class$("java.rmi.Remote")) : class$java$rmi$Remote).isAssignableFrom(var3[var4])) {
- Method[] var5 = var3[var4].getMethods();
-
- for(int var6 = 0; var6 < var5.length; ++var6) {
- Method var7 = var5[var6];
- AccessController.doPrivileged(new 1(var7));
- long var8 = computeMethodHash(var7);
- var1.put(new Long(var8), var7);
- }
- }
- }
- }
-
- return var1;
- }
-
- private static long computeMethodHash(Method var0) {
- long var1 = 0L;
- ByteArrayOutputStream var3 = new ByteArrayOutputStream(127);
-
- try {
- MessageDigest var4 = MessageDigest.getInstance("SHA");
- DataOutputStream var5 = new DataOutputStream(new DigestOutputStream(var3, var4));
- String var6 = getMethodNameAndDescriptor(var0);
- if (RemoteProxy.logLevel >= 20) {
- LogStream.log("transport").println("UnicastServerRef.computeMethodHash: string used for method hash: \"" + var6 + "\"");
- }
-
- var5.writeUTF(var6);
- var5.flush();
- byte[] var7 = var4.digest();
-
- for(int var8 = 0; var8 < Math.min(8, var7.length); ++var8) {
- var1 += (long)(var7[var8] & 255) << var8 * 8;
- }
- } catch (IOException var9) {
- var1 = -1L;
- } catch (NoSuchAlgorithmException var10) {
- throw new SecurityException(((Throwable)var10).getMessage());
- }
-
- return var1;
- }
-
- private static String getMethodNameAndDescriptor(Method var0) {
- StringBuffer var1 = new StringBuffer(var0.getName());
- var1.append('(');
- Class[] var2 = var0.getParameterTypes();
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- var1.append(getTypeDescriptor(var2[var3]));
- }
-
- var1.append(')');
- Class var4 = var0.getReturnType();
- if (var4 == Void.TYPE) {
- var1.append('V');
- } else {
- var1.append(getTypeDescriptor(var4));
- }
-
- return var1.toString();
- }
-
- private static String getTypeDescriptor(Class var0) {
- if (var0.isPrimitive()) {
- if (var0 == Integer.TYPE) {
- return "I";
- } else if (var0 == Boolean.TYPE) {
- return "Z";
- } else if (var0 == Byte.TYPE) {
- return "B";
- } else if (var0 == Character.TYPE) {
- return "C";
- } else if (var0 == Short.TYPE) {
- return "S";
- } else if (var0 == Long.TYPE) {
- return "J";
- } else if (var0 == Float.TYPE) {
- return "F";
- } else if (var0 == Double.TYPE) {
- return "D";
- } else if (var0 == Void.TYPE) {
- return "V";
- } else {
- throw new Error("unrecognized primitive type: " + var0);
- }
- } else {
- return var0.isArray() ? var0.getName().replace('.', '/') : "L" + var0.getName().replace('.', '/') + ";";
- }
- }
-
- // $FF: synthetic method
- static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
- }
-