Mercurial > hg > blitz_condensed
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/dancres/blitz/remote/ConstrainableBlitzProxy.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,198 @@ +package org.dancres.blitz.remote; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.InvalidObjectException; + +import java.lang.reflect.Method; + +import java.rmi.MarshalledObject; + +import java.util.Collection; +import java.util.List; + +import net.jini.admin.Administrable; + +import net.jini.core.transaction.Transaction; + +import net.jini.core.entry.Entry; + +import net.jini.space.JavaSpace; + +import net.jini.core.event.RemoteEventListener; + +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 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 Space duties to support + appropriate constraints etc. + */ +public final class ConstrainableBlitzProxy extends + BlitzProxy implements RemoteMethodControl { + + /** + The outer-layer calls all feature Entry.class whilst the server + calls use MangledEntry so we must translate constraints which will be + applied against the outer-layer methods to the internal methods. + */ + private static final Method[] theMethodMapping = { + ReflectUtil.findMethod(JavaSpace.class, "write", + new Class[] {Entry.class, Transaction.class, + long.class}), + ReflectUtil.findMethod(BlitzServer.class, "write", + new Class[] {MangledEntry.class, + Transaction.class, long.class}), + + ReflectUtil.findMethod(JavaSpace.class, "read", + new Class[] {Entry.class, Transaction.class, + long.class}), + ReflectUtil.findMethod(BlitzServer.class, "read", + new Class[] {MangledEntry.class, + Transaction.class, long.class}), + + ReflectUtil.findMethod(JavaSpace.class, "readIfExists", + new Class[] {Entry.class, Transaction.class, + long.class}), + ReflectUtil.findMethod(BlitzServer.class, "readIfExists", + new Class[] {MangledEntry.class, + Transaction.class, long.class}), + + ReflectUtil.findMethod(JavaSpace.class, "take", + new Class[] {Entry.class, Transaction.class, + long.class}), + ReflectUtil.findMethod(BlitzServer.class, "take", + new Class[] {MangledEntry.class, + Transaction.class, long.class}), + + ReflectUtil.findMethod(JavaSpace.class, "takeIfExists", + new Class[] {Entry.class, Transaction.class, + long.class}), + ReflectUtil.findMethod(BlitzServer.class, "takeIfExists", + new Class[] {MangledEntry.class, + Transaction.class, long.class}), + + ReflectUtil.findMethod(JavaSpace.class, "notify", + new Class[] {Entry.class, Transaction.class, + RemoteEventListener.class, + long.class, + MarshalledObject.class}), + ReflectUtil.findMethod(BlitzServer.class, "notify", + new Class[] {MangledEntry.class, + Transaction.class, + RemoteEventListener.class, + long.class, + MarshalledObject.class}), + + ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, + "registerForAvailabilityEvent", + new Class[] {Collection.class, Transaction.class, + boolean.class, + RemoteEventListener.class, + long.class, + MarshalledObject.class}), + ReflectUtil.findMethod(JS05Server.class, + "registerForVisibility", + new Class[] {MangledEntry[].class, + Transaction.class, + RemoteEventListener.class, + long.class, + MarshalledObject.class, + boolean.class}), + + ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, "write", + new Class[] {List.class, + Transaction.class, + List.class}), + ReflectUtil.findMethod(JS05Server.class, "write", + new Class[] {List.class, + Transaction.class, + List.class}), + + ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, "take", + new Class[] {Collection.class, + Transaction.class, + long.class, + long.class}), + ReflectUtil.findMethod(JS05Server.class, "take", + new Class[] {MangledEntry[].class, + Transaction.class, + long.class, + long.class}), + + ReflectUtil.findMethod(net.jini.space.JavaSpace05.class, "contents", + new Class[] {Collection.class, + Transaction.class, + long.class, + long.class}), + ReflectUtil.findMethod(EntryViewAdmin.class, "newView", + new Class[] {MangledEntry[].class, + Transaction.class, + long.class, boolean.class, + long.class, int.class}), + + ReflectUtil.findMethod(Administrable.class, "getAdmin", + new Class[] {}), + ReflectUtil.findMethod(BlitzServer.class, "getAdmin", + new Class[] {}) + }; + + private static BlitzServer constrainStub(BlitzServer aServer, + MethodConstraints aConstraints) { + RemoteMethodControl myServer = (RemoteMethodControl) aServer; + + MethodConstraints myStubConstraints = + ConstrainableProxyUtil.translateConstraints(aConstraints, + theMethodMapping); + + myServer.setConstraints(myStubConstraints); + return (BlitzServer) myServer; + } + + private final MethodConstraints theConstraints; + + ConstrainableBlitzProxy(BlitzServer aBlitz, Uuid aUuid) { + super(aBlitz, aUuid); + theConstraints = null; + } + + private ConstrainableBlitzProxy(BlitzServer aBlitz, Uuid aUuid, + MethodConstraints aConstraints) { + super(constrainStub(aBlitz, aConstraints), aUuid); + theConstraints = aConstraints; + } + + private ProxyTrustIterator getProxyTrustIterator() { + return new SingletonProxyTrustIterator(theStub); + } + + public RemoteMethodControl setConstraints(MethodConstraints aConstraints) { + return new ConstrainableBlitzProxy(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"); + } + } +}