forked from fredlund/JavaErlang
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProxyHandler.java
More file actions
84 lines (72 loc) · 2.58 KB
/
ProxyHandler.java
File metadata and controls
84 lines (72 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package javaErlang;
import java.lang.reflect.Method;
import java.util.logging.Level;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.Proxy;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangPid;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangLong;
import com.ericsson.otp.erlang.OtpErlangList;
public class ProxyHandler implements MethodHandler {
int objectId;
OtpErlangPid pid;
OtpErlangObject answer;
JavaErlang root;
Method methods[];
Method method = null;
public ProxyHandler(JavaErlang root, int objectId, OtpErlangPid pid, Method[] methods) {
this.root = root;
this.objectId = objectId;
this.pid = pid;
this.methods = methods;
}
public Object invoke(Object self,
Method m,
Method proceed,
Object[] args) throws Throwable {
if (root.logger.isLoggable(Level.FINE))
root.logger.log
(Level.FINE,
"proxy method "+m+"invoked, pid="+pid+"methods_length="+methods.length);
int index = -1;
for (int i=0; i<methods.length; i++) {
if (root.logger.isLoggable(Level.FINE))
root.logger.log(Level.FINE,"checking "+methods[i]+" against "+m);
if (methods[i].equals(m)) {
index=i;
break;
}
}
if (root.logger.isLoggable(Level.FINE))
root.logger.log(Level.FINE,"index is "+index);
OtpErlangObject elements[] =
new OtpErlangObject[args.length];
for (int i=0; i<args.length; i++)
elements[i] = root.map_to_erlang(args[i]);
OtpErlangObject msg =
root.makeErlangTuple
(new OtpErlangAtom("proxy_invoke"),
root.makeErlangTuple
(new OtpErlangLong(objectId),
root.map_to_erlang(self),
root.map_to_erlang(m),
new OtpErlangLong(index+1),
new OtpErlangList(elements)));
root.msgs.send(pid,msg);
method = m;
return waitForAnswer();
}
public synchronized Object waitForAnswer() throws Exception {
try {
this.wait();
} catch (final InterruptedException exc) {
return waitForAnswer();
}
return root.java_value_from_erlang(answer,method.getReturnType());
}
public synchronized void setAnswer(final OtpErlangObject answer) {
this.answer = answer;
notifyAll();
}
}