diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2014-08-15 13:59:46 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2014-08-15 13:59:46 +0000 |
| commit | 6240b18422d0cf78757df973dc9f06f359d72a4e (patch) | |
| tree | 7eed0e7f9da8ddd6fa9aae54f36db266b93da76e /qpid/java | |
| parent | 610e08aff9b16263f96ed69e4f834dca4b607f52 (diff) | |
| download | qpid-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')
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)); |
