You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2017/03/29 11:13:54 UTC

svn commit: r1789336 - in /qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src: main/java/org/apache/qpid/server/protocol/v0_10/ main/java/org/apache/qpid/server/protocol/v0_10/transport/ test/java/org/apache/qpid/server/protocol/v0_10/transport/

Author: orudyy
Date: Wed Mar 29 11:13:54 2017
New Revision: 1789336

URL: http://svn.apache.org/viewvc?rev=1789336&view=rev
Log:
QPID-7723: Optimize evaluation of metadata storable size for AMQP 0-10

Added:
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/EncoderUtils.java
Modified:
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageMetaData_0_10.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/AbstractEncoder.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Acquired.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/DeliveryProperties.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Encoder.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeBoundResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeQueryResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/FragmentProperties.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/GetTimeoutResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageProperties.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageResumeResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Method.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/QueueQueryResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/RecoverResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ReplyTo.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionCommandFragment.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionHeader.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Struct.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/XaResult.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Xid.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/transport/BBEncoderTest.java

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageMetaData_0_10.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageMetaData_0_10.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageMetaData_0_10.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageMetaData_0_10.java Wed Mar 29 11:13:54 2017
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.message.AMQMessageHeader;
 import org.apache.qpid.server.plugin.MessageMetaDataType;
+import org.apache.qpid.server.protocol.v0_10.transport.EncoderUtils;
 import org.apache.qpid.server.store.StorableMessageMetaData;
 import org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties;
 import org.apache.qpid.server.protocol.v0_10.transport.Header;
@@ -83,17 +84,32 @@ public class MessageMetaData_0_10 implem
         return TYPE;
     }
 
-    public synchronized int getStorableSize()
+
+    public int getStorableSize()
     {
-        QpidByteBuffer buf = _encoded;
+        int len = 0;
+
+        len += 8; // arrival time
+        len += 4; // body size
+        len += 4; // headers length
 
-        if(buf == null)
+        if(_header.getDeliveryProperties() != null)
+        {
+            len += EncoderUtils.getStruct32Length(_header.getDeliveryProperties());
+        }
+        if(_header.getMessageProperties() != null)
         {
-            buf = encodeAsBuffer();
-            _encoded = buf;
+            len += EncoderUtils.getStruct32Length(_header.getMessageProperties());
         }
+        if(_header.getNonStandardProperties() != null)
+        {
+            for(Struct header : _header.getNonStandardProperties())
+            {
+                len += EncoderUtils.getStruct32Length(header);
+            }
 
-        return buf.limit();
+        }
+        return len;
     }
 
     private QpidByteBuffer encodeAsBuffer()

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/AbstractEncoder.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/AbstractEncoder.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/AbstractEncoder.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/AbstractEncoder.java Wed Mar 29 11:13:54 2017
@@ -24,7 +24,6 @@ import static org.apache.qpid.server.tra
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -40,24 +39,6 @@ import java.util.UUID;
 public abstract class AbstractEncoder implements Encoder
 {
 
-    private static Map<Class<?>,Type> ENCODINGS = new HashMap<Class<?>,Type>();
-    static
-    {
-        ENCODINGS.put(Boolean.class, Type.BOOLEAN);
-        ENCODINGS.put(String.class, Type.STR16);
-        ENCODINGS.put(Long.class, Type.INT64);
-        ENCODINGS.put(Integer.class, Type.INT32);
-        ENCODINGS.put(Short.class, Type.INT16);
-        ENCODINGS.put(Byte.class, Type.INT8);
-        ENCODINGS.put(Map.class, Type.MAP);
-        ENCODINGS.put(List.class, Type.LIST);
-        ENCODINGS.put(Float.class, Type.FLOAT);
-        ENCODINGS.put(Double.class, Type.DOUBLE);
-        ENCODINGS.put(Character.class, Type.CHAR);
-        ENCODINGS.put(byte[].class, Type.VBIN32);
-        ENCODINGS.put(UUID.class, Type.UUID);
-        ENCODINGS.put(Xid.class, Type.STRUCT32);
-    }
 
     private final Map<String,byte[]> str8cache = new LinkedHashMap<String,byte[]>()
     {
@@ -281,58 +262,6 @@ public abstract class AbstractEncoder im
         }
     }
 
