Author: markt
Date: Tue Nov 27 14:49:15 2012
New Revision: 1414217
URL: http://svn.apache.org/viewvc?rev=1414217&view=rev
Log:
WebSocket 1.0 implementation part 2 of many
Create the WebSocket servlet and ensure it responds to requests to WebSocket
endpoints
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java Tue Nov 27
14:49:15 2012
@@ -18,7 +18,9 @@ package org.apache.tomcat.websocket;
public class Constants {
- public static final String PACKAGE_NAME = "org.apache.tomcat.websocket";
+ protected static final String PACKAGE_NAME = "org.apache.tomcat.websocket";
+
+ protected static final String SERVLET_NAME = WsServlet.class.getName();
private Constants() {
// Hide default constructor
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=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Tue
Nov 27 14:49:15 2012
@@ -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.
-sci.newInstance.fail=Failed to create an Endpoint instance of type [{0}]
\ No newline at end of file
+sci.newInstance.fail=Failed to create an Endpoint instance of type [{0}]
+serverContainer.endpointDeploy=Endpoint class [{0}] deploying to path [{1}] in
ServletContext [{2}]
+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
\ No newline at end of file
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java Tue
Nov 27 14:49:15 2012
@@ -18,12 +18,17 @@ package org.apache.tomcat.websocket;
import java.util.Map;
import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRegistration;
import javax.websocket.DeploymentException;
import javax.websocket.Endpoint;
import javax.websocket.ServerContainer;
import javax.websocket.ServerEndpointConfiguration;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.res.StringManager;
/**
@@ -42,6 +47,8 @@ public class ServerContainerImpl extends
private static StringManager sm = StringManager.getManager(
Constants.PACKAGE_NAME);
+ protected Log log = LogFactory.getLog(ServerContainerImpl.class);
+
/**
* Intended to be used by implementations of {@link
@@ -64,28 +71,47 @@ public class ServerContainerImpl extends
}
+ private volatile ServletContext servletContext = null;
+
+ private Map<String, Class<? extends Endpoint>> endpointMap =
+ new ConcurrentHashMap<>();
+
+ private Map<String, Class<?>> pojoMap = new ConcurrentHashMap<>();
+
+
private ServerContainerImpl() {
// Hide default constructor
}
+ public void setServletContext(ServletContext servletContext) {
+ this.servletContext = servletContext;
+ }
+
+
@Override
public void publishServer(Class<? extends Endpoint> clazz)
throws DeploymentException {
+ Endpoint ep = null;
try {
- Endpoint ep = clazz.newInstance();
- ServerEndpointConfiguration config =
- (ServerEndpointConfiguration)
ep.getEndpointConfiguration();
- String path = Util.getServletMappingPath(config.getPath());
-
- // TODO Replace following debug code with something useful.
- System.out.println("Class [" + clazz.getName() +
- "] deployed to path [" + path + "]");
+ ep = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new DeploymentException(
sm.getString("sci.newInstance.fail", clazz.getName()), e);
}
+
+ ServerEndpointConfiguration config =
+ (ServerEndpointConfiguration) ep.getEndpointConfiguration();
+ String path = Util.getServletMappingPath(config.getPath());
+
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("serverContainer.endpointDeploy",
+ clazz.getName(), path, servletContext.getContextPath()));
+ }
+
+ endpointMap.put(path.substring(0, path.length() - 2), clazz);
+ addWsServletMapping(path);
}
@@ -94,12 +120,44 @@ public class ServerContainerImpl extends
* plain old java objects (POJOs) that have been annotated as WebSocket
* endpoints.
*
- * @param pojo
- * @param path
+ * @param pojo The annotated POJO
+ * @param ctxt The ServletContext the endpoint is to be published in
+ * @param path The path at which the endpoint is to be published
*/
- public void publishServer(Class<?> pojo, String path) {
- // TODO Replace following debug code with something useful.
- System.out.println("Class [" + pojo.getName() +
- "] deployed to path [" + path + "]");
+ public void publishServer(Class<?> pojo, ServletContext ctxt, String path)
{
+ if (ctxt == null) {
+ throw new IllegalArgumentException(
+ sm.getString("serverContainer.servletContextMissing"));
+ }
+
+ // Set the ServletContext if it hasn't already been set
+ if (servletContext == null) {
+ servletContext = ctxt;
+ } else if (ctxt != servletContext) {
+ // Should never happen
+ throw new IllegalStateException(sm.getString(
+ "serverContainer.servletContextMismatch", path,
+ servletContext.getContextPath(), ctxt.getContextPath()));
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("serverContainer.pojoDeploy",
pojo.getName(),
+ path, servletContext.getContextPath()));
+ }
+
+ pojoMap.put(path.substring(0, path.length() - 2), pojo);
+ addWsServletMapping(path);
+ }
+
+
+ private void addWsServletMapping(String mapping) {
+ ServletRegistration sr =
+ servletContext.getServletRegistration(Constants.SERVLET_NAME);
+ if (sr == null) {
+ sr = servletContext.addServlet(Constants.SERVLET_NAME,
+ WsServlet.class);
+ }
+
+ sr.addMapping(mapping);
}
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSci.java Tue Nov 27
14:49:15 2012
@@ -35,16 +35,20 @@ public class WsSci implements ServletCon
@Override
public void onStartup(Set<Class<?>> clazzes, ServletContext ctx)
throws ServletException {
+
+ // Need to configure the ServletContext in all cases
+ ServerContainerImpl sc = ServerContainerImpl.getServerContainer();
+ sc.setServletContext(ctx);
+
if (clazzes == null || clazzes.size() == 0) {
return;
}
- ServerContainerImpl sc = ServerContainerImpl.getServerContainer();
for (Class<?> clazz : clazzes) {
WebSocketEndpoint anotation =
clazz.getAnnotation(WebSocketEndpoint.class);
String mappingPath = Util.getServletMappingPath(anotation.value());
- sc.publishServer(clazz, mappingPath);
+ sc.publishServer(clazz, ctx, mappingPath);
}
}
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java?rev=1414217&r1=1414216&r2=1414217&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsServlet.java Tue Nov 27
14:49:15 2012
@@ -16,6 +16,22 @@
*/
package org.apache.tomcat.websocket;
-public class WsServlet {
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class WsServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ resp.setContentType("text/plain");
+ resp.getWriter().print("TODO: Implement HTTP Upgrade");
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]