From 6ae0f485d0c0863ff45a819abfebdde1cebaf03f Mon Sep 17 00:00:00 2001 From: Leon Ziegler Date: Fri, 11 Apr 2014 15:23:02 +0200 Subject: [PATCH 1/7] Added an exception to converting attachments, when they contain binary data (more explicitly: ByteBuffer). In this case we don't have to apply a converter. --- src/rsb/converter/XOPConverter.java | 73 +++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/src/rsb/converter/XOPConverter.java b/src/rsb/converter/XOPConverter.java index 5c74597..1463d88 100644 --- a/src/rsb/converter/XOPConverter.java +++ b/src/rsb/converter/XOPConverter.java @@ -9,7 +9,11 @@ import rst.xml.XOPType; /** * RSB converter for {@link rsb.xml.XOP} objects. - * + * Note: If the converted XOP contains attachments, this converter tries to find + * applicable converters for the attached data. If no converter is found, the + * conversion will throw an {@link ConversionException}. In the case of + * {@link ByteBuffer} as attachment data type, the conversion is skipped. + * * @author lkettenb */ public class XOPConverter implements Converter { @@ -20,6 +24,12 @@ public class XOPConverter implements Converter { private ConverterSelectionStrategy serializationConverters = null; private ConverterSelectionStrategy deserializationConverters = null; + /** + * Signature for binary attachments. + */ + private final ConverterSignature byteSignature = new ConverterSignature( + "bytes", ByteBuffer.class); + public XOPConverter() { pbc = new ProtocolBufferConverter (XOPType.XOP.getDefaultInstance()); @@ -38,8 +48,7 @@ public class XOPConverter implements Converter { } @Override - public UserData deserialize(String wireSchema, ByteBuffer buffer) - throws ConversionException { + public UserData deserialize(String wireSchema, ByteBuffer buffer) throws ConversionException { UserData result = pbc.deserialize(wireSchema, buffer); XOPType.XOP data = (XOPType.XOP) result.getData(); XOP xop = convertRSTtoRSB(data); @@ -69,20 +78,33 @@ public class XOPConverter implements Converter { } for (XOPType.Attachment attachment : data.getAttachmentsList()) { - if (attachment.hasUrl() && attachment.hasData()) { + if (!attachment.hasUrl() || !attachment.hasData()) { + throw new ConversionException("received incomplete attachment!"); + } + + String wireSchema = attachment.getWireSchema().toStringUtf8(); + ByteBuffer dataBuffer = ByteBuffer.wrap(attachment.getData() + .toByteArray()); + rsb.transport.Attachment att; + + if (wireSchema.equals(byteSignature.getSchema())) { + att = new rsb.transport.Attachment(dataBuffer, + byteSignature.getDataType()); + } else { + Converter c = deserializationConverters - .getConverter(attachment.getWireSchema().toStringUtf8()); + .getConverter(wireSchema); - ByteBuffer dataBuffer - = ByteBuffer.wrap(attachment.getData().toByteArray()); - UserData deserializedAttachment - = c.deserialize(c.getSignature().getSchema(), dataBuffer); + @SuppressWarnings("rawtypes") + UserData deserializedAttachment = c.deserialize(c + .getSignature().getSchema(), dataBuffer); - rsb.transport.Attachment att - = new rsb.transport.Attachment(deserializedAttachment.getData(), - deserializedAttachment.getTypeInfo()); - xop.setAttachment(attachment.getUrl(), att); + att = new rsb.transport.Attachment( + deserializedAttachment.getData(), + deserializedAttachment.getTypeInfo()); } + xop.setAttachment(attachment.getUrl(), att); + } return xop; } @@ -117,14 +139,23 @@ public class XOPConverter implements Converter { XOPType.Attachment.Builder attachmentBuilder = XOPType.Attachment.newBuilder(); - Converter c - = serializationConverters - .getConverter(attachment.getType().getName()); - - WireContents result - = c.serialize(attachment.getType(), attachment.getData()); - attachmentBuilder.setWireSchema(ByteString.copyFrom(result.getWireSchema().getBytes())); - attachmentBuilder.setData(ByteString.copyFrom(result.getSerialization().asReadOnlyBuffer())); + if (attachment.getType().equals(byteSignature.getDataType())) { + ByteBuffer bb = (ByteBuffer) attachment.getData(); + attachmentBuilder.setWireSchema(ByteString + .copyFrom(byteSignature.getSchema().getBytes())); + attachmentBuilder.setData(ByteString.copyFrom(bb + .asReadOnlyBuffer())); + } else { + Converter c = serializationConverters + .getConverter(attachment.getType().getName()); + + WireContents result = c.serialize( + attachment.getType(), attachment.getData()); + attachmentBuilder.setWireSchema(ByteString.copyFrom(result + .getWireSchema().getBytes())); + attachmentBuilder.setData(ByteString.copyFrom(result + .getSerialization().asReadOnlyBuffer())); + } attachmentBuilder.setUrl(url); xopBuilder.addAttachments(attachmentBuilder.build()); } -- 1.7.9.5