You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/01/10 14:32:40 UTC

[isis] branch master updated: ISIS-2158: fixes to allow deployment of Isis on Payara5

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new ca65ac2  ISIS-2158: fixes to allow deployment of Isis on Payara5
ca65ac2 is described below

commit ca65ac2435fe223a5d58e24229e2d0d5225697fe
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jan 10 15:32:32 2020 +0100

    ISIS-2158: fixes to allow deployment of Isis on Payara5
    
    applied workaround: CDI feels responsible to resolve injection points
    for any Servlet or Filter registered on the ServletContext
    programmatically; we can resolve this by replacing annotations @Inject
    with @Autowire for any Servlet or Filter that gets contributed by a
    WebModule
---
 .../isis/config/viewer/wicket/WebAppContextPath.java      |  2 ++
 .../isis/security/shiro/webmodule/WebModuleShiro.java     | 12 +++++++++++-
 .../jaxrsresteasy4/webmodule/WebModuleJaxrsResteasy4.java |  7 +++++++
 .../viewer/webmodule/IsisRestfulObjectsSessionFilter.java |  9 ++++-----
 .../webmodule/IsisTransactionFilterForRestfulObjects.java |  6 +++---
 .../modules/templresources/TemplateResourceServlet.java   |  9 ++++-----
 .../webapp/webappctx/IsisWebAppContextInitializer.java    | 15 ++++++++++++++-
 .../runtime/jee_support/IsisCDIBeanScanInterceptor.java   |  2 ++
 .../extensions/sse/webmodule/ServerSentEventsServlet.java |  6 +++---
 9 files changed, 50 insertions(+), 18 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppContextPath.java b/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppContextPath.java
