Author: markt
Date: Thu Mar  7 22:09:15 2013
New Revision: 1454125

URL: http://svn.apache.org/r1454125
Log:
Client side POJO support with a simple test case

Added:
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/Constants.java   (with 
props)
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java   
(with props)
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java  
 (with props)
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java
      - copied, changed from r1453881, 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java
Removed:
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java
Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/server/UriTemplate.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TesterSingleMessageClient.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Thu 
Mar  7 22:09:15 2013
@@ -55,11 +55,12 @@ wsSession.invalidHandlerTypePong=A pong 
 wsSession.removeHandlerFailed=Unable to remove the handler [{0}] as it was not 
registered with this session
 wsSession.unknownHandler=Unable to add the message handler [{0}] as it was for 
the unrecognised type [{1}]
 
+wsWebSocketContainer.defaultConfiguratorFaill=Failed to create the default 
configurator
+wsWebSocketContainer.endpointCreateFail=Failed to create a local endpoint of 
type [{0}]
 wsWebSocketContainer.httpRequestFailed=The HTTP request to initiate the 
WebSocket conenction failed
 wsWebSocketContainer.invalidHeader=Unable to parse HTTP header as no colon is 
present to delimit header name and header value in [{0}]. The header has been 
skipped.
 wsWebSocketContainer.invalidStatus=The HTTP response from the server [{0}] did 
not permit the HTTP upgrade to WebSocket
 wsWebSocketContainer.invalidSubProtocol=The WebSocket server returned multiple 
values for the Sec-WebSocket-Protocol header
 wsWebSocketContainer.maxBuffer=This implementation limits the maximum size of 
a buffer to Integer.MAX_VALUE
 wsWebSocketContainer.pathNoHost=No host was specified in URI
-wsWebSocketContainer.pathWrongScheme=The scheme [{0}] is not supported
-wsWebSocketContainer.endpointCreateFail=Failed to create a local endpoint of 
type [{0}]
\ No newline at end of file
+wsWebSocketContainer.pathWrongScheme=The scheme [{0}] is not supported
\ No newline at end of file

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Thu 
Mar  7 22:09:15 2013
@@ -37,6 +37,7 @@ import java.util.concurrent.ConcurrentHa
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
+import javax.websocket.ClientEndpoint;
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.DeploymentException;
 import javax.websocket.Endpoint;
