View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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  }