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 |
|
-
|