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: [email protected]
For additional commands, e-mail: [email protected]