tomee-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From radcor...@apache.org
Subject [tomee] 01/16: TOMEE-2408 - Initial work to make MicroProfile deployment only when required.
Date Fri, 01 Feb 2019 16:26:26 GMT
This is an automated email from the ASF dual-hosted git repository.

radcortez pushed a commit to branch TOMEE-2408
in repository https://gitbox.apache.org/repos/asf/tomee.git

commit 8af6ae2bb4e1b1d362a21586c6bb648767eb2a5b
Author: Roberto Cortez <radcortez@yahoo.com>
AuthorDate: Fri Dec 21 16:58:06 2018 +0000

    TOMEE-2408 - Initial work to make MicroProfile deployment only when required.
---
 .../apache/openejb/server/rest/RESTService.java    |   7 +-
 tomee/tomee-microprofile/mp-common/pom.xml         | 177 ++++++++++++++++----
 .../cdi/TomEEMicroProfileExtension.java            | 179 +++++++++++++++++++++
 .../services/javax.enterprise.inject.spi.Extension |  17 ++
 .../tomee-microprofile-webapp/pom.xml              | 131 +--------------
 5 files changed, 345 insertions(+), 166 deletions(-)

diff --git a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
index 9da7fd1..43d65b4 100644
--- a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
+++ b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
@@ -256,12 +256,7 @@ public abstract class RESTService implements ServerService, SelfManaging
{
                     }
                 }
 
