KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > retrotranslator > runtime > java > rmi > server > RemoteObjectInvocationHandler_


1 /***
2  * Retrotranslator: a Java bytecode transformer that translates Java classes
3  * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
4  *
5  * Copyright (c) 2005 - 2007 Taras Puchko
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holders nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  */

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 /**
43  * @author Taras Puchko
44  */

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 JavaDoc();
51         }
52     }
53
54     public Object JavaDoc invoke(Object JavaDoc proxy, Method method, Object JavaDoc[] args) throws Throwable JavaDoc {
55         if (method.getDeclaringClass() == Object JavaDoc.class) {
56             String JavaDoc name = method.getName();
57             if (name.equals("hashCode")) {
58                 return hashCode();
59             }
60             if (name.equals("equals")) {
61                 Object JavaDoc 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 JavaDoc result = new StringBuilder JavaDoc("Proxy[");
67                 Class JavaDoc[] 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 JavaDoc e) {
79                 throw e;
80             } catch (Exception JavaDoc e) {
81                 throw isExceptionDeclared(e.getClass(), proxy.getClass(), method)
82                         ? e : new UnexpectedException(e.getMessage(), e);
83             }
84         } else {
85             throw new IllegalArgumentException JavaDoc();
86         }
87     }
88
89     public String JavaDoc toString() {
90         return ref == null ? getShortName(getClass()) : getShortName(getClass()) + '[' + ref.remoteToString() + ']';
91     }
92
93     private static String JavaDoc getShortName(Class JavaDoc aClass) {
94         String JavaDoc 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 JavaDoc(e);
111         } catch (IOException e) {
112             throw new SecurityException JavaDoc(e);
113         }
114     }
115
116     private static boolean isExceptionDeclared(Class JavaDoc exceptionClass, Class JavaDoc proxyClass, Method method) {
117         try {
118             method = proxyClass.getMethod(method.getName(), method.getParameterTypes());
119         } catch (NoSuchMethodException JavaDoc ignore) {
120             //ignore
121
}
122         for (Class JavaDoc declaredClass : method.getExceptionTypes()) {
123             if (declaredClass.isAssignableFrom(exceptionClass)) return true;
124         }
125         return false;
126     }
127
128 }
129
Popular Tags