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/03 22:29:20 UTC

[isis] branch ISIS-2086 updated (4cb3e21 -> bbc57e8)

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

danhaywood pushed a change to branch ISIS-2086
in repository https://gitbox.apache.org/repos/asf/isis.git.


 discard 4cb3e21  ISIS-2086: converts several datanucleus config props to type-safe
 discard 1cc832e  ISIS-2086: wip, converting DN config props to use IsisConfiguration
     add 03e666f  ISIS-2158: refinements to _Annotations to support attribute inheritance
     add 1c085be  ISIS-2158: migrating to new _Annotation API, starting with ...
     new 14324ff  ISIS-2086: wip, converting DN config props to use IsisConfiguration
     new d9a912a  ISIS-2086: converts several datanucleus config props to type-safe
     new bbc57e8  ISIS-2086: uses type-safe config for lookup of ConnectionURL

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (4cb3e21)
            \
             N -- N -- N   refs/heads/ISIS-2086 (bbc57e8)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 3 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.


Summary of changes:
 .../commons/internal/reflection/_Annotations.java  | 108 +++++++++++++++++++--
 .../DomainObjectAnnotationFacetFactory.java        |  30 +++---
 .../AuditableFacetForDomainObjectAnnotation.java   |  26 +----
 ...lishedObjectFacetForDomainObjectAnnotation.java |  49 +++++-----
 .../specloader/SpecificationCacheDefault.java      |   8 +-
 .../Annotations_getAnnotations_on_Class_Test.java  |  78 ++++++++++++---
 .../isis/jdo/persistence/DNStoreManagerType.java   |   9 +-
 .../DataNucleusApplicationComponents5.java         |   2 +-
 8 files changed, 217 insertions(+), 93 deletions(-)


[isis] 02/03: ISIS-2086: converts several datanucleus config props to type-safe

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
in repository https://gitbox.apache.org/repos/asf/isis.git

commit d9a912aaedbedb6f7f8dec52f692901c7843bc4c
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Oct 3 23:22:50 2019 +0100

    ISIS-2086: converts several datanucleus config props to type-safe
    
    specifically:
    
    isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName
    isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name
    isis.persistor.datanucleus.impl.datanucleus.ConnectionPasswordDecrypter
    isis.persistor.datanucleus.impl.datanucleus.PersistenceUnitLoadClasses
    isis.persistor.datanucleus.impl.datanucleus.cache.level2.type
    isis.persistor.datanucleus.impl.datanucleus.objectProvider.className
    isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll
    isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateDatabase
    isis.persistor.datanucleus.impl.datanucleus.schema.validateAll
    isis.persistor.datanucleus.impl.javax.jdo.PersistenceManagerFactoryClass
    
    Note that most of these require additional metadata hints, because of casing.
---
 .../org/apache/isis/config/IsisConfiguration.java  | 183 ++++++++++++++++++++-
 .../additional-spring-configuration-metadata.json  |  70 +++++---
 .../DataNucleusApplicationComponents5.java         |   7 +-
 .../persistence/PersistenceSessionFactory5.java    |  49 +-----
 4 files changed, 238 insertions(+), 71 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
index 25135ee..c1444f1 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.config;
 
