diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2013-09-27 12:59:37 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2013-09-27 12:59:37 +0000 |
| commit | c89eebf8ba27623177b44d11d4527be6eb05a5e0 (patch) | |
| tree | 239def7e8698c38c9c6950663f79768394f23652 /qpid/java | |
| parent | cfa39e12ce4da0036faffb6f3f397bffb2b9e4cd (diff) | |
| download | qpid-python-c89eebf8ba27623177b44d11d4527be6eb05a5e0.tar.gz | |
QPID-5127 : ClassCastException on message conversion to 1-0
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1526887 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
2 files changed, 53 insertions, 4 deletions
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java index 82e6216c21..ff886090be 100644 --- a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java +++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java @@ -49,6 +49,7 @@ import org.apache.qpid.amqp_1_0.codec.UnsignedShortWriter; import org.apache.qpid.amqp_1_0.codec.ValueWriter; +import org.apache.qpid.amqp_1_0.type.Binary; import org.apache.qpid.amqp_1_0.type.RestrictedType; import org.apache.qpid.amqp_1_0.type.transport.*; import org.apache.qpid.amqp_1_0.type.transport.codec.*; diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java index be9b0323a3..5925bf0c32 100644 --- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java +++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java @@ -23,8 +23,12 @@ package org.apache.qpid.server.protocol.v1_0; import java.io.EOFException; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; +import java.util.ListIterator; +import java.util.Map; + import org.apache.qpid.amqp_1_0.messaging.SectionEncoder; import org.apache.qpid.amqp_1_0.messaging.SectionEncoderImpl; import org.apache.qpid.amqp_1_0.type.Binary; @@ -92,6 +96,7 @@ public abstract class MessageConverter_to_1_0<M extends ServerMessage> implement { String propName = reader.readStringImpl(); Object value = reader.readObject(); + map.put(propName, value); } catch (EOFException e) @@ -105,21 +110,23 @@ public abstract class MessageConverter_to_1_0<M extends ServerMessage> implement } - return new AmqpValue(map); + return new AmqpValue(fixMapValues(map)); } else if("amqp/map".equals(mimeType)) { BBDecoder decoder = new BBDecoder(); decoder.init(ByteBuffer.wrap(data)); - return new AmqpValue(decoder.readMap()); + final Map<String,Object> map = decoder.readMap(); + + return new AmqpValue(fixMapValues(map)); } else if("amqp/list".equals(mimeType)) { BBDecoder decoder = new BBDecoder(); decoder.init(ByteBuffer.wrap(data)); - return new AmqpValue(decoder.readList()); + return new AmqpValue(fixListValues(decoder.readList())); } else if("jms/stream-message".equals(mimeType)) { @@ -130,7 +137,7 @@ public abstract class MessageConverter_to_1_0<M extends ServerMessage> implement { try { - list.add(reader.readObject()); + list.add(fixValue(reader.readObject())); } catch (TypedBytesFormatException e) { @@ -150,6 +157,47 @@ public abstract class MessageConverter_to_1_0<M extends ServerMessage> implement } } + private static Map fixMapValues(final Map<String, Object> map) + { + for(Map.Entry<String,Object> entry : map.entrySet()) + { + entry.setValue(fixValue(entry.getValue())); + } + return map; + } + + private static Object fixValue(final Object value) + { + if(value instanceof byte[]) + { + return new Binary((byte[])value); + } + else if(value instanceof Map) + { + return fixMapValues((Map)value); + } + else if(value instanceof List) + { + return fixListValues((List)value); + } + else + { + return value; + } + } + + private static List fixListValues(final List list) + { + ListIterator iterator = list.listIterator(); + while(iterator.hasNext()) + { + Object value = iterator.next(); + iterator.set(fixValue(value)); + + } + return list; + } + private StoredMessage<MessageMetaData_1_0> convertServerMessage(final MessageMetaData_1_0 metaData, final ServerMessage serverMessage, SectionEncoder sectionEncoder) |
