X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.lib.jetty%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjetty%2FJettyHttpContext.java;h=551e54e05044410f334694cf9c5641b512ee2a48;hb=5b6b49fa655c7b3ae3dcc06d6c504e3d0225684f;hp=2aa4abc43a3662e5325f6e9fec9112ff159ec637;hpb=81d9084e2c9fd9d33ca1d864171d28f9564647d8;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpContext.java b/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpContext.java index 2aa4abc43..551e54e05 100644 --- a/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpContext.java +++ b/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpContext.java @@ -1,19 +1,17 @@ package org.argeo.cms.jetty; -import java.util.AbstractMap; import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.Set; -import org.argeo.cms.servlet.httpserver.HttpContextServlet; -import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.handler.ContextHandler; +import javax.servlet.ServletContext; +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; + +import org.argeo.cms.websocket.server.WebsocketEndpoints; import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer; +import org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer.Configurator; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.Filter; @@ -21,12 +19,13 @@ import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; -/** Trivial implementation of @{HttpContext}. */ -class JettyHttpContext extends HttpContext { +/** + * An @{HttpContext} implementation based on Jetty. It supports web sockets if + * the handler implements {@link WebsocketEndpoints}. + */ +abstract class JettyHttpContext extends HttpContext { private final JettyHttpServer httpServer; private final String path; - private final ContextHandler contextHandler; - private final ContextAttributes attributes; private final List filters = new ArrayList<>(); private HttpHandler handler; @@ -34,17 +33,13 @@ class JettyHttpContext extends HttpContext { public JettyHttpContext(JettyHttpServer httpServer, String path) { this.httpServer = httpServer; + if (!path.endsWith("/")) + throw new IllegalArgumentException("Path " + path + " should end with a /"); this.path = path; - - ServletContextHandler servletContextHandler = new ServletContextHandler(); - servletContextHandler.setContextPath(path); - HttpContextServlet servlet = new HttpContextServlet(this); - servletContextHandler.addServlet(new ServletHolder(servlet), "/*"); - contextHandler = servletContextHandler; - - attributes = new ContextAttributes(); } + protected abstract ServletContextHandler getServletContextHandler(); + @Override public HttpHandler getHandler() { return handler; @@ -56,13 +51,6 @@ class JettyHttpContext extends HttpContext { throw new IllegalArgumentException("Handler is already set"); Objects.requireNonNull(handler); this.handler = handler; - - if (httpServer.isStarted()) - try { - contextHandler.start(); - } catch (Exception e) { - throw new IllegalStateException("Cannot start context handler", e); - } } @Override @@ -72,12 +60,11 @@ class JettyHttpContext extends HttpContext { @Override public HttpServer getServer() { - return httpServer; + return getJettyHttpServer(); } - @Override - public Map getAttributes() { - return attributes; + protected JettyHttpServer getJettyHttpServer() { + return httpServer; } @Override @@ -97,51 +84,4 @@ class JettyHttpContext extends HttpContext { return authenticator; } - public Handler getContextHandler() { - return contextHandler; - } - - private class ContextAttributes extends AbstractMap { - @Override - public Set> entrySet() { - Set> entries = new HashSet<>(); - for (Enumeration keys = contextHandler.getAttributeNames(); keys.hasMoreElements();) { - entries.add(new ContextAttributeEntry(keys.nextElement())); - } - return entries; - } - - @Override - public Object put(String key, Object value) { - Object previousValue = get(key); - contextHandler.setAttribute(key, value); - return previousValue; - } - - private class ContextAttributeEntry implements Map.Entry { - private final String key; - - public ContextAttributeEntry(String key) { - this.key = key; - } - - @Override - public String getKey() { - return key; - } - - @Override - public Object getValue() { - return contextHandler.getAttribute(key); - } - - @Override - public Object setValue(Object value) { - Object previousValue = getValue(); - contextHandler.setAttribute(key, value); - return previousValue; - } - - } - } }