0001-Added-an-exception-to-converting-attachments-when-th.patch

L. Ziegler, 04/11/2014 03:37 PM

Download (5.94 KB)

View differences:

src/rsb/converter/XOPConverter.java
9 9

  
10 10
/**
11 11
 * RSB converter for {@link rsb.xml.XOP} objects.
12
 *
12
 * Note: If the converted XOP contains attachments, this converter tries to find
13
 * applicable converters for the attached data. If no converter is found, the
14
 * conversion will throw an {@link ConversionException}. In the case of 
15
 * {@link ByteBuffer} as attachment data type, the conversion is skipped.
16
 * 
13 17
 * @author lkettenb
14 18
 */
15 19
public class XOPConverter implements Converter<ByteBuffer> {
......
20 24
    private ConverterSelectionStrategy<ByteBuffer> serializationConverters = null;
21 25
    private ConverterSelectionStrategy<ByteBuffer> deserializationConverters = null;
22 26

  
27
    /**
28
     * Signature for binary attachments.
29
     */
30
    private final ConverterSignature byteSignature = new ConverterSignature(
31
            "bytes", ByteBuffer.class);
32

  
23 33
    public XOPConverter() {
24 34
        pbc = new ProtocolBufferConverter<XOPType.XOP>
25 35
            (XOPType.XOP.getDefaultInstance());
......
38 48
    }
39 49

  
40 50
    @Override
41
    public UserData deserialize(String wireSchema, ByteBuffer buffer)
42
        throws ConversionException {
51
    public UserData<XOPType.XOP> deserialize(String wireSchema, ByteBuffer buffer) throws ConversionException {
43 52
        UserData<XOPType.XOP> result = pbc.deserialize(wireSchema, buffer);
44 53
        XOPType.XOP data = (XOPType.XOP) result.getData();
45 54
        XOP xop = convertRSTtoRSB(data);
......
69 78
        }
70 79

  
71 80
        for (XOPType.Attachment attachment : data.getAttachmentsList()) {
72
            if (attachment.hasUrl() && attachment.hasData()) {
81
            if (!attachment.hasUrl() || !attachment.hasData()) {
82
                throw new ConversionException("received incomplete attachment!");
83
            }
84

  
85
            String wireSchema = attachment.getWireSchema().toStringUtf8();
86
            ByteBuffer dataBuffer = ByteBuffer.wrap(attachment.getData()
87
                    .toByteArray());
88
            rsb.transport.Attachment att;
89

  
90
            if (wireSchema.equals(byteSignature.getSchema())) {
91
                att = new rsb.transport.Attachment(dataBuffer,
92
                        byteSignature.getDataType());
93
            } else {
94

  
73 95
                Converter<ByteBuffer> c = deserializationConverters
74
                    .getConverter(attachment.getWireSchema().toStringUtf8());
96
                        .getConverter(wireSchema);
75 97

  
76
                ByteBuffer dataBuffer
77
                    = ByteBuffer.wrap(attachment.getData().toByteArray());
78
                UserData deserializedAttachment
79
                    = c.deserialize(c.getSignature().getSchema(), dataBuffer);
98
                @SuppressWarnings("rawtypes")
99
                UserData deserializedAttachment = c.deserialize(c
100
                        .getSignature().getSchema(), dataBuffer);
80 101

  
81
                rsb.transport.Attachment att
82
                    = new rsb.transport.Attachment(deserializedAttachment.getData(),
83
                                                   deserializedAttachment.getTypeInfo());
84
                xop.setAttachment(attachment.getUrl(), att);
102
                att = new rsb.transport.Attachment(
103
                        deserializedAttachment.getData(),
104
                        deserializedAttachment.getTypeInfo());
85 105
            }
106
            xop.setAttachment(attachment.getUrl(), att);
107

  
86 108
        }
87 109
        return xop;
88 110
    }
......
117 139
            XOPType.Attachment.Builder attachmentBuilder
118 140
                = XOPType.Attachment.newBuilder();
119 141

  
120
            Converter<ByteBuffer> c
121
                = serializationConverters
122
                .getConverter(attachment.getType().getName());
123

  
124
            WireContents<ByteBuffer> result
125
                = c.serialize(attachment.getType(), attachment.getData());
126
            attachmentBuilder.setWireSchema(ByteString.copyFrom(result.getWireSchema().getBytes()));
127
            attachmentBuilder.setData(ByteString.copyFrom(result.getSerialization().asReadOnlyBuffer()));
142
            if (attachment.getType().equals(byteSignature.getDataType())) {
143
                ByteBuffer bb = (ByteBuffer) attachment.getData();
144
                attachmentBuilder.setWireSchema(ByteString
145
                        .copyFrom(byteSignature.getSchema().getBytes()));
146
                attachmentBuilder.setData(ByteString.copyFrom(bb
147
                        .asReadOnlyBuffer()));
148
            } else {
149
                Converter<ByteBuffer> c = serializationConverters
150
                        .getConverter(attachment.getType().getName());
151

  
152
                WireContents<ByteBuffer> result = c.serialize(
153
                        attachment.getType(), attachment.getData());
154
                attachmentBuilder.setWireSchema(ByteString.copyFrom(result
155
                        .getWireSchema().getBytes()));
156
                attachmentBuilder.setData(ByteString.copyFrom(result
157
                        .getSerialization().asReadOnlyBuffer()));
158
            }
128 159
            attachmentBuilder.setUrl(url);
129 160
            xopBuilder.addAttachments(attachmentBuilder.build());
130 161
        }
131
-