diff src/org/dancres/blitz/remote/ConstrainableAdminProxy.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/dancres/blitz/remote/ConstrainableAdminProxy.java	Sat Mar 21 11:00:06 2009 +0000
@@ -0,0 +1,105 @@
+package org.dancres.blitz.remote;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.InvalidObjectException;
+
+import java.lang.reflect.Method;
+
+import net.jini.id.Uuid;
+
+import net.jini.core.constraint.RemoteMethodControl;
+import net.jini.core.constraint.MethodConstraints;
+
+import net.jini.security.proxytrust.ProxyTrustIterator;
+import net.jini.security.proxytrust.SingletonProxyTrustIterator;
+
+import net.jini.core.transaction.Transaction;
+
+import net.jini.core.entry.Entry;
+
+import com.sun.jini.outrigger.JavaSpaceAdmin;
+
+import com.sun.jini.proxy.ConstrainableProxyUtil;
+
+import org.dancres.blitz.mangler.MangledEntry;
+
+import org.dancres.util.ReflectUtil;
+
+/**
+   When the remote stub generated by the exporter implements
+   RemoteMethodControl, Blitz exports this proxy for Admin duties to support
+   appropriate constraints etc.
+ */
+public final class ConstrainableAdminProxy extends
+    AdminProxy implements RemoteMethodControl {
+
+    private static final Method[] theMethodMapping = {
+        ReflectUtil.findMethod(JavaSpaceAdmin.class, "space",
+                               new Class[] {}),
+        ReflectUtil.findMethod(EntryViewAdmin.class, "getJavaSpaceProxy",
+                               new Class[] {}),
+        ReflectUtil.findMethod(JavaSpaceAdmin.class, "contents",
+                               new Class[] {Entry.class, Transaction.class}),
+        ReflectUtil.findMethod(EntryViewAdmin.class, "newView",
+                               new Class[] {MangledEntry[].class,
+                                                Transaction.class,
+                                                long.class, boolean.class,
+                                                long.class, int.class}),
+        ReflectUtil.findMethod(JavaSpaceAdmin.class, "contents",
+                               new Class[] {Entry.class, Transaction.class,
+                                                int.class}),
+        ReflectUtil.findMethod(EntryViewAdmin.class, "newView",
+                               new Class[] {MangledEntry[].class,
+                                                Transaction.class,
+                                                long.class, boolean.class,
+                                                long.class, int.class})
+    };
+
+
+    private static AdminServer constrainStub(AdminServer aServer,
+                                             MethodConstraints aConstraints) {
+        RemoteMethodControl myServer = (RemoteMethodControl) aServer;
+
+        MethodConstraints myStubConstraints =
+            ConstrainableProxyUtil.translateConstraints(aConstraints,
+                                                        theMethodMapping);
+
+        myServer.setConstraints(myStubConstraints);
+        return (AdminServer) myServer;
+    }
+
+    private MethodConstraints theConstraints;
+
+    ConstrainableAdminProxy(AdminServer aAdmin, Uuid aUuid) {
+        super(aAdmin, aUuid);
+    }
+
+    private ConstrainableAdminProxy(AdminServer anAdmin, Uuid aUuid,
+                                    MethodConstraints aConstraints) {
+        super(constrainStub(anAdmin, aConstraints), aUuid);
+        theConstraints = aConstraints;
+    }
+
+    private ProxyTrustIterator getProxyTrustIterator() {
+        return new SingletonProxyTrustIterator(theStub);
+    }
+
+    public RemoteMethodControl setConstraints(MethodConstraints aConstraints) {
+        return new ConstrainableAdminProxy(theStub, theUuid, aConstraints);
+    }
+
+    public MethodConstraints getConstraints() {
+        return theConstraints;
+    }
+
+    private void readObject(ObjectInputStream anOIS)
+        throws IOException, ClassNotFoundException {
+
+        anOIS.defaultReadObject();
+
+        if(! (theStub instanceof RemoteMethodControl) ) {
+            throw new InvalidObjectException("space does not implement RemoteMethodControl");
+        }
+    }
+}