Mercurial > hg > blitz_condensed
diff src/org/dancres/blitz/remote/LeaseMapImpl.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/LeaseMapImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,108 @@ +package org.dancres.blitz.remote; + +import java.rmi.RemoteException; + +import java.util.Iterator; +import java.util.HashMap; + +import net.jini.core.lease.LeaseMapException; +import net.jini.core.lease.Lease; + +import com.sun.jini.lease.AbstractLeaseMap; + +import org.dancres.blitz.lease.SpaceUID; + +/** + @todo Check constraints are compatible + */ +class LeaseMapImpl extends AbstractLeaseMap { + private Landlord theLandlord; + + LeaseMapImpl(Lease aLease, long aDuration, Landlord aLandlord) { + super(aLease, aDuration); + theLandlord = aLandlord; + } + + public boolean canContainKey(Object aKey) { + if (aKey instanceof LeaseImpl) { + LeaseImpl myOther = (LeaseImpl) aKey; + + return (myOther.theStub.equals(theLandlord)); + } + + return false; + } + + public void cancelAll() throws LeaseMapException, RemoteException { + LeaseImpl[] myLeases = new LeaseImpl[size()]; + SpaceUID[] myUIDs = new SpaceUID[myLeases.length]; + + Iterator mySet = keySet().iterator(); + + for (int i = 0; mySet.hasNext(); i++) { + LeaseImpl myLease = (LeaseImpl) mySet.next(); + + myLeases[i] = myLease; + myUIDs[i] = myLease.getUID(); + } + + LeaseResults myResults = theLandlord.cancel(myUIDs); + + if (myResults == null) + return; + + HashMap myFails = new HashMap(); + + for (int i = 0; i < myResults.theFailures.length; i++) { + if (myResults.theFailures[i] != null) { + myFails.put(myLeases[i], myResults.theFailures[i]); + } + } + + throw new LeaseMapException("Some leases didn't cancel", myFails); + } + + public void renewAll() throws LeaseMapException, RemoteException { + LeaseImpl[] myLeases = new LeaseImpl[size()]; + SpaceUID[] myUIDs = new SpaceUID[myLeases.length]; + long[] myDurations = new long[myLeases.length]; + + Iterator mySet = keySet().iterator(); + + for (int i = 0; mySet.hasNext(); i++) { + LeaseImpl myLease = (LeaseImpl) mySet.next(); + + myLeases[i] = myLease; + myUIDs[i] = myLease.getUID(); + myDurations[i] = ((Long) get(myLease)).longValue(); + } + + LeaseResults myResults = theLandlord.renew(myUIDs, myDurations); + + long myNow = System.currentTimeMillis(); + + HashMap myFailed = null; + + for (int i = 0; i < myResults.theNewDurations.length; i++) { + long myDuration = myResults.theNewDurations[i]; + if (myDuration == -1) { + if (myFailed == null) + myFailed = new HashMap(); + + myFailed.put(myLeases[i], myResults.theFailures[i]); + + // Get this lease out of the map - it's "broken" + remove(myLeases[i]); + } else { + myDuration = myDuration + myNow; + if (myDuration < 0) + myDuration = Long.MAX_VALUE; + + myLeases[i].setExpiration(myDuration); + } + } + + if (myFailed != null) + throw new LeaseMapException("Renewing", myFailed); + } +}