JSR-356 fixing Reader and Boolean parameter id detection.
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java
index c790c6b..d1256fe 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java
@@ -69,12 +69,6 @@
return true;
}
- // Boolean (for indicating partial message support)
- if (param.type.isAssignableFrom(Boolean.TYPE))
- {
- param.bind(Role.MESSAGE_PARTIAL_FLAG);
- return true;
- }
return false;
}
}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java
index 21b7c06..8c646ec 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java
@@ -32,6 +32,7 @@
import org.eclipse.jetty.websocket.jsr356.decoders.FloatDecoder;
import org.eclipse.jetty.websocket.jsr356.decoders.IntegerDecoder;
import org.eclipse.jetty.websocket.jsr356.decoders.LongDecoder;
+import org.eclipse.jetty.websocket.jsr356.decoders.ReaderDecoder;
import org.eclipse.jetty.websocket.jsr356.decoders.ShortDecoder;
import org.eclipse.jetty.websocket.jsr356.decoders.StringDecoder;
@@ -42,6 +43,16 @@
{
public static final IJsrParamId INSTANCE = new JsrParamIdText();
+ private boolean isMessageRoleAssigned(JsrCallable callable)
+ {
+ if (callable instanceof OnMessageCallable)
+ {
+ OnMessageCallable onmessage = (OnMessageCallable)callable;
+ return onmessage.isMessageRoleAssigned();
+ }
+ return false;
+ }
+
@Override
public boolean process(Param param, JsrCallable callable) throws InvalidSignatureException
{
@@ -123,14 +134,26 @@
{
assertPartialMessageSupportDisabled(param,callable);
param.bind(Role.MESSAGE_TEXT_STREAM);
- // Streaming have no decoder
+ callable.setDecoderClass(ReaderDecoder.class);
return true;
}
- // Boolean (for indicating partial message support)
- if (param.type.isAssignableFrom(Boolean.TYPE))
+ /*
+ * boolean primitive.
+ *
+ * can be used for either: 1) a boolean message type 2) a partial message indicator flag
+ */
+ if (param.type == Boolean.TYPE)
{
- param.bind(Role.MESSAGE_PARTIAL_FLAG);
+ if (isMessageRoleAssigned(callable))
+ {
+ param.bind(Role.MESSAGE_PARTIAL_FLAG);
+ }
+ else
+ {
+ param.bind(Role.MESSAGE_TEXT);
+ callable.setDecoderClass(BooleanDecoder.class);
+ }
return true;
}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageCallable.java
index d6e246c..8b3fd86 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageCallable.java
@@ -38,7 +38,7 @@
protected Decoder decoder;
protected int idxPartialMessageFlag = -1;
protected int idxMessageObject = -1;
- protected Param.Role messageRole;
+ protected boolean messageRoleAssigned = false;
public OnMessageCallable(Class<?> pojo, Method method)
{
@@ -54,7 +54,6 @@
this.decoder = copy.decoder;
this.idxPartialMessageFlag = copy.idxPartialMessageFlag;
this.idxMessageObject = copy.idxMessageObject;
- this.messageRole = copy.messageRole;
}
protected void assertDecoderRequired()
@@ -162,6 +161,11 @@
}
}
+ public boolean isMessageRoleAssigned()
+ {
+ return messageRoleAssigned;
+ }
+
public boolean isPartialMessageSupported()
{
return (idxPartialMessageFlag >= 0);
@@ -171,6 +175,7 @@
public void setDecoderClass(Class<? extends Decoder> decoderClass)
{
this.decoderClass = decoderClass;
+ messageRoleAssigned = true;
}
public void setPartialMessageFlag(Param param)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ReaderDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ReaderDecoder.java
new file mode 100644
index 0000000..2a36c88
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ReaderDecoder.java
@@ -0,0 +1,45 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356.decoders;
+
+import java.io.IOException;
+import java.io.Reader;
+
+import javax.websocket.DecodeException;
+import javax.websocket.Decoder;
+import javax.websocket.EndpointConfig;
+
+public class ReaderDecoder implements Decoder.TextStream<Reader>
+{
+ @Override
+ public Reader decode(Reader reader) throws DecodeException, IOException
+ {
+ return reader;
+ }
+
+ @Override
+ public void destroy()
+ {
+ }
+
+ @Override
+ public void init(EndpointConfig config)
+ {
+ }
+}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
index d2fa69e..90ed7fc 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
@@ -52,6 +52,8 @@
import org.eclipse.jetty.websocket.jsr356.server.samples.BasicTextMessageStringSocket;
import org.eclipse.jetty.websocket.jsr356.server.samples.StatelessTextMessageStringSocket;
import org.eclipse.jetty.websocket.jsr356.server.samples.beans.DateTextSocket;
+import org.eclipse.jetty.websocket.jsr356.server.samples.primitives.BooleanObjectTextSocket;
+import org.eclipse.jetty.websocket.jsr356.server.samples.primitives.BooleanTextSocket;
import org.eclipse.jetty.websocket.jsr356.server.samples.primitives.ByteObjectTextSocket;
import org.eclipse.jetty.websocket.jsr356.server.samples.primitives.ByteTextSocket;
import org.eclipse.jetty.websocket.jsr356.server.samples.primitives.CharTextSocket;
@@ -133,6 +135,8 @@
Case.add(data, BasicTextMessageStringSocket.class, fText, String.class);
Case.add(data, StatelessTextMessageStringSocket.class, fText, Session.class, String.class);
// -- Primitives
+ Case.add(data, BooleanTextSocket.class, fText, Boolean.TYPE);
+ Case.add(data, BooleanObjectTextSocket.class, fText, Boolean.class);
Case.add(data, ByteTextSocket.class, fText, Byte.TYPE);
Case.add(data, ByteObjectTextSocket.class, fText, Byte.class);
Case.add(data, CharTextSocket.class, fText, Character.TYPE);
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/primitives/BooleanObjectTextSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/primitives/BooleanObjectTextSocket.java
new file mode 100644
index 0000000..0a53134
--- /dev/null
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/primitives/BooleanObjectTextSocket.java
@@ -0,0 +1,66 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356.server.samples.primitives;
+
+import java.io.IOException;
+
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.jsr356.server.StackUtil;
+
+@ServerEndpoint("/echo/primitives/booleanobject")
+public class BooleanObjectTextSocket
+{
+ private static final Logger LOG = Log.getLogger(BooleanObjectTextSocket.class);
+
+ private Session session;
+
+ @OnOpen
+ public void onOpen(Session session)
+ {
+ this.session = session;
+ }
+
+ @OnMessage
+ public void onMessage(Boolean b) throws IOException
+ {
+ if (b == null)
+ {
+ session.getAsyncRemote().sendText("Error: Boolean is null");
+ }
+ else
+ {
+ String msg = b.toString();
+ session.getAsyncRemote().sendText(msg);
+ }
+ }
+
+ @OnError
+ public void onError(Throwable cause) throws IOException
+ {
+ LOG.warn("Error",cause);
+ session.getBasicRemote().sendText("Exception: " + StackUtil.toString(cause));
+ }
+}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/primitives/BooleanTextSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/primitives/BooleanTextSocket.java
new file mode 100644
index 0000000..d90e941
--- /dev/null
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/primitives/BooleanTextSocket.java
@@ -0,0 +1,59 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356.server.samples.primitives;
+
+import java.io.IOException;
+
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.jsr356.server.StackUtil;
+
+@ServerEndpoint("/echo/primitives/boolean")
+public class BooleanTextSocket
+{
+ private static final Logger LOG = Log.getLogger(BooleanTextSocket.class);
+
+ private Session session;
+
+ @OnOpen
+ public void onOpen(Session session)
+ {
+ this.session = session;
+ }
+
+ @OnMessage
+ public void onMessage(boolean b) throws IOException
+ {
+ String msg = Boolean.toString(b);
+ session.getAsyncRemote().sendText(msg);
+ }
+
+ @OnError
+ public void onError(Throwable cause) throws IOException
+ {
+ LOG.warn("Error",cause);
+ session.getBasicRemote().sendText("Exception: " + StackUtil.toString(cause));
+ }
+}