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));
+    }
+}