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 }