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.Encoder;
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 EncoderMetadataSet extends CoderMetadataSet<Encoder, EncoderMetadata>
32 {
33 @Override
34 protected List<EncoderMetadata> discover(Class<? extends Encoder> encoder)
35 {
36 List<EncoderMetadata> metadatas = new ArrayList<>();
37
38 if (Encoder.Binary.class.isAssignableFrom(encoder))
39 {
40 Class<?> objType = getEncoderType(encoder,Encoder.Binary.class);
41 metadatas.add(new EncoderMetadata(encoder,objType,MessageType.BINARY,false));
42 }
43 if (Encoder.BinaryStream.class.isAssignableFrom(encoder))
44 {
45 Class<?> objType = getEncoderType(encoder,Encoder.BinaryStream.class);
46 metadatas.add(new EncoderMetadata(encoder,objType,MessageType.BINARY,true));
47 }
48 if (Encoder.Text.class.isAssignableFrom(encoder))
49 {
50 Class<?> objType = getEncoderType(encoder,Encoder.Text.class);
51 metadatas.add(new EncoderMetadata(encoder,objType,MessageType.TEXT,false));
52 }
53 if (Encoder.TextStream.class.isAssignableFrom(encoder))
54 {
55 Class<?> objType = getEncoderType(encoder,Encoder.TextStream.class);
56 metadatas.add(new EncoderMetadata(encoder,objType,MessageType.TEXT,true));
57 }
58
59 if (!ReflectUtils.isDefaultConstructable(encoder))
60 {
61 throw new InvalidSignatureException("Encoder must have public, no-args constructor: " + encoder.getName());
62 }
63
64 if (metadatas.size() <= 0)
65 {
66 throw new InvalidSignatureException("Not a valid Encoder class: " + encoder.getName() + " implements no " + Encoder.class.getName() + " interfaces");
67 }
68
69 return metadatas;
70 }
71
72 private Class<?> getEncoderType(Class<? extends Encoder> encoder, Class<?> interfaceClass)
73 {
74 Class<?> decoderClass = ReflectUtils.findGenericClassFor(encoder,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(encoder);
82 throw new InvalidWebSocketException(err.toString());
83 }
84 return decoderClass;
85 }
86
87 protected final void register(Class<?> type, Class<? extends Encoder> encoder, MessageType msgType, boolean streamed)
88 {
89 EncoderMetadata metadata = new EncoderMetadata(encoder,type,msgType,streamed);
90 trackMetadata(metadata);
91 }
92 }