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 2019/10/02 07:45:35 UTC

[isis] branch v2 updated: ISIS-2158: smoketests to have their individual in-mem connections

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 2a0353a  ISIS-2158: smoketests to have their individual in-mem connections
2a0353a is described below

commit 2a0353aee509dd93870da93ab7b8d66467459d73
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Oct 2 09:45:25 2019 +0200

    ISIS-2158: smoketests to have their individual in-mem connections
    
    - adds new 'IsisPresets.H2InMemory_withUniqueSchema'
    - also converts DN plugin to use new config bean 'DataNucleusSettings'
    
    However, there might be a random number collision when generating unique
    schema names, though highly unlikely. Unfortunately using a UUID as
    schema name does not seem to work, its too long (has too many
    characters).
---
 .../presets/H2InMemory_withUniqueSchema.properties |  3 +-
 .../isis/jdo/datanucleus/DataNucleusSettings.java  | 41 ++++++++++++++++++++++
 .../org/apache/isis/jdo/IsisBootDataNucleus.java   | 26 ++++++++++----
 .../DataNucleusApplicationComponents5.java         |  6 ++--
 .../persistence/PersistenceSessionFactory5.java    | 39 +++++++++++++-------
 .../org/apache/isis/testdomain/config/FooTest.java | 23 +++++++++++-
 6 files changed, 111 insertions(+), 27 deletions(-)

diff --git a/core/config/src/main/resources/presets/H2InMemory_withUniqueSchema.properties b/core/config/src/main/resources/presets/H2InMemory_withUniqueSchema.properties
index 82df5d8..1ecfb3f 100644
--- a/core/config/src/main/resources/presets/H2InMemory_withUniqueSchema.properties
+++ b/core/config/src/main/resources/presets/H2InMemory_withUniqueSchema.properties
@@ -15,8 +15,7 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL = jdbc:h2:mem:t${random.long} 
-#jdbc:h2:mem:test_${random.uuid}
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL = jdbc:h2:mem:T${random.long[1,9999999]}
 isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName = org.h2.Driver
 isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName = sa
 isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword = 
\ No newline at end of file
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusSettings.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusSettings.java
new file mode 100644
index 0000000..08b3849
--- /dev/null
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusSettings.java
@@ -0,0 +1,41 @@
+/*
+ *  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.isis.jdo.datanucleus;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @since 2.0
+ */
+@Service
+public class DataNucleusSettings {
+
+    @Inject @Named("dn-settings") 
+    private Map<String, String> dnSettings;
+    
+    public Map<String, String> getAsMap() {
+        return dnSettings;
+    }
+    
+}
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/IsisBootDataNucleus.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/IsisBootDataNucleus.java
index 4face09..787a7a9 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/IsisBootDataNucleus.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/IsisBootDataNucleus.java
@@ -18,12 +18,18 @@
  */
 package org.apache.isis.jdo;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Named;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.FilterType;
 import org.springframework.context.annotation.Import;
 
-import org.apache.isis.config.beans.IsisBeanScanInterceptorForSpring;
+import org.apache.isis.jdo.datanucleus.DataNucleusSettings;
 import org.apache.isis.jdo.jdosupport.IsisJdoSupportDN5;
 import org.apache.isis.jdo.jdosupport.mixins.Persistable_datanucleusIdLong;
 import org.apache.isis.jdo.metrics.MetricsServiceDefault;
