You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2012/12/04 10:33:40 UTC
svn commit: r1416836 - in /tomcat/trunk:
java/org/apache/tomcat/websocket/WsProtocolHandler.java
java/org/apache/tomcat/websocket/WsSession.java
webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java
Author: markt
Date: Tue Dec 4 09:33:39 2012
New Revision: 1416836
URL: http://svn.apache.org/viewvc?rev=1416836&view=rev
Log:
WebSocket 1.0 implementation part 8 of many
Start to join up the upgrade ProtocolHandler, the WebSocket session and the Echo end point implementation
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java?rev=1416836&r1=1416835&r2=1416836&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java Tue Dec 4 09:33:39 2012
@@ -16,6 +16,12 @@
*/
package org.apache.tomcat.websocket;
+import java.io.IOException;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
import javax.servlet.http.ProtocolHandler;
import javax.servlet.http.WebConnection;
import javax.websocket.Endpoint;
@@ -26,16 +32,98 @@ import javax.websocket.Endpoint;
public class WsProtocolHandler implements ProtocolHandler {
private final Endpoint ep;
+ private final ClassLoader applicationClassLoader;
+ private final WsSession session;
public WsProtocolHandler(Endpoint ep) {
this.ep = ep;
+ applicationClassLoader = Thread.currentThread().getContextClassLoader();
+ session = new WsSession();
}
@Override
public void init(WebConnection connection) {
- ep.onOpen(new WsSession());
+ // Need to call onOpen using the web application's class loader
+ Thread t = Thread.currentThread();
+ ClassLoader cl = t.getContextClassLoader();
+ t.setContextClassLoader(applicationClassLoader);
+ try {
+ ep.onOpen(session);
+ } finally {
+ t.setContextClassLoader(cl);
+ }
+
+ ServletInputStream sis;
+ ServletOutputStream sos;
+ try {
+ sis = connection.getInputStream();
+ sos = connection.getOutputStream();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+
+ sis.setReadListener(new WsReadListener(this));
+ sos.setWriteListener(new WsWriteListener(this));
+ }
+
+
+ private void onError(Throwable throwable) {
+ // Need to call onError using the web application's class loader
+ Thread t = Thread.currentThread();
+ ClassLoader cl = t.getContextClassLoader();
+ t.setContextClassLoader(applicationClassLoader);
+ try {
+ ep.onError(throwable);
+ } finally {
+ t.setContextClassLoader(cl);
+ }
+ }
+
+ private static class WsReadListener implements ReadListener {
+
+ private final WsProtocolHandler wsProtocolHandler;
+
+ private WsReadListener(WsProtocolHandler wsProtocolHandler) {
+ this.wsProtocolHandler = wsProtocolHandler;
+ }
+
+ @Override
+ public void onDataAvailable() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAllDataRead() {
+ // Will never happen with WebSocket
+ throw new IllegalStateException();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ wsProtocolHandler.onError(throwable);
+ }
+ }
+
+
+ private static class WsWriteListener implements WriteListener {
+
+ private final WsProtocolHandler wsProtocolHandler;
+
+ private WsWriteListener(WsProtocolHandler wsProtocolHandler) {
+ this.wsProtocolHandler = wsProtocolHandler;
+ }
+
+ @Override
+ public void onWritePossible() {
+ // TODO Auto-generated method stub
+
+ }
- // TODO Message handling
+ @Override
+ public void onError(Throwable throwable) {
+ wsProtocolHandler.onError(throwable);
+ }
}
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1416836&r1=1416835&r2=1416836&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Tue Dec 4 09:33:39 2012
@@ -18,12 +18,14 @@ package org.apache.tomcat.websocket;
import java.io.IOException;
import java.net.URI;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.websocket.ClientContainer;
import javax.websocket.CloseReason;
+import javax.websocket.CloseReason.CloseCodes;
import javax.websocket.Encoder;
import javax.websocket.MessageHandler;
import javax.websocket.RemoteEndpoint;
@@ -31,6 +33,8 @@ import javax.websocket.Session;
public class WsSession implements Session {
+ private final Set<MessageHandler> messageHandlers = new LinkedHashSet<>();
+
@Override
public ClientContainer getContainer() {
// TODO Auto-generated method stub
@@ -45,20 +49,17 @@ public class WsSession implements Sessio
@Override
public void addMessageHandler(MessageHandler listener) {
- // TODO Auto-generated method stub
-
+ messageHandlers.add(listener);
}
@Override
public Set<MessageHandler> getMessageHandlers() {
- // TODO Auto-generated method stub
- return null;
+ return messageHandlers;
}
@Override
public void removeMessageHandler(MessageHandler listener) {
- // TODO Auto-generated method stub
-
+ messageHandlers.remove(listener);
}
@Override
@@ -129,8 +130,7 @@ public class WsSession implements Sessio
@Override
public void close() throws IOException {
- // TODO Auto-generated method stub
-
+ close(new CloseReason(CloseCodes.GOING_AWAY, ""));
}
@Override
Modified: tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java?rev=1416836&r1=1416835&r2=1416836&view=diff
==============================================================================
--- tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java (original)
+++ tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java Tue Dec 4 09:33:39 2012
@@ -16,9 +16,12 @@
*/
package websocket.echo;
+import java.io.IOException;
+
import javax.websocket.DefaultServerConfiguration;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfiguration;
+import javax.websocket.RemoteEndpoint;
import javax.websocket.ServerEndpointConfiguration;
import javax.websocket.Session;
@@ -41,9 +44,27 @@ public class EchoEndpoint extends Endpoi
@Override
public void onOpen(Session session) {
- // TODO - Review this debug hack
- System.out.println("EchoEndpoint onOpen() called");
- // TODO Auto-generated method stub
+ RemoteEndpoint remoteEndpoint = session.getRemote();
+ session.addMessageHandler(new EchoMessageHandler<>(remoteEndpoint));
+ }
+
+ private static class EchoMessageHandler<T>
+ implements javax.websocket.MessageHandler.Basic<String> {
+
+ private final RemoteEndpoint remoteEndpoint;
+ private EchoMessageHandler(RemoteEndpoint remoteEndpoint) {
+ this.remoteEndpoint = remoteEndpoint;
+ }
+
+ @Override
+ public void onMessage(String message) {
+ try {
+ remoteEndpoint.sendString(message);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org