From e189cb9175c4f220f98b0b663d12c4e5fac4dc4f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 28 Apr 2019 16:52:41 +0200 Subject: [PATCH] Javax WebSocket support --- dep/org.argeo.dep.cms.node/pom.xml | 5 ++ .../cms/internal/kernel/DeployConfig.java | 1 + org.argeo.ext.equinox.jetty/.classpath | 7 ++ org.argeo.ext.equinox.jetty/.gitignore | 2 + org.argeo.ext.equinox.jetty/.project | 28 ++++++++ .../META-INF/.gitignore | 1 + org.argeo.ext.equinox.jetty/bnd.bnd | 4 ++ org.argeo.ext.equinox.jetty/build.properties | 4 ++ org.argeo.ext.equinox.jetty/pom.xml | 12 ++++ .../jetty/WebSocketJettyCustomizer.java | 65 +++++++++++++++++++ pom.xml | 1 + 11 files changed, 130 insertions(+) create mode 100644 org.argeo.ext.equinox.jetty/.classpath create mode 100644 org.argeo.ext.equinox.jetty/.gitignore create mode 100644 org.argeo.ext.equinox.jetty/.project create mode 100644 org.argeo.ext.equinox.jetty/META-INF/.gitignore create mode 100644 org.argeo.ext.equinox.jetty/bnd.bnd create mode 100644 org.argeo.ext.equinox.jetty/build.properties create mode 100644 org.argeo.ext.equinox.jetty/pom.xml create mode 100644 org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/WebSocketJettyCustomizer.java diff --git a/dep/org.argeo.dep.cms.node/pom.xml b/dep/org.argeo.dep.cms.node/pom.xml index c77027d7e..3e25980d5 100644 --- a/dep/org.argeo.dep.cms.node/pom.xml +++ b/dep/org.argeo.dep.cms.node/pom.xml @@ -37,6 +37,11 @@ org.argeo.ext.jackrabbit 2.1.77-SNAPSHOT + + org.argeo.commons + org.argeo.ext.equinox.jetty + 2.1.77-SNAPSHOT + diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java index 8ad51fc9f..4db887606 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java @@ -122,6 +122,7 @@ class DeployConfig implements ConfigurationListener { // http server Dictionary webServerConfig = InitUtils .getHttpServerConfig(getProps(KernelConstants.JETTY_FACTORY_PID, NodeConstants.DEFAULT)); + webServerConfig.put("customizer.class", "org.argeo.equinox.jetty.WebSocketJettyCustomizer"); if (!webServerConfig.isEmpty()) putFactoryDeployConfig(KernelConstants.JETTY_FACTORY_PID, webServerConfig); diff --git a/org.argeo.ext.equinox.jetty/.classpath b/org.argeo.ext.equinox.jetty/.classpath new file mode 100644 index 000000000..eca7bdba8 --- /dev/null +++ b/org.argeo.ext.equinox.jetty/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.ext.equinox.jetty/.gitignore b/org.argeo.ext.equinox.jetty/.gitignore new file mode 100644 index 000000000..09e3bc9b2 --- /dev/null +++ b/org.argeo.ext.equinox.jetty/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.ext.equinox.jetty/.project b/org.argeo.ext.equinox.jetty/.project new file mode 100644 index 000000000..0b9700dd6 --- /dev/null +++ b/org.argeo.ext.equinox.jetty/.project @@ -0,0 +1,28 @@ + + + org.argeo.ext.equinox.jetty + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.argeo.ext.equinox.jetty/META-INF/.gitignore b/org.argeo.ext.equinox.jetty/META-INF/.gitignore new file mode 100644 index 000000000..4854a41b9 --- /dev/null +++ b/org.argeo.ext.equinox.jetty/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.ext.equinox.jetty/bnd.bnd b/org.argeo.ext.equinox.jetty/bnd.bnd new file mode 100644 index 000000000..135f392e9 --- /dev/null +++ b/org.argeo.ext.equinox.jetty/bnd.bnd @@ -0,0 +1,4 @@ +Fragment-Host: org.eclipse.equinox.http.jetty + +Import-Package: org.eclipse.jetty.websocket.jsr356,\ +* \ No newline at end of file diff --git a/org.argeo.ext.equinox.jetty/build.properties b/org.argeo.ext.equinox.jetty/build.properties new file mode 100644 index 000000000..34d2e4d2d --- /dev/null +++ b/org.argeo.ext.equinox.jetty/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/org.argeo.ext.equinox.jetty/pom.xml b/org.argeo.ext.equinox.jetty/pom.xml new file mode 100644 index 000000000..2c71d6f61 --- /dev/null +++ b/org.argeo.ext.equinox.jetty/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + org.argeo.commons + argeo-commons + 2.1.77-SNAPSHOT + .. + + org.argeo.ext.equinox.jetty + Extension of Equinox Jetty Integration + \ No newline at end of file diff --git a/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/WebSocketJettyCustomizer.java b/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/WebSocketJettyCustomizer.java new file mode 100644 index 000000000..6c868875f --- /dev/null +++ b/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/WebSocketJettyCustomizer.java @@ -0,0 +1,65 @@ +package org.argeo.equinox.jetty; + +import java.util.Dictionary; + +import javax.servlet.ServletException; +import javax.websocket.server.ServerContainer; + +import org.eclipse.equinox.http.jetty.JettyCustomizer; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; + +public class WebSocketJettyCustomizer extends JettyCustomizer { + private BundleContext bc = FrameworkUtil.getBundle(WebSocketJettyCustomizer.class).getBundleContext(); + + @Override + public Object customizeContext(Object context, Dictionary settings) { + ServletContextHandler servletContextHandler = (ServletContextHandler) context; + new WebSocketInit(servletContextHandler).start(); + return super.customizeContext(context, settings); + } + + /** Configure websocket container asynchronously as it may take some time */ + private class WebSocketInit extends Thread { + ServletContextHandler servletContextHandler; + + public WebSocketInit(ServletContextHandler servletContextHandler) { + super("WebSocket Init"); + this.servletContextHandler = servletContextHandler; + } + + @Override + public void run() { + ServerContainer serverContainer; + try { + serverContainer = WebSocketServerContainerInitializer.configureContext(servletContextHandler); + } catch (ServletException e) { + throw new IllegalStateException("Cannot configure web sockets", e); + } + bc.registerService(ServerContainer.class, serverContainer, null); +// ServiceTracker endpointsTracker = new ServiceTracker( +// bc, ServerEndpointConfig.Builder.class, null) { +// +// @Override +// public ServerEndpointConfig.Builder addingService( +// ServiceReference reference) { +// +// ServerEndpointConfig.Builder serverEndpointConfig = super.addingService(reference); +// try { +// serverContainer.addEndpoint(serverEndpointConfig.build()); +// } catch (DeploymentException e) { +// throw new IllegalArgumentException("Cannot add end point " + reference, e); +// } +// return serverEndpointConfig; +// } +// }; +// endpointsTracker.open(); + // TODO log it properly + // TODO close itproperly + } + + } + +} diff --git a/pom.xml b/pom.xml index 0c5ed5d21..2450e28d8 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,7 @@ org.argeo.cms.ui.workbench.rap org.argeo.ext.jackrabbit + org.argeo.ext.equinox.jetty org.argeo.ext.rap.ui.workbench maven -- 2.30.2