summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2013-09-27 12:59:37 +0000
committerRobert Godfrey <rgodfrey@apache.org>2013-09-27 12:59:37 +0000
commitc89eebf8ba27623177b44d11d4527be6eb05a5e0 (patch)
tree239def7e8698c38c9c6950663f79768394f23652 /qpid/java
parentcfa39e12ce4da0036faffb6f3f397bffb2b9e4cd (diff)
downloadqpid-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')
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java1
-rw-r--r--qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java56
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)