@@ -49,6 +50,7 @@ import javax.xml.bind.DatatypeConverter;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.res.StringManager;
+import org.apache.tomcat.websocket.pojo.PojoEndpointClient;
 
 public class WsWebSocketContainer
         implements WebSocketContainer, BackgroundProcess {
@@ -77,8 +79,28 @@ public class WsWebSocketContainer
     @Override
     public Session connectToServer(Object pojo, URI path)
             throws DeploymentException {
-        // TODO Auto-generated method stub
-        return null;
+
+        Endpoint ep = new PojoEndpointClient(pojo);
+
+        Class<? extends ClientEndpointConfig.Configurator> configuratorClazz =
+                pojo.getClass().getAnnotation(
+                        ClientEndpoint.class).configurator();
+
+        ClientEndpointConfig.Configurator configurator = null;
+        if (!ClientEndpointConfig.Configurator.class.equals(
+                configuratorClazz)) {
+            try {
+                configurator = configuratorClazz.newInstance();
+            } catch (InstantiationException | IllegalAccessException e) {
+                throw new DeploymentException(sm.getString(
+                        "wsWebSocketContainer.defaultConfiguratorFail"), e);
+            }
+        }
+
+        ClientEndpointConfig config =
+                ClientEndpointConfig.Builder.create().configurator(
+                        configurator).build();
+        return connectToServer(ep, config, path);
     }
 
 

Added: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/Constants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/Constants.java?rev=1454125&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/Constants.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/Constants.java Thu Mar  
7 22:09:15 2013
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket.pojo;
+
+/**
+ * Internal implementation constants.
+ */
+public class Constants {
+
+    protected static final String PACKAGE_NAME =
+            Constants.class.getPackage().getName();
+
+    private Constants() {
+        // Hide default constructor
+    }
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/Constants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties 
Thu Mar  7 22:09:15 2013
@@ -12,4 +12,8 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-pojoUriTemplate.noMatch=The input template [{0}] generated the pattern [{1}] 
which did not match the supplied pathInfo [{2}]
+
+pojoEndpointBase.onCloseFail=Failed to call onClose method of POJO end point 
for POJO of type [{0}]
+pojoEndpointBase.onErrorFail=Failed to call onError method of POJO end point 
for POJO of type [{0}]
+pojoEndpointBase.onOpenFail=Failed to call onOpen method of POJO end point for 
POJO of type [{0}]
+pojoEndpointServer.getPojoInstanceFail=Failed to create instance of POJO of 
type [{0}]
\ No newline at end of file

Added: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java?rev=1454125&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java 
(added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java 
Thu Mar  7 22:09:15 2013
@@ -0,0 +1,111 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.websocket.pojo;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+
+import javax.websocket.CloseReason;
+import javax.websocket.Endpoint;
+import javax.websocket.MessageHandler;
+import javax.websocket.Session;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
+
+public abstract class PojoEndpointBase extends Endpoint {
+
+    private static final Log log = LogFactory.getLog(PojoEndpointBase.class);
+    private static final StringManager sm =
+            StringManager.getManager(Constants.PACKAGE_NAME);
+
+    private Object pojo;
+    private Map<String,String> pathParameters;
+    private PojoMethodMapping methodMapping;
+
+
+    protected final void doOnOpen(Session session) {
+        PojoMethodMapping methodMapping = getMethodMapping();
+        Object pojo = getPojo();
+        Map<String,String> pathParameters = getPathParameters();
+
+        if (methodMapping.getOnOpen() != null) {
+            try {
+                methodMapping.getOnOpen().invoke(pojo,
+                        methodMapping.getOnOpenArgs(pathParameters, session));
+            } catch (IllegalAccessException | InvocationTargetException e) {
+                throw new IllegalArgumentException(sm.getString(
+                        "pojoEndpointBase.onOpenFail",
+                        pojo.getClass().getName()), e);
+            }
+        }
+        for (MessageHandler mh : methodMapping.getMessageHandlers(pojo,
+                pathParameters, session)) {
+            session.addMessageHandler(mh);
+        }
+    }
+
+
+    @Override
+    public final void onClose(Session session, CloseReason closeReason) {
+
+        if (methodMapping.getOnClose() != null) {
+            try {
+                methodMapping.getOnClose().invoke(pojo,
+                        methodMapping.getOnCloseArgs(pathParameters, session));
+            } catch (IllegalAccessException | IllegalArgumentException
+                    | InvocationTargetException e) {
+                log.error(sm.getString("pojoEndpointBase.onCloseFail",
+                        pojo.getClass().getName()), e);
+            }
+        }
+    }
+
+
+    @Override
+    public final void onError(Session session, Throwable throwable) {
+
+        if (methodMapping.getOnError() != null) {
+            try {
+                methodMapping.getOnError().invoke(
+                        pojo,
+                        methodMapping.getOnErrorArgs(pathParameters, session,
+                                throwable));
+            } catch (IllegalAccessException | IllegalArgumentException
+                    | InvocationTargetException e) {
+                log.error(sm.getString("pojoEndpointBase.onErrorFail",
+                        pojo.getClass().getName()), e);
+            }
+        }
+    }
+
+    protected Object getPojo() { return pojo; }
+    protected void setPojo(Object pojo) { this.pojo = pojo; }
+
+
+    protected Map<String,String> getPathParameters() { return pathParameters; }
+    protected void setPathParameters(Map<String,String> pathParameters) {
+        this.pathParameters = pathParameters;
+    }
+
+
+    protected PojoMethodMapping getMethodMapping() { return methodMapping; }
+    protected void setMethodMapping(PojoMethodMapping methodMapping) {
+        this.methodMapping = methodMapping;
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java?rev=1454125&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java 
(added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java 
Thu Mar  7 22:09:15 2013
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.websocket.pojo;
+
+import java.util.Collections;
+
+import javax.websocket.EndpointConfig;
+import javax.websocket.Session;
+
+
+public class PojoEndpointClient extends PojoEndpointBase {
+
+    public PojoEndpointClient(Object pojo) {
+        setPojo(pojo);
+        setMethodMapping(new PojoMethodMapping(pojo.getClass(), null));
+        setPathParameters(Collections.EMPTY_MAP);
+    }
+
+    @Override
+    public void onOpen(Session session, EndpointConfig config) {
+        doOnOpen(session);
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java 
(from r1453881, 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java)
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java?p2=tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java&p1=tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java&r1=1453881&r2=1454125&rev=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpoint.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java 
Thu Mar  7 22:09:15 2013
@@ -16,96 +16,56 @@
  */
 package org.apache.tomcat.websocket.pojo;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 
-import javax.websocket.CloseReason;
-import javax.websocket.Endpoint;
 import javax.websocket.EndpointConfig;
-import javax.websocket.MessageHandler;
 import javax.websocket.Session;
 import javax.websocket.server.ServerEndpointConfig;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Wrapper class for instances of POJOs annotated with
  * {@link javax.websocket.server.ServerEndpoint} so they appear as standard
- * {@link Endpoint} instances.
+ * {@link javax.websocket.Endpoint} instances.
  */
-public class PojoEndpoint extends Endpoint {
+public class PojoEndpointServer extends PojoEndpointBase {
+
+    private static final StringManager sm =
+            StringManager.getManager(Constants.PACKAGE_NAME);
 
     public static final String POJO_PATH_PARAM_KEY =
             "org.apache.tomcat.websocket.pojo.PojoEndpoint.pathParams";
     public static final String POJO_METHOD_MAPPING_KEY =
             "org.apache.tomcat.websocket.pojo.PojoEndpoint.methodMapping";
 
-    private Object pojo;
-    private Map<String,String> pathParameters;
-    private PojoMethodMapping methodMapping;
-
 
     @Override
     public void onOpen(Session session, EndpointConfig endpointConfig) {
 
         ServerEndpointConfig sec = (ServerEndpointConfig) endpointConfig;
 
+        Object pojo;
         try {
             pojo = sec.getConfigurator().getEndpointInstance(
                     sec.getEndpointClass());
         } catch (InstantiationException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
-        pathParameters = (Map<String, String>) sec.getUserProperties().get(
-                POJO_PATH_PARAM_KEY);
-        methodMapping = (PojoMethodMapping) sec.getUserProperties().get(
-                POJO_METHOD_MAPPING_KEY);
-
-        if (methodMapping.getOnOpen() != null) {
-            try {
-                methodMapping.getOnOpen().invoke(pojo,
-                        methodMapping.getOnOpenArgs(pathParameters, session));
-            } catch (IllegalAccessException | IllegalArgumentException
-                    | InvocationTargetException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-        for (MessageHandler mh : methodMapping.getMessageHandlers(pojo,
-                pathParameters, session)) {
-            session.addMessageHandler(mh);
-        }
-    }
-
-
-    @Override
-    public void onClose(Session session, CloseReason closeReason) {
-        if (methodMapping.getOnClose() != null) {
-            try {
-                methodMapping.getOnClose().invoke(pojo,
-                        methodMapping.getOnCloseArgs(pathParameters, session));
-            } catch (IllegalAccessException | IllegalArgumentException
-                    | InvocationTargetException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
+            throw new IllegalArgumentException(sm.getString(
+                    "pojoEndpointServer.getPojoInstanceFail",
+                    sec.getEndpointClass().getName()), e);
         }
-    }
+        setPojo(pojo);
 
+        Map<String,String> pathParameters =
+                (Map<String, String>) sec.getUserProperties().get(
+                        POJO_PATH_PARAM_KEY);
+        setPathParameters(pathParameters);
+
+        PojoMethodMapping methodMapping =
+                (PojoMethodMapping) sec.getUserProperties().get(
+                        POJO_METHOD_MAPPING_KEY);
+        setMethodMapping(methodMapping);
 
-    @Override
-    public void onError(Session session, Throwable throwable) {
-        if (methodMapping.getOnError() != null) {
-            try {
-                methodMapping.getOnError().invoke(
-                        pojo,
-                        methodMapping.getOnErrorArgs(pathParameters, session,
-                                throwable));
-            } catch (IllegalAccessException | IllegalArgumentException
-                    | InvocationTargetException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
+        doOnOpen(session);
     }
 }

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/server/LocalStrings.properties 
Thu Mar  7 22:09:15 2013
@@ -19,5 +19,6 @@ serverContainer.missingEndpoint=An Endpo
 serverContainer.pojoDeploy=POJO class [{0}] deploying to path [{1}] in 
ServletContext [{2}]
 serverContainer.servletContextMismatch=Attempted to register a POJO annotated 
for WebSocket at path [{0}] in the ServletContext with context path [{1}] when 
the WebSocket ServerContainer is allocated to the ServletContext with context 
path [{2}]
 serverContainer.servletContextMissing=No ServletContext was specified
+uriTemplate.noMatch=The input template [{0}] generated the pattern [{1}] which 
did not match the supplied pathInfo [{2}]
 wsProtocolHandler.closeFailed=Failed to close the WebSocket connection cleanly
 wsRemoteEndpointServer.closeFailed=Failed to close the ServletOutputStream 
connection cleanly
\ No newline at end of file

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/UriTemplate.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/UriTemplate.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/UriTemplate.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/UriTemplate.java Thu 
Mar  7 22:09:15 2013
@@ -84,7 +84,7 @@ public class UriTemplate {
         Matcher m = pattern.matcher(pathInfo);
         if (!m.matches()) {
             throw new IllegalArgumentException(sm.getString(
-                    "pojoUriTemplate.noMatch", template, pattern, pathInfo));
+                    "uriTemplate.noMatch", template, pattern, pathInfo));
         }
         int group = 2;
         for (String name : names) {

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java 
Thu Mar  7 22:09:15 2013
@@ -33,7 +33,7 @@ import org.apache.juli.logging.LogFactor
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.websocket.WsSession;
 import org.apache.tomcat.websocket.WsWebSocketContainer;
-import org.apache.tomcat.websocket.pojo.PojoEndpoint;
+import org.apache.tomcat.websocket.pojo.PojoEndpointServer;
 import org.apache.tomcat.websocket.pojo.PojoMethodMapping;
 
 /**
@@ -210,9 +210,9 @@ public class WsServerContainer extends W
                 sec = ServerEndpointConfig.Builder.create(
                         pojo, methodMapping.getWsPath()).build();
                 sec.getUserProperties().put(
-                        PojoEndpoint.POJO_PATH_PARAM_KEY, pathParameters);
+                        PojoEndpointServer.POJO_PATH_PARAM_KEY, 
pathParameters);
                 sec.getUserProperties().put(
-                        PojoEndpoint.POJO_METHOD_MAPPING_KEY, methodMapping);
+                        PojoEndpointServer.POJO_METHOD_MAPPING_KEY, 
methodMapping);
                 return sec;
             }
         }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java Thu Mar 
 7 22:09:15 2013
@@ -46,7 +46,7 @@ import javax.xml.bind.DatatypeConverter;
 
 import org.apache.tomcat.websocket.Constants;
 import org.apache.tomcat.websocket.WsRequest;
-import org.apache.tomcat.websocket.pojo.PojoEndpoint;
+import org.apache.tomcat.websocket.pojo.PojoEndpointServer;
 
 /**
  * Handles the initial HTTP connection for WebSocket connections.
@@ -140,7 +140,7 @@ public class WsServlet extends HttpServl
             if (Endpoint.class.isAssignableFrom(clazz)) {
                 ep = (Endpoint) sec.getEndpointClass().newInstance();
             } else {
-                ep = new PojoEndpoint();
+                ep = new PojoEndpointServer();
             }
         } catch (InstantiationException | IllegalAccessException e) {
             throw new ServletException(e);

Modified: 
tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java 
(original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java Thu 
Mar  7 22:09:15 2013
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit;
 
 import javax.websocket.ClientEndpointConfig.Builder;
 import javax.websocket.ContainerProvider;
+import javax.websocket.Endpoint;
 import javax.websocket.Session;
 import javax.websocket.WebSocketContainer;
 
@@ -35,7 +36,8 @@ import org.apache.catalina.startup.Tomca
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.websocket.TesterSingleMessageClient.AsyncHandler;
 import org.apache.tomcat.websocket.TesterSingleMessageClient.AsyncText;
-import org.apache.tomcat.websocket.TesterSingleMessageClient.TesterEndpoint;
+import 
org.apache.tomcat.websocket.TesterSingleMessageClient.TesterAnnotatedEndpoint;
+import 
org.apache.tomcat.websocket.TesterSingleMessageClient.TesterProgrammaticEndpoint;
 
 public class TestWsRemoteEndpoint extends TomcatBaseTest {
 
@@ -52,7 +54,16 @@ public class TestWsRemoteEndpoint extend
     }
 
     @Test
-    public void testWriter() throws Exception {
+    public void testWriterAnnotation() throws Exception {
+        doTestWriter(TesterAnnotatedEndpoint.class);
+    }
+
+    @Test
+    public void testWriterProgrammatic() throws Exception {
+        doTestWriter(TesterProgrammaticEndpoint.class);
+    }
+
+    private void doTestWriter(Class<?> clazz) throws Exception {
         Tomcat tomcat = getTomcatInstance();
         // Must have a real docBase - just use temp
         Context ctx =
@@ -64,10 +75,18 @@ public class TestWsRemoteEndpoint extend
 
         tomcat.start();
 
-        Session wsSession = wsContainer.connectToServer(TesterEndpoint.class,
-                Builder.create().build(),
-                new URI("http://localhost:"; + getPort() +
-                        TesterEchoServer.Config.PATH_ASYNC));
+        Session wsSession;
+        URI uri = new URI("http://localhost:"; + getPort() +
+                TesterEchoServer.Config.PATH_ASYNC);
+        if (Endpoint.class.isAssignableFrom(clazz)) {
+            @SuppressWarnings("unchecked")
+            Class<? extends Endpoint> endpointClazz =
+                    (Class<? extends Endpoint>) clazz;
+            wsSession = wsContainer.connectToServer(endpointClazz,
+                    Builder.create().build(), uri);
+        } else {
+            wsSession = wsContainer.connectToServer(clazz, uri);
+        }
 
         CountDownLatch latch = new CountDownLatch(1);
         wsSession.getUserProperties().put("latch", latch);

Modified: 
tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java 
(original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java 
Thu Mar  7 22:09:15 2013
@@ -49,7 +49,7 @@ import org.apache.coyote.http11.Http11Pr
 import org.apache.tomcat.websocket.TesterSingleMessageClient.BasicBinary;
 import org.apache.tomcat.websocket.TesterSingleMessageClient.BasicHandler;
 import org.apache.tomcat.websocket.TesterSingleMessageClient.BasicText;
-import org.apache.tomcat.websocket.TesterSingleMessageClient.TesterEndpoint;
+import 
org.apache.tomcat.websocket.TesterSingleMessageClient.TesterProgrammaticEndpoint;
 import org.apache.tomcat.websocket.server.WsListener;
 import org.apache.tomcat.websocket.server.WsServerContainer;
 
@@ -83,7 +83,7 @@ public class TestWsWebSocketContainer ex
 
         WebSocketContainer wsContainer =
                 ContainerProvider.getWebSocketContainer();
-        Session wsSession = wsContainer.connectToServer(TesterEndpoint.class,
+        Session wsSession = 
wsContainer.connectToServer(TesterProgrammaticEndpoint.class,
                 ClientEndpointConfig.Builder.create().build(),
                 new URI("http://localhost:"; + getPort() +
                         TesterEchoServer.Config.PATH_ASYNC));
@@ -114,7 +114,7 @@ public class TestWsWebSocketContainer ex
 
         WebSocketContainer wsContainer =
                 ContainerProvider.getWebSocketContainer();
-        wsContainer.connectToServer(TesterEndpoint.class,
+        wsContainer.connectToServer(TesterProgrammaticEndpoint.class,
                 ClientEndpointConfig.Builder.create().build(),
                 new URI("ftp://localhost:"; + getPort() +
                         TesterEchoServer.Config.PATH_ASYNC));
@@ -133,7 +133,7 @@ public class TestWsWebSocketContainer ex
 
         WebSocketContainer wsContainer =
                 ContainerProvider.getWebSocketContainer();
-        wsContainer.connectToServer(TesterEndpoint.class,
+        wsContainer.connectToServer(TesterProgrammaticEndpoint.class,
                 ClientEndpointConfig.Builder.create().build(),
                 new URI("http://"; + TesterEchoServer.Config.PATH_ASYNC));
     }
@@ -221,7 +221,7 @@ public class TestWsWebSocketContainer ex
 
         tomcat.start();
 
-        Session wsSession = wsContainer.connectToServer(TesterEndpoint.class,
+        Session wsSession = 
wsContainer.connectToServer(TesterProgrammaticEndpoint.class,
                 ClientEndpointConfig.Builder.create().build(),
                         new URI("http://localhost:"; + getPort() +
                                 TesterEchoServer.Config.PATH_BASIC));
@@ -292,7 +292,7 @@ public class TestWsWebSocketContainer ex
 
         tomcat.start();
 
-        Session wsSession = wsContainer.connectToServer(TesterEndpoint.class,
+        Session wsSession = 
wsContainer.connectToServer(TesterProgrammaticEndpoint.class,
                 ClientEndpointConfig.Builder.create().build(),
                 new URI("http://localhost:"; + getPort() + 
BlockingConfig.PATH));
 
@@ -373,7 +373,7 @@ public class TestWsWebSocketContainer ex
 
         tomcat.start();
 
-        Session wsSession = wsContainer.connectToServer(TesterEndpoint.class,
+        Session wsSession = 
wsContainer.connectToServer(TesterProgrammaticEndpoint.class,
                 ClientEndpointConfig.Builder.create().build(),
                 new URI("http://localhost:"; + getPort() +
                         ConstantTxConfig.PATH));

Modified: 
tomcat/trunk/test/org/apache/tomcat/websocket/TesterSingleMessageClient.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TesterSingleMessageClient.java?rev=1454125&r1=1454124&r2=1454125&view=diff
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/websocket/TesterSingleMessageClient.java 
(original)
+++ 
tomcat/trunk/test/org/apache/tomcat/websocket/TesterSingleMessageClient.java 
Thu Mar  7 22:09:15 2013
@@ -21,15 +21,19 @@ import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CountDownLatch;
 
+import javax.websocket.ClientEndpoint;
 import javax.websocket.CloseReason;
 import javax.websocket.Endpoint;
 import javax.websocket.EndpointConfig;
 import javax.websocket.MessageHandler;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnOpen;
 import javax.websocket.Session;
 
 public class TesterSingleMessageClient {
 
-    public static class TesterEndpoint extends Endpoint {
+    public static class TesterProgrammaticEndpoint extends Endpoint {
 
         @Override
         public void onClose(Session session, CloseReason closeReason) {
@@ -57,6 +61,36 @@ public class TesterSingleMessageClient {
         }
     }
 
+    @ClientEndpoint
+    public static class TesterAnnotatedEndpoint {
+
+        @OnClose
+        public void onClose(Session session) {
+            clearLatch(session);
+        }
+
+        @OnError
+        public void onError(Session session,
+                @SuppressWarnings("unused") Throwable throwable) {
+            clearLatch(session);
+        }
+
+        private void clearLatch(Session session) {
+            CountDownLatch latch =
+                    (CountDownLatch) session.getUserProperties().get("latch");
+            if (latch != null) {
+                while (latch.getCount() > 0) {
+                    latch.countDown();
+                }
+            }
+        }
+
+        @OnOpen
+        public void onOpen() {
+            // NO-OP
+        }
+    }
+
 
     public abstract static class BasicHandler<T>
             implements MessageHandler.Whole<T> {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to