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