This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwebbeans-meecrowave.git
The following commit(s) were added to refs/heads/master by this push: new 0b0c83c [MEECROWAVE-284] add meecrowave-websocket module 0b0c83c is described below commit 0b0c83ce357c8f4f7874985504ddaf60ca7b9d20 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Thu Apr 22 17:10:48 2021 +0200 [MEECROWAVE-284] add meecrowave-websocket module --- meecrowave-doc/pom.xml | 4 +- .../main/java/org/apache/meecrowave/doc/JBake.java | 4 + .../src/main/jbake/assets/assets/css/styles.css | 64 ++++++++ .../src/main/jbake/assets/assets/js/main.js | 26 ++++ .../jbake/content/meecrowave-websocket/index.adoc | 27 ++++ meecrowave-websocket/pom.xml | 168 +++++++++++++++++++++ .../websocket/CDIServerConfigurator.java | 70 +++++++++ ...socket.server.ServerEndpointConfig$Configurator | 1 + pom.xml | 1 + 9 files changed, 364 insertions(+), 1 deletion(-) diff --git a/meecrowave-doc/pom.xml b/meecrowave-doc/pom.xml index 89ec459..0d3c100 100644 --- a/meecrowave-doc/pom.xml +++ b/meecrowave-doc/pom.xml @@ -164,7 +164,7 @@ <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> - <version>1.6.0</version> + <version>3.0.0</version> <executions> <execution> <id>meecrowave-site</id> @@ -175,6 +175,8 @@ </execution> </executions> <configuration> + <cleanupDaemonThreads>false</cleanupDaemonThreads> + <stopUnresponsiveDaemonThreads>false</stopUnresponsiveDaemonThreads> <includeProjectDependencies>true</includeProjectDependencies> <mainClass>org.apache.meecrowave.doc.JBake</mainClass> <arguments> diff --git a/meecrowave-doc/src/main/java/org/apache/meecrowave/doc/JBake.java b/meecrowave-doc/src/main/java/org/apache/meecrowave/doc/JBake.java index 9746ef4..abf3a2d 100755 --- a/meecrowave-doc/src/main/java/org/apache/meecrowave/doc/JBake.java +++ b/meecrowave-doc/src/main/java/org/apache/meecrowave/doc/JBake.java @@ -54,6 +54,7 @@ import org.apache.meecrowave.doc.generator.LetsEncryptConfiguration; import org.apache.meecrowave.doc.generator.MavenConfiguration; import org.apache.meecrowave.doc.generator.OAuth2Configuration; import org.apache.meecrowave.doc.generator.ProxyConfiguration; +import org.apache.meecrowave.proxy.servlet.meecrowave.ProxyServletSetup; import org.jbake.app.Oven; import org.jbake.app.configuration.ConfigUtil; import org.jbake.app.configuration.DefaultJBakeConfiguration; @@ -123,6 +124,7 @@ public class JBake { add("source-highlighter=highlightjs"); add("highlightjs-theme=idea"); add("context_rootpath=/meecrowave"); + add("icons=font"); }}); }})); config.addConfiguration(DefaultJBakeConfiguration.class.cast( @@ -243,8 +245,10 @@ public class JBake { try (final Meecrowave container = new Meecrowave(new Meecrowave.Builder() {{ setWebResourceCached(false); + property("proxy-skip", "true"); }}) {{ start(); + getTomcat().getServer().setParentClassLoader(Thread.currentThread().getContextClassLoader()); deployWebapp("/meecrowave", destination); }}) { System.out.println("Started on http://localhost:" + container.getConfiguration().getHttpPort() + "/meecrowave"); diff --git a/meecrowave-doc/src/main/jbake/assets/assets/css/styles.css b/meecrowave-doc/src/main/jbake/assets/assets/css/styles.css index edb6c74..d758f1b 100644 --- a/meecrowave-doc/src/main/jbake/assets/assets/css/styles.css +++ b/meecrowave-doc/src/main/jbake/assets/assets/css/styles.css @@ -1261,3 +1261,67 @@ select { pre { padding: 0; } + + +} +.admonitionblock td.content > :first-child { + margin: 0; +} +.admonitionblock { + margin-bottom: 1rem; +} +.admonitionblock > table { + padding-top: 1rem; + padding-bottom: 1rem; + width: 100%; + height: 100%; + position: relative; + display: block; + /*border: 1px solid #c6c6c6; + border-radius: 5px;*/ +} +.admonitionblock td.content > code { + background-color: unset !important; + color: unset !important; +} +.admonitionblock td.content { + display: block; + width: 100%; + padding: 0.5rem; +} +.admonitionblock .icon { + padding-right: 0.6rem; + padding-top: 0.5rem; +} +.admonitionblock .icon i { + display: inline-flex; + align-items: center; + height: 100%; +} +.admonitionblock .icon i::after { + content: attr(title); + hyphens: none; +} +.icon-important:before, .icon-note:before, .icon-tip:before, .icon-warning:before { + font-size: 1em; +} +.icon-important:before { + content: "\f06a"; + font-family: "Font Awesome 5 Free"; + color: #e96065; +} +.icon-note:before { + content: "\f05a"; + font-family: "Font Awesome 5 Free"; + color: #0675c1; +} +.icon-tip:before { + content: "\f059"; + font-family: "Font Awesome 5 Free"; + color: #6ec01e; +} +.icon-warning:before { + content: "\f071"; + font-family: "Font Awesome 5 Free"; + color: #ffc300; +} diff --git a/meecrowave-doc/src/main/jbake/assets/assets/js/main.js b/meecrowave-doc/src/main/jbake/assets/assets/js/main.js index da07fe8..6dc2e61 100644 --- a/meecrowave-doc/src/main/jbake/assets/assets/js/main.js +++ b/meecrowave-doc/src/main/jbake/assets/assets/js/main.js @@ -46,4 +46,30 @@ $(document).ready(function() { }); hljs.initHighlightingOnLoad(); + + // set admonitionblock custom theme + // drop titles from <i> to not pollute the ui with pointless text + function setAdmonitionStyle(item, color) { + var i = $(item); + i.css('border-left', '1.5px solid ' + color); + i.css('padding-left', '2rem'); + i.css('background-color', color + '10'); + i.css('color', color); + } + $('div.admonitionblock td.icon > i.fa').each(function (idx, item) { + item.title = ''; + + var jItem = $(item); + jItem.addClass('fa-lg'); + var content = jItem.parent().parent().find('td.content'); + if (jItem.hasClass('icon-important')) { + setAdmonitionStyle(content, '#e96065'); + } else if (jItem.hasClass('icon-note')) { + setAdmonitionStyle(content, '#0675c1'); + } else if (jItem.hasClass('icon-warning')) { + setAdmonitionStyle(content, '#ffc300'); + } else { + setAdmonitionStyle(content, '#6ec01e'); + } + }); }); \ No newline at end of file diff --git a/meecrowave-doc/src/main/jbake/content/meecrowave-websocket/index.adoc b/meecrowave-doc/src/main/jbake/content/meecrowave-websocket/index.adoc new file mode 100755 index 0000000..32b8253 --- /dev/null +++ b/meecrowave-doc/src/main/jbake/content/meecrowave-websocket/index.adoc @@ -0,0 +1,27 @@ += Meecrowave WebSocket +:jbake-date: 2021-04-22 +:jbake-type: page +:jbake-status: published +:jbake-meecrowavepdf: +:jbake-meecrowavetitleicon: icon icon_chat +:jbake-meecrowavecolor: body-red +:icons: font + +WARNING: this module is available with Apache Meecrowave >= 1.2.11. + +Coordinates: + +[source,xml] +---- +<dependency> + <groupId>org.apache.meecrowave</groupId> + <artifactId>meecrowave-websocket</artifactId> + <version>${meecrowave.version}</version> +</dependency> +---- + +IMPORTANT: this module requires `org.apache.tomcat:tomcat-websocket-api` but replaces `org.apache.tomcat:tomcat-websocket` until Tomcat enables a better way to extend its default. + +Once this module added, you can implement a server websocket endpoint as a CDI bean, it will use `CDI.current().select(endpointType).get()` to resolve it. + +NOTE: you can still pass a custom `Configurator` to your endpoint to customize the lookup or runtime of the endpoint. diff --git a/meecrowave-websocket/pom.xml b/meecrowave-websocket/pom.xml new file mode 100644 index 0000000..71828d3 --- /dev/null +++ b/meecrowave-websocket/pom.xml @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, 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. +--> +<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/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>meecrowave</artifactId> + <groupId>org.apache.meecrowave</groupId> + <version>1.2.11-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>meecrowave-websocket</artifactId> + <name>Meecrowave :: WebSocket</name> + + <properties> + <meecrowave.build.name>${project.groupId}.websocket</meecrowave.build.name> + </properties> + + <dependencies> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>meecrowave-specs-api</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-websocket</artifactId> + <version>${tomcat.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <executions> + <execution> + <id>embed-tomcat-websocket</id> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <createDependencyReducedPom>true</createDependencyReducedPom> + <dependencyReducedPomLocation>${project.build.directory}/reduced.pom</dependencyReducedPomLocation> + <artifactSet> + <includes> + <include>${project.groupId}:${project.artifactId}</include> + <include>org.apache.tomcat:tomcat-websocket</include> + </includes> + </artifactSet> + <filters> + <filter> + <artifact>org.apache.tomcat:tomcat-websocket</artifact> + <excludes> + META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator + </excludes> + </filter> + <filter> + <artifact>*:*</artifact> + <excludes> + <exclude>META-INF/*.SF</exclude> + <exclude>META-INF/*.DSA</exclude> + <exclude>META-INF/*.RSA</exclude> + </excludes> + </filter> + </filters> + </configuration> + </execution> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <transformers> + <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> + </transformers> + <shadedArtifactAttached>true</shadedArtifactAttached> + <shadedClassifierName>jakarta</shadedClassifierName> + <createDependencyReducedPom>false</createDependencyReducedPom> + <artifactSet> + <includes> + <include>${project.groupId}:${project.artifactId}</include> + <include>org.apache.tomcat:tomcat-websocket</include> + </includes> + </artifactSet> + <filters> + <filter> + <artifact>org.apache.tomcat:tomcat-websocket</artifact> + <excludes> + META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator + </excludes> + </filter> + <filter> + <artifact>*:*</artifact> + <excludes> + <exclude>META-INF/*.SF</exclude> + <exclude>META-INF/*.DSA</exclude> + <exclude>META-INF/*.RSA</exclude> + </excludes> + </filter> + </filters> + <relocations> + <relocation> + <pattern>javax.activation</pattern> + <shadedPattern>jakarta.activation</shadedPattern> + </relocation> + <relocation> + <pattern>javax.annotation</pattern> + <shadedPattern>jakarta.annotation</shadedPattern> + </relocation> + <relocation> + <pattern>javax.el</pattern> + <shadedPattern>jakarta.el</shadedPattern> + </relocation> + <relocation> + <pattern>javax.enterprise</pattern> + <shadedPattern>jakarta.enterprise</shadedPattern> + </relocation> + <relocation> + <pattern>javax.decorator</pattern> + <shadedPattern>jakarta.decorator</shadedPattern> + </relocation> + <relocation> + <pattern>javax.inject</pattern> + <shadedPattern>jakarta.inject</shadedPattern> + </relocation> + <relocation> + <pattern>javax.interceptor</pattern> + <shadedPattern>jakarta.interceptor</shadedPattern> + </relocation> + <relocation> + <pattern>javax.servlet</pattern> + <shadedPattern>jakarta.servlet</shadedPattern> + </relocation> + <relocation> + <pattern>javax.websocket</pattern> + <shadedPattern>jakarta.websocket</shadedPattern> + </relocation> + </relocations> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/meecrowave-websocket/src/main/java/org/apache/meecrowave/websocket/CDIServerConfigurator.java b/meecrowave-websocket/src/main/java/org/apache/meecrowave/websocket/CDIServerConfigurator.java new file mode 100644 index 0000000..cd25611 --- /dev/null +++ b/meecrowave-websocket/src/main/java/org/apache/meecrowave/websocket/CDIServerConfigurator.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, 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. + */ +package org.apache.meecrowave.websocket; + +import javax.enterprise.inject.spi.CDI; +import javax.websocket.Extension; +import javax.websocket.HandshakeResponse; +import javax.websocket.server.HandshakeRequest; +import javax.websocket.server.ServerEndpointConfig; +import java.util.List; +import java.util.Set; + +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; + +public class CDIServerConfigurator extends ServerEndpointConfig.Configurator { + @Override + public <T> T getEndpointInstance(final Class<T> clazz) throws InstantiationException { + try { + return CDI.current().select(clazz).get(); + } catch (final RuntimeException re) { + return super.getEndpointInstance(clazz); + } + } + + @Override + public String getNegotiatedSubprotocol(final List<String> supported, final List<String> requested) { + return requested.stream().filter(supported::contains).findFirst().orElse(""); + } + + + @Override + public List<Extension> getNegotiatedExtensions(final List<Extension> installed, + final List<Extension> requested) { + if (requested.isEmpty()) { + return emptyList(); + } + final Set<String> names = installed.stream().map(Extension::getName).collect(toSet()); + return requested.stream().filter(e -> names.contains(e.getName())).collect(toList()); + } + + @Override + public boolean checkOrigin(final String originHeaderValue) { + return true; + } + + @Override + public void modifyHandshake(final ServerEndpointConfig sec, + final HandshakeRequest request, + final HandshakeResponse response) { + // no-op + } +} diff --git a/meecrowave-websocket/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator b/meecrowave-websocket/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator new file mode 100644 index 0000000..269ba96 --- /dev/null +++ b/meecrowave-websocket/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator @@ -0,0 +1 @@ +org.apache.meecrowave.websocket.CDIServerConfigurator \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2845f69..7fd2457 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,7 @@ <module>meecrowave-oauth2</module> <module>meecrowave-letsencrypt</module> <module>meecrowave-proxy</module> + <module>meecrowave-websocket</module> </modules> <dependencyManagement>