summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-08-15 13:59:46 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-08-15 13:59:46 +0000
commit6240b18422d0cf78757df973dc9f06f359d72a4e (patch)
tree7eed0e7f9da8ddd6fa9aae54f36db266b93da76e /qpid/java
parent610e08aff9b16263f96ed69e4f834dca4b607f52 (diff)
downloadqpid-python-6240b18422d0cf78757df973dc9f06f359d72a4e.tar.gz
QPID-6003 : [Java Broker] improve conversion of non-standard AMQP 1.0 types in message headers
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1618176 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_from_1_0.java131
-rw-r--r--qpid/java/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_1_0_to_v0_10.java4
-rw-r--r--qpid/java/broker-plugins/amqp-msg-conv-0-8-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_8_v1_0/MessageConverter_1_0_to_v0_8.java2
3 files changed, 102 insertions, 35 deletions
diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_from_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_from_1_0.java
index 3974ab0af6..266f3b6868 100644
--- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_from_1_0.java
+++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/MessageConverter_from_1_0.java
@@ -20,10 +20,32 @@
*/
package org.apache.qpid.server.protocol.v1_0;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
import org.apache.qpid.amqp_1_0.type.Binary;
import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
import org.apache.qpid.amqp_1_0.type.messaging.Data;
@@ -32,17 +54,6 @@ import org.apache.qpid.transport.codec.BBEncoder;
import org.apache.qpid.typedmessage.TypedBytesContentWriter;
import org.apache.qpid.typedmessage.TypedBytesFormatException;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
public class MessageConverter_from_1_0
{
private static final Charset UTF_8 = Charset.forName("UTF-8");
@@ -91,7 +102,7 @@ public class MessageConverter_from_1_0
Section firstBodySection = sections.get(0);
if(firstBodySection instanceof AmqpValue)
{
- bodyObject = fixObject(((AmqpValue)firstBodySection).getValue());
+ bodyObject = convertValue(((AmqpValue)firstBodySection).getValue());
}
else if(firstBodySection instanceof Data)
{
@@ -115,7 +126,7 @@ public class MessageConverter_from_1_0
{
totalSequence.addAll(((AmqpSequence)section).getValue());
}
- bodyObject = fixObject(totalSequence);
+ bodyObject = convertValue(totalSequence);
}
}
@@ -127,40 +138,94 @@ public class MessageConverter_from_1_0
return bodyObject;
}
- private static Object fixObject(final Object value)
+ private static final Set<Class> STANDARD_TYPES = new HashSet<>(Arrays.<Class>asList(Boolean.class,
+ Byte.class,
+ Short.class,
+ Integer.class,
+ Long.class,
+ Float.class,
+ Double.class,
+ Character.class,
+ String.class,
+ byte[].class,
+ UUID.class));
+
+ private static Map convertMap(final Map map)
{
- if(value instanceof Binary)
+ Map resultMap = new LinkedHashMap();
+ Iterator<Map.Entry> iterator = map.entrySet().iterator();
+ while(iterator.hasNext())
{
- final Binary binaryValue = (Binary) value;
- byte[] data = new byte[binaryValue.getLength()];
- binaryValue.asByteBuffer().get(data);
- return data;
+ Map.Entry entry = iterator.next();
+ resultMap.put(convertValue(entry.getKey()), convertValue(entry.getValue()));
+
}
- else if(value instanceof List)
+ return resultMap;
+ }
+
+ public static Object convertValue(final Object value)
+ {
+ if(value != null && !STANDARD_TYPES.contains(value))
{
- List listValue = (List) value;
- List fixedValue = new ArrayList(listValue.size());
- for(Object o : listValue)
+ if(value instanceof Map)
{
- fixedValue.add(fixObject(o));
+ return convertMap((Map)value);
}
- return fixedValue;
- }
- else if(value instanceof Map)
- {
- Map<?,?> mapValue = (Map) value;
- Map fixedValue = new LinkedHashMap(mapValue.size());
- for(Map.Entry<?,?> entry : mapValue.entrySet())
+ else if(value instanceof List)
+ {
+ return convertList((List)value);
+ }
+ else if(value instanceof UnsignedByte)
+ {
+ return ((UnsignedByte)value).shortValue();
+ }
+ else if(value instanceof UnsignedShort)
+ {
+ return ((UnsignedShort)value).intValue();
+ }
+ else if(value instanceof UnsignedInteger)
+ {
+ return ((UnsignedInteger)value).longValue();
+ }
+ else if(value instanceof UnsignedLong)
+ {
+ return ((UnsignedLong)value).longValue();
+ }
+ else if(value instanceof Symbol)
+ {
+ return value.toString();
+ }
+ else if(value instanceof Date)
{
- fixedValue.put(fixObject(entry.getKey()),fixObject(entry.getValue()));
+ return ((Date)value).getTime();
+ }
+ else if(value instanceof Binary)
+ {
+ Binary binary = (Binary)value;
+ byte[] data = new byte[binary.getLength()];
+ binary.asByteBuffer().get(data);
+ return data;
+ }
+ else
+ {
+ // Throw exception instead?
+ return value.toString();
}
- return fixedValue;
}
else
{
return value;
}
+ }
+ private static List convertList(final List list)
+ {
+ List result = new ArrayList(list.size());
+ for(Object entry : list)
+ {
+ result.add(convertValue(entry));
+ }
+ return result;
}
public static byte[] convertToBody(Object object)
diff --git a/qpid/java/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_1_0_to_v0_10.java b/qpid/java/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_1_0_to_v0_10.java
index 8d77a8cfaf..54d4638bb8 100644
--- a/qpid/java/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_1_0_to_v0_10.java
+++ b/qpid/java/broker-plugins/amqp-msg-conv-0-10-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_10_v1_0/MessageConverter_1_0_to_v0_10.java
@@ -21,6 +21,7 @@
package org.apache.qpid.server.protocol.converter.v0_10_v1_0;
import java.nio.ByteBuffer;
+import java.util.Map;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.plugin.MessageConverter;
@@ -176,7 +177,8 @@ public class MessageConverter_1_0_to_v0_10 implements MessageConverter<Message_1
messageProps.setReplyTo(replyTo);
}
- messageProps.setApplicationHeaders(serverMsg.getMessageHeader().getHeadersAsMap());
+ messageProps.setApplicationHeaders((Map<String, Object>) MessageConverter_from_1_0.convertValue(serverMsg.getMessageHeader()
+ .getHeadersAsMap()));
Header header = new Header(deliveryProps, messageProps, null);
return new MessageMetaData_0_10(header, size, serverMsg.getArrivalTime());
diff --git a/qpid/java/broker-plugins/amqp-msg-conv-0-8-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_8_v1_0/MessageConverter_1_0_to_v0_8.java b/qpid/java/broker-plugins/amqp-msg-conv-0-8-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_8_v1_0/MessageConverter_1_0_to_v0_8.java
index 5b1c25e879..2de21e1a9f 100644
--- a/qpid/java/broker-plugins/amqp-msg-conv-0-8-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_8_v1_0/MessageConverter_1_0_to_v0_8.java
+++ b/qpid/java/broker-plugins/amqp-msg-conv-0-8-to-1-0/src/main/java/org/apache/qpid/server/protocol/converter/v0_8_v1_0/MessageConverter_1_0_to_v0_8.java
@@ -194,7 +194,7 @@ public class MessageConverter_1_0_to_v0_8 implements MessageConverter<Message_1_
for(String headerName : serverMsg.getMessageHeader().getHeaderNames())
{
- headerProps.put(headerName, serverMsg.getMessageHeader().getHeader(headerName));
+ headerProps.put(headerName, MessageConverter_from_1_0.convertValue(serverMsg.getMessageHeader().getHeader(headerName)));
}
props.setHeaders(FieldTable.convertToFieldTable(headerProps));