View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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.annotations;
20  
21  import java.io.Reader;
22  
23  import javax.websocket.OnMessage;
24  
25  import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
26  import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
27  import org.eclipse.jetty.websocket.jsr356.decoders.BooleanDecoder;
28  import org.eclipse.jetty.websocket.jsr356.decoders.ByteDecoder;
29  import org.eclipse.jetty.websocket.jsr356.decoders.CharacterDecoder;
30  import org.eclipse.jetty.websocket.jsr356.decoders.DoubleDecoder;
31  import org.eclipse.jetty.websocket.jsr356.decoders.FloatDecoder;
32  import org.eclipse.jetty.websocket.jsr356.decoders.IntegerDecoder;
33  import org.eclipse.jetty.websocket.jsr356.decoders.LongDecoder;
34  import org.eclipse.jetty.websocket.jsr356.decoders.ReaderDecoder;
35  import org.eclipse.jetty.websocket.jsr356.decoders.ShortDecoder;
36  import org.eclipse.jetty.websocket.jsr356.decoders.StringDecoder;
37  
38  /**
39   * Param handling for static Text @{@link OnMessage} parameters
40   */
41  public class JsrParamIdText extends JsrParamIdOnMessage implements IJsrParamId
42  {
43      public static final IJsrParamId INSTANCE = new JsrParamIdText();
44  
45      private boolean isMessageRoleAssigned(JsrCallable callable)
46      {
47          if (callable instanceof OnMessageCallable)
48          {
49              OnMessageCallable onmessage = (OnMessageCallable)callable;
50              return onmessage.isMessageRoleAssigned();
51          }
52          return false;
53      }
54  
55      @Override
56      public boolean process(Param param, JsrCallable callable) throws InvalidSignatureException
57      {
58          if (super.process(param,callable))
59          {
60              // Found common roles
61              return true;
62          }
63  
64          // String for whole message
65          if (param.type.isAssignableFrom(String.class))
66          {
67              param.bind(Role.MESSAGE_TEXT);
68              callable.setDecoderClass(StringDecoder.class);
69              return true;
70          }
71  
72          // Java primitive or class equivalent to receive the whole message converted to that type
73          if (param.type.isAssignableFrom(Boolean.class))
74          {
75              assertPartialMessageSupportDisabled(param,callable);
76              param.bind(Role.MESSAGE_TEXT);
77              callable.setDecoderClass(BooleanDecoder.class);
78              return true;
79          }
80          if (param.type.isAssignableFrom(Byte.class) || (param.type == Byte.TYPE))
81          {
82              assertPartialMessageSupportDisabled(param,callable);
83              param.bind(Role.MESSAGE_TEXT);
84              callable.setDecoderClass(ByteDecoder.class);
85              return true;
86          }
87          if (param.type.isAssignableFrom(Character.class) || (param.type == Character.TYPE))
88          {
89              assertPartialMessageSupportDisabled(param,callable);
90              param.bind(Role.MESSAGE_TEXT);
91              callable.setDecoderClass(CharacterDecoder.class);
92              return true;
93          }
94          if (param.type.isAssignableFrom(Double.class) || (param.type == Double.TYPE))
95          {
96              assertPartialMessageSupportDisabled(param,callable);
97              param.bind(Role.MESSAGE_TEXT);
98              callable.setDecoderClass(DoubleDecoder.class);
99              return true;
100         }
101         if (param.type.isAssignableFrom(Float.class) || (param.type == Float.TYPE))
102         {
103             assertPartialMessageSupportDisabled(param,callable);
104             param.bind(Role.MESSAGE_TEXT);
105             callable.setDecoderClass(FloatDecoder.class);
106             return true;
107         }
108         if (param.type.isAssignableFrom(Integer.class) || (param.type == Integer.TYPE))
109         {
110             assertPartialMessageSupportDisabled(param,callable);
111             param.bind(Role.MESSAGE_TEXT);
112             callable.setDecoderClass(IntegerDecoder.class);
113             return true;
114         }
115         if (param.type.isAssignableFrom(Long.class) || (param.type == Long.TYPE))
116         {
117             assertPartialMessageSupportDisabled(param,callable);
118             param.bind(Role.MESSAGE_TEXT);
119             callable.setDecoderClass(LongDecoder.class);
120             return true;
121         }
122         if (param.type.isAssignableFrom(Short.class) || (param.type == Short.TYPE))
123         {
124             assertPartialMessageSupportDisabled(param,callable);
125             param.bind(Role.MESSAGE_TEXT);
126             callable.setDecoderClass(ShortDecoder.class);
127             return true;
128         }
129 
130         // Streaming
131         if (param.type.isAssignableFrom(Reader.class))
132         {
133             assertPartialMessageSupportDisabled(param,callable);
134             param.bind(Role.MESSAGE_TEXT_STREAM);
135             callable.setDecoderClass(ReaderDecoder.class);
136             return true;
137         }
138 
139         /*
140          * boolean primitive.
141          * 
142          * can be used for either: 1) a boolean message type 2) a partial message indicator flag
143          */
144         if (param.type == Boolean.TYPE)
145         {
146             if (isMessageRoleAssigned(callable))
147             {
148                 param.bind(Role.MESSAGE_PARTIAL_FLAG);
149             }
150             else
151             {
152                 param.bind(Role.MESSAGE_TEXT);
153                 callable.setDecoderClass(BooleanDecoder.class);
154             }
155             return true;
156         }
157 
158         return false;
159     }
160 }