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/05/31 15:58:20 UTC

[isis] branch master updated: ISIS-1958: extending org.apache.isis.applib.Module

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 f47d31a  ISIS-1958: extending org.apache.isis.applib.Module
f47d31a is described below

commit f47d31af2486dab6866c942e9430e00038876988
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 31 17:58:12 2018 +0200

    ISIS-1958: extending org.apache.isis.applib.Module
    
    additional to override logic, allow for fallback logic
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1958
---
 .../apache/isis/applib/AppManifestAbstract.java    | 20 +++++++---
 .../main/java/org/apache/isis/applib/Module.java   | 44 ++++++++++++++--------
 .../isis/applib/ModuleOrBuilderAbstract.java       | 27 ++++++++++---
 .../commons/internal/collections/_Collections.java |  2 +-
 .../integtestsupport/IntegrationTestAbstract3.java |  2 +-
 .../integtestsupport/IntegrationTestJupiter.java   |  2 +-
 .../apache/isis/core/integtestsupport/Util.java    |  7 ++--
 .../isis/core/runtime/headless/IsisSystem.java     |  2 +-
 .../runtime/headless/IsisSystemBootstrapper.java   |  2 +-
 .../core/runtime/system/context/IsisContext.java   | 10 ++++-
 10 files changed, 82 insertions(+), 36 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifestAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifestAbstract.java
index 965bb52..f8e5539 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifestAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifestAbstract.java
@@ -54,7 +54,9 @@ public abstract class AppManifestAbstract implements AppManifest {
 
         // note uses this.fixtures, so must come afterwards...
         this.configurationProperties = createConfigurationProperties(
-                builder.getAllPropertyResources(), builder.getAllIndividualConfigProps(),
+                builder.getAllPropertyResources(), 
+                builder.getAllIndividualConfigProps(),
+                builder.getAllFallbackConfigProps(),
                 this.fixtureClasses);
     }
 
