You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/10/04 07:00:50 UTC

[isis] branch ISIS-2086-uses-type-safe-config-in-DN-bootstrapping created (now e549947)

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

danhaywood pushed a change to branch ISIS-2086-uses-type-safe-config-in-DN-bootstrapping
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at e549947  ISIS-2086: uses typesafe settings in DN (nb: breaks smoke tests)

This branch includes the following new commits:

     new e549947  ISIS-2086: uses typesafe settings in DN (nb: breaks smoke tests)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[isis] 01/01: ISIS-2086: uses typesafe settings in DN (nb: breaks smoke tests)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2086-uses-type-safe-config-in-DN-bootstrapping
in repository https://gitbox.apache.org/repos/asf/isis.git

commit e549947d53fd50cb61534c93df445bab1a41a8f0
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Oct 4 08:00:33 2019 +0100

    ISIS-2086: uses typesafe settings in DN (nb: breaks smoke tests)
---
 .../datanucleus/DataNucleusPropertiesAware.java    |  4 ++
 ...rtiesAware.java => IsisConfigurationAware.java} |  6 ++-
 .../CreateSchemaObjectFromClassMetadata.java       | 37 +++++++++-------
 .../isis/jdo/persistence/DNStoreManagerType.java   |  9 ++--
 .../DataNucleusApplicationComponents5.java         |  9 ++--
 .../persistence/PersistenceSessionFactory5.java    | 49 ++++------------------
 6 files changed, 47 insertions(+), 67 deletions(-)

diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java
index 3d2067f..1ead202 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java
@@ -20,6 +20,10 @@ package org.apache.isis.jdo.datanucleus;
 
 import java.util.Map;
 