-    private Type encoding(Object value)
-    {
-        if (value == null)
-        {
-            return Type.VOID;
-        }
-
-        Class klass = value.getClass();
-        Type type = resolve(klass);
-
-        if (type == null)
-        {
-            throw new IllegalArgumentException
-                ("unable to resolve type: " + klass + ", " + value);
-        }
-        else
-        {
-            return type;
-        }
-    }
-
-    static final Type resolve(Class klass)
-    {
-        Type type = ENCODINGS.get(klass);
-        if (type != null)
-        {
-            return type;
-        }
-
-        Class sup = klass.getSuperclass();
-        if (sup != null)
-        {
-            type = resolve(klass.getSuperclass());
-
-            if (type != null)
-            {
-                return type;
-            }
-        }
-
-        for (Class iface : klass.getInterfaces())
-        {
-            type = resolve(iface);
-            if (type != null)
-            {
-                return type;
-            }
-        }
-
-        return null;
-    }
-
     public void writeMap(Map<String,Object> map)
     {
         int pos = beginSize32();
@@ -350,7 +279,7 @@ public abstract class AbstractEncoder im
         {
             String key = entry.getKey();
             Object value = entry.getValue();
-            Type type = encoding(value);
+            Type type = EncoderUtils.getEncodingType(value);
             writeStr8(key);
             put(type.getCode());
             write(type, value);
@@ -372,7 +301,7 @@ public abstract class AbstractEncoder im
     {
         for (Object value : list)
         {
-            Type type = encoding(value);
+            Type type = EncoderUtils.getEncodingType(value);
             put(type.getCode());
             write(type, value);
         }
@@ -398,7 +327,7 @@ public abstract class AbstractEncoder im
         }
         else
         {
-            type = encoding(array.get(0));
+            type = EncoderUtils.getEncodingType(array.get(0));
         }
 
         put(type.getCode());

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Acquired.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Acquired.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Acquired.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Acquired.java Wed Mar 29 11:13:54 2017
@@ -134,5 +134,9 @@ public final class Acquired extends Stru
         return result;
     }
 
-
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/DeliveryProperties.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/DeliveryProperties.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/DeliveryProperties.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/DeliveryProperties.java Wed Mar 29 11:13:54 2017
@@ -517,6 +517,51 @@ public final class DeliveryProperties ex
 
     }
 
+    public int getEncodedLength()
+    {
+        int len = 0;
+
+        len += 2; // packing_flags
+
+        if ((packing_flags & 2048) != 0)
+        {
+            len += 1; // priority
+        }
+        if ((packing_flags & 4096) != 0)
+        {
+            len += 1; // deliveryMode
+        }
+        if ((packing_flags & 8192) != 0)
+        {
+            len += 8; // ttl
+        }
+        if ((packing_flags & 16384) != 0)
+        {
+            len += 8; // timestamp
+        }
+        if ((packing_flags & 32768) != 0)
+        {
+            len += 8; // expiration
+        }
+        if ((packing_flags & 1) != 0)
+        {
+            len += EncoderUtils.getStr8Length(this.exchange);
+        }
+        if ((packing_flags & 2) != 0)
+        {
+            len += EncoderUtils.getStr8Length(this.routingKey);
+        }
+        if ((packing_flags & 4) != 0)
+        {
+            len += EncoderUtils.getStr16Length(this.resumeId);
+        }
+        if ((packing_flags & 8) != 0)
+        {
+            len += 8; // resumeTtl
+        }
+        return len;
+    }
+
     public void read(Decoder dec)
     {
         packing_flags = (short) dec.readUint16();
@@ -559,6 +604,7 @@ public final class DeliveryProperties ex
 
     }
 
+
     public Map<String,Object> getFields()
     {
         Map<String,Object> result = new LinkedHashMap<String,Object>();
@@ -615,6 +661,4 @@ public final class DeliveryProperties ex
 
         return result;
     }
