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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org