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:51 UTC
[isis] 01/01: ISIS-2086: uses typesafe settings in DN (nb: breaks
smoke tests)
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());
}
-
-
}
}