1 32 package net.sf.retrotranslator.runtime.java.rmi.server; 33 34 import java.io.*; 35 import java.lang.reflect.*; 36 import java.rmi.*; 37 import java.rmi.server.*; 38 import java.security.*; 39 import net.sf.retrotranslator.runtime.asm.Type; 40 import net.sf.retrotranslator.runtime.impl.NullOutputStream; 41 42 45 public class RemoteObjectInvocationHandler_ extends RemoteObject implements InvocationHandler { 46 47 public RemoteObjectInvocationHandler_(RemoteRef ref) { 48 super(ref); 49 if (ref == null) { 50 throw new NullPointerException (); 51 } 52 } 53 54 public Object invoke(Object proxy, Method method, Object [] args) throws Throwable { 55 if (method.getDeclaringClass() == Object .class) { 56 String name = method.getName(); 57 if (name.equals("hashCode")) { 58 return hashCode(); 59 } 60 if (name.equals("equals")) { 61 Object arg = args[0]; 62 return arg == proxy || 63 arg != null && Proxy.isProxyClass(arg.getClass()) && equals(Proxy.getInvocationHandler(arg)); 64 } 65 if (name.equals("toString")) { 66 StringBuilder result = new StringBuilder ("Proxy["); 67 Class [] interfaces = proxy.getClass().getInterfaces(); 68 if (interfaces.length > 0) { 69 boolean isFirst = interfaces.length == 1 || interfaces[0] != Remote.class; 70 result.append(getShortName(interfaces[isFirst ? 0 : 1])).append(','); 71 } 72 return result.append(this).append(']').toString(); 73 } 74 } 75 if (proxy instanceof Remote) { 76 try { 77 return ref.invoke((Remote) proxy, method, args, getOperationNumber(method)); 78 } catch (RuntimeException e) { 79 throw e; 80 } catch (Exception e) { 81 throw isExceptionDeclared(e.getClass(), proxy.getClass(), method) 82 ? e : new UnexpectedException(e.getMessage(), e); 83 } 84 } else { 85 throw new IllegalArgumentException (); 86 } 87 } 88 89 public String toString() { 90 return ref == null ? getShortName(getClass()) : getShortName(getClass()) + '[' + ref.remoteToString() + ']'; 91 } 92 93 private static String getShortName(Class aClass) { 94 String name = aClass.getName(); 95 return name.substring(name.lastIndexOf('.') + 1); 96 } 97 98 private static long getOperationNumber(Method method) { 99 try { 100 MessageDigest digest = MessageDigest.getInstance("SHA"); 101 DataOutputStream stream = new DataOutputStream(new DigestOutputStream(NullOutputStream.INSTANCE, digest)); 102 stream.writeUTF(method.getName() + Type.getMethodDescriptor(method)); 103 byte[] bytes = digest.digest(); 104 long result = 0; 105 for (int i = 7; i >= 0; i--) { 106 result = result << 8 | bytes[i] & 0xFF; 107 } 108 return result; 109 } catch (NoSuchAlgorithmException e) { 110 throw new SecurityException (e); 111 } catch (IOException e) { 112 throw new SecurityException (e); 113 } 114 } 115 116 private static boolean isExceptionDeclared(Class exceptionClass, Class proxyClass, Method method) { 117 try { 118 method = proxyClass.getMethod(method.getName(), method.getParameterTypes()); 119 } catch (NoSuchMethodException ignore) { 120 } 122 for (Class declaredClass : method.getExceptionTypes()) { 123 if (declaredClass.isAssignableFrom(exceptionClass)) return true; 124 } 125 return false; 126 } 127 128 } 129 | Popular Tags |