index 0775644..263d313 100644
--- a/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppContextPath.java
+++ b/core/config/src/main/java/org/apache/isis/config/viewer/wicket/WebAppContextPath.java
@@ -47,6 +47,8 @@ import lombok.Getter;
 @Qualifier("Default")
 public class WebAppContextPath implements Serializable {
 
+    private static final long serialVersionUID = 1L;
+    
     /**
      * In the form "xxx/yyy" (no leading nor trailing '/').
      */
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
index ef994b5..d2cdb7c 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
@@ -45,6 +46,7 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.webapp.modules.WebModuleAbstract;
 import org.apache.isis.webapp.modules.WebModuleContext;
 
@@ -117,7 +119,7 @@ public class WebModuleShiro extends WebModuleAbstract {
      * Adds support for dependency injection into security realms
      * @since 2.0
      */
-    @NoArgsConstructor // don't remove, this is class is managed by Isis
+    @NoArgsConstructor // don't remove, this class is managed by Isis
     public static class EnvironmentLoaderListenerForIsis extends EnvironmentLoaderListener {
 
         @Inject private ServiceInjector serviceInjector;
@@ -126,6 +128,14 @@ public class WebModuleShiro extends WebModuleAbstract {
         public EnvironmentLoaderListenerForIsis(ServiceInjector serviceInjector) {
             this.serviceInjector = serviceInjector;
         }
+        
+        @Override
+        public void contextInitialized(ServletContextEvent sce) {
+            System.err.println("intercepted: " + this);
+            _Exceptions.dumpStackTrace();
+            System.err.println("======================================================");
+            super.contextInitialized(sce);
+        }
 
         @Override 
         protected WebEnvironment createEnvironment(ServletContext servletContext) {
diff --git a/core/viewers/restfulobjects/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/jaxrsresteasy4/webmodule/WebModuleJaxrsResteasy4.java b/core/viewers/restfulobjects/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/jaxrsresteasy4/webmodule/WebModuleJaxrsResteasy4.java
index ffa3f3c..0b15dcd 100644
--- a/core/viewers/restfulobjects/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/jaxrsresteasy4/webmodule/WebModuleJaxrsResteasy4.java
+++ b/core/viewers/restfulobjects/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/jaxrsresteasy4/webmodule/WebModuleJaxrsResteasy4.java
@@ -24,6 +24,8 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl;
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -74,6 +76,9 @@ public final class WebModuleJaxrsResteasy4 extends WebModuleAbstract {
 
     @Override
     public void prepare(WebModuleContext ctx) {
+        
+        ResteasyProviderFactory.setInstance(new ResteasyProviderFactoryImpl());
+        
         super.prepare(ctx);
 
         if(!isApplicable(ctx)) {
@@ -87,6 +92,8 @@ public final class WebModuleJaxrsResteasy4 extends WebModuleAbstract {
     @Override
     public Can<ServletContextListener> init(ServletContext ctx) throws ServletException {
 
+        ResteasyProviderFactory.setInstance(new ResteasyProviderFactoryImpl());
+        
         registerFilter(ctx, ISIS_SESSION_FILTER_FOR_RESTFUL_OBJECTS, IsisRestfulObjectsSessionFilter.class)
                 .ifPresent(filterReg -> {
                     // this is mapped to the entire application;
diff --git a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsSessionFilter.java b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsSessionFilter.java
index a9e79d2..9bdae7e 100644
--- a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsSessionFilter.java
+++ b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsSessionFilter.java
@@ -29,7 +29,6 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -39,6 +38,8 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.springframework.beans.factory.annotation.Autowired;
+
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.factory.InstanceUtil;
@@ -153,10 +154,8 @@ public class IsisRestfulObjectsSessionFilter implements Filter {
         return Pattern.compile(".*\\." + input);
     };
 
-    @Inject
-    private IsisSessionFactory isisSessionFactory;
-    @Inject
-    private SpecificationLoader specificationLoader;
+    @Autowired private IsisSessionFactory isisSessionFactory;
+    @Autowired private SpecificationLoader specificationLoader;
     
     private List<String> passThruList = Collections.emptyList();
 
diff --git a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisTransactionFilterForRestfulObjects.java b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisTransactionFilterForRestfulObjects.java
index 96af113..3aee005 100644
--- a/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisTransactionFilterForRestfulObjects.java
+++ b/core/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisTransactionFilterForRestfulObjects.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.restfulobjects.viewer.webmodule;
 
 import java.io.IOException;
 
-import javax.inject.Inject;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
@@ -28,6 +27,8 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.transaction.TransactionalException;
 
+import org.springframework.beans.factory.annotation.Autowired;
+
 import org.apache.isis.applib.services.xactn.TransactionService;
 
 //@WebFilter(servletNames= {"RestfulObjectsRestEasyDispatcher"}) //[ahuber] to support 
@@ -35,8 +36,7 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 //with skinny war deployment requires additional configuration, so for now we disable this annotation
 public class IsisTransactionFilterForRestfulObjects implements Filter {
 
-    @Inject
-    private TransactionService transactionService;
+    @Autowired private TransactionService transactionService;
 
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/TemplateResourceServlet.java b/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/TemplateResourceServlet.java
index 8cb2411..0a35c02 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/TemplateResourceServlet.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/modules/templresources/TemplateResourceServlet.java
@@ -23,13 +23,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
-import javax.inject.Inject;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.springframework.beans.factory.annotation.Autowired;
+
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.RestEasyConfiguration;
@@ -53,10 +54,8 @@ public class TemplateResourceServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
     private TemplateResourceServlet_HtmlTemplateVariables templateVariables;
 
-    @Inject
-    private RestEasyConfiguration restEasyConfiguration;
-    @Inject
-    private WebAppContextPath webAppContextPath;
+    @Autowired private RestEasyConfiguration restEasyConfiguration;
+    @Autowired private WebAppContextPath webAppContextPath;
 
     @Override
     public void init(ServletConfig config) throws ServletException {
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/webappctx/IsisWebAppContextInitializer.java b/core/webapp/src/main/java/org/apache/isis/webapp/webappctx/IsisWebAppContextInitializer.java
index c4c504a..2a9507b 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/webappctx/IsisWebAppContextInitializer.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/webappctx/IsisWebAppContextInitializer.java
@@ -19,6 +19,7 @@
 package org.apache.isis.webapp.webappctx;
 
 import java.util.EventListener;
+import java.util.concurrent.atomic.LongAdder;
 
 import javax.inject.Inject;
 import javax.servlet.ServletContext;
@@ -27,6 +28,7 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.springframework.boot.web.servlet.ServletContextInitializer;
+import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.context._Context;
@@ -53,9 +55,12 @@ import lombok.extern.log4j.Log4j2;
  * @since 2.0
  *
  */
+@Component
 @Log4j2
 public class IsisWebAppContextInitializer implements ServletContextInitializer {
     
+    private final static LongAdder instanceCount = new LongAdder();
+    
     @Inject private ServiceRegistry serviceRegistry; // this dependency ensures Isis has been initialized/provisioned
     @Inject private IsisConfiguration isisConfiguration;
     @Inject private WebAppContextPath webAppContextPath;
@@ -65,6 +70,13 @@ public class IsisWebAppContextInitializer implements ServletContextInitializer {
     @Override
     public void onStartup(ServletContext servletContext) throws ServletException {
 
+        { // onStartup(...) must be a one shot, otherwise just ignore 
+            if(instanceCount.intValue() > 0) {
+                return;
+            }
+            instanceCount.increment();
+        }
+        
         if(!isIsisProvisioned()) {
             log.error("skipping initialization, Spring should already have provisioned all configured Beans");
             return;
@@ -73,7 +85,7 @@ public class IsisWebAppContextInitializer implements ServletContextInitializer {
         // set the ServletContext initializing thread as preliminary default until overridden by
         // IsisWicketApplication#init() or others, that better know what ClassLoader to use as application default.
         _Context.setDefaultClassLoader(Thread.currentThread().getContextClassLoader(), false);
-
+        
         val contextPath = servletContext.getContextPath();
 
         log.info("=== PHASE 1 === Setting up ServletContext parameters, contextPath = " + contextPath);
@@ -97,6 +109,7 @@ public class IsisWebAppContextInitializer implements ServletContextInitializer {
             log.info("about to destroy the context");
             webModuleContext.shutdown(event);
         }
+        instanceCount.reset();
         log.info("context destroyed");
     }
 
diff --git a/incubator/extensions/core/microprofile/src/main/java/org/apache/isis/runtime/jee_support/IsisCDIBeanScanInterceptor.java b/incubator/extensions/core/microprofile/src/main/java/org/apache/isis/runtime/jee_support/IsisCDIBeanScanInterceptor.java
index d925b00..b8954b1 100644
--- a/incubator/extensions/core/microprofile/src/main/java/org/apache/isis/runtime/jee_support/IsisCDIBeanScanInterceptor.java
+++ b/incubator/extensions/core/microprofile/src/main/java/org/apache/isis/runtime/jee_support/IsisCDIBeanScanInterceptor.java
@@ -27,6 +27,7 @@ import javax.enterprise.inject.spi.BeforeBeanDiscovery;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.ProcessAnnotatedType;
 import javax.servlet.ServletContextListener;
+import javax.servlet.http.HttpServlet;
 
 import org.springframework.stereotype.Component;
 
@@ -64,6 +65,7 @@ public final class IsisCDIBeanScanInterceptor implements Extension {
     private static final List<Predicate<Class<?>>> vetoTests = _Lists.of(
         ExceptionRecognizer.class::isAssignableFrom,
         ServletContextListener.class::isAssignableFrom, // seems this has no effect anyway
+        HttpServlet.class::isAssignableFrom, // seems this has no effect either
         type->type.getName().startsWith("org.springframework."),
         type->type.getName().startsWith("org.apache.isis."), 
         type->_Annotations.isPresent(type, Component.class));
diff --git a/valuetypes/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/ServerSentEventsServlet.java b/valuetypes/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/ServerSentEventsServlet.java
index 585c20c..b2da45e 100644
--- a/valuetypes/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/ServerSentEventsServlet.java
+++ b/valuetypes/sse/src/main/java/org/apache/isis/extensions/sse/webmodule/ServerSentEventsServlet.java
@@ -23,13 +23,14 @@ import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ForkJoinPool;
 
-import javax.inject.Inject;
 import javax.servlet.AsyncContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.springframework.beans.factory.annotation.Autowired;
+
 import org.apache.isis.applib.util.JaxbAdapters;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.context._Context;
@@ -54,8 +55,7 @@ public class ServerSentEventsServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
     private ExecutorService threadPool;
 
-    @Inject
-    private SseService sseService;
+    @Autowired private SseService sseService;
 
     @Override
     public void init() throws ServletException {