summaryrefslogtreecommitdiff
path: root/qpid/java/common/src
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2007-10-10 13:24:24 +0000
committerRafael H. Schloming <rhs@apache.org>2007-10-10 13:24:24 +0000
commit89cc15c84947df5b19efaf4c8e4d46b62559f96e (patch)
treeb13bd36f6e97712eb7adbff1b0e44bdbc470fe30 /qpid/java/common/src
parentbcee10ba757312614d9dcb57681ef4a19ef652f4 (diff)
downloadqpid-python-89cc15c84947df5b19efaf4c8e4d46b62559f96e.tar.gz
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
Diffstat (limited to 'qpid/java/common/src')
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/ToyClient.java1
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/Field.java27
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/Struct.java132
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractDecoder.java8
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/AbstractEncoder.java5
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/codec/Encodable.java4
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Assembler.java2
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpidity/transport/network/Disassembler.java4
8 files changed, 165 insertions, 18 deletions
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<QueueQueryResult> 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<T>
+public abstract class Field<C,T>
{
- private final Class<T> container;
+ private final Class<C> container;
+ private final Class<T> type;
private final String name;
private final int index;
- Field(Class<T> container, String name, int index)
+ Field(Class<C> container, Class<T> type, String name, int index)
{
this.container = container;
+ this.type = type;
this.name = name;
this.index = index;
}
- public Class<T> getContainer()
+ public final Class<C> getContainer()
{
return container;
}
- public String getName()
+ public final Class<T> 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<Field<?>> getFields();
+ public abstract List<Field<?,?>> 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<Field<?,?>> 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<Field<?,?>> 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<NetworkEvent>, 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<Struct> 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<ConnectionEvent>,
{
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();