@@ -31,7 +37,7 @@ import org.apache.isis.jdo.persistence.IsisPlatformTransactionManagerForJdo;
 
 @Configuration
 @Import({
-    //TimestampService.class, //FIXME initializes too early 
+    DataNucleusSettings.class, // config bean
     MetricsServiceDefault.class,
     IsisJdoSupportDN5.class,
     IsisPlatformTransactionManagerForJdo.class,
@@ -40,10 +46,16 @@ import org.apache.isis.jdo.persistence.IsisPlatformTransactionManagerForJdo;
         basePackageClasses= {
                 // bring in the mixins
                 Persistable_datanucleusIdLong.class,
-        },
-        includeFilters= {
-                @ComponentScan.Filter(type = FilterType.CUSTOM, classes= {IsisBeanScanInterceptorForSpring.class})
         })
 public class IsisBootDataNucleus {
-
+    
+    // reserved for datanucleus' own config props
+    public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; 
+    
+    @ConfigurationProperties(prefix = DATANUCLEUS_CONFIG_PREFIX)
+    @Bean @Named("dn-settings")
+    public Map<String, String> getAsMap() {
+        return new HashMap<>();
+    }
+    
 }
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DataNucleusApplicationComponents5.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DataNucleusApplicationComponents5.java
index c90b2af..1a04dca 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DataNucleusApplicationComponents5.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DataNucleusApplicationComponents5.java
@@ -27,7 +27,6 @@ import javax.enterprise.inject.Vetoed;
 import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManagerFactory;
 
-import org.apache.isis.config.IsisConfiguration;
 import org.datanucleus.PersistenceNucleusContext;
 import org.datanucleus.PropertyNames;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
@@ -39,8 +38,7 @@ import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.components.ApplicationScopedComponent;
 import org.apache.isis.commons.internal.factory.InstanceUtil;
-import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.jdo.datanucleus.CreateSchemaObjectFromClassMetadata;
+import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.jdo.datanucleus.DataNucleusLifeCycleHelper;
 import org.apache.isis.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.apache.isis.jdo.metamodel.facets.object.query.JdoNamedQuery;
@@ -93,8 +91,8 @@ public class DataNucleusApplicationComponents5 implements ApplicationScopedCompo
             final IsisConfiguration configuration,
             final Map<String, String> datanucleusProps,
             final Set<String> persistableClassNameSet) {
+        
         this.configuration = configuration;
-
         this.datanucleusProps = datanucleusProps;
         this.persistableClassNameSet = persistableClassNameSet;
 
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java
index 400fccc..b1d066f 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java
@@ -26,21 +26,21 @@ import javax.enterprise.inject.Vetoed;
 import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.listener.StoreLifecycleListener;
 
-import org.apache.isis.metamodel.MetaModelContext;
 import org.datanucleus.PropertyNames;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
 
 import org.apache.isis.commons.internal.base._Blackhole;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.components.ApplicationScopedComponent;
-import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.config.internal._Config;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.jdo.datanucleus.DataNucleusSettings;
 import org.apache.isis.jdo.datanucleus.JDOStateManagerForIsis;
 import org.apache.isis.jdo.entities.JdoEntityTypeRegistry;
 import org.apache.isis.jdo.lifecycles.JdoStoreLifecycleListenerForIsis;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.persistence.FixturesInstalledState;
 import org.apache.isis.runtime.persistence.FixturesInstalledStateHolder;
+import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtime.system.persistence.PersistenceSessionFactory;
 import org.apache.isis.security.authentication.AuthenticationSession;
@@ -59,13 +59,11 @@ import lombok.extern.log4j.Log4j2;
 public class PersistenceSessionFactory5
 implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledStateHolder {
 
-    public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; // reserved for datanucleus' own config props
-
     private final _Lazy<DataNucleusApplicationComponents5> applicationComponents = 
             _Lazy.threadSafe(this::createDataNucleusApplicationComponents);
     
     private StoreLifecycleListener storeLifecycleListener;
-    private IsisConfigurationLegacy configuration;
+    private IsisConfiguration configuration;
 
     @Getter(onMethod=@__({@Override})) 
     @Setter(onMethod=@__({@Override})) 
@@ -73,7 +71,7 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
 
     @Override
     public void init() {
-        this.configuration = _Config.getConfiguration();
+        this.configuration = IsisContext.getConfiguration();
         // need to eagerly build, ... must be completed before catalogNamedQueries().
         // Why? because that method causes entity classes to be loaded which register with DN's EnhancementHelper,
         // which are then cached in DN.  It results in our CreateSchema listener not firing.
@@ -90,16 +88,24 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
 
     private DataNucleusApplicationComponents5 createDataNucleusApplicationComponents() {
 
-        val dataNucleusConfig = configuration.subsetWithNamesStripped(DATANUCLEUS_CONFIG_PREFIX);
-        val datanucleusProps = dataNucleusConfig.copyToMap();
+        this.configuration = IsisContext.getConfiguration();
+        
+        val dnSettings = IsisContext.getServiceRegistry().lookupServiceElseFail(DataNucleusSettings.class);
+        
+        //val dataNucleusConfig = configuration.subsetWithNamesStripped(DATANUCLEUS_CONFIG_PREFIX);
+        val datanucleusProps = dnSettings.getAsMap(); 
+                //dataNucleusConfig.copyToMap();
+        
+        System.out.println("############## " + datanucleusProps);
 
         addDataNucleusPropertiesIfRequired(datanucleusProps);
 
         val classesToBePersisted = JdoEntityTypeRegistry.current().getEntityTypes();
 
         return new DataNucleusApplicationComponents5(
-                MetaModelContext.current().getConfiguration(),
-                datanucleusProps, classesToBePersisted);
+                configuration,
+                datanucleusProps, 
+                classesToBePersisted);
     }
 
     @Override
@@ -108,8 +114,15 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
         DataNucleusApplicationComponents5.catalogNamedQueries(classesToBePersisted, specificationLoader);
     }
 
-    private static void addDataNucleusPropertiesIfRequired(
-            final Map<String, String> props) {
+//    private static HashMap<String, String> toMap(Properties props) {
+//        val map = _Maps.<String, String>newHashMap();
+//        for (val name: props.stringPropertyNames()) {
+//            map.put(name, props.getProperty(name));
+//        }
+//        return map;
+//    }
+    
+    private static void addDataNucleusPropertiesIfRequired(Map<String, String> props) {
 
         // new feature in DN 3.2.3; enables dependency injection into entities
         putIfNotPresent(props, PropertyNames.PROPERTY_OBJECT_PROVIDER_CLASS_NAME, JDOStateManagerForIsis.class.getName());
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/config/FooTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/config/FooTest.java
index bbac121..0494cb2 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/config/FooTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/config/FooTest.java
@@ -18,15 +18,22 @@
  */
 package org.apache.isis.testdomain.config;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.junit.jupiter.api.Test;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 import org.apache.isis.testdomain.Smoketest;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -49,9 +56,19 @@ class FooTest {
     @Configuration
     static class Setup {
         
+        @ConfigurationProperties(prefix = "foo")
+        @Bean @Named("foo-as-map")
+        public Map<String, String> getAsMap() {
+            return new HashMap<>();
+        }
+        
     }
 
-    @Inject private FooProperties foo;
+    @Inject 
+    private FooProperties foo;
+    
+    @Inject @Named("foo-as-map") 
+    private Map<String, String> fooAsMap;
 
     @Test
     void foo() {
@@ -64,6 +81,10 @@ class FooTest {
         
         System.out.println(foo);
         
+        assertNotNull(fooAsMap);
+        assertFalse(fooAsMap.isEmpty());
+        System.out.println(fooAsMap);
+        
     }
 
 }