-import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -116,7 +115,147 @@ public class IsisConfiguration {
                  */
                 @Data
                 public static class DataNucleus {
-                    private String ConnectionPasswordDecrypter;
+
+                    /**
+                     * 	The JNDI name for a connection factory for transactional connections.
+                     *
+                     * 	<p>
+                     * 	    For RBDMS, it must be a JNDI name that points to a javax.sql.DataSource object.
+                     * 	</p>
+                     *
+                     * <p>
+                     *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                     * </p>
+                     */
+                    private String connectionFactoryName;
+
+                    /**
+                     * 	The JNDI name for a connection factory for non-transactional connections.
+                     *
+                     * 	<p>
+                     * 	    For RBDMS, it must be a JNDI name that points to a javax.sql.DataSource object.
+                     * 	</p>
+                     *
+                     * <p>
+                     *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                     * </p>
+                     */
+                    private String connectionFactory2Name;
+
+
+                    /**
+                     * Name of a class that implements <tt>org.datanucleus.store.connection.DecryptionProvider</tt>
+                     * and should only be specified if the password is encrypted in the persistence properties.
+                     *
+                     * <p>
+                     *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                     * </p>
+                     */
+                    private String connectionPasswordDecrypter;
+
+
+                    /**
+                     * 	Used when we have specified the persistence-unit name for a PMF/EMF and where we want the
+                     * 	datastore "tables" for all classes of that persistence-unit loading up into the StoreManager.
+                     *
+                     * <p>
+                     *     Defaults to true, which is the opposite of DataNucleus' own default.
+                     *     (The reason that DN defaults to false is because some databases are slow so such an
+                     *     operation would slow down the startup process).
+                     * </p>
+                     *
+                     * <p>
+                     *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                     * </p>
+                     */
+                    private boolean persistenceUnitLoadClasses = true;
+
+                    public enum TransactionTypeEnum {
+                        RESOURCE_LOCAL,
+                        JTA
+                    }
+
+                    /**
+                     * Type of transaction to use.
+                     *
+                     * <p>
+                     * If running under JavaSE the default is RESOURCE_LOCAL, and if running under JavaEE the default is JTA.
+                     * </p>
+                     *
+                     * <p>
+                     *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                     * </p>
+                     */
+                    private TransactionTypeEnum transactionType;
+
+                    private final Cache cache = new Cache();
+                    @Data
+                    public static class Cache {
+                        private final Level2 level2 = new Level2();
+                        @Data
+                        public static class Level2 {
+                            /**
+                             * Name of the type of Level 2 Cache to use.
+                             *
+                             * <p>
+                             * Can be used to interface with external caching products.
+                             * Use "none" to turn off L2 caching.
+                             * </p>
+                             *
+                             * <p>
+                             * See also Cache docs for JDO, and for JPA
+                             * </p>
+                             */
+                            private String type = "none";
+                        }
+                    }
+                    private final ObjectProvider objectProvider = new ObjectProvider();
+                    @Data
+                    public static class ObjectProvider {
+                        /**
+                         * New feature in DN 3.2.3; enables dependency injection into entities
+                         *
+                         * <p>
+                         *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                         * </p>
+                         */
+                        private String className = "org.apache.isis.jdo.datanucleus.JDOStateManagerForIsis";
+                    }
+                    private final Schema schema = new Schema();
+                    @Data
+                    public static class Schema {
+                        /**
+                         * Whether DN should automatically create the database schema on bootstrapping.
+                         *
+                         * <p>
+                         *     This should be set to <tt>true</tt> when running against an in-memory database, but
+                         *     set to <tt>false</tt> when running against a persistent database (use something like
+                         *     flyway instead to manage schema evolution).
+                         * </p>
+                         *
+                         * <p>
+                         *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                         * </p>
+                         */
+                        private boolean autoCreateAll = false;
+
+                        /**
+                         * Previously we defaulted this property to "true", but that could cause the target database
+                         * to be modified
+                         *
+                         * <p>
+                         *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                         * </p>
+                         */
+                        private boolean autoCreateDatabase = false;
+
+                        /**
+                         * <p>
+                         *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                         * </p>
+                         */
+                        private boolean validateAll = true;
+                    }
                 }
                 private final Javax javax = new Javax();
                 @Data
@@ -124,16 +263,48 @@ public class IsisConfiguration {
                     private final Jdo jdo = new Jdo();
                     @Data
                     public static class Jdo {
+
+                        /**
+                         * <p>
+                         *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                         * </p>
+                         */
+                        private String persistenceManagerFactoryClass = "org.datanucleus.api.jdo.JDOPersistenceManagerFactory";
+
                         private final Option option = new Option();
                         @Data
                         public static class Option {
-                            // this field also appears in additional-spring-configuration-metadata.json, to fix the casing as 'ConnectionDriverName'
+                            /**
+                             * JDBC driver used by DataNucleus Object store to connect.
+                             *
+                             * <p>
+                             *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                             * </p>
+                             */
                             private String connectionDriverName;
-                            // this field also appears in additional-spring-configuration-metadata.json, to fix the casing as 'ConnectionURL'
+                            /**
+                             * URL used by DataNucleus Object store to connect.
+                             *
+                             * <p>
+                             *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                             * </p>
+                             */
                             private String connectionUrl;
-                            // this field also appears in additional-spring-configuration-metadata.json, to fix the casing as 'ConnectionUserName'
+                            /**
+                             * User account used by DataNucleus Object store to connect.
+                             *
+                             * <p>
+                             *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                             * </p>
+                             */
                             private String connectionUserName;
-                            // this field also appears in additional-spring-configuration-metadata.json, to fix the casing as 'ConnectionPassword'
+                            /**
+                             * Password for the user account used by DataNucleus Object store to connect.
+                             *
+                             * <p>
+                             *     See also <tt>additional-spring-configuration-metadata.json</tt> (change casing).
+                             * </p>
+                             */
                             private String connectionPassword;
                         }
                     }
diff --git a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index acbeb06..04ab67f 100644
--- a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -1,29 +1,43 @@
 {
   "properties": [
     {
-      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName",
-      "type": "java.lang.String",
-      "description": "JDBC driver used by DataNucleus Object store to connect."
+      "name": "isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName"
     },
     {
-      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL",
-      "type": "java.lang.String",
-      "description": "URL used by DataNucleus Object store to connect."
+      "name": "isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name"
     },
     {
-      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName",
-      "type": "java.lang.String",
-      "description": "User account used by DataNucleus Object store to connect."
+      "name": "isis.persistor.datanucleus.impl.datanucleus.ConnectionPasswordDecrypter"
     },
     {
-      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword",
-      "type": "java.lang.String",
-      "description": "Password for the user account used by DataNucleus Object store to connect."
+      "name": "isis.persistor.datanucleus.impl.datanucleus.PersistenceUnitLoadClasses"
     },
     {
-      "name": "isis.persistor.datanucleus.impl.javax.datanucleus.ConnectionPasswordDecrypter",
-      "type": "java.lang.String",
-      "description": "Name of a class that implements org.datanucleus.store.connection.DecryptionProvider and should only be specified if the password is encrypted in the persistence properties"
+      "name": "isis.persistor.datanucleus.impl.datanucleus.objectProvider.className"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateDatabase"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.datanucleus.schema.validateAll"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword"
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.javax.jdo.PersistenceManagerFactoryClass"
     },
     {
       "name": "isis.viewer.wicket.credit.1.url",
@@ -67,20 +81,38 @@
   ],
   "hints": [
     {
-      "name": "isis.viewer.wicket.themes.provider",
+      "name": "isis.persistor.datanucleus.impl.datanucleus.ConnectionPasswordDecrypter",
       "providers": [{
         "name": "class-reference",
         "parameters": {
-          "target": "org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.IsisWicketThemeSupport"
+          "target": "org.datanucleus.store.connection.DecryptionProvider"
         }
       }]
     },
     {
-      "name": "isis.persistor.datanucleus.impl.javax.datanucleus.ConnectionPasswordDecrypter",
+      "name": "isis.persistor.datanucleus.impl.javax.jdo.PersistenceManagerFactoryClass",
       "providers": [{
         "name": "class-reference",
         "parameters": {
-          "target": "org.datanucleus.store.connection.DecryptionProvider"
+          "target": "javax.jdo.PersistenceManagerFactory"
+        }
+      }]
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.datanucleus.objectProvider.className",
+      "providers": [{
+        "name": "class-reference",
+        "parameters": {
+          "target": "org.datanucleus.state.StateManagerImpl"
+        }
+      }]
+    },
+    {
+      "name": "isis.viewer.wicket.themes.provider",
+      "providers": [{
+        "name": "class-reference",
+        "parameters": {
+          "target": "org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.IsisWicketThemeSupport"
         }
       }]
     }
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..1737484 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
@@ -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());
             }
-
-
         }
     }
 


[isis] 01/03: ISIS-2086: wip, converting DN config props to use IsisConfiguration

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
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 14324ffaa857e0b0392e02eeddd61e364ae7c965
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Oct 2 09:44:06 2019 +0100

    ISIS-2086: wip, converting DN config props to use IsisConfiguration
    
    (cherry picked from commit 0a9b39ba4ddceba0f5a2349e1a90eac8f5e6a3f5)
---
 .../org/apache/isis/config/IsisConfiguration.java  | 10 +++++-
 .../additional-spring-configuration-metadata.json  | 14 ++++++++
 .../datanucleus/DataNucleusPropertiesAware.java    |  4 +++
 ...rtiesAware.java => IsisConfigurationAware.java} |  6 ++--
 .../CreateSchemaObjectFromClassMetadata.java       | 37 ++++++++++++++--------
 5 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
