1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.websocket.jsr356.metadata;
20
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import javax.websocket.Decoder;
25
26 import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
27 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
28 import org.eclipse.jetty.websocket.common.util.ReflectUtils;
29 import org.eclipse.jetty.websocket.jsr356.MessageType;
30
31 public class DecoderMetadataSet extends CoderMetadataSet<Decoder, DecoderMetadata>
32 {
33 @Override
34 protected List<DecoderMetadata> discover(Class<? extends Decoder> decoder)
35 {
36 List<DecoderMetadata> metadatas = new ArrayList<>();
37
38 if (Decoder.Binary.class.isAssignableFrom(decoder))
39 {
40 Class<?> objType = getDecoderType(decoder,Decoder.Binary.class);
41 metadatas.add(new DecoderMetadata(decoder,objType,MessageType.BINARY,false));
42 }
43 if (Decoder.BinaryStream.class.isAssignableFrom(decoder))
44 {
45 Class<?> objType = getDecoderType(decoder,Decoder.BinaryStream.class);
46 metadatas.add(new DecoderMetadata(decoder,objType,MessageType.BINARY,true));
47 }
48 if (Decoder.Text.class.isAssignableFrom(decoder))
49 {
50 Class<?> objType = getDecoderType(decoder,Decoder.Text.class);
51 metadatas.add(new DecoderMetadata(decoder,objType,MessageType.TEXT,false));
52 }
53 if (Decoder.TextStream.class.isAssignableFrom(decoder))
54 {
55 Class<?> objType = getDecoderType(decoder,Decoder.TextStream.class);
56 metadatas.add(new DecoderMetadata(decoder,objType,MessageType.TEXT,true));
57 }
58
59 if (!ReflectUtils.isDefaultConstructable(decoder))
60 {
61 throw new InvalidSignatureException("Decoder must have public, no-args constructor: " + decoder.getName());
62 }
63
64 if (metadatas.size() <= 0)
65 {
66 throw new InvalidSignatureException("Not a valid Decoder class: " + decoder.getName());
67 }
68
69 return metadatas;
70 }
71
72 private Class<?> getDecoderType(Class<? extends Decoder> decoder, Class<?> interfaceClass)
73 {
74 Class<?> decoderClass = ReflectUtils.findGenericClassFor(decoder,interfaceClass);
75 if (decoderClass == null)
76 {
77 StringBuilder err = new StringBuilder();
78 err.append("Invalid type declared for interface ");
79 err.append(interfaceClass.getName());
80 err.append(" on class ");
81 err.append(decoder);
82 throw new InvalidWebSocketException(err.toString());
83 }
84 return decoderClass;
85 }
86
87 protected final void register(Class<?> type, Class<? extends Decoder> decoder, MessageType msgType, boolean streamed)
88 {
89 DecoderMetadata metadata = new DecoderMetadata(decoder,type,msgType,streamed);
90 trackMetadata(metadata);
91 }
92 }