You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2007/09/23 14:02:52 UTC

svn commit: r578566 [3/4] - in /geronimo/sandbox/gshell/trunk/gshell-whisper: ./ src/ src/main/java/org/apache/geronimo/gshell/remote/ src/main/java/org/apache/geronimo/gshell/whisper/ src/main/java/org/apache/geronimo/gshell/whisper/crypto/ src/main/j...

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.request;
+
+import org.apache.geronimo.gshell.common.tostring.ToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+
+//
+// NOTE: Snatched and massaged from Apache Mina
+//
+
+/**
+ * Represents a response to a request message.
+ *
+ * @version $Rev$ $Date$
+ */
+public class Response
+{
+    private final Request request;
+
+    private final Type type;
+
+    private final Message message;
+
+    public Response(final Request request, final Message message, final Type type) {
+        this.request = request;
+        this.type = type;
+        this.message = message;
+    }
+
+    public int hashCode() {
+        return getRequest().getId().hashCode();
+    }
+
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        else if (obj == null) {
+            return false;
+        }
+        else if (!(obj instanceof Response)) {
+            return false;
+        }
+
+        Response resp = (Response) obj;
+
+        return getRequest().equals(resp.getRequest()) && getType().equals(resp.getType());
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+                .append("id", getId())
+                .append("responseTo", getRequest().getId())
+                .append("message", message)
+                .toString();
+    }
+
+    public Request getRequest() {
+        return request;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public Message getMessage() {
+        return message;
+    }
+
+    public MessageID getId() {
+        return getMessage().getId();
+    }
+
+    //
+    // Response Type
+    //
+
+    public static enum Type
+    {
+        WHOLE,
+        PARTIAL,
+        PARTIAL_LAST
+    }
+}

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Response.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Provides support for synchronous request/response messaging.
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.whisper.request;
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.session;
+
+import org.apache.mina.common.IoSession;
+
+/**
+ * Helper to manage binding operations for typed session attribute objects.
+ *
+ * @version $Rev$ $Date$
+ */
+public class SessionAttributeBinder<T>
+{
+    private final String key;
+
+    public SessionAttributeBinder(final String key) {
+        assert key != null;
+        
+        this.key = key;
+    }
+
+    public SessionAttributeBinder(final Class type) {
+        this(type.getName());
+    }
+
+    public SessionAttributeBinder(final Class type, final String suffix) {
+        this(type.getName() + "." + suffix);
+    }
+
+    public boolean isBound(final IoSession session) {
+        assert session != null;
+        
+        return session.containsAttribute(key);
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public T lookup(final IoSession session) {
+        assert session != null;
+
+        T obj = (T) session.getAttribute(key);
+
+        if (obj == null) {
+            throw new NotBoundException(key);
+        }
+
+        return obj;
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public T lookup(final IoSession session, final T defaultValue) {
+        assert session != null;
+
+        T obj = (T) session.getAttribute(key);
+
+        if (obj == null) {
+            return defaultValue;
+        }
+
+        return obj;
+    }
+
+    public T bind(final IoSession session, final T obj) {
+        assert session != null;
+        assert obj != null;
+        
+        Object prev = session.getAttribute(key);
+
+        if (prev != null) {
+            throw new AlreadyBoundException(key);
+        }
+
+        session.setAttribute(key, obj);
+
+        return obj;
+    }
+    
+    @SuppressWarnings({"unchecked"})
+    public T rebind(final IoSession session, final T obj) {
+        assert session != null;
+        assert obj != null;
+
+        T prev = (T) session.getAttribute(key);
+
+        session.setAttribute(key, obj);
+
+        return prev;
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public T unbind(final IoSession session) {
+        assert session != null;
+
+        return (T) session.removeAttribute(key);
+    }
+
+    public static class NotBoundException
+        extends RuntimeException
+    {
+        public NotBoundException(final String key) {
+            super(key);
+        }
+    }
+
+    public static class AlreadyBoundException
+        extends RuntimeException
+    {
+        public AlreadyBoundException(final String key) {
+            super(key);
+        }
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/SessionAttributeBinder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.session;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.geronimo.gshell.common.NamedThreadFactory;
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.ThreadModel;
+import org.apache.mina.filter.executor.ExecutorFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A custom {@link ThreadModel} to get some more control over the pool configuration as well as how threads are constructed.
+ *
+ * @version $Rev$ $Date$
+ */
+@SuppressWarnings({"FieldCanBeLocal"})
+public class ThreadPoolModel
+    implements ThreadModel
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final ThreadPoolExecutor threadPool;
+
+    private final ExecutorFilter filter;
+
+    public ThreadPoolModel(final String name) {
+        assert name != null;
+
+        ThreadGroup group = new ThreadGroup(name);
+
+        ThreadFactory tf = new NamedThreadFactory(name, group);
+
+        //
+        // TODO: See which is better SynchronousQueue<Runnable> or LinkedBlockingQueue<Runnable>
+        //
+
+        threadPool = new ThreadPoolExecutor(
+                1,
+                Integer.MAX_VALUE,
+                60L,
+                TimeUnit.SECONDS,
+                new LinkedBlockingQueue<Runnable>(),
+                tf,
+                new ThreadPoolExecutor.AbortPolicy());
+
+        filter = new ExecutorFilter(threadPool);
+    }
+
+    public void close() {
+        //
+        // FIXME: This causes some problems when a rsh client closes, like:
+        //
+        //        java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThread)
+        //
+
+        /*
+        List<Runnable> pending = threadPool.shutdownNow();
+
+        if (!pending.isEmpty()) {
+            log.warn("There were {} pending tasks which have not been run", pending.size());
+        }
+        */
+    }
+    
+    //
+    // ThreadModel
+    //
+
+    public void buildFilterChain(final IoFilterChain chain) throws Exception {
+        assert chain != null;
+        
+        chain.addFirst(getClass().getSimpleName(), filter);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/ThreadPoolModel.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Session support.
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.whisper.session;
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/session/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,197 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+//
+// NOTE: Snatched and massaged from Apache Mina'a Examples
+//
+
+package org.apache.geronimo.gshell.whisper.ssl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.GeneralSecurityException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.Security;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.ManagerFactoryParameters;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactorySpi;
+import javax.net.ssl.X509TrustManager;
+
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+import org.codehaus.plexus.util.IOUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Factory to create a bougus SSLContext.
+ *
+ * @version $Rev$ $Date$
+ */
+@Component(role=SSLContextFactory.class) // HACK: hint="bogus")
+public class BogusSSLContextFactory
+    implements SSLContextFactory, Initializable
+{
+    private static final String PROTOCOL = "TLS";
+
+    private static final String DEFAULT_KEY_MANAGER_FACTORY_ALGORITHM = "SunX509";
+
+    private static final String KEY_MANAGER_FACTORY_ALGORITHM;
+
+    static {
+        String algorithm = Security.getProperty("ssl.KeyManagerFactory.algorithm");
+        
+        if (algorithm == null) {
+            algorithm = DEFAULT_KEY_MANAGER_FACTORY_ALGORITHM;
+        }
+
+        KEY_MANAGER_FACTORY_ALGORITHM = algorithm;
+    }
+
+    //
+    // NOTE: The keystore was generated using keytool:
+    //   keytool -genkey -alias bogus -keysize 512 -validity 3650
+    //           -keyalg RSA -dname "CN=bogus.com, OU=XXX CA,
+    //               O=Bogus Inc, L=Stockholm, S=Stockholm, C=SE"
+    //           -keypass boguspw -storepass boguspw -keystore bogus.cert
+
+    private Logger log = LoggerFactory.getLogger(getClass());
+
+    // @Configuration
+    private boolean preload = true;
+
+    // @Configuration
+    private String keystoreResource = "bogus.cert";
+
+    // @Configuration
+    private char[] keystorePassword = { 'b', 'o', 'g', 'u', 's', 'p', 'w' };
+
+    private SSLContext serverInstance;
+
+    private SSLContext clientInstance;
+
+    public synchronized void initialize() throws InitializationException {
+        if (preload) {
+            log.debug("Preloading SSLContext instances");
+            
+            try {
+                createServerContext();
+                createClientContext();
+            }
+            catch (GeneralSecurityException e) {
+                throw new InitializationException("Failed to setup SSLContext instances", e);
+            }
+        }
+    }
+
+    //
+    // SSLContextFactory
+    //
+
+    public synchronized SSLContext createServerContext() throws GeneralSecurityException {
+        if (serverInstance == null) {
+            KeyStore keyStore;
+
+            try {
+                keyStore = KeyStore.getInstance("JKS");
+
+                InputStream in = getClass().getResourceAsStream(keystoreResource);
+                if (in == null) {
+                    throw new GeneralSecurityException("Failed to load bogus keystore from resource: " + keystoreResource);
+                }
+
+                try {
+                    keyStore.load(in, keystorePassword);
+                }
+                finally {
+                    IOUtil.close(in);
+                }
+            }
+            catch (IOException e) {
+                throw new GeneralSecurityException("Failed to load bogus keystore", e);
+            }
+
+            // Set up key manager factory to use our key store
+            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KEY_MANAGER_FACTORY_ALGORITHM);
+            keyManagerFactory.init(keyStore, keystorePassword);
+
+            // Initialize the SSLContext to work with our key managers.
+            SSLContext context = SSLContext.getInstance(PROTOCOL);
+            context.init(keyManagerFactory.getKeyManagers(), BogusTrustManagerFactory.X509_MANAGERS, null);
+
+            serverInstance = context;
+
+            log.debug("Created server SSLContext: {}", serverInstance);
+        }
+
+        return serverInstance;
+    }
+
+    public synchronized SSLContext createClientContext() throws GeneralSecurityException {
+        if (clientInstance == null) {
+            SSLContext context = SSLContext.getInstance(PROTOCOL);
+            context.init(null, BogusTrustManagerFactory.X509_MANAGERS, null);
+
+            clientInstance = context;
+
+            log.debug("Created client SSLContext: {}", clientInstance);
+        }
+
+        return clientInstance;
+    }
+
+    //
+    // BogusTrustManagerFactory
+    //
+
+    private static class BogusTrustManagerFactory
+        extends TrustManagerFactorySpi
+    {
+        private static final X509TrustManager X509 = new X509TrustManager() {
+            public void checkClientTrusted(X509Certificate[] c, String s) throws CertificateException {}
+
+            public void checkServerTrusted(X509Certificate[] c, String s) throws CertificateException {}
+
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[0];
+            }
+        };
+
+        private static final TrustManager[] X509_MANAGERS = { X509 };
+
+        @Override
+        protected TrustManager[] engineGetTrustManagers() {
+            return X509_MANAGERS;
+        }
+
+        @Override
+        protected void engineInit(KeyStore keystore) throws KeyStoreException {}
+
+        @Override
+        protected void engineInit(ManagerFactoryParameters managerFactoryParameters) throws InvalidAlgorithmParameterException {}
+    }
+}

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/BogusSSLContextFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+//
+// NOTE: Snatched from Apache Mina'a Examples
+//
+
+package org.apache.geronimo.gshell.whisper.ssl;
+
+import java.security.GeneralSecurityException;
+
+import javax.net.ssl.SSLContext;
+
+/**
+ * Provides an abstraction of client and server {@link SSLContext} creation.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface SSLContextFactory
+{
+    /**
+     * Creates a {@link SSLContext} suiteable for server-side usage.
+     */
+    SSLContext createServerContext() throws GeneralSecurityException;
+
+    /**
+     * Creates a {@link SSLContext} suiteable for client-side usage.
+     */
+    SSLContext createClientContext() throws GeneralSecurityException;
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/SSLContextFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Support for SSL.
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.whisper.ssl;
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/ssl/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.stream;
+
+//
+// NOTE: Snatched and massaged from Apache Mina
+//
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.geronimo.gshell.common.NestedIOException;
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.session.SessionAttributeBinder;
+import org.apache.mina.common.ByteBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An {@link InputStream} that buffers data read from {@link StreamMessage} messages.
+ *
+ * @version $Rev$ $Date$
+ */
+public class SessionInputStream
+    extends InputStream
+{
+    public static final SessionAttributeBinder<SessionInputStream> BINDER = new SessionAttributeBinder<SessionInputStream>(SessionInputStream.class);
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final Object mutex = new Object();
+
+    private final ByteBuffer buff;
+
+    private volatile boolean closed;
+
+    private volatile boolean released;
+
+    private IOException exception;
+
+    public SessionInputStream() {
+        buff = ByteBuffer.allocate(16);
+        buff.setAutoExpand(true);
+        buff.limit(0);
+    }
+
+    public String toString() {
+        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+    }
+
+    public int available() {
+        if (released) {
+            return 0;
+        }
+        else {
+            synchronized (mutex) {
+                return buff.remaining();
+            }
+        }
+    }
+
+    public void close() {
+        if (closed) {
+            return;
+        }
+
+        synchronized (mutex) {
+            closed = true;
+
+            releaseBuffer();
+
+            mutex.notifyAll();
+        }
+    }
+
+    public int read() throws IOException {
+        synchronized (mutex) {
+            if (!waitForData()) {
+                return -1;
+            }
+
+            return buff.get() & 0xff;
+        }
+    }
+
+    public int read(final byte[] b, final int off, final int len) throws IOException {
+        synchronized (mutex) {
+            if (!waitForData()) {
+                return -1;
+            }
+
+            int readBytes;
+
+            if (len > buff.remaining()) {
+                readBytes = buff.remaining();
+            }
+            else {
+                readBytes = len;
+            }
+
+            buff.get(b, off, readBytes);
+
+            return readBytes;
+        }
+    }
+
+    private boolean waitForData() throws IOException {
+        if (released) {
+            return false;
+        }
+
+        synchronized (mutex) {
+            while (!released && buff.remaining() == 0 && exception == null) {
+                try {
+                    mutex.wait();
+                }
+                catch (InterruptedException e) {
+                    throw new NestedIOException("Interrupted while waiting for more data");
+                }
+            }
+        }
+
+        if (exception != null) {
+            releaseBuffer();
+
+            throw exception;
+        }
+
+        if (closed && buff.remaining() == 0) {
+            releaseBuffer();
+
+            return false;
+        }
+
+        return true;
+    }
+
+    private void releaseBuffer() {
+        if (released) {
+            return;
+        }
+
+        released = true;
+    }
+
+    public void write(final StreamMessage msg) {
+        synchronized (mutex) {
+            if (closed) {
+                return;
+            }
+
+            ByteBuffer src = msg.getBuffer();
+
+            log.debug("Writing {} bytes", src.remaining());
+
+            if (buff.hasRemaining()) {
+                buff.compact();
+                buff.put(src);
+                buff.flip();
+            }
+            else {
+                buff.clear();
+                buff.put(src);
+                buff.flip();
+
+                mutex.notifyAll();
+            }
+        }
+    }
+
+    public void throwException(final IOException e) {
+        synchronized (mutex) {
+            if (exception == null) {
+                exception = e;
+
+                mutex.notifyAll();
+            }
+        }
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionInputStream.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.stream;
+
+//
+// NOTE: Snatched and massaged from Apache Mina
+//
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.session.SessionAttributeBinder;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An {@link OutputStream} that forwards all write operations as {@link StreamMessage} messages.
+ *
+ * @version $Rev$ $Date$
+ */
+public class SessionOutputStream
+    extends OutputStream
+{
+    public static final SessionAttributeBinder<SessionOutputStream> BINDER = new SessionAttributeBinder<SessionOutputStream>(SessionOutputStream.class);
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    
+    private final IoSession session;
+
+    private WriteFuture lastWriteFuture;
+
+    private volatile boolean opened;
+
+    public SessionOutputStream(final IoSession session) {
+        assert session != null;
+        
+        this.session = session;
+
+        this.opened = true;
+    }
+
+    public String toString() {
+        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+    }
+
+    public void close() throws IOException {
+        if (!opened) {
+            return;
+        }
+        
+        try {
+            flush();
+
+            opened = false;
+        }
+        finally {
+            super.close();
+        }
+    }
+
+    public void write(final byte[] b, final int off, final int len) throws IOException {
+        write(ByteBuffer.wrap(b.clone(), off, len));
+    }
+
+    public void write(final int b) throws IOException {
+        ByteBuffer buff = ByteBuffer.allocate(1);
+        buff.put((byte) b);
+        buff.flip();
+
+        write(buff);
+    }
+
+    private void ensureOpened() throws IOException {
+        if (!opened || !session.isConnected()) {
+            throw new IOException("The session has been closed.");
+        }
+    }
+    
+    private synchronized void write(final ByteBuffer buff) throws IOException {
+        ensureOpened();
+
+        log.debug("Writing {} bytes", buff.remaining());
+
+        WriteFuture wf = session.write(new StreamMessage(buff));
+
+        lastWriteFuture = wf;
+
+        wf.join();
+    }
+
+    public synchronized void flush() throws IOException {
+        ensureOpened();
+
+        if (lastWriteFuture == null) {
+            return;
+        }
+        
+        // Process the last write future and clear it
+        lastWriteFuture.join();
+
+        if (!lastWriteFuture.isWritten()) {
+            throw new IOException("Failed to fully write bytes to the session");
+        }
+    }
+}

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionOutputStream.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.stream;
+
+import org.apache.mina.common.IoFilterAdapter;
+import org.apache.mina.common.IoSession;
+import org.codehaus.plexus.util.IOUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides stream I/O handling.
+ *
+ * @version $Rev$ $Date$
+ */
+public class SessionStreamFilter
+    extends IoFilterAdapter
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    /**
+     * Setup the input and output streams for the session.
+     */
+    @Override
+    public void sessionCreated(final NextFilter nextFilter, final IoSession session) throws Exception {
+        SessionInputStream.BINDER.bind(session, new SessionInputStream());
+        SessionOutputStream.BINDER.bind(session, new SessionOutputStream(session));
+
+        nextFilter.sessionCreated(session);
+    }
+
+    /**
+     * Close the input and output streams for the session.
+     */
+    @Override
+    public void sessionClosed(final NextFilter nextFilter, final IoSession session) throws Exception {
+        IOUtil.close(SessionInputStream.BINDER.unbind(session));
+        IOUtil.close(SessionOutputStream.BINDER.unbind(session));
+
+        nextFilter.sessionClosed(session);
+    }
+
+    /**
+     * Handles write stream messages.
+     */
+    @Override
+    public void messageReceived(final NextFilter nextFilter, final IoSession session, final Object message) throws Exception {
+        if (message instanceof StreamMessage) {
+            StreamMessage msg = (StreamMessage) message;
+
+            SessionInputStream in = SessionInputStream.BINDER.lookup(session);
+
+            in.write(msg);
+
+            // There is no need to pass on this message to any other filters, they have no use for it...
+        }
+        else {
+            nextFilter.messageReceived(session, message);
+        }
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/SessionStreamFilter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.stream;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Feeds data from an input stream to an output stream.
+ *
+ * @version $Rev$ $Date$
+ */
+public class StreamFeeder
+    implements Runnable
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final InputStream input;
+
+    private final OutputStream output;
+
+    private volatile boolean running;
+
+    public StreamFeeder(final InputStream input, final OutputStream output) {
+        assert input != null;
+        assert output != null;
+        
+        this.input = input;
+        this.output = output;
+    }
+
+    public void run() {
+        running = true;
+
+        log.debug("Running");
+
+        //
+        // TODO: Look into using a byte[] buffer here to read larger chunks at the same time?
+        //
+        
+        try {
+            int b;
+
+            while (running && ((b = input.read()) != -1)) {
+                output.write(b);
+            }
+        }
+        catch (Throwable e) {
+            log.error("Feed failure: " + e, e);
+        }
+        finally {
+            close();
+        }
+
+        log.debug("Stopped");
+    }
+
+    public boolean isRunning() {
+        return running;
+    }
+    
+    public void close() {
+        running = false;
+        
+        log.debug("Closed");
+    }
+
+    private static final AtomicInteger THREAD_COUNTER = new AtomicInteger(0);
+
+    public Thread createThread() {
+        Thread t = new Thread(this, getClass().getSimpleName() + "-" + THREAD_COUNTER.getAndIncrement());
+
+        t.setDaemon(true);
+        
+        return t;
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamFeeder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.stream;
+
+import java.io.IOException;
+
+import org.apache.geronimo.gshell.whisper.marshal.Marshaller;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.MessageSupport;
+import org.apache.geronimo.gshell.whisper.message.MessageType;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.RuntimeIOException;
+
+/**
+ * Write a buffer to a stream.
+ *
+ * @version $Rev$ $Date$
+ */
+public class StreamMessage
+    extends MessageSupport
+{
+    private ByteBuffer buffer;
+
+    public StreamMessage(final Type type, final ByteBuffer buffer) {
+        super(type);
+
+        if (buffer != null) {
+            ByteBuffer tmp = ByteBuffer.allocate(buffer.remaining());
+
+            tmp.put(buffer);
+            tmp.flip();
+
+            this.buffer = tmp;
+        }
+    }
+
+    public StreamMessage(final ByteBuffer buffer) {
+        this(Type.IN, buffer);
+    }
+    
+    public StreamMessage() {
+        this(null, null);
+    }
+
+    public ByteBuffer getBuffer() {
+        return buffer;
+    }
+
+    public void setBuffer(final ByteBuffer buffer) {
+        this.buffer = buffer;
+    }
+
+    public void readExternal(final ByteBuffer in) throws Exception {
+        assert in != null;
+
+        buffer = Marshaller.readBuffer(in);
+    }
+
+    public void writeExternal(final ByteBuffer out) throws Exception {
+        assert out != null;
+
+        Marshaller.writeBuffer(out, buffer);
+    }
+
+    public static enum Type
+        implements MessageType
+    {
+
+        IN,  // (local SYSOUT to remote SYSIN)
+        OUT, // ???
+        ERR  // ???
+        ;
+
+        public Class<? extends Message> getType() {
+            return StreamMessage.class;
+        }
+
+        // Dynamically fitgure out how bit we are, assumes each enum is sized the same
+        private volatile Integer size;
+
+        public int size() {
+            if (size == null) {
+                try {
+                    size = Marshaller.marshall(IN).length;
+                }
+                catch (IOException e) {
+                    throw new RuntimeIOException(e);
+                }
+            }
+
+            return size;
+        }
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/StreamMessage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Support for remote input and output streaming.
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.whisper.stream;
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/stream/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+/**
+ * Thrown to indicate a connection related failure has occured.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ConnectException
+    extends TransportException
+{
+    private static final long serialVersionUID = 1;
+
+    public ConnectException(final String msg, final Throwable cause) {
+        super(msg, cause);
+    }
+
+    public ConnectException(final String msg) {
+        super(msg);
+    }
+
+    public ConnectException(final Throwable cause) {
+        super(cause);
+    }
+
+    public ConnectException() {
+        super();
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/ConnectException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.geronimo.gshell.common.Duration;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteFuture;
+
+/**
+ * Provides the client-side protocol interface.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface Transport
+{
+    URI getRemoteLocation();
+
+    URI getLocalLocation();
+
+    IoService getService();
+
+    IoSession getSession();
+
+    void connect() throws Exception;
+
+    boolean isConnected();
+
+    void close();
+    
+    WriteFuture send(Object msg) throws Exception;
+
+    Message request(Message msg, Duration timeout) throws Exception;
+
+    Message request(Message msg, long timeout, TimeUnit unit) throws Exception;
+
+    Message request(Message msg) throws Exception;
+
+    InputStream getInputStream();
+
+    OutputStream getOutputStream();
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/Transport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+/**
+ * Thrown to indicate a transport failure has occured.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TransportException
+    extends RuntimeException
+{
+    private static final long serialVersionUID = 1;
+
+    public TransportException(final String msg, final Throwable cause) {
+        super(msg, cause);
+    }
+
+    public TransportException(final String msg) {
+        super(msg);
+    }
+
+    public TransportException(final Throwable cause) {
+        super(cause);
+    }
+
+    public TransportException() {
+        super();
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+import org.apache.mina.common.ExceptionMonitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class TransportExceptionMonitor
+    extends ExceptionMonitor
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    public void exceptionCaught(final Throwable cause) {
+        assert cause != null;
+
+        log.error("Unhandled exception: " + cause, cause);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportExceptionMonitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+import java.net.URI;
+
+/**
+ * Factory for producing client and server transport implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface TransportFactory
+{
+    Transport connect(final URI remote, final URI local) throws Exception;
+
+    Transport connect(final URI remote) throws Exception;
+
+    TransportServer bind(final URI location) throws Exception;
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+import java.net.URI;
+
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+/**
+ * Helper to locate a {@link TransportFactory} instance.
+ *
+ * @version $Rev$ $Date$
+ */
+@Component(role=TransportFactoryLocator.class)
+public class TransportFactoryLocator
+{
+    @Requirement
+    private PlexusContainer container;
+
+    public TransportFactory locate(final URI location) throws MissingSchemeException, ComponentLookupException {
+        assert location != null;
+
+        String scheme = location.getScheme();
+
+        if (scheme == null) {
+            throw new MissingSchemeException(location);
+        }
+
+        return (TransportFactory) container.lookup(TransportFactory.class, scheme);
+    }
+
+    public static class MissingSchemeException
+        extends TransportException
+    {
+        public MissingSchemeException(final URI location) {
+            super("Invalid location; missing scheme: " + location);
+        }
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportFactoryLocator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport;
+
+import java.net.URI;
+
+import org.apache.mina.common.IoService;
+
+/**
+ * Provides the server-side protocol interface.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface TransportServer
+{
+    URI getLocation();
+
+    IoService getService();
+
+    void bind() throws Exception;
+
+    boolean isBound();
+
+    void close();
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/TransportServer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/base/BaseCommon.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/base/BaseCommon.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/base/BaseCommon.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/transport/base/BaseCommon.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,256 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.whisper.transport.base;
+
+import java.net.SocketAddress;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.whisper.message.MessageHandler;
+import org.apache.geronimo.gshell.whisper.message.spi.MessageProvider;
+import org.apache.geronimo.gshell.whisper.request.RequestResponseFilter;
+import org.apache.geronimo.gshell.whisper.stream.SessionStreamFilter;
+import org.apache.geronimo.gshell.whisper.transport.Transport;
+import org.apache.geronimo.gshell.whisper.transport.TransportExceptionMonitor;
+import org.apache.geronimo.gshell.whisper.transport.TransportServer;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.common.ExceptionMonitor;
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.SimpleByteBufferAllocator;
+import org.apache.mina.filter.LoggingFilter;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.codehaus.plexus.PlexusContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Common bits for {@link Transport} and {@link TransportServer} implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public abstract class BaseCommon
+{
+    static {
+        // Setup our exception monitor
+        ExceptionMonitor.setInstance(new TransportExceptionMonitor());
+        
+        // Make sure that we use non-pooled fast buffers
+        ByteBuffer.setUseDirectBuffers(false);
+        ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
+    }
+
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+
+    private IoHandler handler;
+
+    private IoService service;
+
+    // private StatCollector statCollector;
+
+    public String toString() {
+        return ReflectionToStringBuilder.toString(this);
+    }
+
+    protected IoHandler getHandler() {
+        if (handler == null) {
+            throw new IllegalStateException("Handler not bound");
+        }
+        
+        return handler;
+    }
+
+    public IoService getService() {
+        return service;
+    }
+
+    //
+    // Configuration
+    //
+    
+    protected void configure(final IoService service) throws Exception {
+        assert service != null;
+
+        this.service = service;
+
+        service.addListener(new IoServiceListener() {
+            public void serviceActivated(final IoService service, final SocketAddress serviceAddress, final IoHandler handler, final IoServiceConfig config) {
+                log.info("Service activated: {}", service);
+
+                // log.info("Service activated: {}, {}, {}, {}", service, serviceAddress, handler, config);
+
+                logFilters(service);
+            }
+
+            public void serviceDeactivated(final IoService service, final SocketAddress serviceAddress, final IoHandler handler, final IoServiceConfig config) {
+                log.info("Service deactivated: {}", service);
+
+                // log.info("Service deactivated: {}, {}, {}, {}", service, serviceAddress, handler, config);
+            }
+
+            public void sessionCreated(final IoSession session) {
+                log.info("Session created: {}", session);
+
+                logFilters(session);
+            }
+
+            public void sessionDestroyed(final IoSession session) {
+                log.info("Session destroyed: {}", session);
+            }
+        });
+
+        // Setup the io handler
+        handler = getMessageHandler();
+
+        // Install the default set of filters
+        configure(service.getFilterChain());
+
+        //
+        // TODO: Start up a scheduled task to periodically log stats
+        //
+
+        // Setup stat collection
+        // statCollector = new StatCollector(service);
+        // statCollector.start();
+    }
+
+    protected void configure(final DefaultIoFilterChainBuilder chain) throws Exception {
+        assert chain != null;
+
+        // chain.addLast(ProfilerTimerFilter.class.getSimpleName(), new ProfilerTimerFilter());
+
+        //
+        // TODO: Test this guy out....
+        //
+        // chain.addLast(CryptoContextInjectingFilter.class.getSimpleName(), new CryptoContextInjectingFilter(getProvider().getCryptoContext()));
+
+        chain.addLast(ProtocolCodecFilter.class.getSimpleName(), new ProtocolCodecFilter(getProvider().getProtocolCodecFactory()));
+        
+        chain.addLast(LoggingFilter.class.getSimpleName(), new LoggingFilter());
+
+        chain.addLast(SessionStreamFilter.class.getSimpleName(), new SessionStreamFilter());
+
+        chain.addLast(RequestResponseFilter.class.getSimpleName(), new RequestResponseFilter());
+    }
+
+    public void close() {
+        // statCollector.stop();
+    }
+
+    //
+    // Logging Helpers
+    //
+    
+    protected void logFilters(final IoService service) {
+        assert service != null;
+
+        log.debug("Service filters:");
+
+        for (IoFilterChain.Entry entry : service.getFilterChain().getAll()) {
+            log.debug("    {}", entry);
+        }
+    }
+
+    protected void logFilters(final IoSession session) {
+        assert session != null;
+        
+        log.debug("Session filters:");
+
+        for (IoFilterChain.Entry entry : session.getFilterChain().getAll()) {
+            log.debug("    {}", entry);
+        }
+    }
+
+    /*
+    protected void logStats(final IoSession session) {
+        assert session != null;
+
+        IoSessionStat stat = (IoSessionStat) session.getAttribute(StatCollector.KEY);
+
+        if (stat != null) {
+            log.debug("Stats: {}", ReflectionToStringBuilder.toString(stat, ToStringStyle.SHORT_PREFIX_STYLE));
+        }
+    }
+    */
+    
+    //
+    // AutoWire Support, Setters exposed to support Plexus autowire()  Getters exposed to handle state checking.
+    //
+
+    private PlexusContainer container;
+
+    private MessageProvider provider;
+
+    private MessageHandler messageHandler;
+
+    public void setMessageHandler(final MessageHandler messageHandler) {
+        assert messageHandler != null;
+
+        log.trace("Using message handler: {}", messageHandler);
+
+        this.messageHandler = messageHandler;
+    }
+
+    protected MessageHandler getMessageHandler() {
+        if (messageHandler == null) {
+            throw new IllegalStateException("Message handler not bound");
+        }
+
+        return messageHandler;
+    }
+    
+    public void setProvider(final MessageProvider provider) {
+        assert provider != null;
+
+        log.trace("Using provider: {}", provider);
+
+        this.provider = provider;
+    }
+
+    protected MessageProvider getProvider() {
+        if (provider == null) {
+            throw new IllegalStateException("Provider not bound");
+        }
+
+        return provider;
+    }
+
+    //
+    // HACK: Added for manual wiring of the message visitor, autowire() can't seem to handle it... :-(
+    //
+
+    public void setContainer(final PlexusContainer container) {
+        log.trace("Using plexus container: {}", container);
+
+        this.container = container;
+    }
+
+    protected PlexusContainer getContainer() {
+        if (container == null) {
+            throw new IllegalStateException("Container not bound");
+        }
+
+        return container;
+    }
+}
\ No newline at end of file