From d9e6b243ba15f3cdf329e35fedd5a018f37bd2c1 Mon Sep 17 00:00:00 2001 From: "Rafael H. Schloming" Date: Wed, 4 Jun 2008 17:44:57 +0000 Subject: QPID-1062: use BBDecoder for non fragmented segments, modified BBDecoder/Encoder to use byte buffer primitives, made various classes final (including generated classes) git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@663325 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/qpidity/transport/codec/BBDecoder.java | 29 +++++++++++++++++++- .../apache/qpidity/transport/codec/BBEncoder.java | 30 ++++++++++++++++++++- .../apache/qpidity/transport/codec/Decoder.java | 2 ++ .../qpidity/transport/network/Assembler.java | 12 ++++++++- .../apache/qpidity/transport/network/Frame.java | 3 +-- .../qpidity/transport/network/OutputHandler.java | 31 ++++++++++------------ 6 files changed, 85 insertions(+), 22 deletions(-) (limited to 'qpid/java/common/src') diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBDecoder.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBDecoder.java index 270ae668af..cf40cef8bf 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBDecoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBDecoder.java @@ -21,6 +21,7 @@ package org.apache.qpidity.transport.codec; import java.nio.ByteBuffer; +import java.nio.ByteOrder; /** @@ -29,7 +30,7 @@ import java.nio.ByteBuffer; * @author Rafael H. Schloming */ -public class BBDecoder extends AbstractDecoder +public final class BBDecoder extends AbstractDecoder { private final ByteBuffer in; @@ -37,6 +38,7 @@ public class BBDecoder extends AbstractDecoder public BBDecoder(ByteBuffer in) { this.in = in; + this.in.order(ByteOrder.BIG_ENDIAN); } protected byte doGet() @@ -49,4 +51,29 @@ public class BBDecoder extends AbstractDecoder in.get(bytes); } + public boolean hasRemaining() + { + return in.hasRemaining(); + } + + public short readUint8() + { + return (short) (0xFF & in.get()); + } + + public int readUint16() + { + return 0xFFFF & in.getShort(); + } + + public long readUint32() + { + return 0xFFFFFFFFL & in.getInt(); + } + + public long readUint64() + { + return in.getLong(); + } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBEncoder.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBEncoder.java index f97baeafbd..2e7b41bf42 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBEncoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/BBEncoder.java @@ -21,6 +21,7 @@ package org.apache.qpidity.transport.codec; import java.nio.ByteBuffer; +import java.nio.ByteOrder; /** @@ -29,13 +30,14 @@ import java.nio.ByteBuffer; * @author Rafael H. Schloming */ -public class BBEncoder extends AbstractEncoder +public final class BBEncoder extends AbstractEncoder { private final ByteBuffer out; public BBEncoder(ByteBuffer out) { this.out = out; + this.out.order(ByteOrder.BIG_ENDIAN); } protected void doPut(byte b) @@ -48,4 +50,30 @@ public class BBEncoder extends AbstractEncoder out.put(src); } + public void writeUint8(short b) + { + assert b < 0x100; + + out.put((byte) b); + } + + public void writeUint16(int s) + { + assert s < 0x10000; + + out.putShort((short) s); + } + + public void writeUint32(long i) + { + assert i < 0x100000000L; + + out.putInt((int) i); + } + + public void writeUint64(long l) + { + out.putLong(l); + } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Decoder.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Decoder.java index 62abc74668..dec901748d 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Decoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Decoder.java @@ -37,6 +37,8 @@ import org.apache.qpidity.transport.Struct; public interface Decoder { + boolean hasRemaining(); + short readUint8(); int readUint16(); long readUint32(); diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Assembler.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Assembler.java index d493245f0c..3a7a550573 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Assembler.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Assembler.java @@ -27,6 +27,8 @@ import java.util.Map; import java.nio.ByteBuffer; +import org.apache.qpidity.transport.codec.BBDecoder; +import org.apache.qpidity.transport.codec.Decoder; import org.apache.qpidity.transport.codec.FragmentDecoder; import org.apache.qpidity.transport.ConnectionEvent; @@ -161,7 +163,15 @@ public class Assembler implements Receiver, NetworkDelegate private ProtocolEvent decode(Frame frame, SegmentType type, List segment) { - FragmentDecoder dec = new FragmentDecoder(segment.iterator()); + Decoder dec; + if (segment.size() == 1) + { + dec = new BBDecoder(segment.get(0)); + } + else + { + dec = new FragmentDecoder(segment.iterator()); + } switch (type) { diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Frame.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Frame.java index 8bbbf08b22..2abac382e6 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Frame.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Frame.java @@ -38,8 +38,7 @@ import static org.apache.qpidity.transport.util.Functions.*; * @author Rafael H. Schloming */ -// RA: changed it to public until we sort the package issues -public class Frame implements NetworkEvent, Iterable +public final class Frame implements NetworkEvent, Iterable { public static final int HEADER_SIZE = 12; diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java index 64dcdb131f..fa739cf637 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/OutputHandler.java @@ -67,29 +67,26 @@ public class OutputHandler implements Sender, NetworkDelegate } } - public static final int FRAME_END = 0xCE; - public void frame(Frame frame) { - ByteBuffer hdr = ByteBuffer.allocate(HEADER_SIZE + frame.getSize() + 1); - hdr.put(frame.getFlags()); - hdr.put((byte) frame.getType().getValue()); - hdr.putShort((short) (frame.getSize() + HEADER_SIZE)); - hdr.put(RESERVED); - hdr.put(frame.getTrack()); - hdr.putShort((short) frame.getChannel()); - hdr.put(RESERVED); - hdr.put(RESERVED); - hdr.put(RESERVED); - hdr.put(RESERVED); - for(ByteBuffer buf : frame) + ByteBuffer buf = ByteBuffer.allocate(HEADER_SIZE + frame.getSize()); + buf.put(frame.getFlags()); + buf.put((byte) frame.getType().getValue()); + buf.putShort((short) (frame.getSize() + HEADER_SIZE)); + // RESERVED + buf.put(RESERVED); + buf.put(frame.getTrack()); + buf.putShort((short) frame.getChannel()); + // RESERVED + buf.putInt(0); + for(ByteBuffer frg : frame) { - hdr.put(buf); + buf.put(frg); } - hdr.flip(); + buf.flip(); synchronized (lock) { - sender.send(hdr); + sender.send(buf); } } -- cgit v1.2.1