-
-
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Encoder.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Encoder.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Encoder.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Encoder.java Wed Mar 29 11:13:54 2017
@@ -24,9 +24,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.qpid.server.protocol.v0_10.transport.RangeSet;
-import org.apache.qpid.server.protocol.v0_10.transport.Struct;
-
 
 /**
  * Encoder interface.

Added: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/EncoderUtils.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/EncoderUtils.java?rev=1789336&view=auto
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/EncoderUtils.java (added)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/EncoderUtils.java Wed Mar 29 11:13:54 2017
@@ -0,0 +1,339 @@
+/*
+ * 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.server.protocol.v0_10.transport;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class EncoderUtils
+{
+    private static final Map<Class<?>, Type> ENCODINGS = new HashMap<>();
+    static
+    {
+        ENCODINGS.put(Boolean.class, Type.BOOLEAN);
+        ENCODINGS.put(String.class, Type.STR16);
+        ENCODINGS.put(Long.class, Type.INT64);
+        ENCODINGS.put(Integer.class, Type.INT32);
+        ENCODINGS.put(Short.class, Type.INT16);
+        ENCODINGS.put(Byte.class, Type.INT8);
+        ENCODINGS.put(Map.class, Type.MAP);
+        ENCODINGS.put(List.class, Type.LIST);
+        ENCODINGS.put(Float.class, Type.FLOAT);
+        ENCODINGS.put(Double.class, Type.DOUBLE);
+        ENCODINGS.put(Character.class, Type.CHAR);
+        ENCODINGS.put(byte[].class, Type.VBIN32);
+        ENCODINGS.put(UUID.class, Type.UUID);
+        ENCODINGS.put(Xid.class, Type.STRUCT32);
+    }
+
+    public static Type getEncodingType(Object value)
+    {
+        if (value == null)
+        {
+            return Type.VOID;
+        }
+
+        Class klass = value.getClass();
+        Type type = resolve(klass);
+
+        if (type == null)
+        {
+            throw new IllegalArgumentException
+                    ("unable to resolve type: " + klass + ", " + value);
+        }
+        else
+        {
+            return type;
+        }
+    }
+
+    public static int getStruct32Length(Struct s)
+    {
+        if (s == null)
+        {
+            return 4;
+        }
+        else
+        {
+            int len = 0;
+            len += 4; // size
+            len += 2; // encoded type
+            len += s.getEncodedLength();
+
+            return len;
+        }
+    }
+
+    public static int getArrayLength(List<Object> value)
+    {
+        int len = 0;
+        len += 4; // size
+        if (value != null && !value.isEmpty())
+        {
+            len += 1; // type
+            len += 4; // array size
+
+            final Type type = getEncodingType(value.get(0));
+            for (Object v : value)
+            {
+                len += getTypeLength(type, v);
+            }
+
+        }
+
+        return len;
+
+    }
+
+    public static int getListLength(List<Object> value)
+    {
+        int len = 0;
+        len += 4; // size
+        if (value != null && !value.isEmpty())
+        {
+            len += 4; // list size
+            for (Object v : value)
+            {
+                final Type type = getEncodingType(v);
+                len += 1; // type code
+                len += getTypeLength(type, v);
+            }
+        }
+        return len;
+    }
+
+    public static int getStr8Length(String s)
+    {
+        if (s == null)
+        {
+            return 1;
+        }
+        else
+        {
+            int length = s.getBytes(StandardCharsets.UTF_8).length;
+            if (length > 255)
+            {
+                throw new IllegalArgumentException(String.format("String too long (%d) for str8", length));
+            }
+            return 1 + length;
+        }
+    }
+
+    public static int getStr16Length(String s)
+    {
+        if (s == null)
+        {
+            return 2;
+        }
+        else
+        {
+            int length = s.getBytes(StandardCharsets.UTF_8).length;
+            if (length > 65535)
+            {
+                throw new IllegalArgumentException(String.format("String too long (%d) for str16", length));
+            }
+            return 2 + length;
+        }
+    }
+
+    public static int getVbin16Length(byte[] bytes)
+    {
+        if (bytes == null)
+        {
+            return 2;
+        }
+        else
+        {
+            return 2 + bytes.length;
+        }
+    }
+
+    public static int getStructLength(int type, Struct s)
+    {
+        int len = 0;
+
+        if (s == null)
+        {
+            s = Struct.create(type);
+        }
+
+        int width = s.getSizeWidth();
+
+        if (width > 0)
+        {
+            switch (width)
+            {
+                case 1:
+                case 2:
+                case 4:
+                    len += width;
+                    break;
+                default:
+                    throw new IllegalStateException("illegal width: " + width);
+            }
+        }
+
+        if (type > 0)
+        {
+            len += 2; // type
+        }
+
+        len += s.getEncodedLength();
+
+        return len;
+
+
+    }
+
+    public static int getMapLength(Map<String, Object> map)
+    {
+        int len = 0;
+
+        len += 4; // size
+        if (map != null)
+        {
+            len += 4; // map size
+            for (Map.Entry<String,Object> entry : map.entrySet())
+            {
+                String key = entry.getKey();
+                Object value = entry.getValue();
+                len += getStr8Length(key);
+                len += 1; // type code
+                Type type = getEncodingType(value);
+                len += getTypeLength(type, value);
+            }
+        }
+
+        return len;
+    }
+
+    private static Type resolve(Class klass)
+    {
+        Type type = ENCODINGS.get(klass);
+        if (type != null)
+        {
+            return type;
+        }
+
+        Class sup = klass.getSuperclass();
+        if (sup != null)
+        {
+            type = resolve(klass.getSuperclass());
+
+            if (type != null)
+            {
+                return type;
+            }
+        }
+
+        for (Class iface : klass.getInterfaces())
+        {
+            type = resolve(iface);
+            if (type != null)
+            {
+                return type;
+            }
+        }
+
+        return null;
+    }
+
+    private static int getTypeLength(Type t, Object value)
+    {
+        switch (t)
+        {
+            case VOID:
+                return 0;
+
+            case BIN8:
+            case UINT8:
+            case INT8:
+            case CHAR:
+            case BOOLEAN:
+                return 1;
+
+            case BIN16:
+            case UINT16:
+            case INT16:
+                return 2;
+
+            case BIN32:
+            case UINT32:
+            case CHAR_UTF32:
+            case INT32:
+            case FLOAT:
+                return 4;
+
+            case BIN64:
+            case UINT64:
+            case INT64:
+            case DATETIME:
+            case DOUBLE:
+                return 8;
+
+            case UUID:
+                return 16;
+
+            case STR8:
+                return getStr8Length((String) value);
+
+            case STR16:
+                return getStr16Length((String) value);
+
+            case STR8_LATIN:
+            case STR8_UTF16:
+            case STR16_LATIN:
+            case STR16_UTF16:
+                String str = (String) value;
+                return t.getWidth() + (str == null ? 0 : str.getBytes(StandardCharsets.UTF_8).length);
+
+            case MAP:
+                return getMapLength((Map<String, Object>) value);
+
+            case LIST:
+                return getListLength((List<Object>) value);
+
+            case ARRAY:
+                return getArrayLength((List<Object>) value);
+
+            case STRUCT32:
+                return getStruct32Length((Struct) value);
+
+            case BIN40:
+            case DEC32:
+            case BIN72:
+            case DEC64:
+                return t.getWidth() + (value == null ? 0 : ((byte[])value).length);
+
+            default:
+                if (!(value instanceof byte[]))
+                {
+                    throw new IllegalArgumentException("Expecting byte array was " + (value == null
+                            ? "null"
+                            : value.getClass()));
+                }
+                return t.getWidth() + (value == null ? 0 : ((byte[])value).length);
+        }
+    }
+}

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeBoundResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeBoundResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeBoundResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeBoundResult.java Wed Mar 29 11:13:54 2017
@@ -294,5 +294,10 @@ public final class ExchangeBoundResult e
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeQueryResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeQueryResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeQueryResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ExchangeQueryResult.java Wed Mar 29 11:13:54 2017
@@ -261,5 +261,10 @@ public final class ExchangeQueryResult e
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/FragmentProperties.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/FragmentProperties.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/FragmentProperties.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/FragmentProperties.java Wed Mar 29 11:13:54 2017
@@ -217,5 +217,11 @@ public final class FragmentProperties ex
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/GetTimeoutResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/GetTimeoutResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/GetTimeoutResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/GetTimeoutResult.java Wed Mar 29 11:13:54 2017
@@ -132,5 +132,11 @@ public final class GetTimeoutResult exte
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageProperties.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageProperties.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageProperties.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageProperties.java Wed Mar 29 11:13:54 2017
@@ -389,6 +389,52 @@ public final class MessageProperties ext
 
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        int len = 0;
+
+        len += 2; // packing_flags
+
+        if ((packing_flags & 256) != 0)
+        {
+            len += 8; // contentLength
+        }
+        if ((packing_flags & 512) != 0)
+        {
+            len += 16; // messageId
+        }
+        if ((packing_flags & 1024) != 0)
+        {
+            len += EncoderUtils.getVbin16Length(this.correlationId);
+        }
+        if ((packing_flags & 2048) != 0)
+        {
+            len += EncoderUtils.getStructLength(ReplyTo.TYPE, this.replyTo);
+        }
+        if ((packing_flags & 4096) != 0)
+        {
+            len += EncoderUtils.getStr8Length(this.contentType);
+        }
+        if ((packing_flags & 8192) != 0)
+        {
+            len += EncoderUtils.getStr8Length(this.contentEncoding);
+        }
+        if ((packing_flags & 16384) != 0)
+        {
+            len += EncoderUtils.getVbin16Length(this.userId);
+        }
+        if ((packing_flags & 32768) != 0)
+        {
+            len += EncoderUtils.getVbin16Length(this.appId);
+        }
+        if ((packing_flags & 1) != 0)
+        {
+            len += EncoderUtils.getMapLength(this.applicationHeaders);
+        }
+        return len;
+    }
+
     public void read(Decoder dec)
     {
         packing_flags = (short) dec.readUint16();
@@ -477,4 +523,5 @@ public final class MessageProperties ext
     }
 
 
+
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageResumeResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageResumeResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageResumeResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/MessageResumeResult.java Wed Mar 29 11:13:54 2017
@@ -132,5 +132,10 @@ public final class MessageResumeResult e
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Method.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Method.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Method.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Method.java Wed Mar 29 11:13:54 2017
@@ -176,6 +176,12 @@ public abstract class Method extends Str
         return completionListener != null;
     }
 
+    @Override
+    public final int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
     public String toString()
     {
         StringBuilder str = new StringBuilder();

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/QueueQueryResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/QueueQueryResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/QueueQueryResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/QueueQueryResult.java Wed Mar 29 11:13:54 2017
@@ -421,5 +421,11 @@ public final class QueueQueryResult exte
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/RecoverResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/RecoverResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/RecoverResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/RecoverResult.java Wed Mar 29 11:13:54 2017
@@ -134,5 +134,11 @@ public final class RecoverResult extends
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ReplyTo.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ReplyTo.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ReplyTo.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/ReplyTo.java Wed Mar 29 11:13:54 2017
@@ -145,6 +145,25 @@ public final class ReplyTo extends Struc
 
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        int len = 0;
+
+        len += 2; // packing_flags
+
+        if ((packing_flags & 256) != 0)
+        {
+            len += EncoderUtils.getStr8Length(this.exchange);
+        }
+        if ((packing_flags & 512) != 0)
+        {
+            len += EncoderUtils.getStr8Length(this.routingKey);
+        }
+        return len;
+    }
+
+
     public void read(Decoder dec)
     {
         packing_flags = (short) dec.readUint16();

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionCommandFragment.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionCommandFragment.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionCommandFragment.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionCommandFragment.java Wed Mar 29 11:13:54 2017
@@ -131,5 +131,10 @@ public final class SessionCommandFragmen
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionHeader.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionHeader.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionHeader.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/SessionHeader.java Wed Mar 29 11:13:54 2017
@@ -138,5 +138,11 @@ public final class SessionHeader extends
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Struct.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Struct.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Struct.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Struct.java Wed Mar 29 11:13:54 2017
@@ -111,6 +111,8 @@ public abstract class Struct implements
 
     public abstract Map<String,Object> getFields();
 
+    public abstract int getEncodedLength();
+
     public String toString()
     {
         StringBuilder str = new StringBuilder();

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/XaResult.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/XaResult.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/XaResult.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/XaResult.java Wed Mar 29 11:13:54 2017
@@ -134,5 +134,12 @@ public final class XaResult extends Stru
         return result;
     }
 
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+
 
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Xid.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Xid.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Xid.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/transport/Xid.java Wed Mar 29 11:13:54 2017
@@ -215,4 +215,11 @@ public final class Xid extends Struct {
 
         return result;
     }
+
+    @Override
+    public int getEncodedLength()
+    {
+        throw new UnsupportedOperationException();
+    }
+
 }

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/transport/BBEncoderTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/transport/BBEncoderTest.java?rev=1789336&r1=1789335&r2=1789336&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/transport/BBEncoderTest.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/transport/BBEncoderTest.java Wed Mar 29 11:13:54 2017
@@ -21,14 +21,17 @@
 
 package org.apache.qpid.server.protocol.v0_10.transport;
 
-import org.apache.qpid.test.utils.QpidTestCase;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertArrayEquals;
 
 import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
 
-/**
- * BBEncoderTest
- *
- */
+import org.apache.qpid.test.utils.QpidTestCase;
 
 public class BBEncoderTest extends QpidTestCase
 {
@@ -45,4 +48,63 @@ public class BBEncoderTest extends QpidT
         assertEquals(0xBEEFDEAD, buf.getInt(4));
     }
 
