Mercurial > hg > blitz_stable
diff src/org/dancres/blitz/remote/perf/ServiceImpl.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/perf/ServiceImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,299 @@ +package org.dancres.blitz.remote.perf; + +import java.io.IOException; +import java.io.File; +import java.io.ObjectOutputStream; +import java.io.FileOutputStream; + +import java.rmi.RemoteException; +import java.rmi.MarshalledObject; +import java.rmi.RMISecurityManager; + +import java.rmi.activation.ActivationID; +import java.rmi.activation.ActivationException; +import java.rmi.activation.ActivationSystem; +import java.rmi.activation.Activatable; + +import java.util.logging.Logger; +import java.util.logging.Level; + +import java.security.PrivilegedExceptionAction; +import java.security.PrivilegedActionException; + +import javax.security.auth.Subject; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; + +import net.jini.id.Uuid; +import net.jini.id.UuidFactory; + +import net.jini.config.ConfigurationException; +import net.jini.config.Configuration; + +import net.jini.export.ProxyAccessor; +import net.jini.export.Exporter; + +import net.jini.jeri.BasicILFactory; +import net.jini.jeri.BasicJeriExporter; + +import net.jini.jeri.tcp.TcpServerEndpoint; + +import net.jini.core.transaction.Transaction; +import net.jini.core.transaction.UnknownTransactionException; +import net.jini.core.transaction.TransactionException; + +import net.jini.core.lease.Lease; +import net.jini.core.lease.UnknownLeaseException; +import net.jini.core.lease.LeaseDeniedException; + +import net.jini.core.entry.Entry; + +import com.sun.jini.start.LifeCycle; + +import org.dancres.blitz.mangler.EntryMangler; +import org.dancres.blitz.mangler.MangledEntry; + +import org.dancres.blitz.lease.SpaceUID; + +import org.dancres.blitz.config.ConfigurationFactory; + +import org.dancres.blitz.notify.EventGenerator; + +import org.dancres.blitz.Logging; + +/** + */ +public class ServiceImpl implements Server { + static final String STUB_FILE = "stub.ser"; + + static final Logger theLogger = + Logging.newLogger("org.dancres.blitz.remote.perf", Level.INFO); + + private static ServiceImpl theServiceImpl; + + private Exporter theExporter; + + private Server theStub; + + private boolean isStopped = false; + + private Uuid theUuid = UuidFactory.generate(); + + private long theFakeExpiry = System.currentTimeMillis(); + + private MangledEntry theEntry; + + public static void main(String anArgs[]) { + + try { + theServiceImpl = new ServiceImpl(anArgs, null); + } catch (Exception anE) { + theLogger.log(Level.SEVERE, "Init failed", anE); + } + } + + /** + This constructor is required to use + com.sun.jini.start.NonActivatableServiceDescriptor. + */ + public ServiceImpl(String [] anArgs, LifeCycle aLifeCycle) + throws RemoteException, ConfigurationException { + + try { + init(anArgs); + } catch (ConfigurationException aCE) { + throw aCE; + } catch (RemoteException anRE) { + throw anRE; + } + + EntryMangler myMangler = new EntryMangler(); + + theEntry = myMangler.mangle(new DummyEntry("rhubarb")); + + /* + Keep a static reference to ourselves in order to avoid premature + GC + */ + theServiceImpl = this; + } + + /** + This constructor is required to use + com.sun.jini.start.SharedActivatableServiceDescriptor which invokes + on ActivateWrapper which will call this constructor. + SharedActivatabkeServiceDescriptor's serverConfigArgs are wrapped + into a MarshalledObject and pass in with the ActivationID. + */ + public ServiceImpl(ActivationID anActivationID, + MarshalledObject aData) + throws RemoteException, ConfigurationException { + + String[] myArgs = null; + + try { + myArgs = (String[]) aData.get(); + } catch (Exception anE) { + theLogger.log(Level.SEVERE, "Failed to unpacked marshalled args", + anE); + throw new RemoteException("Failed to unpack marshalled args"); + } + + try { + init(myArgs); + } catch (ConfigurationException aCE) { + throw aCE; + } catch (RemoteException anRE) { + throw anRE; + } + } + + private void init(String[] anArgs) throws ConfigurationException, + RemoteException { + + if (System.getSecurityManager() == null) + System.setSecurityManager(new RMISecurityManager()); + + if ((anArgs != null) && (anArgs.length > 0)) { + ConfigurationFactory.setup(anArgs); + } + + try { + doPriv(new PrivilegedInitImpl()); + } catch (Exception anE) { + anE.printStackTrace(System.err); + theLogger.log(Level.SEVERE, "Oops privilege problem?", anE); + throw new ConfigurationException("loginContext has insufficient privileges", anE); + } + } + + private Object doPriv(PrivilegedExceptionAction aPAE) + throws Exception { + + return aPAE.run(); + } + + private class PrivilegedInitImpl implements PrivilegedExceptionAction { + public Object run() throws Exception { + try { + initImpl(); + } catch (Exception anE) { + theLogger.log(Level.SEVERE, "Could init with subject", anE); + throw anE; + } + return null; + } + } + + private void initImpl() throws ConfigurationException, RemoteException { + Exporter myDefaultExporter = + new BasicJeriExporter(TcpServerEndpoint.getInstance(0), + new BasicILFactory(), false, true); + + ConfigurationFactory.setup(new String[] {"config/nettest.config"}); + + theExporter = + (Exporter) ConfigurationFactory.getEntry("serverExporter", + Exporter.class, + myDefaultExporter); + if (theExporter == null) { + throw new ConfigurationException("serverExporter must be non-null if it's specified"); + } + + System.err.println("Using exporter: " + theExporter); + + theStub = (Server) theExporter.export(this); + + Class[] myInterfaces = theStub.getClass().getInterfaces(); + + for (int i = 0; i < myInterfaces.length; i++) { + System.err.println("Stub supports: " + myInterfaces[i].getName()); + } + + try { + File myFlattenedStub = new File(STUB_FILE); + + ObjectOutputStream myOOS = + new ObjectOutputStream(new FileOutputStream(myFlattenedStub)); + + myOOS.writeObject(theStub); + + myOOS.close(); + } catch (IOException anIOE) { + throw new RemoteException("Oops, didn't save stub", anIOE); + } + + System.err.println("Stub saved in " + STUB_FILE + " - start client with it"); + } + + public Lease write(MangledEntry anEntry, Transaction aTxn, + long aLeaseTime) + throws RemoteException, TransactionException { + + stopBarrier(); + + return + ProxyFactory.newLeaseImpl(theStub, theUuid, + new FakeUID(), + theFakeExpiry); + } + + public MangledEntry read(MangledEntry anEntry, Transaction aTxn, + long aWaitTime) + throws RemoteException, TransactionException { + + stopBarrier(); + + return theEntry; + } + + /** + Used to check whether calls are blocked and, if they are, throws + a RemoteException back to the client. + */ + private void stopBarrier() throws RemoteException { + synchronized(this) { + if (isStopped) + throw new RemoteException("Space has been stopped"); + } + } + + public long renew(SpaceUID aUID, long aDuration) + throws UnknownLeaseException, LeaseDeniedException, RemoteException { + + // System.out.println("Renew: " + aUID + ", " + aDuration); + + stopBarrier(); + + throw new org.dancres.util.NotImplementedException(); + } + + public void cancel(SpaceUID aUID) + throws UnknownLeaseException, RemoteException { + + stopBarrier(); + + + throw new org.dancres.util.NotImplementedException(); + } + + public LeaseResults renew(SpaceUID[] aLeases, long[] aDurations) + throws RemoteException { + + stopBarrier(); + + throw new org.dancres.util.NotImplementedException(); + } + + public LeaseResults cancel(SpaceUID[] aLeases) + throws RemoteException { + + stopBarrier(); + + throw new org.dancres.util.NotImplementedException(); + } + + private Exception[] initFails(int aLength, int anOffset) { + return new Exception[aLength]; + } +}