From 89cc15c84947df5b19efaf4c8e4d46b62559f96e Mon Sep 17 00:00:00 2001 From: "Rafael H. Schloming" Date: Wed, 10 Oct 2007 13:24:24 +0000 Subject: added support (currently disabled) for packed encoding git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@583468 13f79535-47bb-0310-9956-ffa450edef68 --- .../main/java/org/apache/qpidity/ToyClient.java | 1 + .../java/org/apache/qpidity/transport/Field.java | 27 +++-- .../java/org/apache/qpidity/transport/Struct.java | 132 ++++++++++++++++++++- .../qpidity/transport/codec/AbstractDecoder.java | 8 +- .../qpidity/transport/codec/AbstractEncoder.java | 5 +- .../apache/qpidity/transport/codec/Encodable.java | 4 +- .../qpidity/transport/network/Assembler.java | 2 +- .../qpidity/transport/network/Disassembler.java | 4 +- 8 files changed, 165 insertions(+), 18 deletions(-) (limited to 'qpid/java/common/src') diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/ToyClient.java b/qpid/java/common/src/main/java/org/apache/qpidity/ToyClient.java index f3f7338c07..67f34f9bde 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/ToyClient.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/ToyClient.java @@ -117,6 +117,7 @@ class ToyClient extends SessionDelegate Future future = ssn.queueQuery("asdf"); System.out.println(future.get().getQueue()); + ssn.sync(); ssn.close(); conn.close(); } diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/Field.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/Field.java index 8c16b60779..ebbd59288b 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/Field.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/Field.java @@ -29,41 +29,52 @@ import org.apache.qpidity.transport.codec.Encoder; * */ -public abstract class Field +public abstract class Field { - private final Class container; + private final Class container; + private final Class type; private final String name; private final int index; - Field(Class container, String name, int index) + Field(Class container, Class type, String name, int index) { this.container = container; + this.type = type; this.name = name; this.index = index; } - public Class getContainer() + public final Class getContainer() { return container; } - public String getName() + public final Class getType() + { + return type; + } + + public final String getName() { return name; } - public int getIndex() + public final int getIndex() { return index; } - protected T check(Object struct) + protected final C check(Object struct) { return container.cast(struct); } - public abstract Object get(Object struct); + public abstract boolean has(Object struct); + + public abstract void has(Object struct, boolean value); + + public abstract T get(Object struct); public abstract void read(Decoder dec, Object struct); diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/Struct.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/Struct.java index 185615fda4..b87512284f 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/Struct.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/Struct.java @@ -22,7 +22,9 @@ package org.apache.qpidity.transport; import java.util.List; +import org.apache.qpidity.transport.codec.Decoder; import org.apache.qpidity.transport.codec.Encodable; +import org.apache.qpidity.transport.codec.Encoder; /** @@ -39,10 +41,127 @@ public abstract class Struct implements Encodable return StructFactory.create(type); } - public abstract List> getFields(); + public abstract List> getFields(); public abstract int getEncodedType(); + public abstract int getSizeWidth(); + + public abstract int getPackWidth(); + + public abstract boolean hasTicket(); + + private final boolean isBit(Field f) + { + return f.getType().equals(Boolean.class); + } + + private final boolean encoded(Field f) + { + // XXX: remove to enable packed encoding + if (true) { return true; } + return !isBit(f) && f.has(this); + } + + private final int getFlagWidth() + { + return (getFields().size() + 7)/8; + } + + private final int getPaddWidth() + { + int pw = getPackWidth() - getFlagWidth(); + assert pw > 0; + return pw; + } + + public final void read(Decoder dec) + { + List> fields = getFields(); + + assert fields.size() <= 8*getPackWidth(); + + // XXX: remove to enable packed encoding + if (false) + { + for (Field f : fields) + { + if (isBit(f)) + { + f.has(this, true); + f.read(dec, this); + } + else + { + f.has(this, dec.readBit()); + } + } + + for (int i = 0; i < getPaddWidth(); i++) + { + short padd = dec.readOctet(); + if (padd != 0x0) + { + throw new IllegalStateException("urecognized value in reserved bytes: " + padd); + } + } + } + + if (hasTicket()) + { + dec.readShort(); + } + + for (Field f : fields) + { + if (encoded(f)) + { + f.read(dec, this); + } + } + } + + public final void write(Encoder enc) + { + List> fields = getFields(); + + assert fields.size() <= 8*getPackWidth(); + + // XXX: remove to enable packed encoding + if (false) + { + for (Field f : fields) + { + if (isBit(f)) + { + f.write(enc, this); + } + else + { + enc.writeBit(f.has(this)); + } + } + + for (int i = 0; i < getPaddWidth(); i++) + { + enc.writeOctet((short) 0x0); + } + } + + if (hasTicket()) + { + enc.writeShort(0x0); + } + + for (Field f : fields) + { + if (encoded(f)) + { + f.write(enc, this); + } + } + } + public String toString() { StringBuilder str = new StringBuilder(); @@ -50,8 +169,17 @@ public abstract class Struct implements Encodable str.append("("); boolean first = true; - for (Field f : getFields()) + for (Field f : getFields()) { + // XXX: remove when packed encoding is enabled + if (false) + { + if (!f.has(this)) + { + continue; + } + } + if (first) { first = false; diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java index 2855986f90..e5997d6642 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java @@ -88,6 +88,12 @@ abstract class AbstractDecoder implements Decoder } boolean result = (bits & (1 << nbits++)) != 0; + + if (nbits == 8) + { + clearBits(); + } + return result; } @@ -191,7 +197,7 @@ abstract class AbstractDecoder implements Decoder { int type = readShort(); Struct result = Struct.create(type); - result.read(this, major, minor); + result.read(this); return result; } } diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java index 8e68a0f2b6..68c2b3c952 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java @@ -236,13 +236,14 @@ abstract class AbstractEncoder implements Encoder { SizeEncoder sizer = new SizeEncoder(major, minor); sizer.writeShort(s.getEncodedType()); - s.write(sizer, major, minor); + s.write(sizer); + sizer.flush(); size = sizer.getSize(); } writeLong(size); writeShort(s.getEncodedType()); - s.write(this, major, minor); + s.write(this); } } diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Encodable.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Encodable.java index 54fdd2768e..60c2ea97b8 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Encodable.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Encodable.java @@ -30,8 +30,8 @@ package org.apache.qpidity.transport.codec; public interface Encodable { - void write(Encoder enc, byte major, byte minor); + void write(Encoder enc); - void read(Decoder dec, byte major, byte minor); + void read(Decoder dec); } 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 d12cd003a9..8375e3f845 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 @@ -167,7 +167,7 @@ public class Assembler implements Receiver, NetworkDelegate case Frame.METHOD: int methodType = dec.readShort(); Method method = Method.create(methodType); - method.read(dec, major, minor); + method.read(dec); return method; case Frame.HEADER: List structs = new ArrayList(); diff --git a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Disassembler.java b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Disassembler.java index faaf8bfe4c..8f95dc0234 100644 --- a/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Disassembler.java +++ b/qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Disassembler.java @@ -118,14 +118,14 @@ public class Disassembler implements Sender, { SizeEncoder sizer = new SizeEncoder(major, minor); sizer.writeShort(method.getEncodedType()); - method.write(sizer, major, minor); + method.write(sizer); sizer.flush(); int size = sizer.getSize(); ByteBuffer buf = ByteBuffer.allocate(size); BBEncoder enc = new BBEncoder(major, minor, buf); enc.writeShort(method.getEncodedType()); - method.write(enc, major, minor); + method.write(enc); enc.flush(); buf.flip(); -- cgit v1.2.1