View Javadoc

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