+
+    public void testReadWriteStruct()
+    {
+        BBEncoder encoder = new BBEncoder(4);
+
+        ReplyTo replyTo = new ReplyTo("amq.direct", "test");
+        encoder.writeStruct(ReplyTo.TYPE, replyTo);
+
+        ByteBuffer buffer = encoder.buffer();
+
+        assertEquals("Unexpected size", EncoderUtils.getStructLength(ReplyTo.TYPE, replyTo), buffer.remaining());
+
+        BBDecoder decoder = new BBDecoder();
+        decoder.init(buffer);
+
+        ReplyTo decoded = (ReplyTo)decoder.readStruct(ReplyTo.TYPE);
+
+        assertEquals("Unexpected exchange", replyTo.getExchange(), decoded.getExchange());
+        assertEquals("Unexpected routing key", replyTo.getRoutingKey(), decoded.getRoutingKey());
+    }
+
+    public void testReadWriteStruct32()
+    {
+        BBEncoder encoder = new BBEncoder(4);
+        Map<String, Object> applicationHeaders = new HashMap<>();
+        applicationHeaders.put("testProperty", "testValue");
+        applicationHeaders.put("list", Arrays.asList("a", 1, 2.0));
+        applicationHeaders.put("map", Collections.singletonMap("mapKey", "mapValue"));
+        MessageProperties messageProperties = new MessageProperties(10,
+                                                                    UUID.randomUUID(),
+                                                                    "abc".getBytes(UTF_8),
+                                                                    new ReplyTo("amq.direct", "test"),
+                                                                    "text/plain",
+                                                                    "identity",
+                                                                    "cba".getBytes(UTF_8),
+                                                                    "app".getBytes(UTF_8),
+                                                                    applicationHeaders);
+
+        encoder.writeStruct32(messageProperties);
+
+        ByteBuffer buffer = encoder.buffer();
+
+        assertEquals("Unexpected size", EncoderUtils.getStruct32Length(messageProperties), buffer.remaining());
+
+        BBDecoder decoder = new BBDecoder();
+        decoder.init(buffer);
+
+        MessageProperties decoded = (MessageProperties)decoder.readStruct32();
+
+        assertEquals("Unexpected content length", messageProperties.getContentLength(), decoded.getContentLength());
+        assertEquals("Unexpected message id", messageProperties.getMessageId(), decoded.getMessageId());
+        assertArrayEquals("Unexpected correlation id", messageProperties.getCorrelationId(), decoded.getCorrelationId());
+        assertEquals("Unexpected reply to", messageProperties.getReplyTo(), decoded.getReplyTo());
+        assertEquals("Unexpected content type", messageProperties.getContentType(), decoded.getContentType());
+        assertEquals("Unexpected content encoding", messageProperties.getContentEncoding(), decoded.getContentEncoding());
+        assertArrayEquals("Unexpected user id", messageProperties.getUserId(), decoded.getUserId());
+        assertArrayEquals("Unexpected application id", messageProperties.getAppId(), decoded.getAppId());
+        assertEquals("Unexpected application headers", messageProperties.getApplicationHeaders(), decoded.getApplicationHeaders());
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org