diff src/org/dancres/blitz/remote/transport/StubImpl.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/transport/StubImpl.java	Sat Mar 21 11:00:06 2009 +0000
@@ -0,0 +1,412 @@
+package org.dancres.blitz.remote.transport;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.rmi.MarshalledObject;
+import java.rmi.RemoteException;
+import java.util.List;
+
+import net.jini.core.discovery.LookupLocator;
+import net.jini.core.entry.Entry;
+import net.jini.core.event.EventRegistration;
+import net.jini.core.event.RemoteEventListener;
+import net.jini.core.lease.LeaseDeniedException;
+import net.jini.core.lease.UnknownLeaseException;
+import net.jini.core.transaction.Transaction;
+import net.jini.core.transaction.TransactionException;
+import net.jini.core.transaction.UnknownTransactionException;
+import net.jini.core.transaction.server.TransactionManager;
+import net.jini.space.JavaSpace;
+
+import org.dancres.blitz.EntryChit;
+import org.dancres.blitz.lease.SpaceUID;
+import org.dancres.blitz.mangler.MangledEntry;
+import org.dancres.blitz.remote.BlitzServer;
+import org.dancres.blitz.remote.LeaseImpl;
+import org.dancres.blitz.remote.LeaseResults;
+import org.dancres.blitz.remote.ViewResult;
+import org.dancres.blitz.remote.view.EntryViewUID;
+import org.dancres.blitz.stats.Stat;
+import org.dancres.blitz.stats.Switch;
+import org.apache.mina.common.*;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
+import org.apache.mina.filter.LoggingFilter;
+import org.apache.mina.transport.socket.nio.SocketConnector;
+import org.apache.mina.transport.socket.nio.SocketConnectorConfig;
+import org.apache.mina.transport.socket.nio.SocketSessionConfig;
+import edu.emory.mathcs.backport.java.util.concurrent.Executors;
+
+/**
+ */
+public class StubImpl implements BlitzServer {
+    private static final String HOSTNAME = "192.168.0.54";
+    private static final int PORT = 8080;
+    private static final int CONNECT_TIMEOUT = 30; // seconds
+
+    private IoSession _session;
+    private ClientSessionHandler _handler;
+
+    private Object _lock = new Object();
+    private int _nextConversationId;
+
+    private int nextConversationId() {
+        synchronized (_lock) {
+            return _nextConversationId++;
+        }
+    }
+
+    private synchronized IoSession getSession() throws RemoteException {
+        if (_session == null) {
+            SocketConnector connector = new SocketConnector();
+                // new SocketConnector(2, Executors.newFixedThreadPool(2));
+
+            // Change the worker timeout to 1 second to make the I/O thread quit soon
+            // when there's no connection to manage.
+            connector.setWorkerTimeout(1);
+
+            // Configure the service.
+            SocketConnectorConfig cfg = new SocketConnectorConfig();
+            cfg.setConnectTimeout(CONNECT_TIMEOUT);
+            cfg.getFilterChain().addLast(
+                "codec",
+                new ProtocolCodecFilter(new MessageCodecFactory()));
+
+            SocketSessionConfig mySConfig = (SocketSessionConfig)
+                cfg.getSessionConfig();
+            mySConfig.setTcpNoDelay(true);
+
+            // cfg.getFilterChain().addLast(
+            //     "codec",
+            //     new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
+            // cfg.getFilterChain().addLast("logger", new LoggingFilter());
+
+            _handler = new ClientSessionHandler();
+
+            for (; ;) {
+                try {
+                    ConnectFuture future = connector.connect(
+                        new InetSocketAddress(HOSTNAME, PORT),
+                        _handler, cfg);
+
+                    future.join();
+                    _session = future.getSession();
+                    break;
+                }
+                catch (RuntimeIOException anRIOE) {
+                    throw new RemoteException("Failed to connect", anRIOE);
+                }
+            }
+        }
+
+        return _session;
+    }
+
+    private synchronized ClientSessionHandler getHandler()
+        throws RemoteException {
+
+        if (_handler == null) {
+            getSession();
+        }
+
+        return _handler;
+    }
+
+    public void ping() throws RemoteException {
+        Message myMessage = MarshallUtil.marshall(new Ping(), 0);
+
+        getSession().write(myMessage);
+    }
+
+    public LeaseImpl write(MangledEntry anEntry, Transaction aTxn,
+                           long aLeaseTime) throws RemoteException,
+        TransactionException {
+
+        int myConversationId = nextConversationId();
+
+        Message myMessage =
+            MarshallUtil.marshall(new Write(anEntry, aTxn, aLeaseTime),
+                myConversationId);
+
+        ClientSessionHandler.Ticket myTicket =
+            getHandler().getTicket(myConversationId);
+
+        getSession().write(myMessage);
+
+        myMessage = myTicket.getResponse(Long.MAX_VALUE);
+
+        Object myResult = MarshallUtil.unmarshall(myMessage);
+
+        if (myResult instanceof Exception) {
+            if (myResult instanceof RemoteException)
+                throw (RemoteException) myResult;
+            else
+                throw (TransactionException) myResult;
+        } else {
+            return (LeaseImpl) myResult;
+        }
+    }
+
+    public MangledEntry take(MangledEntry anEntry, Transaction aTxn,
+                             long aWaitTime) throws RemoteException,
+        TransactionException {
+
+        int myConversationId = nextConversationId();
+
+        Message myMessage =
+            MarshallUtil.marshall(new Take(anEntry, aTxn, aWaitTime),
+                myConversationId);
+
+        ClientSessionHandler.Ticket myTicket =
+            getHandler().getTicket(myConversationId);
+
+        getSession().write(myMessage);
+
+        myMessage = myTicket.getResponse(aWaitTime);
+
+        if (myMessage == null)
+            return null;
+
+        Object myResult = MarshallUtil.unmarshall(myMessage);
+
+        if (myResult instanceof Exception) {
+            if (myResult instanceof RemoteException)
+                throw (RemoteException) myResult;
+            else
+                throw (TransactionException) myResult;
+        } else {
+            return (MangledEntry) myResult;
+        }
+    }
+
+    public MangledEntry read(MangledEntry anEntry, Transaction aTxn,
+                             long aWaitTime) throws RemoteException,
+        TransactionException {
+
+        int myConversationId = nextConversationId();
+
+        Message myMessage =
+            MarshallUtil.marshall(new Read(anEntry, aTxn, aWaitTime),
+                myConversationId);
+
+        ClientSessionHandler.Ticket myTicket =
+            getHandler().getTicket(myConversationId);
+
+        getSession().write(myMessage);
+
+        myMessage = myTicket.getResponse(Long.MAX_VALUE);
+
+        if (myMessage == null)
+            return null;
+
+        Object myResult = MarshallUtil.unmarshall(myMessage);
+
+        if (myResult instanceof Exception) {
+            if (myResult instanceof RemoteException)
+                throw (RemoteException) myResult;
+            else
+                throw (TransactionException) myResult;
+        } else {
+            return (MangledEntry) myResult;
+        }
+    }
+
+    public MangledEntry takeIfExists(MangledEntry anEntry, Transaction aTxn,
+                                     long aWaitTime) throws RemoteException,
+        TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public MangledEntry readIfExists(MangledEntry anEntry, Transaction aTxn,
+                                     long aWaitTime) throws RemoteException,
+        TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public EventRegistration notify(MangledEntry anEntry, Transaction aTxn,
+                                    RemoteEventListener aListener,
+                                    long aLeaseTime,
+                                    MarshalledObject aHandback) throws
+        RemoteException, TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Entry[] getLookupAttributes() throws RemoteException {
+        return new Entry[0];  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void addLookupAttributes(Entry[] entries) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void modifyLookupAttributes(Entry[] entries, Entry[] entries1) throws
+        RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public String[] getLookupGroups() throws RemoteException {
+        return new String[0];  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void addLookupGroups(String[] strings) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void removeLookupGroups(String[] strings) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void setLookupGroups(String[] strings) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public LookupLocator[] getLookupLocators() throws RemoteException {
+        return new LookupLocator[0];  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void addLookupLocators(LookupLocator[] lookupLocators) throws
+        RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void removeLookupLocators(LookupLocator[] lookupLocators) throws
+        RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void setLookupLocators(LookupLocator[] lookupLocators) throws
+        RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Stat[] getStats() throws RemoteException {
+        return new Stat[0];  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void setSwitches(Switch[] aListOfSwitches) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void backup(String aBackupDir) throws RemoteException, IOException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void requestSnapshot() throws RemoteException, TransactionException,
+        IOException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void shutdown() throws RemoteException, IOException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void clean() throws RemoteException, IOException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void reap() throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void destroy() throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public JavaSpace getJavaSpaceProxy() throws RemoteException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }/*
+    * @param isJavaSpace05 if <code>true</code> enforces any defined lease bounds
+    * and asserts locks when performing the scan/acquire internally.
+    * This is used internally to differentiate between old and new contents
+    * methods as JavaSpaceAdmin::contents does not do leases.
+    */
+    public ViewResult newView(MangledEntry[] aTemplates, Transaction aTxn,
+                              long aLeaseDuration, boolean isJavaSpace05,
+                              long aLimit, int anInitialChunk) throws
+        RemoteException, TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public EntryChit[] getNext(EntryViewUID aEntryViewUID,
+                               int aChunkSize) throws RemoteException {
+        return new EntryChit[0];  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void delete(Object aCookie) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void close(EntryViewUID aEntryViewUID) throws RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Object getServiceProxy() throws RemoteException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public int prepare(TransactionManager transactionManager, long l) throws
+        UnknownTransactionException, RemoteException {
+        return 0;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void commit(TransactionManager transactionManager, long l) throws
+        UnknownTransactionException, RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void abort(TransactionManager transactionManager, long l) throws
+        UnknownTransactionException, RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public int prepareAndCommit(TransactionManager transactionManager,
+                                long l) throws UnknownTransactionException,
+        RemoteException {
+        return 0;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public List write(List aMangledEntries, Transaction aTxn,
+                      List aLeaseTimes) throws RemoteException,
+        TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public List take(MangledEntry[] aTemplates, Transaction aTxn,
+                     long aWaitTime, long aLimit) throws RemoteException,
+        TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public EventRegistration registerForVisibility(MangledEntry[] aTemplates,
+                                                   Transaction aTxn,
+                                                   RemoteEventListener aListener,
+                                                   long aLeaseTime,
+                                                   MarshalledObject aHandback,
+                                                   boolean visibilityOnly) throws
+        RemoteException, TransactionException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public LeaseResults renew(SpaceUID[] aLeases, long[] aDurations) throws
+        RemoteException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public LeaseResults cancel(SpaceUID[] aLeases) throws RemoteException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public long renew(SpaceUID aUID, long aDuration) throws
+        UnknownLeaseException, LeaseDeniedException, RemoteException {
+        return 0;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void cancel(SpaceUID aUID) throws UnknownLeaseException,
+        RemoteException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Object getAdmin() throws RemoteException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+}