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 2013/11/27 08:51:28 UTC

git commit: ISIS-611: call RegisterEntities from DataNucleusPersistenceMechanismInstaller

Updated Branches:
  refs/heads/master cd586fef6 -> 37beb951e


ISIS-611: call RegisterEntities from DataNucleusPersistenceMechanismInstaller

No longer necessary to register as a service (the key is still needed, indeed is now mandatory).


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/37beb951
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/37beb951
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/37beb951

Branch: refs/heads/master
Commit: 37beb951ec55170062eb1f9ae5023e428d619016
Parents: cd586fe
Author: Dan Haywood <da...@apache.org>
Authored: Wed Nov 27 07:45:59 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Wed Nov 27 07:45:59 2013 +0000

----------------------------------------------------------------------
 .../DataNucleusApplicationComponents.java       | 33 ++++++++----------
 ...ataNucleusPersistenceMechanismInstaller.java | 25 +++++++++++++-
 .../jdo/service/RegisterEntities.java           | 35 +++++++++++++-------
 .../src/main/webapp/WEB-INF/isis.properties     |  2 --
 .../src/main/webapp/WEB-INF/isis.properties     |  2 --
 5 files changed, 60 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/37beb951/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
index 791c8e6..fb0ed0b 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Properties;
@@ -28,8 +27,8 @@ import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 
 import org.datanucleus.NucleusContext;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
@@ -37,10 +36,9 @@ import org.datanucleus.store.schema.SchemaAwareStoreManager;
 
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.embeddedonly.JdoEmbeddedOnlyFacet;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoNamedQuery;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryFacet;
 
@@ -57,17 +55,20 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     //
     ///////////////////////////////////////////////////////////////////////////
 
