summaryrefslogtreecommitdiff
path: root/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
commit3bfe908a60b7492c4eab5f2036fa54e737a8b2e2 (patch)
treedf63f2c6de1e5721d3292b4fab328f0626d65bfb /java
parent04c5726a17abb7c00e9a846fd368f7236c8ae5f7 (diff)
downloadqpid-python-3bfe908a60b7492c4eab5f2036fa54e737a8b2e2.tar.gz
QPID-5127 : ClassCastException on message conversion to 1-0
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1526887 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java')
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java1
-rw-r--r--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/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java
index 82e6216c21..ff886090be 100644
--- a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java
+++ b/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/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java b/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/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_to_1_0.java
+++ b/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)