1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.codec.delimited.serialization;
21
22 import java.io.InputStream;
23 import java.lang.reflect.InvocationTargetException;
24 import java.lang.reflect.Method;
25
26 import org.apache.mina.codec.IoBuffer;
27 import org.apache.mina.codec.delimited.IoBufferDecoder;
28
29 import com.google.protobuf.ExtensionRegistryLite;
30 import com.google.protobuf.GeneratedMessage;
31
32
33
34
35
36
37
38
39
40
41 public class ProtobufDynamicMessageDecoder extends
42 IoBufferDecoder<ProtobufDynamicMessageDecoder.ProtobufSerializedMessage> {
43
44 public static ProtobufDynamicMessageDecoder newInstance() {
45 return new ProtobufDynamicMessageDecoder();
46 }
47
48 @Override
49 public ProtobufSerializedMessage decode(IoBuffer input) {
50 return new ProtobufSerializedMessage(input);
51 }
52
53 public static final class ProtobufSerializedMessage {
54 private final IoBuffer input;
55
56 public ProtobufSerializedMessage(IoBuffer input) {
57 this.input = input;
58 }
59
60 @SuppressWarnings("unchecked")
61 public <L extends GeneratedMessage> L get(Class<L> clazz, ExtensionRegistryLite registry)
62 throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
63 Method parseMethod = clazz.getDeclaredMethod("parseFrom", InputStream.class, ExtensionRegistryLite.class);
64 return (L) parseMethod.invoke(null, input.asInputStream(), registry);
65 }
66
67 public <L extends GeneratedMessage> L get(Class<L> clazz) throws NoSuchMethodException, IllegalAccessException,
68 InvocationTargetException {
69 return get(clazz, ExtensionRegistryLite.getEmptyRegistry());
70 }
71 }
72 }