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 2018/11/30 09:22:14 UTC

[isis] branch v2 updated: ISIS-2039: allows for AppConfig to be managed by CDI if available

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

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


The following commit(s) were added to refs/heads/v2 by this push:
     new c57e3fa  ISIS-2039: allows for AppConfig to be managed by CDI if available
c57e3fa is described below

commit c57e3faeff95f135ad07d97c20c2b9a5a46ee203
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 30 10:22:08 2018 +0100

    ISIS-2039: allows for AppConfig to be managed by CDI if available
    
    also updates helloworld, to showcase this
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2039
---
 .../isis/applib/ModuleOrBuilderAbstract.java       |  5 ++-
 .../org/apache/isis/config/AppConfigLocator.java   | 49 +++++++++++++++++++---
 .../apache/isis/applib/DomainObjectContainer.java  |  8 ++--
 .../isis/core/runtime/headless/IsisSystem.java     |  5 +--
 .../runtime/headless/IsisSystemBootstrapper.java   |  1 +
 .../application/HelloWorldAppManifest.java         |  5 ++-
 6 files changed, 56 insertions(+), 17 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/ModuleOrBuilderAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/ModuleOrBuilderAbstract.java
index 6aff7cc..28d6de2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/ModuleOrBuilderAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/ModuleOrBuilderAbstract.java
@@ -20,6 +20,7 @@ package org.apache.isis.applib;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -86,7 +87,7 @@ abstract class ModuleOrBuilderAbstract<B extends ModuleOrBuilderAbstract<B>> {
         return withAdditionalModules(Arrays.asList(modules));
     }
 
-    public B withAdditionalModules(final List<Class<?>> modules) {
+    public B withAdditionalModules(final Collection<Class<?>> modules) {
         if(modules == null) {
             return self();
         }
@@ -98,7 +99,7 @@ abstract class ModuleOrBuilderAbstract<B extends ModuleOrBuilderAbstract<B>> {
         return withAdditionalServices(Arrays.asList(additionalServices));
     }
 
-    public B withAdditionalServices(final List<Class<?>> additionalServices) {
+    public B withAdditionalServices(final Collection<Class<?>> additionalServices) {
         if(additionalServices == null) {
             return self();
         }
diff --git a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
index 3127094..74e962d 100644
--- a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
+++ b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
@@ -1,5 +1,7 @@
 package org.apache.isis.config;
 
+import javax.enterprise.inject.spi.CDI;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,15 +25,50 @@ public final class AppConfigLocator {
     // -- HELPER
     
     private static AppConfig lookupAppConfig() {
+        
+        AppConfig appConfig;
+        
+        appConfig = lookupAppConfig_UsingCDI();
+        if(appConfig!=null) {
+            LOG.info(String.format("Located AppConfig '%s' via CDI.", appConfig.getClass().getName()));
+            return appConfig;
+        }
+        
+        appConfig = lookupAppConfig_UsingServiceLoader();
+        if(appConfig!=null) {
+            LOG.info(String.format("Located AppConfig '%s' via ServiceLoader.", appConfig.getClass().getName()));
+            return appConfig;
+        }
+        
+        appConfig = lookupAppConfig_UsingConfigProperties();
+        if(appConfig!=null) {
+            LOG.info(String.format("Located AppConfig '%s' using config properties.", appConfig.getClass().getName()));
+            return appConfig;    
+        }
+        
+        throw new IsisException("Failed to locate the AppManifest");
+    }
+    
+    private static AppConfig lookupAppConfig_UsingCDI() {
+        try {
+            final CDI<Object> cdi = CDI.current();
+            if(cdi==null) {
+                return null;
+            }
+            return cdi.select(AppConfig.class).get();
+        } catch (Exception e) {
+            // ignore
+        }
+        return null;        
+    }
+    
+    private static AppConfig lookupAppConfig_UsingServiceLoader() {
+        
         return _Plugin.getOrElse(AppConfig.class,
                 ambiguousPlugins->{
                     throw _Plugin.ambiguityNonRecoverable(AppConfig.class, ambiguousPlugins);
                 },
-                ()->{
-                    LOG.warn("Failed to locate AppConfig via ServiceLoader, falling back to "
-                            + "search utilizing config properties.");
-                    return lookupAppConfig_UsingConfigProperties();
-                });
+                ()->null);
     }
     
     // to support pre 2.0.0-M2 behavior    
@@ -60,5 +97,7 @@ public final class AppConfigLocator {
         
     }
     
+    
+    
 
 }
diff --git a/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java b/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
index 7974b76..1c24fb7 100644
--- a/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
+++ b/core/legacy/transition-1-2/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
@@ -44,7 +44,7 @@ import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import static org.apache.isis.commons.internal.collections._Lists.lastElementIfAny;
 
@@ -420,7 +420,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public String getProperty(String name) {
-    	return _Config.getConfiguration().getString(name);
+    	return IsisContext.getConfiguration().getString(name);
     }
 
     /**
@@ -429,7 +429,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public String getProperty(String name, String defaultValue) {
-    	return _Config.getConfiguration().getString(name, defaultValue);
+    	return IsisContext.getConfiguration().getString(name, defaultValue);
     }
 
     /**
@@ -438,7 +438,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public List<String> getPropertyNames() {
-        return new ArrayList<>(_Config.getConfiguration().asMap().keySet());
+        return new ArrayList<>(IsisContext.getConfiguration().asMap().keySet());
     }
 
     /**
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
index 320a0f1..243609d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
@@ -93,9 +93,6 @@ public final class IsisSystem {
 
     // -- setup (also componentProvider)
 
-    // populated at #setupSystem
-    protected IsisComponentProvider componentProvider;
-
     IsisSystem setUpSystem() throws RuntimeException {
         try {
             initIfRequiredThenOpenSession();
@@ -119,7 +116,7 @@ public final class IsisSystem {
         boolean firstTime = isisSessionFactory == null;
         if(firstTime) {
 
-            componentProvider = IsisComponentProvider.builder(appManifest)
+            final IsisComponentProvider componentProvider = IsisComponentProvider.builder(appManifest)
                     .build();
             
             //[2039] environment priming removed 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
index 61ac537..fc93242 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.fixturescripts.FixtureScripts;
 import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.runtime.headless.logging.LeveledLogger;
diff --git a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
index 58aca18..489ad92 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
+++ b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
@@ -27,6 +27,7 @@ import domainapp.dom.HelloWorldModule;
 /**
  * Bootstrap the application.
  */
+@javax.ejb.Singleton // only if you want AppConfig to be managed by CDI (if available), otherwise not required
 public class HelloWorldAppManifest extends AppManifestAbstract2 implements AppConfig {
 
     public static final Builder BUILDER = Builder
@@ -38,10 +39,10 @@ public class HelloWorldAppManifest extends AppManifestAbstract2 implements AppCo
         super(BUILDER);
     }
 
-    // Tells the ServiceLoader which AppManifest to use to bootstrap the IsisConfiguration.
+    // Implementing AppConfig, to tell the framework how to bootstrap the configuration.
     @Override
     public IsisConfiguration isisConfiguration () {
-        return IsisConfiguration.buildFromAppManifest(new HelloWorldAppManifest());
+        return IsisConfiguration.buildFromAppManifest(this);
     }
 
 }