@@ -96,17 +98,21 @@ public abstract class AppManifestAbstract implements AppManifest {
     private Map<String, String> createConfigurationProperties(
             final List<PropertyResource> propertyResources,
             final Map<String,String> individualConfigProps,
+            final Map<String,String> fallbackConfigProps,
             final List<Class<? extends FixtureScript>> fixtures) {
         final Map<String, String> props = _Maps.newHashMap();
         for (PropertyResource propertyResource : propertyResources) {
             propertyResource.loadPropsInto(props);
         }
-        for (final Map.Entry<String,String> individualConfigProp : individualConfigProps.entrySet()) {
-            props.put(individualConfigProp.getKey(), individualConfigProp.getValue());
-        }
+        
+        individualConfigProps.forEach(props::put);
+        
         if(!fixtures.isEmpty()) {
-            props.put("isis.persistor.datanucleus.install-fixtures","true");
+            props.put("isis.persistor.datanucleus.install-fixtures", "true");
         }
+        
+        fallbackConfigProps.forEach((k, v)->props.computeIfAbsent(k, __->v));
+        
         overrideConfigurationProperties(props);
         return props;
     }
@@ -249,6 +255,10 @@ public abstract class AppManifestAbstract implements AppManifest {
         Map<String,String> getAllIndividualConfigProps() {
             return getIndividualConfigProps();
         }
+        
+        Map<String,String> getAllFallbackConfigProps() {
+            return getFallbackConfigProps();
+        }
 
         public abstract AppManifest build();
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/Module.java b/core/applib/src/main/java/org/apache/isis/applib/Module.java
index f960439..91b6ec7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/Module.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/Module.java
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.applib;
 
+import static org.apache.isis.commons.internal.base._With.accept;
+import static org.apache.isis.commons.internal.collections._Lists.newArrayList;
+import static org.apache.isis.commons.internal.collections._Maps.newLinkedHashMap;
+
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -26,7 +30,6 @@ import java.util.Set;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
 
 /**
@@ -105,6 +108,12 @@ public interface Module {
      * Optionally each module can define additional configuration properties.
      */
     Map<String,String> getIndividualConfigProps();
+    
+    /**
+     * Optionally each module can define fallback configuration properties, 
+     * such that if not configured elsewhere provides values to fallback to.
+     */
+    Map<String, String> getFallbackConfigProps();
 
     /**
      * Optionally each module can define additional configuration properties, specified in terms of
@@ -202,24 +211,27 @@ public interface Module {
         }
 
         static Map<String, String> transitiveIndividualConfigPropsOf(final Module module) {
-            final Map<String,String> transitiveIndividualConfigProps = _Maps.newLinkedHashMap();
-
-            final List<Module> transitiveDependencies = transitiveDependenciesOf(module);
-            for (Module transitiveDependency : transitiveDependencies) {
-                transitiveIndividualConfigProps.putAll(transitiveDependency.getIndividualConfigProps());
-            }
-            return transitiveIndividualConfigProps;
+        	return accept(newLinkedHashMap(), props->{
+        		transitiveDependenciesOf(module).stream()
+            	.map(Module::getIndividualConfigProps)
+            	.forEach(props::putAll);
+        	});
+        }
+        
+        static Map<String, String> transitiveFallbackConfigPropsOf(final Module module) {
+        	return accept(newLinkedHashMap(), props->{
+        		transitiveDependenciesOf(module).stream()
+            	.map(Module::getFallbackConfigProps)
+            	.forEach(props::putAll);
+        	});
         }
 
         static List<PropertyResource> transitivePropertyResourcesOf(final Module module) {
-            final List<PropertyResource> transitivePropertyResources = _Lists.newArrayList();
-
-            final List<Module> transitiveDependencies = transitiveDependenciesOf(module);
-            for (Module transitiveDependency : transitiveDependencies) {
-                transitivePropertyResources.addAll(transitiveDependency.getPropertyResources());
-            }
-
-            return transitivePropertyResources;
+        	return accept(newArrayList(), resources->{
+        		transitiveDependenciesOf(module).stream()
+            	.map(Module::getPropertyResources)
+            	.forEach(resources::addAll);
+        	});
         }
     }
 
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 10e76e6..9003f56 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
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -42,6 +43,7 @@ abstract class ModuleOrBuilderAbstract<B extends ModuleOrBuilderAbstract<B>> {
     final Set<Class<?>> additionalServices  = _Sets.newLinkedHashSet();
 
     final Map<String,String> individualConfigProps = _Maps.newLinkedHashMap();
+    final Map<String,String> fallbackConfigProps = _Maps.newLinkedHashMap();
     final List<PropertyResource> propertyResources = _Lists.newArrayList();
 
     ModuleOrBuilderAbstract() {}
@@ -68,16 +70,16 @@ abstract class ModuleOrBuilderAbstract<B extends ModuleOrBuilderAbstract<B>> {
         withAdditionalServices(Module.Util.transitiveAdditionalServicesOf(module));
         withConfigurationPropertyResources(Module.Util.transitivePropertyResourcesOf(module));
         withConfigurationProperties(Module.Util.transitiveIndividualConfigPropsOf(module));
+        withFallbackConfigurationProperties(Module.Util.transitiveFallbackConfigPropsOf(module));
     }
 
-    @SuppressWarnings("unchecked") //[ahuber] it's safe to assume correct type casting here
     private static Class<? extends Module>[] asClasses(final List<Module> dependencies) {
         final List<Class<? extends Module>> list = new ArrayList<>();
         for (Module dependency : dependencies) {
             Class<? extends Module> aClass = dependency.getClass();
             list.add(aClass);
         }
-        return list.toArray(new Class[] {});
+        return _Casts.uncheckedCast( list.toArray(_Constants.emptyClasses) );
     }
 
     public B withAdditionalModules(final Class<?>... modules) {
@@ -105,9 +107,12 @@ abstract class ModuleOrBuilderAbstract<B extends ModuleOrBuilderAbstract<B>> {
     }
 
     public B withConfigurationProperties(final Map<String,String> configurationProperties) {
-        for (Map.Entry<String, String> keyValue : configurationProperties.entrySet()) {
-            withConfigurationProperty(keyValue.getKey(), keyValue.getValue());
-        }
+    	configurationProperties.forEach(this::withConfigurationProperty);
+        return self();
+    }
+    
+    public B withFallbackConfigurationProperties(final Map<String,String> fallbackConfigurationProperties) {
+    	fallbackConfigurationProperties.forEach(this::withFallbackConfigurationProperty);
         return self();
     }
 
@@ -151,10 +156,20 @@ abstract class ModuleOrBuilderAbstract<B extends ModuleOrBuilderAbstract<B>> {
         return self();
     }
 
-    @XmlTransient
+    @XmlTransient 
     public Map<String,String> getIndividualConfigProps() {
         return individualConfigProps;
     }
+    
+    public B withFallbackConfigurationProperty(final String key, final String value) {
+    	fallbackConfigProps.put(key, value);
+        return self();
+    }
+    
+    @XmlTransient
+    public Map<String,String> getFallbackConfigProps() {
+        return fallbackConfigProps;
+    }
 
     @XmlTransient
     public List<PropertyResource> getPropertyResources() {
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java
index 364d635..d0f2d55 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java
@@ -143,7 +143,7 @@ public final class _Collections {
 		return _Collections_SortedSetOfList.of(list);
 	}
 
-	// -- STREAM TO COMMON COLLECTIONS
+	// -- COMMON COLLECTORS
 	
 	public static <T> Collector<T, ?, HashSet<T>> toHashSet() {
 		return Collectors.toCollection(HashSet::new);
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
index 05a2614..4dc078b 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
@@ -84,7 +84,7 @@ public abstract class IntegrationTestAbstract3 extends HeadlessWithBootstrapping
     	super(logConfig, 
 				Util.moduleBuilder(module)
 				.withHeadlessTransactionSupport()
-				.withIntegrationTestConfigIfAbsent()
+				.withIntegrationTestConfigFallback()
 				.build() );
     }
 
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java
index b966ab8..d81fc2e 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java
@@ -79,7 +79,7 @@ public abstract class IntegrationTestJupiter extends HeadlessWithBootstrappingAb
 		super(logConfig, 
 				Util.moduleBuilder(module)
 				.withHeadlessTransactionSupport()
-				.withIntegrationTestConfigIfAbsent()
+				.withIntegrationTestConfigFallback()
 				.build() );
 	}
 
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java
index 89dc859..048d715 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java
@@ -53,16 +53,17 @@ class Util {
 			return this;
 		}
 		/**
-		 * Adds default config values for integration tests, without overriding any existing keys.
+		 * Adds default fallback configuration values for integration tests, 
+		 * without overriding any existing key value pairs.
 		 */
-		public ModuleBuilder withIntegrationTestConfigIfAbsent() {
+		public ModuleBuilder withIntegrationTestConfigFallback() {
 			final Map<String, String> integrationTestDefaultConfig = new HashMap<>();
 			AppManifest.Util.withJavaxJdoRunInMemoryProperties(integrationTestDefaultConfig);
 			AppManifest.Util.withDataNucleusProperties(integrationTestDefaultConfig);
 			AppManifest.Util.withIsisIntegTestProperties(integrationTestDefaultConfig);
 			
 			integrationTestDefaultConfig.forEach((k, v)->{
-				module.getIndividualConfigProps().computeIfAbsent(k, __->v);
+				module.getFallbackConfigProps().computeIfAbsent(k, __->v);
 			});
 			return this;
 		}
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 3e1c9a0..c976e6a 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
@@ -285,7 +285,7 @@ public class IsisSystem {
     }
 
     public void closeSession() throws Exception {
-        if(isisSessionFactory.inSession()) {
+        if(isisSessionFactory!=null && isisSessionFactory.inSession()) {
             isisSessionFactory.closeSession();
         }
     }
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 a606192..52a5b35 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
@@ -158,7 +158,7 @@ public class IsisSystemBootstrapper {
         // used to bootstrap the system onto thread-local
         IsisSystem.set(isft);
         isftAppManifest.set(appManifest2);
-
+        
         return isft;
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
index ef29773..9ea8559 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
@@ -115,7 +115,15 @@ public interface IsisContext {
     
     public static void dumpConfig() {
 
-		final Map<String, String> map = new TreeMap<>(getConfiguration().asMap());
+    	final IsisConfiguration configuration;
+    	try {
+    		configuration = getConfiguration();	
+    	} catch (Exception e) {
+    		// ignore
+    		return;
+    	}
+    	
+		final Map<String, String> map = new TreeMap<>(configuration.asMap());
 
 		System.out.println("=============================================");
 		System.out.println("=                ISIS 2.0.0                 =");

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.