Mercurial > hg > blitz_condensed
comparison src/org/dancres/blitz/remote/ConstrainableBlitzProxy.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3dc0c5604566 |
---|---|
1 package org.dancres.blitz.remote; | |
2 | |
3 import java.io.IOException; | |
4 import java.io.ObjectInputStream; | |
5 import java.io.InvalidObjectException; | |
6 | |
7 import java.lang.reflect.Method; | |
8 | |
9 import java.rmi.MarshalledObject; | |
10 | |
11 import java.util.Collection; | |
12 import java.util.List; | |
13 | |
14 import net.jini.admin.Administrable; | |
15 | |
16 import net.jini.core.transaction.Transaction; | |
17 | |
18 import net.jini.core.entry.Entry; | |
19 | |
20 import net.jini.space.JavaSpace; | |
21 | |
22 import net.jini.core.event.RemoteEventListener; | |
23 | |
24 import net.jini.id.Uuid; | |
25 | |
26 import net.jini.core.constraint.RemoteMethodControl; | |
27 import net.jini.core.constraint.MethodConstraints; | |
28 | |
29 import net.jini.security.proxytrust.ProxyTrustIterator; | |
30 import net.jini.security.proxytrust.SingletonProxyTrustIterator; | |
31 | |
32 import com.sun.jini.proxy.ConstrainableProxyUtil; | |
33 | |
34 import org.dancres.blitz.mangler.MangledEntry; | |
35 | |
36 import org.dancres.util.ReflectUtil; | |
37 | |
38 /** | |
39 When the remote stub generated by the exporter implements | |
40 RemoteMethodControl, Blitz exports this proxy for Space duties to support | |
41 appropriate constraints etc. | |
42 */ | |
43 public final class ConstrainableBlitzProxy extends | |
44 BlitzProxy implements RemoteMethodControl { | |
45 | |
46 /** | |
47 The outer-layer calls all feature Entry.class whilst the server | |
48 calls use MangledEntry so we must translate constraints which will be | |
49 applied against the outer-layer methods to the internal methods. | |
50 */ | |
51 private static final Method[] theMethodMapping = { | |
52 ReflectUtil.findMethod(JavaSpace.class, "write", | |
53 new Class[] {Entry.class, Transaction.class, | |
54 long.class}), | |
55 ReflectUtil.findMethod(BlitzServer.class, "write", | |
56 new Class[] {MangledEntry.class, | |
57 Transaction.class, long.class}), | |
58 | |
59 ReflectUtil.findMethod(JavaSpace.class, "read", | |
60 new Class[] {Entry.class, Transaction.class, | |
61 long.class}), | |
62 ReflectUtil.findMethod(BlitzServer.class, "read", | |
63 new Class[] {MangledEntry.class, | |
64 Transaction.class, long.class}), | |
65 | |
66 ReflectUtil.findMethod(JavaSpace.class, "readIfExists", | |
67 new Class[] {Entry.class, Transaction.class, | |
68 long.class}), | |
69 ReflectUtil.findMethod(BlitzServer.class, "readIfExists", | |
70 new Class[] {MangledEntry.class, | |
71 Transaction.class, long.class}), | |
72 | |
73 ReflectUtil.findMethod(JavaSpace.class, "take", | |
74 new Class[] {Entry.class, Transaction.class, | |
75 long.class}), | |
76 ReflectUtil.findMethod(BlitzServer.class, "take", | |
77 new Class[] {MangledEntry.class, | |
78 Transaction.class, long.class}), | |
79 | |
80 ReflectUtil.findMethod(JavaSpace.class, "takeIfExists", | |
81 new Class[] {Entry.class, Transaction.class, | |
82 long.class}), | |
83 ReflectUtil.findMethod(BlitzServer.class, "takeIfExists", | |
84 new Class[] {MangledEntry.class, | |
85 Transaction.class, long.class}), | |
86 | |
87 ReflectUtil.findMethod(JavaSpace.class, "notify", | |
88 new Class[] {Entry.class, Transaction.class, | |
89 RemoteEventListener.class, | |
90 long.class, | |
91 MarshalledObject.class}), | |
92 ReflectUtil.findMethod(BlitzServer.class, "notify", | |
93 new Class[] {MangledEntry.class, | |
94 Transaction.class, | |
95 RemoteEventListener.class, | |
96 long.class, | |
97 MarshalledObject.class}), | |
98 | |
99 ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, | |
100 "registerForAvailabilityEvent", | |
101 new Class[] {Collection.class, Transaction.class, | |
102 boolean.class, | |
103 RemoteEventListener.class, | |
104 long.class, | |
105 MarshalledObject.class}), | |
106 ReflectUtil.findMethod(JS05Server.class, | |
107 "registerForVisibility", | |
108 new Class[] {MangledEntry[].class, | |
109 Transaction.class, | |
110 RemoteEventListener.class, | |
111 long.class, | |
112 MarshalledObject.class, | |
113 boolean.class}), | |
114 | |
115 ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, "write", | |
116 new Class[] {List.class, | |
117 Transaction.class, | |
118 List.class}), | |
119 ReflectUtil.findMethod(JS05Server.class, "write", | |
120 new Class[] {List.class, | |
121 Transaction.class, | |
122 List.class}), | |
123 | |
124 ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, "take", | |
125 new Class[] {Collection.class, | |
126 Transaction.class, | |
127 long.class, | |
128 long.class}), | |
129 ReflectUtil.findMethod(JS05Server.class, "take", | |
130 new Class[] {MangledEntry[].class, | |
131 Transaction.class, | |
132 long.class, | |
133 long.class}), | |
134 | |
135 ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, "contents", | |
136 new Class[] {Collection.class, | |
137 Transaction.class, | |
138 long.class, | |
139 long.class}), | |
140 ReflectUtil.findMethod(EntryViewAdmin.class, "newView", | |
141 new Class[] {MangledEntry[].class, | |
142 Transaction.class, | |
143 long.class, boolean.class, | |
144 long.class, int.class}), | |
145 | |
146 ReflectUtil.findMethod(Administrable.class, "getAdmin", | |
147 new Class[] {}), | |
148 ReflectUtil.findMethod(BlitzServer.class, "getAdmin", | |
149 new Class[] {}) | |
150 }; | |
151 | |
152 private static BlitzServer constrainStub(BlitzServer aServer, | |
153 MethodConstraints aConstraints) { | |
154 RemoteMethodControl myServer = (RemoteMethodControl) aServer; | |
155 | |
156 MethodConstraints myStubConstraints = | |
157 ConstrainableProxyUtil.translateConstraints(aConstraints, | |
158 theMethodMapping); | |
159 | |
160 myServer.setConstraints(myStubConstraints); | |
161 return (BlitzServer) myServer; | |
162 } | |
163 | |
164 private final MethodConstraints theConstraints; | |
165 | |
166 ConstrainableBlitzProxy(BlitzServer aBlitz, Uuid aUuid) { | |
167 super(aBlitz, aUuid); | |
168 theConstraints = null; | |
169 } | |
170 | |
171 private ConstrainableBlitzProxy(BlitzServer aBlitz, Uuid aUuid, | |
172 MethodConstraints aConstraints) { | |
173 super(constrainStub(aBlitz, aConstraints), aUuid); | |
174 theConstraints = aConstraints; | |
175 } | |
176 | |
177 private ProxyTrustIterator getProxyTrustIterator() { | |
178 return new SingletonProxyTrustIterator(theStub); | |
179 } | |
180 | |
181 public RemoteMethodControl setConstraints(MethodConstraints aConstraints) { | |
182 return new ConstrainableBlitzProxy(theStub, theUuid, aConstraints); | |
183 } | |
184 | |
185 public MethodConstraints getConstraints() { | |
186 return theConstraints; | |
187 } | |
188 | |
189 private void readObject(ObjectInputStream anOIS) | |
190 throws IOException, ClassNotFoundException { | |
191 | |
192 anOIS.defaultReadObject(); | |
193 | |
194 if(! (theStub instanceof RemoteMethodControl) ) { | |
195 throw new InvalidObjectException("space does not implement RemoteMethodControl"); | |
196 } | |
197 } | |
198 } |