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 [2/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/message/spi/DefaultMessageMarshaller.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageMarshaller.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageMarshaller.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageMarshaller.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,115 @@
+/*
+ * 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.message.spi;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.channels.Channels;
+import java.nio.channels.WritableByteChannel;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.crypto.CryptoContextAware;
+import org.apache.geronimo.gshell.whisper.marshal.Marshaller;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.MessageType;
+import org.apache.mina.common.ByteBuffer;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultMessageMarshaller
+    implements MessageMarshaller
+{
+    private final MessageProvider provider;
+
+    public DefaultMessageMarshaller(final MessageProvider provider) {
+        this.provider = provider;
+    }
+
+    public String toString() {
+        return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+    }
+    
+    public void marshal(final ByteBuffer out, final Message msg) throws Exception {
+        MessageHeader header = provider.getMessageHeader();
+
+        header.writeExternal(out);
+
+        Marshaller.writeObject(out, msg.getType());
+
+        // Determine the length of the message body
+        out.mark();
+        out.putInt(0);
+        msg.writeExternal(out);
+
+        int bodyStart = header.size();
+        int pos = out.position();
+        int len = pos - bodyStart;
+
+        out.reset();
+
+        // Write the length of the body
+        out.putInt(len);
+        out.position(pos);
+        out.limit(pos);
+        out.flip();
+    }
+
+    public byte[] marshal(final Message msg) throws Exception {
+        ByteBuffer out = ByteBuffer.allocate(256, false);
+        out.setAutoExpand(true);
+
+        marshal(out, msg);
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        WritableByteChannel channel = Channels.newChannel(baos);
+        channel.write(out.buf());
+        channel.close();
+
+        return baos.toByteArray();
+    }
+
+    public Message unmarshal(final ByteBuffer in) throws Exception {
+        MessageHeader header = provider.getMessageHeader();
+
+        header.readExternal(in);
+
+        MessageType type = (MessageType) Marshaller.readObject(in);
+
+        Message msg = provider.getMessageFactory().create(type);
+
+        //
+        // FIXME: This could be handled by the factory...
+        //
+
+        if (msg instanceof CryptoContextAware) {
+            ((CryptoContextAware)msg).setCryptoContext(provider.getCryptoContext());
+        }
+
+        int len = in.getInt(); // ignored for now
+
+        msg.readExternal(in);
+
+        return msg;
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageProvider.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageProvider.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageProvider.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/DefaultMessageProvider.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,138 @@
+/*
+ * 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.message.spi;
+
+import java.util.Set;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.crypto.CryptoContext;
+import org.apache.geronimo.gshell.whisper.request.RequestEncoder;
+import org.apache.mina.filter.codec.ProtocolCodecFactory;
+import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultMessageProvider
+    implements MessageProvider
+{
+    private MessageHeader header;
+
+    private Set<Class<?>> types;
+
+    private MessageFactory factory;
+
+    private MessageIDFactory idFactory;
+
+    private MessageMarshaller marshaller;
+    
+    private ProtocolCodecFactory codecFactory;
+
+    private CryptoContext cryptoContext;
+
+    public DefaultMessageProvider(final MessageHeader header, final Set<Class<?>> messageTypes) {
+        this.header = header;
+        
+        this.types = messageTypes;
+
+        this.factory = new DefaultMessageFactory();
+
+        this.idFactory = new LongMessageID.Factory();
+
+        this.marshaller = new DefaultMessageMarshaller(this);
+
+        DemuxingProtocolCodecFactory factory = new DemuxingProtocolCodecFactory();
+
+        factory.register(new MessageDecoder.Factory(this));
+
+        factory.register(new MessageEncoder.Factory(this));
+
+        //
+        // TODO: Need to find a better way to get this puppy registered na...
+        //
+
+        factory.register(new RequestEncoder.Factory(this));
+
+        this.codecFactory = factory;
+    }
+
+    public String toString() {
+        return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+    }
+
+    public MessageHeader getMessageHeader() {
+        return header;
+    }
+
+    public void setMessageHeader(final MessageHeader header) {
+        this.header = header;
+    }
+
+    public Set<Class<?>> getMessageTypes() {
+        return types;
+    }
+
+    public void setMessageTypes(final Set<Class<?>> types) {
+        this.types = types;
+    }
+
+    public MessageFactory getMessageFactory() {
+        return factory;
+    }
+
+    public void setMessageFactory(final MessageFactory factory) {
+        this.factory = factory;
+    }
+
+    public MessageIDFactory getMessageIDFactory() {
+        return idFactory;
+    }
+
+    public void setMessageIDFactory(final MessageIDFactory idFactory) {
+        this.idFactory = idFactory;
+    }
+
+    public MessageMarshaller getMessageMarshaller() {
+        return marshaller;
+    }
+
+    public void setMessageMarshaller(final MessageMarshaller marshaller) {
+        this.marshaller = marshaller;
+    }
+
+    public ProtocolCodecFactory getProtocolCodecFactory() {
+        return codecFactory;
+    }
+
+    public void setProtocolCodecFactory(final ProtocolCodecFactory factory) {
+        this.codecFactory = factory;
+    }
+
+    public CryptoContext getCryptoContext() {
+        return cryptoContext;
+    }
+
+    public void setCryptoContext(final CryptoContext context) {
+        this.cryptoContext = context;
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/LongMessageID.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/LongMessageID.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/LongMessageID.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/LongMessageID.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,86 @@
+/*
+ * 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.message.spi;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+import org.apache.mina.common.ByteBuffer;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class LongMessageID
+    implements MessageID
+{
+    private Long value;
+
+    public LongMessageID(final long value) {
+        this.value = value;
+    }
+
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        else if (obj == null) {
+            return false;
+        }
+        else if (!(obj instanceof LongMessageID)) {
+            return false;
+        }
+
+        return value.equals(((LongMessageID)obj).value);
+    }
+
+    public String toString() {
+        return String.valueOf(value);
+    }
+
+    public void writeExternal(final ByteBuffer out) throws Exception {
+        out.putLong(value);
+    }
+
+    public void readExternal(final ByteBuffer in) throws Exception {
+        value = in.getLong();
+    }
+
+    public static class Factory
+        implements MessageIDFactory
+    {
+        private static final AtomicLong COUNTER = new AtomicLong(0);
+        
+        public MessageID create() {
+            return new LongMessageID(COUNTER.getAndIncrement());
+        }
+
+        public String toString() {
+            return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+        }
+    }
+}

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageDecoder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageDecoder.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageDecoder.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageDecoder.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,116 @@
+/*
+ * 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.message.spi;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.marshal.Marshaller;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.MessageType;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+import org.apache.mina.filter.codec.demux.MessageDecoderResult;
+
+/**
+ * Decodes {@link Message} instances.
+ *
+ * @version $Rev$ $Date$
+ */
+public class MessageDecoder
+    implements org.apache.mina.filter.codec.demux.MessageDecoder
+{
+    private final MessageProvider provider;
+
+    public MessageDecoder(final MessageProvider provider) {
+        this.provider = provider;
+    }
+
+    public String toString() {
+        return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+    }
+    
+    public MessageDecoderResult decodable(final IoSession session, final ByteBuffer in) {
+        assert session != null;
+        assert in != null;
+
+        MessageHeader header = provider.getMessageHeader();
+
+        if (in.remaining() < header.size()) {
+            return MessageDecoderResult.NEED_DATA;
+        }
+
+        //
+        // FIXME: Use the MessageMarshaller instancer here some how..., maybe even unmarshall in a try/catch would work for now
+        //
+        
+        try {
+            header.readExternal(in);
+
+            MessageType type = (MessageType) Marshaller.readObject(in);
+
+            if (type == null) {
+                return MessageDecoderResult.NOT_OK;
+            }
+        }
+        catch (Exception e) {
+            return MessageDecoderResult.NOT_OK;
+        }
+
+        // Make sure we have all of the data we need
+        int len = in.getInt();
+
+        if (in.remaining() != len) {
+            return MessageDecoderResult.NEED_DATA;
+        }
+
+        return MessageDecoderResult.OK;
+    }
+
+    public MessageDecoderResult decode(final IoSession session, final ByteBuffer in, final ProtocolDecoderOutput out) throws Exception {
+        assert session != null;
+        assert in != null;
+        assert out != null;
+
+        MessageMarshaller marshaller = provider.getMessageMarshaller();
+
+        Message msg = marshaller.unmarshal(in);
+
+        out.write(msg);
+
+        return MessageDecoderResult.OK;
+    }
+
+    public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception {}
+
+    public static class Factory
+        implements org.apache.mina.filter.codec.demux.MessageDecoderFactory
+    {
+        private MessageProvider provider;
+
+        public Factory(final MessageProvider provider) {
+            this.provider = provider;
+        }
+
+        public org.apache.mina.filter.codec.demux.MessageDecoder getDecoder() throws Exception {
+            return new MessageDecoder(provider);
+        }
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageEncoder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageEncoder.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageEncoder.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageEncoder.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,89 @@
+/*
+ * 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.message.spi;
+
+import java.util.Set;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.crypto.CryptoContextAware;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
+
+/**
+ * Encodes {@link Message} instances.
+ *
+ * @version $Rev$ $Date$
+ */
+public class MessageEncoder
+    implements org.apache.mina.filter.codec.demux.MessageEncoder
+{
+    private final MessageProvider provider;
+
+    public MessageEncoder(final MessageProvider provider) {
+        this.provider = provider;
+    }
+
+    public String toString() {
+        return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+    }
+
+    public Set<Class<?>> getMessageTypes() {
+        return provider.getMessageTypes();
+    }
+
+    public void encode(final IoSession session, final Object message, final ProtocolEncoderOutput out) throws Exception {
+        assert session != null;
+        assert message != null;
+        assert out != null;
+
+        Message msg = (Message)message;
+
+        //
+        // FIXME: This could be handled by the factory...
+        //
+
+        if (msg instanceof CryptoContextAware) {
+            ((CryptoContextAware)msg).setCryptoContext(provider.getCryptoContext());
+        }
+
+        MessageMarshaller marshaller = provider.getMessageMarshaller();
+
+        byte[] bytes = marshaller.marshal(msg);
+
+        out.write(ByteBuffer.wrap(bytes));
+    }
+
+    public static class Factory
+        implements org.apache.mina.filter.codec.demux.MessageEncoderFactory
+    {
+        private MessageProvider provider;
+
+        public Factory(final MessageProvider provider) {
+            this.provider = provider;
+        }
+
+        public org.apache.mina.filter.codec.demux.MessageEncoder getEncoder() throws Exception {
+            return new MessageEncoder(provider);
+        }
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageFactory.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageFactory.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,33 @@
+/*
+ * 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.message.spi;
+
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.MessageType;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface MessageFactory
+{
+    Message create(MessageType type) throws Exception;
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageHeader.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageHeader.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageHeader.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageHeader.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,43 @@
+/*
+ * 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.message.spi;
+
+import org.apache.geronimo.gshell.whisper.marshal.MarshalAware;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface MessageHeader
+    extends MarshalAware
+{
+    int size();
+    
+    byte[] magic();
+
+    byte version();
+
+    /*
+    MessageType type();
+
+    int length();
+    */
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageIDFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageIDFactory.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageIDFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageIDFactory.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,32 @@
+/*
+ * 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.message.spi;
+
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface MessageIDFactory
+{
+    MessageID create();
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageMarshaller.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageMarshaller.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageMarshaller.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageMarshaller.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,37 @@
+/*
+ * 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.message.spi;
+
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.mina.common.ByteBuffer;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface MessageMarshaller
+{
+    Message unmarshal(ByteBuffer in) throws Exception;
+
+    void marshal(ByteBuffer out, Message msg) throws Exception;
+
+    byte[] marshal(Message msg) throws Exception;
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageProvider.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageProvider.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageProvider.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/MessageProvider.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.message.spi;
+
+import java.util.Set;
+
+import org.apache.geronimo.gshell.whisper.crypto.CryptoContext;
+import org.apache.mina.filter.codec.ProtocolCodecFactory;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface MessageProvider
+{
+    MessageHeader getMessageHeader();
+
+    Set<Class<?>> getMessageTypes();
+
+    MessageFactory getMessageFactory();
+
+    MessageIDFactory getMessageIDFactory();
+
+    MessageMarshaller getMessageMarshaller();
+
+    ProtocolCodecFactory getProtocolCodecFactory();
+
+    CryptoContext getCryptoContext();
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UUIDMessageID.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UUIDMessageID.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UUIDMessageID.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UUIDMessageID.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,89 @@
+/*
+ * 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.message.spi;
+
+import java.util.UUID;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.marshal.Marshaller;
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+import org.apache.mina.common.ByteBuffer;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class UUIDMessageID
+    implements MessageID
+{
+    private UUID value;
+
+    public UUIDMessageID(final UUID value) {
+        this.value = value;
+    }
+
+    public UUIDMessageID() {
+        this(UUID.randomUUID());
+    }
+
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        else if (obj == null) {
+            return false;
+        }
+        else if (!(obj instanceof UUIDMessageID)) {
+            return false;
+        }
+
+        return value.equals(((UUIDMessageID)obj).value);
+    }
+
+    public String toString() {
+        return String.valueOf(value);
+    }
+
+    public void writeExternal(final ByteBuffer out) throws Exception {
+        Marshaller.writeUuid(out, value);
+    }
+
+    public void readExternal(final ByteBuffer in) throws Exception {
+        value = Marshaller.readUuid(in);
+    }
+
+    public static class Factory
+        implements MessageIDFactory
+    {
+        public MessageID create() {
+            return new UUIDMessageID();
+        }
+
+        public String toString() {
+            return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+        }
+    }
+}

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UuidMessageID.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UuidMessageID.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UuidMessageID.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/UuidMessageID.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,89 @@
+/*
+ * 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.message.spi;
+
+import java.util.UUID;
+
+import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.marshal.Marshaller;
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+import org.apache.mina.common.ByteBuffer;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class UUIDMessageID
+    implements MessageID
+{
+    private UUID value;
+
+    public UUIDMessageID(final UUID value) {
+        this.value = value;
+    }
+
+    public UUIDMessageID() {
+        this(UUID.randomUUID());
+    }
+
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        else if (obj == null) {
+            return false;
+        }
+        else if (!(obj instanceof UUIDMessageID)) {
+            return false;
+        }
+
+        return value.equals(((UUIDMessageID)obj).value);
+    }
+
+    public String toString() {
+        return String.valueOf(value);
+    }
+
+    public void writeExternal(final ByteBuffer out) throws Exception {
+        Marshaller.writeUuid(out, value);
+    }
+
+    public void readExternal(final ByteBuffer in) throws Exception {
+        value = Marshaller.readUuid(in);
+    }
+
+    public static class Factory
+        implements MessageIDFactory
+    {
+        public MessageID create() {
+            return new UUIDMessageID();
+        }
+
+        public String toString() {
+            return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+        }
+    }
+}

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/package-info.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/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.
+ */
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.whisper.message.spi;
\ No newline at end of file

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

Propchange: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/message/spi/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/message/spi/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Request.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Request.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Request.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Request.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,229 @@
+/*
+ * 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 java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.geronimo.gshell.common.Duration;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents a request message.
+ *
+ * @version $Rev$ $Date$
+ */
+public class Request
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    final Lock lock = new ReentrantLock();
+
+    private final BlockingQueue<Object> responses = new LinkedBlockingQueue<Object>();
+
+    private final Message message;
+
+    private final Duration timeout;
+
+    private volatile boolean endOfResponses;
+
+    private volatile boolean signaled;
+
+    public Request(final Message message, final Duration timeout) {
+        assert message != null;
+        assert timeout != null;
+
+        this.message = message;
+        this.timeout = timeout;
+    }
+
+    public Request(final Message message, long timeout, final TimeUnit timeoutUnit) {
+        this(message, new Duration(timeout, timeoutUnit));
+    }
+
+    public int hashCode() {
+        return getId().hashCode();
+    }
+
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        else if (obj == null) {
+            return false;
+        }
+        else if (!(obj instanceof Request)) {
+            return false;
+        }
+
+        Request request = (Request) obj;
+
+        return getId().equals(request.getId());
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+                .append("id", getId())
+                .append("signaled", signaled)
+                .append("message", message)
+                .toString();
+    }
+
+    public Message getMessage() {
+        return message;
+    }
+
+    public MessageID getId() {
+        return getMessage().getId();
+    }
+
+    public Duration getTimeout() {
+        return timeout;
+    }
+
+    public boolean hasResponse() {
+        return !responses.isEmpty();
+    }
+
+    public Response awaitResponse() throws RequestTimeoutException, InterruptedException {
+        chechEndOfResponses();
+
+        log.debug("Waiting for response");
+
+        Response resp = decodeResponse(responses.take());
+
+        log.trace("Received response: {}", resp);
+
+        return resp;
+    }
+
+    public Response awaitResponse(final long timeout, final TimeUnit unit) throws RequestTimeoutException, InterruptedException {
+        chechEndOfResponses();
+
+        log.debug("Polling for response");
+
+        Response resp = decodeResponse(responses.poll(timeout, unit));
+
+        if (log.isTraceEnabled()) {
+            if (resp != null) {
+                log.trace("Received response: {}", resp);
+            }
+            else {
+                log.trace("Operation timed out before the response was signaled");
+            }
+        }
+
+        return resp;
+    }
+
+    public Response awaitResponseUninterruptibly() throws RequestTimeoutException {
+        while (true) {
+            try {
+                return awaitResponse();
+            }
+            catch (InterruptedException ignore) {}
+        }
+    }
+
+    private Response decodeResponse(final Object obj) {
+        if (obj instanceof Response) {
+            return (Response) obj;
+        }
+        else if (obj == null) {
+            return null;
+        }
+        else if (obj == RequestTimeoutException.class) {
+            throw new RequestTimeoutException(getId());
+        }
+
+        // This should never happen
+        throw new InternalError();
+    }
+
+    private void chechEndOfResponses() {
+        if (endOfResponses && responses.isEmpty()) {
+            throw new IllegalStateException("All responses has been retrieved already");
+        }
+    }
+
+    private void queueResponse(final Object answer) {
+        signaled = true;
+
+        responses.add(answer);
+    }
+
+    void signal(final Response response) {
+        assert response != null;
+
+        lock.lock();
+
+        try {
+            if (log.isTraceEnabled()) {
+                log.debug("Signal response: {}", response);
+            }
+            else {
+                log.debug("Signal response: {}", response.getRequest().getId());
+            }
+
+            queueResponse(response);
+
+            if (response.getType() != Response.Type.PARTIAL) {
+                endOfResponses = true;
+            }
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    void timeout() {
+        lock.lock();
+
+        try {
+            log.debug("Timeout");
+
+            queueResponse(RequestTimeoutException.class);
+
+            endOfResponses = true;
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    boolean isSignaled() {
+        lock.lock();
+
+        try {
+            return signaled;
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+}

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestEncoder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestEncoder.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestEncoder.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestEncoder.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,87 @@
+/*
+ * 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 java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.spi.MessageMarshaller;
+import org.apache.geronimo.gshell.whisper.message.spi.MessageProvider;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
+
+/**
+ * Encodes {@link Request} objects for protocl serialization handling.
+ *
+ * @version $Rev$ $Date$
+ */
+public class RequestEncoder
+    implements org.apache.mina.filter.codec.demux.MessageEncoder
+{
+    @SuppressWarnings({"FieldCanBeLocal"})
+    private static final Set<Class<?>> MESSAGE_TYPES;
+
+    static {
+        Set<Class<?>> types = new HashSet<Class<?>>();
+
+        types.add(Request.class);
+
+        MESSAGE_TYPES = Collections.unmodifiableSet(types);
+    }
+
+    private final MessageProvider provider;
+
+    public RequestEncoder(final MessageProvider provider) {
+        this.provider = provider;
+    }
+
+    public Set<Class<?>> getMessageTypes() {
+        return MESSAGE_TYPES;
+    }
+
+    public void encode(final IoSession session, final Object message, final ProtocolEncoderOutput out) throws Exception {
+        Request request = (Request) message;
+
+        MessageMarshaller marshaller = provider.getMessageMarshaller();
+
+        Message msg = request.getMessage();
+
+        byte[] bytes = marshaller.marshal(msg);
+
+        out.write(ByteBuffer.wrap(bytes));
+    }
+
+    public static class Factory
+        implements org.apache.mina.filter.codec.demux.MessageEncoderFactory
+    {
+        private MessageProvider provider;
+
+        public Factory(final MessageProvider provider) {
+            this.provider = provider;
+        }
+
+        public org.apache.mina.filter.codec.demux.MessageEncoder getEncoder() throws Exception {
+            return new RequestEncoder(provider);
+        }
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestException.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestException.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestException.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestException.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,53 @@
+/*
+ * 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.whisper.message.MessageID;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class RequestException
+    extends RuntimeException
+{
+    private static final long serialVersionUID = 1;
+
+    public RequestException(final MessageID id) {
+        super(String.valueOf(id));
+    }
+
+    public RequestException(final String msg, final Throwable cause) {
+        super(msg, cause);
+    }
+
+    public RequestException(final String msg) {
+        super(msg);
+    }
+
+    public RequestException(final Throwable cause) {
+        super(cause);
+    }
+
+    public RequestException() {
+        super();
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestManager.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestManager.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestManager.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,339 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.geronimo.gshell.common.Duration;
+import org.apache.geronimo.gshell.common.NamedThreadFactory;
+import org.apache.geronimo.gshell.common.tostring.ToStringBuilder;
+import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+import org.apache.geronimo.gshell.whisper.session.SessionAttributeBinder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Manages request state on a per-session basis, handles timeouts and signalling responses.
+ *
+ * @version $Rev$ $Date$
+ */
+public class RequestManager
+{
+    public static final SessionAttributeBinder<RequestManager> BINDER = new SessionAttributeBinder<RequestManager>(RequestManager.class);
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final Map<MessageID,Registration> registrations = new HashMap<MessageID, Registration>();
+
+    private final ScheduledExecutorService scheduler;
+
+    //
+    // TODO: Use a better locking scheme...
+    //
+    
+    private final Lock lock = new ReentrantLock();
+
+    public RequestManager() {
+        ThreadFactory tf = new NamedThreadFactory(getClass());
+        
+        scheduler = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, tf);
+    }
+
+    private Registration get(final MessageID id) {
+        assert id != null;
+
+        Registration reg = registrations.get(id);
+
+        if (reg == null) {
+            throw new NotRegisteredException(id);
+        }
+
+        return reg;
+    }
+
+    private Registration remove(final MessageID id) {
+        assert id != null;
+
+        Registration reg = registrations.remove(id);
+
+        if (reg == null) {
+            throw new NotRegisteredException(id);
+        }
+
+        return reg;
+    }
+
+    public void register(final Request request) {
+        assert request != null;
+
+        lock.lock();
+
+        try {
+            MessageID id = request.getId();
+
+            if (registrations.containsKey(id)) {
+                throw new DuplicateRegistrationException(id);
+            }
+
+            Registration reg = new Registration(request);
+
+            registrations.put(id, reg);
+
+            log.debug("Registered: {}", reg);
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    public Request lookup(final MessageID id) {
+        assert id != null;
+
+        lock.lock();
+
+        try {
+            Registration reg = get(id);
+
+            return reg.request;
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    public Request deregister(final MessageID id) {
+        assert id != null;
+
+        lock.lock();
+
+        try {
+            Registration reg = remove(id);
+
+            reg.deactivate();
+
+            log.debug("Deregistered: {}", reg);
+
+            return reg.request;
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    public void activate(final MessageID id) {
+        assert id != null;
+
+        lock.lock();
+
+        try {
+            Registration reg = get(id);
+            
+            reg.activate();
+
+            log.debug("Activated: {}", reg);
+        }
+        catch (NotRegisteredException e) {
+            log.debug("Ignoring activation; request not registered: {}", id);
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    public void deactivate(final MessageID id) {
+        assert id != null;
+
+        lock.lock();
+
+        try {
+            Registration reg = get(id);
+
+            reg.deactivate();
+
+            log.debug("Deactivated: {}", reg);
+        }
+        catch (NotRegisteredException e) {
+            log.debug("Ignoring deactivation; request not registered: {}", id);
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    private void timeout(final MessageID id) {
+        assert id != null;
+
+        lock.lock();
+
+        try {
+            Registration reg = remove(id);
+
+            reg.timeout();
+
+            log.debug("Timed out: {}", reg);
+        }
+        catch (NotRegisteredException e) {
+            log.debug("Ignoring timeout; request not registered: {}", id);
+        }
+        catch (TimeoutAbortedException e) {
+            log.debug("Timeout aborted: " + e.getMessage());
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    public void close() {
+        lock.lock();
+
+        try {
+            if (!registrations.isEmpty()) {
+                log.warn("Timing out remaining {} registrations", registrations.size());
+
+                for (Registration reg : registrations.values()) {
+                    timeout(reg.request.getId());
+                }
+            }
+
+            //
+            // FIXME: This causes some problems when a rsh client closes, like:
+            //
+            //        java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThread)
+            //
+            // scheduler.shutdown();
+        }
+        finally {
+            lock.unlock();
+        }
+    }
+
+    private enum RegistrationState
+    {
+        PENDING,
+        ACTIVE,
+        DEACTIVE,
+        TIMEDOUT
+    }
+
+    private class Registration
+    {
+        public final Request request;
+
+        public RegistrationState state = RegistrationState.PENDING;
+
+        private ScheduledFuture<?> timeoutFuture;
+
+        public Registration(final Request request) {
+            assert request != null;
+
+            this.request = request;
+        }
+
+        public void activate() {
+            if (state != RegistrationState.PENDING) {
+                log.debug("Can not activate, state is not PENDING, found: {}", state);
+            }
+            else {
+                Runnable task = new Runnable() {
+                    public void run() {
+                        RequestManager.this.timeout(request.getId());
+                    }
+                };
+
+                Duration timeout = request.getTimeout();
+
+                log.debug("Scheduling timeout to trigger in: {}", timeout);
+
+                timeoutFuture = scheduler.schedule(task, timeout.getValue(), timeout.getUnit());
+
+                state = RegistrationState.ACTIVE;
+            }
+        }
+
+        public void deactivate() {
+            if (state != RegistrationState.ACTIVE) {
+                log.debug("Can not deactivate; state is not ACTIVE, found: {}", state);
+            }
+            else if (timeoutFuture.cancel(false)) {
+                timeoutFuture = null;
+
+                state = RegistrationState.DEACTIVE;
+            }
+            else {
+                log.warn("Unable to cancel registration timeout: {}", this);
+            }
+        }
+
+        public void timeout() {
+            MessageID id = request.getId();
+
+            if (timeoutFuture.isCancelled()) {
+                throw new TimeoutAbortedException("Timeout has been canceled: " + id);
+            }
+            else if (request.isSignaled()) {
+                throw new TimeoutAbortedException("Request has been singled: " + id);
+            }
+            else {
+                request.timeout();
+
+                state = RegistrationState.TIMEDOUT;
+            }
+        }
+
+        public String toString() {
+            return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+                    .append("id", request.getId())
+                    .append("state", state)
+                    .toString();
+        }
+    }
+
+    public class NotRegisteredException
+        extends RequestException
+    {
+        public NotRegisteredException(final MessageID id) {
+            super(id);
+        }
+    }
+
+    public class DuplicateRegistrationException
+        extends RequestException
+    {
+        public DuplicateRegistrationException(final MessageID id) {
+            super(id);
+        }
+    }
+
+    public class TimeoutAbortedException
+        extends RequestException
+    {
+        public TimeoutAbortedException(final String msg) {
+            super(msg);
+        }
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestResponseFilter.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestResponseFilter.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestResponseFilter.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestResponseFilter.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.request;
+
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.message.MessageID;
+import org.apache.mina.common.IoFilterAdapter;
+import org.apache.mina.common.IoSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides synchronous request/response messaging.
+ *
+ * @version $Rev$ $Date$
+ */
+public class RequestResponseFilter
+    extends IoFilterAdapter
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    /**
+     * Set up the request manager instance for the session.
+     */
+    @Override
+    public void sessionCreated(final NextFilter nextFilter, final IoSession session) throws Exception {
+        RequestManager.BINDER.bind(session, new RequestManager());
+
+        nextFilter.sessionCreated(session);
+    }
+
+    /**
+     * Close the request manager instance for the session.
+     */
+    @Override
+    public void sessionClosed(final NextFilter nextFilter, final IoSession session) throws Exception {
+        RequestManager manager = RequestManager.BINDER.unbind(session);
+        
+        manager.close();
+
+        nextFilter.sessionClosed(session);
+    }
+
+    /**
+     * When a request is sent, register it with the request manager.
+     */
+    @Override
+    public void filterWrite(final NextFilter nextFilter, final IoSession session, final WriteRequest writeRequest) throws Exception {
+        Object message = writeRequest.getMessage();
+
+        if (message instanceof Request) {
+            Request request = (Request) message;
+
+            RequestManager manager = RequestManager.BINDER.lookup(session);
+
+            manager.register(request);
+        }
+
+        nextFilter.filterWrite(session, writeRequest);
+    }
+
+    /**
+     * When a response message has been received, deregister it and signal the response.
+     */
+    @Override
+    public void messageReceived(final NextFilter nextFilter, final IoSession session, final Object message) throws Exception {
+        Message msg = null;
+
+        MessageID id = null;
+
+        if (message instanceof Message) {
+            msg = (Message)message;
+
+            id = msg.getCorrelationId();
+        }
+
+        // If we have a correlation id, then we can process the response
+        if (id != null) {
+            RequestManager manager = RequestManager.BINDER.lookup(session);
+
+            Request request = manager.deregister(id);
+
+            // Setup the response and signal the request
+            Response response = new Response(request, msg, Response.Type.WHOLE);
+
+            request.signal(response);
+
+            // Do not pass on the response
+        }
+        else {
+            nextFilter.messageReceived(session, message);
+        }
+    }
+
+    /**
+     * Once the reqeust message has been sent then activate it.  Some times a message gets consumed before we get a chance
+     * to activate it, which is okay, the {@link RequestManager} will simply ignore the request.
+     */
+    @Override
+    public void messageSent(final NextFilter nextFilter, final IoSession session, final Object message) throws Exception {
+        if (message instanceof Request) {
+            Request request = (Request) message;
+
+            RequestManager manager = RequestManager.BINDER.lookup(session);
+
+            manager.activate(request.getId());
+        }
+
+        nextFilter.messageSent(session, message);
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestTimeoutException.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestTimeoutException.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestTimeoutException.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/RequestTimeoutException.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,45 @@
+/*
+ * 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.whisper.message.MessageID;
+
+/**
+ * Thrown to indicate that a request has been timed out.
+ *
+ * @version $Rev$ $Date$
+ */
+public class RequestTimeoutException
+    extends RequestException
+{
+    private static final long serialVersionUID = 1;
+
+    private final MessageID id;
+
+    public RequestTimeoutException(final MessageID id) {
+        super("Request timed out: " + id);
+
+        this.id = id;
+    }
+
+    public MessageID getId() {
+        return id;
+    }
+}
\ No newline at end of file

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

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

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

Added: geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Requestor.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Requestor.java?rev=578566&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Requestor.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-whisper/src/main/java/org/apache/geronimo/gshell/whisper/request/Requestor.java Sun Sep 23 05:02:46 2007
@@ -0,0 +1,155 @@
+/*
+ * 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 java.util.concurrent.TimeUnit;
+
+import org.apache.geronimo.gshell.common.Duration;
+import org.apache.geronimo.gshell.whisper.message.Message;
+import org.apache.geronimo.gshell.whisper.transport.Transport;
+import org.apache.mina.common.IoFutureListener;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides support to send a request and receive it's response.
+ *
+ * @version $Rev$ $Date$
+ */
+public class Requestor
+{
+    public static final Duration DEFAULT_TIMEOUT = new Duration(10, TimeUnit.SECONDS);
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    
+    private final IoSession session;
+
+    private final Duration timeout;
+
+    public Requestor(final IoSession session, final Duration timeout) {
+        this.session = session;
+        this.timeout = timeout;
+    }
+
+    public Requestor(final IoSession session) {
+        this(session, DEFAULT_TIMEOUT);
+    }
+
+    public Requestor(final Transport transport, final long timeout, final TimeUnit unit) {
+        this(transport.getSession(), new Duration(timeout, unit));
+    }
+
+    public Requestor(final Transport transport) {
+        this(transport.getSession(), DEFAULT_TIMEOUT);
+    }
+
+    public RequestWriteFuture submit(final Message msg, final long timeout, final TimeUnit unit) throws Exception {
+        assert msg != null;
+
+        Request req = new Request(msg, timeout, unit);
+
+        WriteFuture wf = session.write(req);
+
+        return new RequestWriteFuture(wf, req);
+    }
+
+    public RequestWriteFuture submit(final Message msg, final Duration timeout) throws Exception {
+        return submit(msg, timeout.getValue(), timeout.getUnit());
+    }
+
+    public RequestWriteFuture submit(final Message msg) throws Exception {
+        return submit(msg, timeout.getValue(), timeout.getUnit());
+    }
+
+    public Message request(final Message msg, final long timeout, final TimeUnit unit) throws Exception {
+        assert msg != null;
+
+        RequestWriteFuture wf = submit(msg, timeout, unit);
+
+        Request req = wf.getRequest();
+
+        Response resp = req.awaitResponse();
+
+        return resp.getMessage();
+    }
+
+    public Message request(final Message msg, final Duration timeout) throws Exception {
+        return request(msg, timeout.getValue(), timeout.getUnit());
+    }
+
+    public Message request(final Message msg) throws Exception {
+        return request(msg, timeout.getValue(), timeout.getUnit());
+    }
+    
+    //
+    // RequestWriteFuture
+    //
+
+    public class RequestWriteFuture
+        implements WriteFuture
+    {
+        private final WriteFuture delegate;
+
+        private final Request request;
+
+        public RequestWriteFuture(final WriteFuture wf, final Request req) {
+            this.delegate = wf;
+            this.request = req;
+        }
+
+        public Request getRequest() {
+            return request;
+        }
+
+        public boolean isWritten() {
+            return delegate.isWritten();
+        }
+
+        public void setWritten(final boolean written) {
+            delegate.setWritten(written);
+        }
+
+        public IoSession getSession() {
+            return delegate.getSession();
+        }
+
+        public void join() {
+            delegate.join();
+        }
+
+        public boolean join(final long timeout) {
+            return delegate.join(timeout);
+        }
+
+        public boolean isReady() {
+            return delegate.isReady();
+        }
+
+        public void addListener(final IoFutureListener listener) {
+            delegate.addListener(listener);
+        }
+
+        public void removeListener(final IoFutureListener listener) {
+            delegate.removeListener(listener);
+        }
+    }
+}
\ No newline at end of file

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

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

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