You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ra...@apache.org on 2015/10/05 18:46:48 UTC
[2/5] qpid-proton git commit: Fixed various bugs within the codec and
type handling logic.
Fixed various bugs within the codec and type handling logic.
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/041c573d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/041c573d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/041c573d
Branch: refs/heads/rajith-codec
Commit: 041c573d09da71a1bc1b71f8b321612428cbf22e
Parents: e7d9c59
Author: Rajith Attapattu <ra...@apache.org>
Authored: Sun Oct 4 18:12:46 2015 -0400
Committer: Rajith Attapattu <ra...@apache.org>
Committed: Sun Oct 4 18:12:46 2015 -0400
----------------------------------------------------------------------
.../qpid/proton/codec2/AbstractDecoder.java | 6 +
.../qpid/proton/codec2/AbstractEncoder.java | 33 +-
.../qpid/proton/codec2/AbstractEncoder2.java | 379 +++++++++++++++++++
.../qpid/proton/codec2/ByteArrayEncoder.java | 2 +-
.../org/apache/qpid/proton/codec2/Decoder.java | 2 +
.../qpid/proton/codec2/DiscriptorRegistry.java | 5 +
.../org/apache/qpid/proton/codec2/Example.java | 141 ++++++-
.../apache/qpid/proton/codec2/POJOBuilder.java | 3 +-
8 files changed, 556 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractDecoder.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractDecoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractDecoder.java
index af047df..6efd8fd 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractDecoder.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractDecoder.java
@@ -519,4 +519,10 @@ public abstract class AbstractDecoder implements Decoder
// TODO Auto-generated method stub
return 0;
}
+
+ @Override
+ public byte[] getBytes(int size)
+ {
+ return readBytes(offset, size);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder.java
index 01c3aed..3d931d5 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder.java
@@ -52,6 +52,12 @@ public abstract class AbstractEncoder implements Encoder
boolean written;
Coder coder;
Incrementor incrementor;
+ String desc;
+
+ public String toString()
+ {
+ return "desc=" + desc + ", start=" + start;
+ }
}
private Frame free = null;
@@ -73,13 +79,14 @@ public abstract class AbstractEncoder implements Encoder
private Frame current = null;
- private void push() {
+ private void push(String desc) {
Frame frame = allocate();
frame.next = current;
frame.start = getPosition();
frame.count = count;
frame.coder = coder;
frame.incrementor = incrementor;
+ frame.desc = desc;
count = 0;
incrementor = NOOP;
coder = DEFAULT;
@@ -321,27 +328,27 @@ public abstract class AbstractEncoder implements Encoder
increment();
}
- private void start(int width) {
- push();
+ private void start(int width, String desc) {
+ push(desc);
skip(width);
}
@Override
public void putList() {
writeCode(Encodings.LIST32);
- start(Widths.LIST32);
+ start(Widths.LIST32, "List");
}
@Override
public void putMap() {
writeCode(Encodings.MAP32);
- start(Widths.MAP32);
+ start(Widths.MAP32, "Map");
}
@Override
public void putArray(Type t) {
writeCode(Encodings.ARRAY32);
- start(Widths.ARRAY32);
+ start(Widths.ARRAY32, "Array");
coder = ARRAY;
}
@@ -349,7 +356,7 @@ public abstract class AbstractEncoder implements Encoder
public void putDescriptor() {
writeF8(0x0);
Incrementor inc = coder == ARRAY ? DESC_ARRAY : DESC;
- push();
+ push("Descriptor");
incrementor = inc;
}
@@ -367,6 +374,18 @@ public abstract class AbstractEncoder implements Encoder
increment();
}
+ public void endInCurrentFrame() {
+ int pos = getPosition();
+ setPosition(current.start);
+ writeF32(pos - current.start);
+ writeF32(count);
+ setPosition(pos);
+ count = current.count;
+ coder = current.coder;
+ incrementor = current.incrementor;
+ current = current.next;
+ increment();
+ }
@Override
public void putUshort(int i)
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder2.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder2.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder2.java
new file mode 100644
index 0000000..0982bf2
--- /dev/null
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/AbstractEncoder2.java
@@ -0,0 +1,379 @@
+/*
+ *
+ * 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.qpid.proton.codec2;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * AbstractEncoder
+ *
+ */
+
+public abstract class AbstractEncoder2 implements Encoder
+{
+
+ abstract void skip(int width);
+
+ abstract void writeF8(int i);
+ abstract void writeF16(int i);
+ abstract void writeF32(int i);
+ abstract void writeF64(long l);
+
+ abstract void writeV8(byte[] bytes, int offset, int size);
+ abstract void writeV32(byte[] bytes, int offset, int size);
+
+ abstract int getPosition();
+ abstract void setPosition(int i);
+
+ private class Frame {
+ Frame prev;
+ int start;
+ int count;
+ Coder coder;
+ Incrementor incrementor;
+ String desc;
+ String format = "[desc=%s, start=%s, count=%s]";
+
+ public String toString()
+ {
+ return String.format(format, desc, start, count);
+ }
+ }
+
+ /*private Frame free = null;
+
+ private Frame allocate() {
+ if (free == null) {
+ free = new Frame();
+ }
+
+ Frame frame = free;
+ free = free.next;
+ return frame;
+ }
+
+ private void free(Frame frame) {
+ frame.next = free;
+ free = frame;
+ }*/
+
+ private Frame current = null;
+
+ private void newFrame(String desc) {
+ Frame frame = new Frame();
+ frame.prev = current;
+ frame.start = getPosition();
+ frame.count = 0;
+ frame.coder = coder;
+ frame.incrementor = incrementor;
+ frame.desc = desc;
+ incrementor = NOOP;
+ coder = DEFAULT;
+ current = frame;
+ }
+
+ private void endFrame() {
+ coder = current.prev == null? DEFAULT : current.prev.coder;
+ incrementor = current.prev == null? NOOP : current.prev.incrementor;
+ current = current.prev;
+ }
+
+ private abstract class Coder {
+ abstract void write(int encoding);
+ }
+
+ private class DefaultCoder extends Coder {
+ void write(int encoding) {
+ writeF8(encoding);
+ }
+ }
+
+ private class ArrayCoder extends Coder {
+ void write(int encoding) {
+ writeF8(encoding);
+ coder = NOCODE;
+ }
+ }
+
+ private class NoopCoder extends Coder {
+ void write(int encoding) {}
+ }
+
+ private final Coder DEFAULT = new DefaultCoder();
+ private final Coder ARRAY = new ArrayCoder();
+ private final Coder NOCODE = new NoopCoder();
+ private Coder coder = DEFAULT;
+
+ private void writeCode(int encoding) {
+ coder.write(encoding);
+ }
+
+ private abstract class Incrementor {
+ abstract void go();
+ }
+
+ private class NoopIncrementor extends Incrementor {
+ void go() {}
+ }
+
+ private class DescriptorIncrementor extends Incrementor {
+ void go() {
+ if (current.count == 2) {
+ endFrame();
+ increment();
+ incrementor = NOOP;
+ }
+ }
+ }
+
+ private class DescriptorArrayIncrementor extends Incrementor {
+ void go() {
+ if (current.count == 1) {
+ endFrame();
+ incrementor = NOOP;
+ }
+ }
+ }
+
+ private final Incrementor NOOP = new NoopIncrementor();
+ private final Incrementor DESC = new DescriptorIncrementor();
+ private final Incrementor DESC_ARRAY = new DescriptorArrayIncrementor();
+
+ private Incrementor incrementor = NOOP;
+
+ private void increment() {
+ if (current != null)
+ {
+ current.count++;
+ current.incrementor.go();
+ }
+ }
+
+ @Override
+ public void putNull() {
+ writeCode(Encodings.NULL);
+ increment();
+ }
+
+ @Override
+ public void putBoolean(boolean b) {
+ // XXX: array
+ if (b) {
+ writeCode(Encodings.TRUE);
+ } else {
+ writeCode(Encodings.FALSE);
+ }
+ increment();
+ }
+
+ @Override
+ public void putByte(byte b) {
+ writeCode(Encodings.BYTE);
+ writeF8(b);
+ increment();
+ }
+
+ @Override
+ public void putShort(short s) {
+ writeCode(Encodings.SHORT);
+ writeF16(s);
+ increment();
+ }
+
+ @Override
+ public void putInt(int i) {
+ writeCode(Encodings.INT);
+ writeF32(i);
+ increment();
+ }
+
+ @Override
+ public void putLong(long l) {
+ writeCode(Encodings.LONG);
+ writeF64(l);
+ increment();
+ }
+
+ @Override
+ public void putUbyte(byte b) {
+ writeCode(Encodings.UBYTE);
+ writeF8(b);
+ increment();
+ }
+
+ @Override
+ public void putUshort(short s) {
+ writeCode(Encodings.USHORT);
+ writeF16(s);
+ increment();
+ }
+
+ @Override
+ public void putUint(int i) {
+ writeCode(Encodings.UINT);
+ writeF32(i);
+ increment();
+ }
+
+ @Override
+ public void putUlong(long l) {
+ writeCode(Encodings.ULONG);
+ writeF64(l);
+ increment();
+ }
+
+ @Override
+ public void putFloat(float f) {
+ writeCode(Encodings.FLOAT);
+ writeF32(Float.floatToIntBits(f));
+ increment();
+ }
+
+ @Override
+ public void putDouble(double d) {
+ writeCode(Encodings.DOUBLE);
+ writeF64(Double.doubleToLongBits(d));
+ increment();
+ }
+
+ @Override
+ public void putChar(char c) {
+ putChar(c);
+ }
+
+ @Override
+ public void putChar(int utf32) {
+ writeCode(Encodings.UTF32);
+ writeF32(utf32);
+ increment();
+ }
+
+ @Override
+ public void putTimestamp(long t) {
+ writeCode(Encodings.MS64);
+ writeF64(t);
+ increment();
+ }
+
+ @Override
+ public void putUUID(long hi, long lo) {
+ writeCode(Encodings.UUID);
+ writeF64(hi);
+ writeF64(lo);
+ increment();
+ }
+
+ @Override
+ public void putString(String s) {
+ if(s == null)
+ {
+ putNull();
+ return;
+ }
+ byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
+ putString(bytes, 0, bytes.length);
+ }
+
+ @Override
+ public void putString(byte[] utf8, int offset, int size) {
+ writeCode(Encodings.STR32);
+ writeV32(utf8, offset, size);
+ increment();
+ }
+
+ @Override
+ public void putBinary(byte[] bytes, int offset, int size) {
+ writeCode(Encodings.VBIN32);
+ writeV32(bytes, offset, size);
+ increment();
+ }
+
+ @Override
+ public void putSymbol(String s) {
+ if(s == null)
+ {
+ putNull();
+ return;
+ }
+ byte[] bytes = s.getBytes(StandardCharsets.US_ASCII);
+ putSymbol(bytes, 0, bytes.length);
+ }
+
+ @Override
+ public void putSymbol(byte[] ascii, int offset, int size) {
+ writeCode(Encodings.SYM32);
+ writeV32(ascii, offset, size);
+ increment();
+ }
+
+ private void start(int width, String desc) {
+ newFrame(desc);
+ skip(width);
+ }
+
+ @Override
+ public void putList() {
+ writeCode(Encodings.LIST32);
+ start(Widths.LIST32, "List");
+ }
+
+ @Override
+ public void putMap() {
+ writeCode(Encodings.MAP32);
+ start(Widths.MAP32, "Map");
+ }
+
+ @Override
+ public void putArray(Type t) {
+ writeCode(Encodings.ARRAY32);
+ start(Widths.ARRAY32, "Array");
+ coder = ARRAY;
+ }
+
+ @Override
+ public void putDescriptor() {
+ writeF8(0x0);
+ Incrementor inc = coder == ARRAY ? DESC_ARRAY : DESC;
+ incrementor = inc;
+ newFrame("Descriptor");
+ }
+
+ @Override
+ public void end() {
+ if (current == null) {
+ throw new IllegalStateException("mismatched call to end()");
+ }
+ System.out.println("Ending frame : " + current);
+ int pos = getPosition();
+ setPosition(current.start);
+ writeF32(pos - current.start);
+ writeF32(current.count);
+ setPosition(pos);
+ endFrame();
+ increment();
+ }
+
+ @Override
+ public void putUshort(int i)
+ {
+ // TODO Auto-generated method stub
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/ByteArrayEncoder.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/ByteArrayEncoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/ByteArrayEncoder.java
index 5c28757..5e601d3 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/ByteArrayEncoder.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/ByteArrayEncoder.java
@@ -26,7 +26,7 @@ package org.apache.qpid.proton.codec2;
*
*/
-public class ByteArrayEncoder extends AbstractEncoder
+public class ByteArrayEncoder extends AbstractEncoder2
{
private byte[] bytes;
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java
index 5a14081..f754f13 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java
@@ -58,5 +58,7 @@ public interface Decoder
char getChar();
+ byte[] getBytes(int size);
+
void decode(DataHandler handler);
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/DiscriptorRegistry.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/DiscriptorRegistry.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/DiscriptorRegistry.java
index 6536c6b..06c68b4 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/DiscriptorRegistry.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/DiscriptorRegistry.java
@@ -157,4 +157,9 @@ public class DiscriptorRegistry
{
return _typeRegByDescriptor.get(code);
}
+
+ static void dump()
+ {
+ System.out.println(_typeRegByCode);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/Example.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Example.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Example.java
index c8b9d4e..378ecc1 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Example.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Example.java
@@ -20,7 +20,13 @@
*/
package org.apache.qpid.proton.codec2;
-import java.util.*;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+
+import org.apache.qpid.proton.transport2.Attach;
+import org.apache.qpid.proton.transport2.Source;
+import org.apache.qpid.proton.transport2.Target;
+import org.apache.qpid.proton.transport2.Transfer;
/**
* Example
@@ -30,12 +36,19 @@ import java.util.*;
public class Example
{
- public static final void main(String[] args) {
+ public static final void main(String[] args) throws Exception {
byte[] bytes = new byte[1024];
ByteArrayEncoder enc = new ByteArrayEncoder();
enc.init(bytes, 0, 1024);
- enc.putInt(3);
+
+ method5(enc);
+
+ int size = enc.getPosition();
+
+ toFile(bytes, 0, size);
+
+ /*enc.putInt(3);
enc.putDescriptor();
enc.putSymbol("url");
enc.putString("http://example.org");
@@ -69,16 +82,132 @@ public class Example
int size = enc.getPosition();
//System.out.write(bytes, 0, size);
- /**/
+
ByteArrayDecoder dec = new ByteArrayDecoder();
dec.init(bytes, 0, size);
POJOBuilder pb = new POJOBuilder();
dec.decode(pb);
System.out.println(pb.build());
- /**/
+
List l = (List) pb.build();
+ System.out.println("First item : " + l.get(0));
+ System.out.println("Second item : " + l.get(1));
System.out.println(Arrays.toString((Object[]) l.get(4)));
- System.out.println(Arrays.toString((Object[]) l.get(5)));
+ System.out.println(Arrays.toString((Object[]) l.get(5)));
+ **/
+
+ ByteArrayDecoder dec = new ByteArrayDecoder();
+ dec.init(bytes, 0, size);
+ POJOBuilder pb = new POJOBuilder();
+ dec.decode(pb);
+ System.out.println(pb.build());
+ }
+
+ static void toFileHex(byte[] bytes, int offset, int len) throws Exception
+ {
+ FileWriter fout = new FileWriter("/home/rajith/data/NestedData");
+ fout.write(bytesToHex(bytes, 0, len));
+ fout.flush();
+ fout.close();
+ }
+
+ static void toFile(byte[] bytes, int offset, int len) throws Exception
+ {
+ FileOutputStream fout = new FileOutputStream("/home/rajith/data/NestedData");
+ fout.write(bytes, 0, len);
+ fout.flush();
+ fout.close();
+ }
+
+ final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
+ public static String bytesToHex(byte[] bytes, int offset, int len) {
+ char[] hexChars = new char[len * 2];
+ for ( int j = offset; j < len; j++ ) {
+ int v = bytes[j] & 0xFF;
+ hexChars[j * 2] = hexArray[v >>> 4];
+ hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+ }
+ return new String(hexChars);
+ }
+
+ public static void method1(Encoder enc)
+ {
+ enc.putMap();
+ enc.putString("List");
+ enc.putList();
+ enc.putInt(1);
+ enc.putInt(2);
+ enc.putInt(3);
+ enc.end();
+ enc.putString("Name");
+ enc.putString("Rajith");
+ enc.end();
+ }
+
+
+ public static void method2(Encoder enc)
+ {
+ enc.putMap();
+ enc.putString("List");
+ enc.putList();
+ enc.putInt(1);
+ enc.putInt(2);
+ enc.putInt(3);
+ enc.end();
+ enc.putString("Name");
+ enc.putString("Rajith");
+ enc.putString("List2");
+ enc.putList();
+ enc.putInt(1);
+ enc.putInt(2);
+ enc.putInt(3);
+ enc.end();
+ enc.end();
+ }
+
+ public static void method3(Encoder enc)
+ {
+ enc.putMap();
+ enc.putString("List");
+ enc.putList();
+ enc.putInt(1);
+ enc.putInt(2);
+ enc.putInt(3);
+ enc.end();
+ enc.putString("Name");
+ enc.putString("Rajith");
+ enc.putString("Inner Map");
+ enc.putMap();
+ enc.putString("InnerList");
+ enc.putString("FakeListValue");
+ /*enc.putList();
+ enc.putInt(1);
+ enc.putInt(2);
+ enc.putInt(3);
+ enc.end();*/
+ enc.end();
+ enc.end();
}
+ public static void method4(Encoder enc)
+ {
+ Attach a = new Attach();
+ a.setName("Hello");
+ Source s = new Source();
+ s.setAddress("hello");
+ Target t = new Target();
+ a.setSource(s);
+ a.setTarget(t);
+ a.encode(enc);
+ }
+
+ public static void method5(Encoder enc)
+ {
+ Transfer t = new Transfer();
+ t.setDeliveryTag("hello".getBytes());
+ t.setHandle(1);
+ t.encode(enc);
+ }
}
+
+
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/041c573d/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java
index 87cfc0d..676fbaa 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java
@@ -73,6 +73,7 @@ public class POJOBuilder implements DataHandler
}
else
{
+ DiscriptorRegistry.dump();
described = new Described(descriptor, o);
}
end();
@@ -404,6 +405,6 @@ public class POJOBuilder implements DataHandler
@Override
public void onBinary(Decoder decoder)
{
- //builder.add(decoder.get);
+ builder.add(decoder.getBytes(decoder.getSize()));
}
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org