-                /*
-                boolean isMicroProfileOnlyEndpoints =
-                        webApp.restClass.stream().allMatch(name -> name.startsWith("org.apache.geronimo.microprofile"));
-                */
-
-                if (webApp.restApplications.isEmpty() /*&& !isMicroProfileOnlyEndpoints*/)
{
+                if (webApp.restApplications.isEmpty()) {
                     final Application application = new InternalApplication(null);
                     for (final String clazz : webApp.restClass) {
                         try {
diff --git a/tomee/tomee-microprofile/mp-common/pom.xml b/tomee/tomee-microprofile/mp-common/pom.xml
index 263af46..da9f024 100644
--- a/tomee/tomee-microprofile/mp-common/pom.xml
+++ b/tomee/tomee-microprofile/mp-common/pom.xml
@@ -19,34 +19,149 @@
 <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>tomee-microprofile</artifactId>
-        <groupId>org.apache.tomee</groupId>
-        <version>8.0.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>mp-common</artifactId>
-    <name>OpenEJB :: TomEE :: MicroProfile Common</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>javaee-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.microprofile.fault-tolerance</groupId>
-            <artifactId>microprofile-fault-tolerance-api</artifactId>
-            <version>${microprofile.fault-tolerance.version}</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.geronimo.safeguard</groupId>
-            <artifactId>safeguard-impl</artifactId>
-            <version>${microprofile.fault-tolerance.impl.version}</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
+  <parent>
+    <artifactId>tomee-microprofile</artifactId>
+    <groupId>org.apache.tomee</groupId>
+    <version>8.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>mp-common</artifactId>
+  <name>OpenEJB :: TomEE :: MicroProfile Common</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>javaee-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <!-- MicroProfile -->
+    <dependency>
+      <groupId>org.eclipse.microprofile.config</groupId>
+      <artifactId>microprofile-config-api</artifactId>
+      <version>${microprofile.config.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo.config</groupId>
+      <artifactId>geronimo-config-impl</artifactId>
+      <version>${microprofile.config.impl.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.jwt</groupId>
+      <artifactId>microprofile-jwt-auth-api</artifactId>
+      <version>${microprofile.jwt.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>mp-jwt</artifactId>
+      <version>${microprofile.jwt.impl.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.fault-tolerance</groupId>
+      <artifactId>microprofile-fault-tolerance-api</artifactId>
+      <version>${microprofile.fault-tolerance.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo.safeguard</groupId>
+      <artifactId>safeguard-impl</artifactId>
+      <version>${microprofile.fault-tolerance.impl.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.health</groupId>
+      <artifactId>microprofile-health-api</artifactId>
+      <version>${microprofile.health.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo</groupId>
+      <artifactId>geronimo-health</artifactId>
+      <version>${microprofile.health.impl.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.metrics</groupId>
+      <artifactId>microprofile-metrics-api</artifactId>
+      <version>${microprofile.metrics.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo</groupId>
+      <artifactId>geronimo-metrics</artifactId>
+      <version>${microprofile.metrics.impl.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.rest.client</groupId>
+      <artifactId>microprofile-rest-client-api</artifactId>
+      <version>${microprofile.rest-client.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-rs-mp-client</artifactId>
+      <version>${microprofile.rest-client.impl.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.json</groupId>
+          <artifactId>javax.json-api</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.openapi</groupId>
+      <artifactId>microprofile-openapi-api</artifactId>
+      <version>${microprofile.openapi.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo</groupId>
+      <artifactId>geronimo-openapi-impl</artifactId>
+      <version>${microprofile.openapi.impl.version}</version>
+    </dependency>
+
+    <!-- Jackson required by OpenAPI Impl -->
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-yaml</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.opentracing</groupId>
+      <artifactId>microprofile-opentracing-api</artifactId>
+      <version>${microprofile.opentracing.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-atinject_1.0_spec</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo</groupId>
+      <artifactId>geronimo-opentracing</artifactId>
+      <version>${microprofile.opentracing.impl.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.opentracing</groupId>
+      <artifactId>opentracing-api</artifactId>
+      <version>${opentracing.api}</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/tomee/tomee-microprofile/mp-common/src/main/java/org/apache/tomee/microprofile/cdi/TomEEMicroProfileExtension.java
b/tomee/tomee-microprofile/mp-common/src/main/java/org/apache/tomee/microprofile/cdi/TomEEMicroProfileExtension.java
new file mode 100644
index 0000000..c3e094c
--- /dev/null
+++ b/tomee/tomee-microprofile/mp-common/src/main/java/org/apache/tomee/microprofile/cdi/TomEEMicroProfileExtension.java
@@ -0,0 +1,179 @@
+/*
+ * 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.tomee.microprofile.cdi;
+
+import org.apache.geronimo.microprofile.impl.health.jaxrs.HealthChecksEndpoint;
+import org.apache.geronimo.microprofile.metrics.jaxrs.MetricsEndpoints;
+import org.apache.geronimo.microprofile.openapi.jaxrs.OpenAPIEndpoint;
+import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.WebAppInfo;
+import org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.event.BeforeEvent;
+import org.eclipse.microprofile.metrics.annotation.Counted;
+import org.eclipse.microprofile.metrics.annotation.Gauge;
+import org.eclipse.microprofile.metrics.annotation.Metered;
+import org.eclipse.microprofile.metrics.annotation.Metric;
+import org.eclipse.microprofile.metrics.annotation.Timed;
+
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.Annotated;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.CDI;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.Interceptor;
+import javax.enterprise.inject.spi.ProcessAnnotatedType;
+import javax.enterprise.inject.spi.ProcessInjectionPoint;
+import javax.enterprise.inject.spi.WithAnnotations;
+import javax.enterprise.util.AnnotationLiteral;
+
+import java.util.List;
+
+import static javax.enterprise.inject.spi.InterceptionType.AROUND_INVOKE;
+import static javax.interceptor.Interceptor.Priority.LIBRARY_BEFORE;
+
+public class TomEEMicroProfileExtension implements Extension {
+    private static final int BEFORE_MICROPROFILE_EXTENSIONS = LIBRARY_BEFORE - 10;
+
+    private boolean requiresConfig;
+    private boolean requiresJwt;
+    private boolean requiresFaultTolerance;
+    private boolean requiresMetrics;
+    private boolean requiresHealth;
+    private boolean requiresOpenApi;
+    private boolean requiresOpenTracing;
+    private boolean requiresRestClient;
+
+    void beforeBeanDiscovery(@Observes
+                             @Priority(BEFORE_MICROPROFILE_EXTENSIONS) final BeforeBeanDiscovery
beforeBeanDiscovery) {
+        this.requiresConfig = true;
+        this.requiresJwt = true;
+        this.requiresFaultTolerance = true;
+        // MP Metrics is not required unless specific annotations are found (or additional
REST enpoints are deployed)
+        this.requiresMetrics = false;
+        this.requiresHealth = true;
+        this.requiresOpenApi = true;
+        this.requiresOpenTracing = true;
+        this.requiresRestClient = true;
+    }
+
+    void processMPAnnotatedTypes(@Observes
+                                 @Priority(BEFORE_MICROPROFILE_EXTENSIONS)
+                                 @WithAnnotations({
+                                         Metric.class,
+                                         Counted.class,
+                                         Gauge.class,
+                                         Metered.class,
+                                         Timed.class
+                                 }) final ProcessAnnotatedType<?> processAnnotatedType)
{
+
+        final AnnotatedType<?> annotatedType = processAnnotatedType.getAnnotatedType();
+        if (annotatedType.getJavaClass().getName().startsWith("org.apache.geronimo.microprofile"))
{
+            return;
+        }
+
+        hasMetricsAnnotations(annotatedType);
+    }
+
+    void processMPInjectionPoints(@Observes
+                                  @Priority(BEFORE_MICROPROFILE_EXTENSIONS)
+                                  final ProcessInjectionPoint<?, ?> processInjectionPoint)
{
+        hasMetricsAnnotations(processInjectionPoint.getInjectionPoint().getAnnotated());
+    }
+
+    void processMPBeans(@Observes
+                        @Priority(BEFORE_MICROPROFILE_EXTENSIONS)
+                        final AfterBeanDiscovery afterBeanDiscovery,
+                        final BeanManager beanManager) {
+        final List<Interceptor<?>> interceptors =
+                beanManager.resolveInterceptors(AROUND_INVOKE, new AnnotationLiteral<Counted>()
{});
+        interceptors.isEmpty();
+    }
+
+    public boolean requiresConfig() {
+        return requiresConfig;
+    }
+
+    public boolean requiresJwt() {
+        return requiresJwt;
+    }
+
+    public boolean requiresFaultTolerance() {
+        return requiresFaultTolerance;
+    }
+
+    public boolean requiresMetrics() {
+        return requiresMetrics;
+    }
+
+    public boolean requiresHealth() {
+        return requiresHealth;
+    }
+
+    public boolean requiresOpenApi() {
+        return requiresOpenApi;
+    }
+
+    public boolean requiresOpenTrakcing() {
+        return requiresOpenTracing;
+    }
+
+    public boolean requiresRestClient() {
+        return requiresRestClient;
+    }
+
+    private void hasMetricsAnnotations(final Annotated annotated) {
+        if (requiresMetrics) {
+            return;
+        }
+
+        requiresMetrics = annotated.isAnnotationPresent(Metric.class) ||
+                          annotated.isAnnotationPresent(Counted.class) ||
+                          annotated.isAnnotationPresent(Gauge.class) ||
+                          annotated.isAnnotationPresent(Metered.class) ||
+                          annotated.isAnnotationPresent(Timed.class);
+    }
+
+    static {
+        SystemInstance.get().addObserver(new TomEEMicroProfileAfterApplicationCreated());
+    }
+
+    static class TomEEMicroProfileAfterApplicationCreated {
+        public void processApplication(
+                @org.apache.openejb.observer.Observes
+                final BeforeEvent<AssemblerAfterApplicationCreated> afterApplicationCreated)
{
+
+            final TomEEMicroProfileExtension microProfileExtension =
+                    CDI.current().getBeanManager().getExtension(TomEEMicroProfileExtension.class);
+            final AppInfo app = afterApplicationCreated.getEvent().getApp();
+            for (final WebAppInfo webApp : app.webApps) {
+                if (webApp.restApplications.isEmpty()) {
+                    if (!microProfileExtension.requiresMetrics) {
+                        webApp.restClass.removeIf(className -> className.equals(MetricsEndpoints.class.getName()));
+                    }
+
+                    webApp.restClass.removeIf(className -> className.equals(HealthChecksEndpoint.class.getName()));
+                    webApp.restClass.removeIf(className -> className.equals(OpenAPIEndpoint.class.getName()));
+                }
+            }
+        }
+    }
+}
diff --git a/tomee/tomee-microprofile/mp-common/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
b/tomee/tomee-microprofile/mp-common/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
new file mode 100644
index 0000000..8caea11
--- /dev/null
+++ b/tomee/tomee-microprofile/mp-common/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
@@ -0,0 +1,17 @@
+#
+# 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.
+#
+org.apache.tomee.microprofile.cdi.TomEEMicroProfileExtension
diff --git a/tomee/tomee-microprofile/tomee-microprofile-webapp/pom.xml b/tomee/tomee-microprofile/tomee-microprofile-webapp/pom.xml
index 7beb65d..a5495cc 100644
--- a/tomee/tomee-microprofile/tomee-microprofile-webapp/pom.xml
+++ b/tomee/tomee-microprofile/tomee-microprofile-webapp/pom.xml
@@ -37,14 +37,8 @@
   <properties>
     <tomee.build.name>${project.groupId}.tomee.microprofile.webapp</tomee.build.name>
   </properties>
-  <dependencies>
-
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>mp-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
 
+  <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>tomee-webapp</artifactId>
@@ -53,131 +47,10 @@
     </dependency>
 
     <dependency>
-      <groupId>org.eclipse.microprofile.config</groupId>
-      <artifactId>microprofile-config-api</artifactId>
-      <version>${microprofile.config.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.geronimo.config</groupId>
-      <artifactId>geronimo-config-impl</artifactId>
-      <version>${microprofile.config.impl.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.jwt</groupId>
-      <artifactId>microprofile-jwt-auth-api</artifactId>
-      <version>${microprofile.jwt.version}</version>
-    </dependency>
-
-    <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>mp-jwt</artifactId>
+      <artifactId>mp-common</artifactId>
       <version>${project.version}</version>
     </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.fault-tolerance</groupId>
-      <artifactId>microprofile-fault-tolerance-api</artifactId>
-      <version>${microprofile.fault-tolerance.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.geronimo.safeguard</groupId>
-      <artifactId>safeguard-impl</artifactId>
-      <version>${microprofile.fault-tolerance.impl.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.health</groupId>
-      <artifactId>microprofile-health-api</artifactId>
-      <version>${microprofile.health.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.geronimo</groupId>
-      <artifactId>geronimo-health</artifactId>
-      <version>${microprofile.health.impl.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.metrics</groupId>
-      <artifactId>microprofile-metrics-api</artifactId>
-      <version>${microprofile.metrics.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.geronimo</groupId>
-      <artifactId>geronimo-metrics</artifactId>
-      <version>${microprofile.metrics.impl.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.rest.client</groupId>
-      <artifactId>microprofile-rest-client-api</artifactId>
-      <version>${microprofile.rest-client.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-rs-mp-client</artifactId>
-      <version>${microprofile.rest-client.impl.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.json</groupId>
-          <artifactId>javax.json-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.openapi</groupId>
-      <artifactId>microprofile-openapi-api</artifactId>
-      <version>${microprofile.openapi.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.geronimo</groupId>
-      <artifactId>geronimo-openapi-impl</artifactId>
-      <version>${microprofile.openapi.impl.version}</version>
-    </dependency>
-
-    <!-- Jackson required by OpenAPI Impl -->
-    <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
-      <artifactId>jackson-dataformat-yaml</artifactId>
-      <version>${jackson.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>${jackson.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.microprofile.opentracing</groupId>
-      <artifactId>microprofile-opentracing-api</artifactId>
-      <version>${microprofile.opentracing.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.geronimo.specs</groupId>
-          <artifactId>geronimo-atinject_1.0_spec</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.geronimo</groupId>
-      <artifactId>geronimo-opentracing</artifactId>
-      <version>${microprofile.opentracing.impl.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>io.opentracing</groupId>
-      <artifactId>opentracing-api</artifactId>
-      <version>${opentracing.api}</version>
-    </dependency>
   </dependencies>
 
   <build>


Mime
View raw message