+/**
+ * @deprecated - should be able to replace with {@link IsisConfigurationAware} instead.
+ */
+@Deprecated
 public interface DataNucleusPropertiesAware {
 
     public void setDataNucleusProperties(final Map<String, String> properties);
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/IsisConfigurationAware.java
similarity index 84%
copy from core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java
copy to core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/IsisConfigurationAware.java
index 3d2067f..a645b7f 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/DataNucleusPropertiesAware.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/IsisConfigurationAware.java
@@ -20,7 +20,9 @@ package org.apache.isis.jdo.datanucleus;
 
 import java.util.Map;
 
-public interface DataNucleusPropertiesAware {
+import org.apache.isis.config.IsisConfiguration;
 
-    public void setDataNucleusProperties(final Map<String, String> properties);
+public interface IsisConfigurationAware {
+
+    void setIsisConfiguration(IsisConfiguration isisConfiguration);
 }
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
index aa44645..e3f0af4 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
@@ -25,6 +25,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Map;
 
+import org.apache.isis.config.IsisConfiguration;
 import org.datanucleus.ClassLoaderResolver;
 import org.datanucleus.enhancer.EnhancementNucleusContextImpl;
 import org.datanucleus.metadata.AbstractClassMetaData;
@@ -39,15 +40,12 @@ import lombok.extern.log4j.Log4j2;
  * Implementation note: the methods in this class are <tt>protected</tt> to allow for easy subclassing.
  */
 @Log4j2
-public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, DataNucleusPropertiesAware {
+public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, DataNucleusPropertiesAware, IsisConfigurationAware {
 
     // -- persistenceManagerFactory, properties
 
     private Map<String, String> properties;
-    protected Map<String, String> getProperties() {
-        return properties;
-    }
-
+    private IsisConfiguration isisConfiguration;
 
     // -- loaded (API)
 
@@ -62,9 +60,9 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
         Connection connection = null;
         Statement statement = null;
 
-        final String driverName = properties.get("javax.jdo.option.ConnectionDriverName");
-        final String url = properties.get("javax.jdo.option.ConnectionURL");
-        final String userName = properties.get("javax.jdo.option.ConnectionUserName");
+        final String driverName = isisConfiguration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionDriverName();
+        final String url = isisConfiguration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionUrl();
+        final String userName = isisConfiguration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionUserName();
         final String password = getConnectionPassword();
 
         if(_Strings.isNullOrEmpty(driverName) || _Strings.isNullOrEmpty(url)) {
@@ -144,7 +142,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
         // db vendors without requiring lots of complex configuration of DataNucleus
         //
 
-        String url = getProperties().get("javax.jdo.option.ConnectionURL");
+        String url = isisConfiguration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionUrl();
 
         if(url.contains("postgres")) {
             // in DN 4.0, was forcing lower case:
@@ -184,10 +182,10 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
      * @return Password
      */
     private String getConnectionPassword() {
-        String password = properties.get("javax.jdo.option.ConnectionPassword");
+        String password = isisConfiguration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionPassword();
         if (password != null)
         {
-            String decrypterName = properties.get("datanucleus.ConnectionPasswordDecrypter");
+            String decrypterName = isisConfiguration.getPersistor().getDatanucleus().getImpl().getDatanucleus().getConnectionPasswordDecrypter();
             if (decrypterName != null)
             {
                 // Decrypt the password using the provided class
@@ -209,11 +207,22 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
 
 
     // -- injected dependencies
+
     @Override
-    public void setDataNucleusProperties(final Map<String, String> properties) {
-        this.properties = properties;
+    public void setIsisConfiguration(IsisConfiguration isisConfiguration) {
+        this.isisConfiguration = isisConfiguration;
     }
 
+    /**
+     *
+     * @param properties
+     *
+     * @deprecated  - should be able to obtain these from {@link IsisConfiguration}, instead
+     */
+    @Deprecated
+    @Override
+    public void setDataNucleusProperties(final Map<String, String> properties) {
+        this.properties = properties;
 
-
+    }
 }
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DNStoreManagerType.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DNStoreManagerType.java
index fb395e7..fcb45e2 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DNStoreManagerType.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/DNStoreManagerType.java
@@ -21,6 +21,7 @@ package org.apache.isis.jdo.persistence;
 import java.util.Map;
 import java.util.function.Function;
 
+import org.apache.isis.config.IsisConfiguration;
 import org.datanucleus.PersistenceNucleusContext;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
 import org.datanucleus.store.StoreManager;
@@ -42,13 +43,13 @@ enum DNStoreManagerType {
     Other
     ;
 
-    public static DNStoreManagerType typeOf(Map<String,String> datanucleusProps) {
+    public static DNStoreManagerType typeOf(Map<String, String> datanucleusProps, IsisConfiguration configuration) {
 
         if(hasSecondaryDataStore(datanucleusProps)) {
             return Federated; 
         } 
 
-        if(isKnownSchemaAwareStoreManagerIfNotFederated(datanucleusProps)) {
+        if(isKnownSchemaAwareStoreManagerIfNotFederated(configuration)) {
             return SchemaAware;
         }
 
@@ -91,12 +92,12 @@ enum DNStoreManagerType {
         return hasSecondaryDataStore;
     }
 
-    private static boolean isKnownSchemaAwareStoreManagerIfNotFederated(Map<String,String> datanucleusProps) {
+    private static boolean isKnownSchemaAwareStoreManagerIfNotFederated(IsisConfiguration configuration) {
 
         // this saves some time, but also avoids the (still undiagnosed) issue that instantiating the
         // PMF can cause the ClassMetadata for the entity classes to be loaded in and cached prior to
         // registering the CreateSchemaObjectFromClassData (to invoke 'create schema' first)
-        final String connectionUrl = datanucleusProps.get("javax.jdo.option.ConnectionURL");
+        final String connectionUrl = configuration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionUrl();
         if(connectionUrl != null) {
             for(String magic : knownSchemaAwareIfNotFederated) {
                 if (connectionUrl.startsWith(magic)) {
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 1a04dca..53dd9c1 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
@@ -126,7 +126,7 @@ public class DataNucleusApplicationComponents5 implements ApplicationScopedCompo
             final Set<String> persistableClassNameSet, 
             final Map<String, String> datanucleusProps) {
 
-        final DNStoreManagerType dnStoreManagerType = DNStoreManagerType.typeOf(datanucleusProps);
+        final DNStoreManagerType dnStoreManagerType = DNStoreManagerType.typeOf(datanucleusProps, configuration);
 
         PersistenceManagerFactory persistenceManagerFactory;
 
@@ -134,7 +134,8 @@ public class DataNucleusApplicationComponents5 implements ApplicationScopedCompo
 
             // rather than reinvent too much of the wheel, we reuse the same property that DN would check
             // for if it were doing the auto-creation itself (read from isis.properties)
-            final boolean createSchema = isSet(datanucleusProps, PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_ALL);
+            final boolean createSchema =
+                    configuration.getPersistor().getDatanucleus().getImpl().getDatanucleus().getSchema().isAutoCreateAll();
 
             if(createSchema) {
 
@@ -207,10 +208,6 @@ public class DataNucleusApplicationComponents5 implements ApplicationScopedCompo
         schemaAwareStoreManager.createSchemaForClasses(persistableClassNameSet, asProperties(datanucleusProps));
     }
 
-    private boolean isSet(final Map<String, String> props, final String key) {
-        return Boolean.parseBoolean( props.get(key) );
-    }
-
     private void registerMetadataListener(
             final MetaDataManager metaDataManager,
             final Map<String, String> datanucleusProps) {
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 b1d066f..9f6931a 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,15 +26,11 @@ import javax.enterprise.inject.Vetoed;
 import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.listener.StoreLifecycleListener;
 
-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.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;
@@ -72,6 +68,7 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
     @Override
     public void init() {
         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.
@@ -88,17 +85,10 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
 
     private DataNucleusApplicationComponents5 createDataNucleusApplicationComponents() {
 
-        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);
+        val datanucleusProps = dnSettings.getAsMap();
 
-        addDataNucleusPropertiesIfRequired(datanucleusProps);
+        addDataNucleusPropertiesIfRequired(datanucleusProps, configuration);
 
         val classesToBePersisted = JdoEntityTypeRegistry.current().getEntityTypes();
 
@@ -114,33 +104,12 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
         DataNucleusApplicationComponents5.catalogNamedQueries(classesToBePersisted, specificationLoader);
     }
 
-//    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());
-
-        putIfNotPresent(props, "javax.jdo.PersistenceManagerFactoryClass", JDOPersistenceManagerFactory.class.getName());
-
-        // previously we defaulted this property to "true", but that could cause the target database to be modified
-        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_DATABASE, Boolean.FALSE.toString());
-
-        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_VALIDATE_ALL, Boolean.TRUE.toString());
-        putIfNotPresent(props, PropertyNames.PROPERTY_CACHE_L2_TYPE, "none");
+    private static void addDataNucleusPropertiesIfRequired(Map<String, String> props, IsisConfiguration configuration) {
 
-        putIfNotPresent(props, PropertyNames.PROPERTY_PERSISTENCE_UNIT_LOAD_CLASSES, Boolean.TRUE.toString());
-
-        String connectionFactoryName = props.get(PropertyNames.PROPERTY_CONNECTION_FACTORY_NAME);
+        String connectionFactoryName = configuration.getPersistor().getDatanucleus().getImpl().getDatanucleus().getConnectionFactoryName();
         if(connectionFactoryName != null) {
-            String connectionFactory2Name = props.get(PropertyNames.PROPERTY_CONNECTION_FACTORY2_NAME);
-            String transactionType = props.get("javax.jdo.option.TransactionType");
+            String connectionFactory2Name = configuration.getPersistor().getDatanucleus().getImpl().getDatanucleus().getConnectionFactory2Name();
+            IsisConfiguration.Persistor.Datanucleus.Impl.DataNucleus.TransactionTypeEnum transactionType = configuration.getPersistor().getDatanucleus().getImpl().getDatanucleus().getTransactionType();
             // extended logging
             if(transactionType == null) {
                 log.info("found config properties to use non-JTA JNDI datasource ({})", connectionFactoryName);
@@ -168,10 +137,8 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
 
             if(log.isInfoEnabled()) {
                 log.info("using JDBC connection '{}'", 
-                        props.get("javax.jdo.option.ConnectionURL"));
+                        configuration.getPersistor().getDatanucleus().getImpl().getJavax().getJdo().getOption().getConnectionUrl());
             }
-
-
         }
     }