-    public DataNucleusApplicationComponents(final Map<String, String> props, final Collection<ObjectSpecification> objectSpecs) {
-        persistenceManagerFactory = JDOHelper.getPersistenceManagerFactory(props);
+    public DataNucleusApplicationComponents(
+            final Map<String, String> props, 
+            final Set<String> persistableClassNameSet) {
+        final String persistableClassNames = Joiner.on(',').join(persistableClassNameSet);
         
-        final Set<String> classesToBePersisted = catalogClassesToBePersisted(objectSpecs);
+        props.put("datanucleus.autoStartClassNames", persistableClassNames);
+        persistenceManagerFactory = JDOHelper.getPersistenceManagerFactory(props);
 
         final boolean createSchema = Boolean.parseBoolean( props.get("datanucleus.autoCreateSchema") );
         if(createSchema) {
-            createSchema(props, classesToBePersisted);
+            createSchema(props, persistableClassNameSet);
         }
 
-        namedQueryByName = Collections.unmodifiableMap(catalogNamedQueries(objectSpecs));
+        namedQueryByName = Collections.unmodifiableMap(catalogNamedQueries(persistableClassNameSet));
 
         synchronizer = new FrameworkSynchronizer();
         lifecycleListener = new IsisLifecycleListener(synchronizer);
@@ -80,15 +81,6 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
         storeManager.createSchema(classesToBePersisted, asProperties(props));
     }
 
-    private static Set<String> catalogClassesToBePersisted(Collection<ObjectSpecification> objectSpecs) {
-        Set<String> classNames = Sets.newTreeSet();
-        for (final ObjectSpecification spec : objectSpecs) {
-            if(spec.containsFacet(JdoPersistenceCapableFacet.class) || spec.containsFacet(JdoEmbeddedOnlyFacet.class)) {
-                classNames.add(spec.getFullIdentifier());
-            }
-        }
-        return Collections.unmodifiableSet(classNames);
-    }
 
     private static Properties asProperties(Map<String, String> props) {
         Properties properties = new Properties();
@@ -96,9 +88,10 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
         return properties;
     }
 
-    private static Map<String, JdoNamedQuery> catalogNamedQueries(Collection<ObjectSpecification> objectSpecs) {
+    private static Map<String, JdoNamedQuery> catalogNamedQueries(Set<String> persistableClassNames) {
         final Map<String, JdoNamedQuery> namedQueryByName = Maps.newHashMap();
-        for (final ObjectSpecification spec : objectSpecs) {
+        for (final String persistableClassName: persistableClassNames) {
+            final ObjectSpecification spec = IsisContext.getSpecificationLoader().loadSpecification(persistableClassName);
             final JdoQueryFacet facet = spec.getFacet(JdoQueryFacet.class);
             if (facet == null) {
                 continue;

http://git-wip-us.apache.org/repos/asf/isis/blob/37beb951/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 8b68d9b..bf4eb15 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -18,7 +18,12 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.Sets;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,6 +33,7 @@ import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
@@ -48,7 +54,9 @@ import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.Auditab
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.datastoreidentity.JdoDatastoreIdentityAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.discriminator.JdoDiscriminatorAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.embeddedonly.JdoEmbeddedOnlyAnnotationFacetFactory;
+import org.apache.isis.objectstore.jdo.metamodel.facets.object.embeddedonly.JdoEmbeddedOnlyFacet;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableAnnotationFacetFactory;
+import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.version.JdoVersionAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.prop.column.BigDecimalDerivedFromJdoColumnAnnotationFacetFactory;
@@ -57,6 +65,7 @@ import org.apache.isis.objectstore.jdo.metamodel.facets.prop.column.MaxLengthDer
 import org.apache.isis.objectstore.jdo.metamodel.facets.prop.notpersistent.JdoNotPersistentAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.prop.primarykey.JdoPrimaryKeyAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.specloader.validator.JdoMetaModelValidator;
+import org.apache.isis.objectstore.jdo.service.RegisterEntities;
 
 /**
  * Configuration files are read in the usual fashion (as per {@link Installer#getConfigurationResources()}, ie will consult all of:
@@ -108,8 +117,22 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
         final IsisConfiguration dataNucleusConfig = configuration.createSubset(ISIS_CONFIG_PREFIX);
         final Map<String, String> props = dataNucleusConfig.asMap();
         addDataNucleusPropertiesIfRequired(props);
+
+        final Set<String> classesToBePersisted = catalogClassesToBePersisted(configuration, getSpecificationLoader().allSpecifications());
+        applicationComponents = new DataNucleusApplicationComponents(props, classesToBePersisted);
+    }
+
+    private static Set<String> catalogClassesToBePersisted(final IsisConfiguration configuration, Collection<ObjectSpecification> objectSpecs) {
+        final RegisterEntities registerEntities = new RegisterEntities();
+        registerEntities.init(configuration.asMap());
         
-        applicationComponents = new DataNucleusApplicationComponents(props, getSpecificationLoader().allSpecifications());
+        Set<String> classNames = Sets.newTreeSet();
+        for (final ObjectSpecification spec : objectSpecs) {
+            if(spec.containsFacet(JdoPersistenceCapableFacet.class) || spec.containsFacet(JdoEmbeddedOnlyFacet.class)) {
+                classNames.add(spec.getFullIdentifier());
+            }
+        }
+        return Collections.unmodifiableSet(classNames);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/37beb951/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
index 921b06c..d8e260b 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
@@ -27,6 +27,7 @@ import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
 
 import org.reflections.Reflections;
@@ -34,20 +35,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.annotation.Hidden;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
 @Hidden
 public class RegisterEntities {
 
+
     private final static Logger LOG = LoggerFactory.getLogger(RegisterEntities.class);
     
-    private final static String PACKAGE_PREFIX_KEY = "isis.persistor.datanucleus.RegisterEntities.packagePrefix";
+    private static final String LOCAL_KEY = "datanucleus.RegisterEntities.packagePrefix";
+    private final static String QUALIFIED_KEY = "isis.persistor." + LOCAL_KEY;
 
     private String packagePrefixes;
+    
+
 
     @PostConstruct
-    public void init(Map<String,String> props) {
-        packagePrefixes = props.get(PACKAGE_PREFIX_KEY);
+    public void init(Map<String,String> configuration) {
+        packagePrefixes = configuration.get(QUALIFIED_KEY);
+        if(Strings.isNullOrEmpty(packagePrefixes)) {
+            throw new IllegalStateException("Could not locate '" + QUALIFIED_KEY + "' key in property files - aborting");
+        }
         
         registerAllPersistenceCapables();
     }
@@ -58,22 +67,17 @@ public class RegisterEntities {
 
     private void registerAllPersistenceCapables() {
 
-        if(packagePrefixes == null) {
-            LOG.warn("Did not find key '" + PACKAGE_PREFIX_KEY + "' and so entities will not be eagerly registered in the Isis metamodel");
-            return;
-        }
-        
-        for (String packagePrefix : Splitter.on(",").split(packagePrefixes)) {
+        for (final String packagePrefix : Splitter.on(",").split(packagePrefixes)) {
             Reflections reflections = new Reflections(packagePrefix);
             
             Set<Class<?>> entityTypes = 
                     reflections.getTypesAnnotatedWith(PersistenceCapable.class);
             
             if(noEntitiesIn(entityTypes)) {
-                LOG.error("Could not locate any PersistenceCapable entities in " + packagePrefix);
+                throw new IllegalStateException("Could not locate any @PersistenceCapable entities in package " + packagePrefix);
             }
             for (Class<?> entityType : entityTypes) {
-                IsisContext.getSpecificationLoader().loadSpecification(entityType);
+                getSpecificationLoader().loadSpecification(entityType);
             }
         }
     }
@@ -94,6 +98,13 @@ public class RegisterEntities {
             }
         };
     }
-    
+
+    // //////////////////////////////////////
+
+    SpecificationLoaderSpi getSpecificationLoader() {
+        return IsisContext.getSpecificationLoader();
+    }
+
+
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/37beb951/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
index 98bddb4..f6f9f0e 100644
--- a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -158,8 +158,6 @@ isis.reflector.facet-decorators=org.apache.isis.core.progmodel.facetdecorators.i
 
 #isis.services.prefix = 
 isis.services = \
-                0:org.apache.isis.objectstore.jdo.service.RegisterEntities,\
-                \
                 10:dom.todo.ToDoItems,\
                 20:app.ToDoItemAnalysis,\
                 dom.todo.ToDoItemContributions,\

http://git-wip-us.apache.org/repos/asf/isis/blob/37beb951/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
index 3944f0f..7c1f234 100644
--- a/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -158,8 +158,6 @@ isis.reflector.facet-decorators=org.apache.isis.core.progmodel.facetdecorators.i
 
 #isis.services.prefix = 
 isis.services = \
-                0:org.apache.isis.objectstore.jdo.service.RegisterEntities,\
-                \
                 10:dom.simple.SimpleObjects,\
                 services.ClockService,\
                 \