index 1c1516a..25135ee 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
@@ -109,6 +109,15 @@ public class IsisConfiguration {
             private final Impl impl = new Impl();
             @Data
             public static class Impl {
+                private final DataNucleus datanucleus = new DataNucleus();
+                /**
+                 * slightly different capitalization is intentional here; cannot have nested class with same name as parent.
+                 * We rely on additional-spring-configuration-metadata.json to specify the desired property names.
+                 */
+                @Data
+                public static class DataNucleus {
+                    private String ConnectionPasswordDecrypter;
+                }
                 private final Javax javax = new Javax();
                 @Data
                 public static class Javax {
@@ -704,7 +713,6 @@ public class IsisConfiguration {
             @Data
             public static class Themes {
 
-// isis.viewer.wicket.themes.showChooser
                 /**
                  * A comma separated list of enabled theme names, as defined by https://bootswatch.com.
                  */
diff --git a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 351d7be..acbeb06 100644
--- a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -21,6 +21,11 @@
       "description": "Password for the user account used by DataNucleus Object store to connect."
     },
     {
+      "name": "isis.persistor.datanucleus.impl.javax.datanucleus.ConnectionPasswordDecrypter",
+      "type": "java.lang.String",
+      "description": "Name of a class that implements org.datanucleus.store.connection.DecryptionProvider and should only be specified if the password is encrypted in the persistence properties"
+    },
+    {
       "name": "isis.viewer.wicket.credit.1.url",
       "type": "java.net.URL"
     },
@@ -69,6 +74,15 @@
           "target": "org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.IsisWicketThemeSupport"
         }
       }]
+    },
+    {
+      "name": "isis.persistor.datanucleus.impl.javax.datanucleus.ConnectionPasswordDecrypter",
+      "providers": [{
+        "name": "class-reference",
+        "parameters": {
+          "target": "org.datanucleus.store.connection.DecryptionProvider"
+        }
+      }]
     }
   ]
 }
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;
 
-
+    }
 }


[isis] 03/03: ISIS-2086: uses type-safe config for lookup of ConnectionURL

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
in repository https://gitbox.apache.org/repos/asf/isis.git

commit bbc57e8e861999f567506a0c7050f9595029f5e3
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Oct 3 23:25:58 2019 +0100

    ISIS-2086: uses type-safe config for lookup of ConnectionURL
---
 .../java/org/apache/isis/jdo/persistence/DNStoreManagerType.java | 9 +++++----
 .../isis/jdo/persistence/DataNucleusApplicationComponents5.java  | 2 +-
 2 files changed, 6 insertions(+), 5 deletions(-)

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 1737484..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;