Author: trustin Date: Sat Jan 1 19:13:50 2005 New Revision: 123875 URL: http://svn.apache.org/viewcvs?view=rev&rev=123875 Log: * Added wrapper for ASN.1 Codec and Netty2. Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecDecoder.java (contents, props changed) incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecEncoder.java (contents, props changed) incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyDecoder.java (contents, props changed) incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyEncoder.java (contents, props changed)
Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecDecoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecDecoder.java?view=auto&rev=123875 ============================================================================== --- (empty file) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecDecoder.java Sat Jan 1 19:13:50 2005 @@ -0,0 +1,49 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.protocol.codec.wapper; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.protocol.ProtocolDecoder; +import org.apache.mina.protocol.ProtocolDecoderOutput; +import org.apache.mina.protocol.ProtocolSession; +import org.apache.mina.protocol.ProtocolViolationException; +import org.apache.snickers.codec.DecoderException; +import org.apache.snickers.codec.stateful.DecoderCallback; +import org.apache.snickers.codec.stateful.StatefulDecoder; + +/** + * A wrapper for [EMAIL PROTECTED] StatefulDecoder} from + * <a href="http://incubator.apache.org/directory/subprojects/asn1/codec-stateful/">Apache ASN.1 Codec</a>. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class Asn1CodecDecoder implements ProtocolDecoder { + + private final StatefulDecoder decoder; + private final DecoderCallbackImpl callback = new DecoderCallbackImpl(); + + public Asn1CodecDecoder(StatefulDecoder decoder) { + decoder.setCallback(callback); + this.decoder = decoder; + } + + public void decode(ProtocolSession session, ByteBuffer in, + ProtocolDecoderOutput out) throws ProtocolViolationException { + callback.decOut = out; + try { + decoder.decode(in.buf()); + } catch (DecoderException e) { + throw new ProtocolViolationException("Failed to decode.", e); + } + } + + private class DecoderCallbackImpl implements DecoderCallback { + private ProtocolDecoderOutput decOut; + + public void decodeOccurred(StatefulDecoder decoder, Object decoded) { + decOut.write(decoded); + } + } +} Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecEncoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecEncoder.java?view=auto&rev=123875 ============================================================================== --- (empty file) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/Asn1CodecEncoder.java Sat Jan 1 19:13:50 2005 @@ -0,0 +1,55 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.protocol.codec.wapper; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.protocol.ProtocolEncoder; +import org.apache.mina.protocol.ProtocolEncoderOutput; +import org.apache.mina.protocol.ProtocolSession; +import org.apache.mina.protocol.ProtocolViolationException; +import org.apache.snickers.codec.EncoderException; +import org.apache.snickers.codec.stateful.EncoderCallback; +import org.apache.snickers.codec.stateful.StatefulEncoder; + +/** + * A wrapper for [EMAIL PROTECTED] StatefulEncoder} from + * <a href="http://incubator.apache.org/directory/subprojects/asn1/codec-stateful/">Apache ASN.1 Codec</a>. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class Asn1CodecEncoder implements ProtocolEncoder { + private final StatefulEncoder encoder; + private final EncoderCallbackImpl callback = new EncoderCallbackImpl(); + + public Asn1CodecEncoder(StatefulEncoder encoder) { + encoder.setCallback(callback); + this.encoder = encoder; + } + + public void encode(ProtocolSession session, Object message, ProtocolEncoderOutput out) throws ProtocolViolationException { + callback.encOut = out; + try { + encoder.encode(message); + } catch (EncoderException e) { + throw new ProtocolViolationException("Encoding failed.", e); + } + } + + private class EncoderCallbackImpl implements EncoderCallback { + private ProtocolEncoderOutput encOut; + + public void encodeOccurred(StatefulEncoder codec, Object encoded) { + if (encoded instanceof java.nio.ByteBuffer) { + java.nio.ByteBuffer buf = (java.nio.ByteBuffer) encoded; + ByteBuffer outBuf = ByteBuffer.allocate(buf.remaining()); + outBuf.put(buf); + outBuf.flip(); + encOut.write(outBuf); + } else { + throw new IllegalArgumentException("Encoded result is not a ByteBuffer: " + encoded.getClass()); + } + } + } +} Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyDecoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyDecoder.java?view=auto&rev=123875 ============================================================================== --- (empty file) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyDecoder.java Sat Jan 1 19:13:50 2005 @@ -0,0 +1,109 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.protocol.codec.wapper; + +import net.gleamynode.netty2.Message; +import net.gleamynode.netty2.MessageParseException; +import net.gleamynode.netty2.MessageRecognizer; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.protocol.ProtocolDecoder; +import org.apache.mina.protocol.ProtocolDecoderOutput; +import org.apache.mina.protocol.ProtocolSession; +import org.apache.mina.protocol.ProtocolViolationException; + +/** + * Encodes byte buffers into Trustin Lee's + * <a href="http://gleamynode.net/dev/projects/netty2/">Netty</code> + * [EMAIL PROTECTED] Message}s using [EMAIL PROTECTED] MessageRecognizer}s. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class NettyDecoder implements ProtocolDecoder { + private final MessageRecognizer recognizer; + + private java.nio.ByteBuffer readBuf = java.nio.ByteBuffer.allocate(1024); + + private Message readingMessage; + + public NettyDecoder(MessageRecognizer recognizer) { + if (recognizer == null) + throw new NullPointerException(); + + this.recognizer = recognizer; + } + + public void decode(ProtocolSession session, ByteBuffer in, + ProtocolDecoderOutput out) throws ProtocolViolationException { + + put(in); + + Message m = readingMessage; + try { + for (;;) { + readBuf.flip(); + if (m == null) { + int limit = readBuf.limit(); + boolean failed = true; + try { + m = recognizer.recognize(readBuf); + failed = false; + } finally { + if (failed) { + // clear the read buffer if failed to recognize + readBuf.clear(); + break; + } else { + if (m == null) { + readBuf.limit(readBuf.capacity()); + readBuf.position(limit); + break; // finish decoding + } else { + // reset buffer for read + readBuf.limit(limit); + readBuf.position(0); + } + } + } + } + + if (m != null) { + try { + if (m.read(readBuf)) { + out.write(m); + m = null; + } + } finally { + if (readBuf.hasRemaining()) { + readBuf.compact(); + } else { + readBuf.clear(); + } + } + } + } + } catch (MessageParseException e) { + m = null; // discard reading message + throw new ProtocolViolationException("Failed to decode.", e); + } + finally { + readingMessage = m; + } + } + + private void put(ByteBuffer in) { + // copy to read buffer + if (in.remaining() > readBuf.remaining()) + expand((readBuf.position() + in.remaining()) * 3 / 2); + readBuf.put(in.buf()); + } + + private void expand(int newCapacity) { + java.nio.ByteBuffer newBuf = java.nio.ByteBuffer.allocate(newCapacity); + readBuf.flip(); + newBuf.put(readBuf); + readBuf = newBuf; + } +} \ No newline at end of file Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyEncoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyEncoder.java?view=auto&rev=123875 ============================================================================== --- (empty file) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/wapper/NettyEncoder.java Sat Jan 1 19:13:50 2005 @@ -0,0 +1,51 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.protocol.codec.wapper; + +import net.gleamynode.netty2.Message; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.protocol.ProtocolEncoder; +import org.apache.mina.protocol.ProtocolEncoderOutput; +import org.apache.mina.protocol.ProtocolSession; +import org.apache.mina.protocol.ProtocolViolationException; + +/** + * Encodes Trustin Lee's + * <a href="http://gleamynode.net/dev/projects/netty2/">Netty</code> + * [EMAIL PROTECTED] Message}s. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class NettyEncoder implements ProtocolEncoder { + + public NettyEncoder() { + } + + public void encode(ProtocolSession session, Object message, + ProtocolEncoderOutput out) throws ProtocolViolationException { + if (!(message instanceof Message)) { + throw new ProtocolViolationException( + "This encoder can decode only Netty Messages."); + } + + for (;;) { + ByteBuffer buf = ByteBuffer.allocate(8192); + Message m = (Message) message; + try { + if (m.write(buf.buf())) { + break; + } + } finally { + buf.flip(); + if (buf.hasRemaining()) { + out.write(buf); + } else { + ByteBuffer.release(buf); + } + } + } + } +} \ No newline at end of file
