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