Mercurial > hg > blitz_stable
diff src/org/dancres/blitz/remote/txn/TransactionManagerImpl.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/txn/TransactionManagerImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,168 @@ +package org.dancres.blitz.remote.txn; + +import java.rmi.RemoteException; +import java.io.IOException; + +import net.jini.core.transaction.server.TransactionManager; +import net.jini.core.transaction.server.TransactionParticipant; +import net.jini.core.transaction.server.CrashCountException; +import net.jini.core.transaction.*; +import net.jini.core.lease.LeaseDeniedException; +import net.jini.core.lease.Lease; +import net.jini.core.entry.Entry; +import net.jini.core.lookup.ServiceID; +import net.jini.core.discovery.LookupLocator; +import net.jini.config.ConfigurationException; +import net.jini.config.NoSuchEntryException; +import net.jini.export.Exporter; +import net.jini.lookup.JoinManager; +import net.jini.lookup.ServiceIDListener; +import net.jini.lookup.entry.ServiceInfo; +import net.jini.lookup.entry.Name; +import net.jini.discovery.LookupDiscoveryManager; +import net.jini.id.Uuid; + +import com.sun.jini.lookup.entry.BasicServiceType; + +import org.dancres.blitz.config.ConfigurationFactory; +import org.dancres.blitz.VersionInfo; +import org.dancres.blitz.remote.BlitzServer; +import org.dancres.blitz.remote.ProxyFactory; + +/** + */ +public class TransactionManagerImpl implements TransactionManager, + ServiceIDListener { + + private JoinManager theJoinManager; + private Exporter theExporter; + private TransactionManager theStub; + private TransactionManager theProxy; + + private String[] theGroups; + private Entry[] theAttributes; + private LookupLocator[] theLocators; + + private BlitzServer theLandlord; + private Uuid theLandlordUuid; + + public TransactionManagerImpl(BlitzServer aLandlord, Uuid aLandlordUuid) + throws ConfigurationException, IOException { + theExporter = + ((Exporter) ConfigurationFactory.getEntry("loopbackTxnExporter", + Exporter.class, + null)); + + theGroups = (String[]) + ConfigurationFactory.getEntry("initialGroups", String[].class, + null); + + theLocators = + (LookupLocator[]) + ConfigurationFactory.getEntry("initialLocators", + LookupLocator[].class, + new LookupLocator[0]); + + String myName = null; + + try { + myName = + (String) + ConfigurationFactory.getEntry("name", String.class); + } catch (NoSuchEntryException aNSEE) { + // Doesn't matter + } + + theAttributes = getDefaultAttrs(myName); + + if (theExporter == null) { + // No exporter means we're not active + // + return; + } + + theStub = (TransactionManager) theExporter.export(this); + + LookupDiscoveryManager myLDM = + new LookupDiscoveryManager(theGroups, theLocators, null); + + theLandlord = aLandlord; + theLandlordUuid = aLandlordUuid; + + theProxy = new TxnMgrProxy(theStub, theLandlordUuid); + + LoopBackMgr.init(theProxy); + + theJoinManager = new JoinManager(theProxy, theAttributes, this, + myLDM, null, ConfigurationFactory.getConfig()); + } + + public void terminate() { + if (theJoinManager != null) { + theJoinManager.terminate(); + theExporter.unexport(true); + } + } + + public Created create(long leaseTime) throws LeaseDeniedException, + RemoteException { + + TxnTicket myTicket = LoopBackMgr.get().create(leaseTime); + + Lease myLease = + ProxyFactory.newLeaseImpl(theLandlord, theLandlordUuid, + myTicket.getUID(), myTicket.getLeaseTime()); + + return new TransactionManager.Created(myTicket.getUID().getId(), myLease); + } + + public void join(long id, TransactionParticipant transactionParticipant, long l1) + throws UnknownTransactionException, CannotJoinException, + CrashCountException, RemoteException { + throw new RemoteException("Remote participants are not supported - use Mahalo"); + } + + public int getState(long id) throws UnknownTransactionException, RemoteException { + throw new RemoteException("Remote participants are not supported - use Mahalo"); + } + + public void commit(long id) throws UnknownTransactionException, + CannotCommitException, RemoteException { + LoopBackMgr.get().commit(id); + } + + public void commit(long id, long timeout) throws UnknownTransactionException, + CannotCommitException, TimeoutExpiredException, RemoteException { + LoopBackMgr.get().commit(id, timeout); + } + + public void abort(long id) throws UnknownTransactionException, + CannotAbortException, RemoteException { + LoopBackMgr.get().abort(id); + } + + public void abort(long id, long timeout) throws UnknownTransactionException, + CannotAbortException, TimeoutExpiredException, RemoteException { + LoopBackMgr.get().abort(id, timeout); + } + + public void serviceIDNotify(ServiceID serviceID) { + // Don't care + } + + static Entry[] getDefaultAttrs(String aName) { + Entry myInfo = + new ServiceInfo("Blitz JavaSpaces Loopback TxnMgr", + VersionInfo.EMAIL_CONTACT, + VersionInfo.SUPPLIER_NAME, + VersionInfo.VERSION, "", ""); + + Entry myType = new BasicServiceType("TransactionManager"); + + if (aName != null) { + return new Entry[]{myInfo, myType, new Name(aName)}; + } else { + return new Entry[]{myInfo, myType}; + } + } +}