Mercurial > hg > blitz_condensed
diff src/org/dancres/blitz/remote/ConstrainableLeaseImpl.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/ConstrainableLeaseImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,91 @@ +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.lease.Lease; + +import net.jini.admin.JoinAdmin; + +import net.jini.id.Uuid; + +import com.sun.jini.proxy.ConstrainableProxyUtil; + +import org.dancres.blitz.lease.SpaceUID; + +import org.dancres.util.ReflectUtil; + +/** + When running in "secure mode", Leases should be constrainable as per + other proxies. + */ +public final class ConstrainableLeaseImpl extends + LeaseImpl implements RemoteMethodControl { + + /** + The outer-layer calls all omit SpaceUID whilst the server + calls use SpaceUID 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(Lease.class, "renew", + new Class[] {long.class}), + ReflectUtil.findMethod(Landlord.class, "renew", + new Class[] {SpaceUID.class, long.class}), + ReflectUtil.findMethod(Lease.class, "cancel", + new Class[] {}), + ReflectUtil.findMethod(Landlord.class, "cancel", + new Class[] {SpaceUID.class}) + }; + + private static Landlord constrainStub(Landlord aServer, + MethodConstraints aConstraints) { + RemoteMethodControl myServer = (RemoteMethodControl) aServer; + + MethodConstraints myStubConstraints = + ConstrainableProxyUtil.translateConstraints(aConstraints, + theMethodMapping); + + myServer.setConstraints(myStubConstraints); + return (Landlord) myServer; + } + + private final MethodConstraints theConstraints; + + ConstrainableLeaseImpl(Landlord aLandlord, Uuid aUuid, SpaceUID aUID, + long aDuration) { + super(aLandlord, aUuid, aUID, aDuration); + theConstraints = null; + } + + ConstrainableLeaseImpl(Landlord aLandlord, Uuid aUuid, SpaceUID aUID, + long aDuration, MethodConstraints aConstraints) { + super(constrainStub(aLandlord, aConstraints), aUuid, aUID, + aDuration); + theConstraints = aConstraints; + } + + private ProxyTrustIterator getProxyTrustIterator() { + return new SingletonProxyTrustIterator(theStub); + } + + public RemoteMethodControl setConstraints(MethodConstraints aConstraints) { + return new ConstrainableLeaseImpl(theStub, theUuid, getUID(), + expiration, aConstraints); + } + + public MethodConstraints getConstraints() { + return theConstraints; + } +}