Javax WebSocket support
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 28 Apr 2019 14:52:41 +0000 (16:52 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 28 Apr 2019 14:52:41 +0000 (16:52 +0200)
dep/org.argeo.dep.cms.node/pom.xml
org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java
org.argeo.ext.equinox.jetty/.classpath [new file with mode: 0644]
org.argeo.ext.equinox.jetty/.gitignore [new file with mode: 0644]
org.argeo.ext.equinox.jetty/.project [new file with mode: 0644]
org.argeo.ext.equinox.jetty/META-INF/.gitignore [new file with mode: 0644]
org.argeo.ext.equinox.jetty/bnd.bnd [new file with mode: 0644]
org.argeo.ext.equinox.jetty/build.properties [new file with mode: 0644]
org.argeo.ext.equinox.jetty/pom.xml [new file with mode: 0644]
org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/WebSocketJettyCustomizer.java [new file with mode: 0644]
pom.xml

index c77027d7e93a8ae50200d95112b1b61e0d0c60c7..3e25980d56807abfd5574a98c957073c4992eaa7 100644 (file)
                        <artifactId>org.argeo.ext.jackrabbit</artifactId>
                        <version>2.1.77-SNAPSHOT</version>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.ext.equinox.jetty</artifactId>
+                       <version>2.1.77-SNAPSHOT</version>
+               </dependency>
 
                <!-- CMS Dependencies -->
                <!-- TODO: not bitronix dependent -->
index 8ad51fc9f0b3dc4ef68169b81bd0a164b5fc51b0..4db887606a419fa483e834f2a52022e51c9efe33 100644 (file)
@@ -122,6 +122,7 @@ class DeployConfig implements ConfigurationListener {
                // http server
                Dictionary<String, Object> 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 (file)
index 0000000..eca7bdb
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.ext.equinox.jetty/.gitignore b/org.argeo.ext.equinox.jetty/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -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 (file)
index 0000000..0b9700d
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.ext.equinox.jetty</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.ext.equinox.jetty/META-INF/.gitignore b/org.argeo.ext.equinox.jetty/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -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 (file)
index 0000000..135f392
--- /dev/null
@@ -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 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -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 (file)
index 0000000..2c71d6f
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons</groupId>
+               <artifactId>argeo-commons</artifactId>
+               <version>2.1.77-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.ext.equinox.jetty</artifactId>
+       <name>Extension of Equinox Jetty Integration</name>
+</project>
\ 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 (file)
index 0000000..6c86887
--- /dev/null
@@ -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<String, ?> 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<ServerEndpointConfig.Builder, ServerEndpointConfig.Builder> endpointsTracker = new ServiceTracker<ServerEndpointConfig.Builder, ServerEndpointConfig.Builder>(
+//                                     bc, ServerEndpointConfig.Builder.class, null) {
+//
+//                             @Override
+//                             public ServerEndpointConfig.Builder addingService(
+//                                             ServiceReference<ServerEndpointConfig.Builder> 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 0c5ed5d215d7efef0f4eeb6d2df21db5061ecb14..2450e28d8c1125ae64d82ed9b1a377c87f7a78da 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,7 @@
                <module>org.argeo.cms.ui.workbench.rap</module>
                <!-- Third Parties Extensions -->
                <module>org.argeo.ext.jackrabbit</module>
+               <module>org.argeo.ext.equinox.jetty</module>
                <module>org.argeo.ext.rap.ui.workbench</module>
                <!-- Distribution -->
                <module>maven</module>