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 2015/03/03 21:22:58 UTC

[06/20] isis git commit: Refactored PersistenceCapable to Persistable

Refactored PersistenceCapable to Persistable

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

Branch: refs/heads/ISIS-789
Commit: fe4ee42342523e772c29cbd81c8bcf18d1bc7a4f
Parents: 9752a09
Author: jdbranham <Je...@Sprint.com>
Authored: Mon Dec 29 21:47:15 2014 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Wed Dec 31 17:42:04 2014 -0600

----------------------------------------------------------------------
 core/metamodel/pom.xml                          | 14 -----
 ...DatanucleusPersistableTypesFacetFactory.java | 14 +++++
 .../AbstractRemoveMethodsFacetFactory.java      |  1 +
 ...PersistableEnhancementTypesFacetFactory.java | 14 +++++
 .../jdo/datanucleus/DataNucleusObjectStore.java | 11 ++--
 ...ataNucleusPersistenceMechanismInstaller.java |  4 ++
 .../IsisConfigurationForJdoIntegTests.java      | 11 ++--
 .../jdo/datanucleus/JDOStateManagerForIsis.java | 60 ++++++++++++++++++--
 .../persistence/FrameworkSynchronizer.java      | 42 +++++++-------
 .../persistence/IsisLifecycleListener.java      | 19 +++----
 .../jdo/datanucleus/persistence/Utils.java      | 13 +++--
 .../PersistenceQueryProcessorAbstract.java      |  9 ++-
 .../src/main/webapp/WEB-INF/isis.properties     | 11 ++--
 .../WEB-INF/persistor_datanucleus.properties    |  9 ++-
 .../integration/tests/ToDoItemIntegTest.java    |  1 +
 .../src/main/webapp/WEB-INF/isis.properties     | 11 ++--
 .../WEB-INF/persistor_datanucleus.properties    |  8 +--
 17 files changed, 166 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/metamodel/pom.xml
----------------------------------------------------------------------
diff --git a/core/metamodel/pom.xml b/core/metamodel/pom.xml
index f4cb1bc..7c7b1b0 100644
--- a/core/metamodel/pom.xml
+++ b/core/metamodel/pom.xml
@@ -105,20 +105,6 @@
             <scope>provided</scope>
         </dependency>
 
-		<dependency>
-			<groupId>org.apache.isis.core</groupId>
-			<artifactId>isis-core-applib</artifactId>
-		</dependency>
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-accessplatform-jdo-rdbms</artifactId>
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>org.datanucleus</groupId>
-            <artifactId>datanucleus-jodatime</artifactId>
-        </dependency>
-
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDatanucleusPersistableTypesFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDatanucleusPersistableTypesFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDatanucleusPersistableTypesFacetFactory.java
new file mode 100644
index 0000000..67402d1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDatanucleusPersistableTypesFacetFactory.java
@@ -0,0 +1,14 @@
+package org.apache.isis.core.metamodel.facets.object.ignore.datanucleus;
+
+import org.apache.isis.core.metamodel.facets.object.ignore.javalang.AbstractRemoveMethodsFacetFactory;
+
+/**
+ * Removes all methods inherited from <tt>org.datanucleus.enhancer.Persistable</tt> (if datanucleus 4.x is on the classpath).
+ */
+public class RemoveDatanucleusPersistableTypesFacetFactory extends AbstractRemoveMethodsFacetFactory {
+
+    public RemoveDatanucleusPersistableTypesFacetFactory() {
+        super("org.datanucleus.enhancer.Persistable");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/AbstractRemoveMethodsFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/AbstractRemoveMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/AbstractRemoveMethodsFacetFactory.java
index 87c139d..ab4665c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/AbstractRemoveMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/AbstractRemoveMethodsFacetFactory.java
@@ -61,6 +61,7 @@ public abstract class AbstractRemoveMethodsFacetFactory extends FacetFactoryAbst
             addMethodsToBeIgnored(typeToIgnore);
         } catch(Exception ex) {
             // ignore
+        	System.out.println(ex.getMessage());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/jdo/RemoveJdoPersistableEnhancementTypesFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/jdo/RemoveJdoPersistableEnhancementTypesFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/jdo/RemoveJdoPersistableEnhancementTypesFacetFactory.java
new file mode 100644
index 0000000..070d722
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/jdo/RemoveJdoPersistableEnhancementTypesFacetFactory.java
@@ -0,0 +1,14 @@
+package org.apache.isis.core.metamodel.facets.object.ignore.jdo;
+
+import org.apache.isis.core.metamodel.facets.object.ignore.javalang.AbstractRemoveMethodsFacetFactory;
+
+/**
+ * Removes all methods inherited from <tt>javax.jdo.spi.Persistable</tt> (if JDO is on the classpath).
+ */
+public class RemoveJdoPersistableEnhancementTypesFacetFactory extends AbstractRemoveMethodsFacetFactory {
+
+    public RemoveJdoPersistableEnhancementTypesFacetFactory() {
+        super("javax.jdo.spi.Persistable");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
index aa0d2c7..fdf36b8 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
@@ -22,13 +22,15 @@ import java.sql.Connection;
 import java.text.MessageFormat;
 import java.util.List;
 import java.util.Map;
+
 import javax.jdo.FetchGroup;
 import javax.jdo.FetchPlan;
 import javax.jdo.PersistenceManager;
 import javax.jdo.Query;
-import javax.jdo.spi.PersistenceCapable;
+
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
@@ -71,6 +73,7 @@ import org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucl
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.*;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.JdoObjectIdSerializer;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoNamedQuery;
+import org.datanucleus.enhancer.Persistable;
 
 import static org.apache.isis.core.commons.ensure.Ensure.*;
 import static org.hamcrest.CoreMatchers.is;
@@ -426,10 +429,10 @@ public class DataNucleusObjectStore implements ObjectStore {
 
     
     public ObjectAdapter lazilyLoaded(Object pojo) {
-        if(!(pojo instanceof PersistenceCapable)) {
+        if(!(pojo instanceof Persistable)) {
             return null;
         } 
-        final PersistenceCapable persistenceCapable = (PersistenceCapable) pojo;
+        final Persistable persistenceCapable = (Persistable) pojo;
         return frameworkSynchronizer.lazilyLoaded(persistenceCapable, CalledFrom.OS_LAZILYLOADED);
     }
 
@@ -493,7 +496,7 @@ public class DataNucleusObjectStore implements ObjectStore {
         // listener, but (with JPA impl) found it was required if we were ever to 
         // get an eager left-outer-join as the result of a refresh (sounds possible).
         
-        frameworkSynchronizer.postLoadProcessingFor((PersistenceCapable) domainObject, CalledFrom.OS_RESOLVE);
+        frameworkSynchronizer.postLoadProcessingFor((Persistable) domainObject, CalledFrom.OS_RESOLVE);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 1b7ca82..b55f1b7 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -22,11 +22,14 @@ 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;
 import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facets.object.ignore.datanucleus.RemoveDatanucleusPersistableTypesFacetFactory;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -206,6 +209,7 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
         
         programmingModel.addFactory(AuditableAnnotationInJdoApplibFacetFactory.class);
         programmingModel.addFactory(AuditableMarkerInterfaceInJdoApplibFacetFactory.class);
+        programmingModel.addFactory(RemoveDatanucleusPersistableTypesFacetFactory.class);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java
index 6df273f..ca69c8e 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java
@@ -63,15 +63,18 @@ public class IsisConfigurationForJdoIntegTests extends IsisConfigurationDefault
 
         // run-in memory
         addDataNucleusProperty("javax.jdo.option.ConnectionURL", "jdbc:hsqldb:mem:test");
+        addDataNucleusProperty("javax.jdo.option.ConnectionDriverName", "org.hsqldb.jdbcDriver");
+        addDataNucleusProperty("javax.jdo.option.ConnectionUserName", "sa");
+        addDataNucleusProperty("javax.jdo.option.ConnectionPassword", "");
 
         // Don't do validations that consume setup time.
-        addDataNucleusProperty("datanucleus.autoCreateSchema", "true");
-        addDataNucleusProperty("datanucleus.validateTables", "false");
-        addDataNucleusProperty("datanucleus.validateConstraints", "false");
+        addDataNucleusProperty("datanucleus.schema.autoCreateAll", "true");
+        addDataNucleusProperty("datanucleus.schmema.validateTables", "true");
+        addDataNucleusProperty("datanucleus.schema.validateConstraints", "false");
 
         // other properties as per WEB-INF/persistor_datanucleus.properties
         addDataNucleusProperty("datanucleus.persistenceByReachabilityAtCommit", "false");
-        addDataNucleusProperty("datanucleus.identifier.case", "PreserveCase");
+        addDataNucleusProperty("datanucleus.identifier.case", "MixedCase");
         addDataNucleusProperty("datanucleus.cache.level2.type","none");
         addDataNucleusProperty("datanucleus.cache.level2.mode","ENABLE_SELECTIVE");
 

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
index b3dfe7a..fc71c7a 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/JDOStateManagerForIsis.java
@@ -19,18 +19,22 @@
 
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.objectstore.jdo.datanucleus.service.eventbus.EventBusServiceJdo;
+import javax.jdo.spi.PersistenceCapable;
+import javax.jdo.spi.StateManager;
+
 import org.datanucleus.ExecutionContext;
 import org.datanucleus.cache.CachedPC;
 import org.datanucleus.enhancer.Persistable;
 import org.datanucleus.metadata.AbstractClassMetaData;
 import org.datanucleus.state.ObjectProvider;
 import org.datanucleus.state.ReferentialStateManagerImpl;
+import org.datanucleus.store.FieldValues;
 import org.datanucleus.store.fieldmanager.FieldManager;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.objectstore.jdo.datanucleus.service.eventbus.EventBusServiceJdo;
 
-public class JDOStateManagerForIsis extends ReferentialStateManagerImpl implements ObjectProvider<Persistable> {
+public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
 
     public JDOStateManagerForIsis(ExecutionContext ec, AbstractClassMetaData cmd) {
         super(ec, cmd);
@@ -51,7 +55,51 @@ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl implemen
         };
     };
 
+    public void initialiseForHollow(Object id, FieldValues fv, Class pcClass) {
+        super.initialiseForHollow(id, fv, pcClass);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForHollowAppId(FieldValues fv, Class pcClass) {
+        super.initialiseForHollowAppId(fv, pcClass);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForHollowPreConstructed(Object id, Persistable pc) {
+        super.initialiseForHollowPreConstructed(id, pc);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForPersistentClean(Object id, Persistable pc) {
+        super.initialiseForPersistentClean(id, pc);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForEmbedded(Persistable pc, boolean copyPc) {
+        super.initialiseForEmbedded(pc, copyPc);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForPersistentNew(Persistable pc,
+            FieldValues preInsertChanges) {
+        super.initialiseForPersistentNew(pc, preInsertChanges);
+        mapIntoIsis(myPC);
+    }
 
+    public void initialiseForTransactionalTransient(Persistable pc) {
+        super.initialiseForTransactionalTransient(pc);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForDetached(Persistable pc, Object id, Object version) {
+        super.initialiseForDetached(pc, id, version);
+        mapIntoIsis(myPC);
+    }
+
+    public void initialiseForPNewToBeDeleted(Persistable pc) {
+        super.initialiseForPNewToBeDeleted(pc);
+        mapIntoIsis(myPC);
+    }
 
     public void initialiseForCachedPC(CachedPC cachedPC, Object id) {
         super.initialiseForCachedPC(cachedPC, id);
@@ -101,8 +149,8 @@ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl implemen
         }
     }
 
-    protected void mapIntoIsis(Persistable myPC) {
-        getServicesInjector().injectServicesInto(myPC);
+    protected void mapIntoIsis(Persistable pc) {
+        getServicesInjector().injectServicesInto(pc);
     }
 
     protected ServicesInjectorSpi getServicesInjector() {

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
index 66b7f1c..2baa776 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
@@ -20,9 +20,10 @@ package org.apache.isis.objectstore.jdo.datanucleus.persistence;
 
 import java.text.MessageFormat;
 import java.util.concurrent.Callable;
+
 import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManager;
-import javax.jdo.spi.PersistenceCapable;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -43,6 +44,7 @@ import org.apache.isis.core.runtime.system.persistence.OidGenerator;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore;
+import org.datanucleus.enhancer.Persistable;
 
 public class FrameworkSynchronizer {
 
@@ -68,12 +70,12 @@ public class FrameworkSynchronizer {
     }
 
 
-    public void postLoadProcessingFor(final PersistenceCapable pojo, CalledFrom calledFrom) {
+    public void postLoadProcessingFor(final Persistable pojo, CalledFrom calledFrom) {
 
         withLogging(pojo, new Runnable() {
             @Override
             public void run() {
-                final PersistenceCapable pc = pojo;
+                final Persistable pc = pojo;
                 
                 // need to do eagerly, because (if a viewModel then) a
                 // viewModel's #viewModelMemento might need to use services 
@@ -131,7 +133,7 @@ public class FrameworkSynchronizer {
                     PersistorUtil.toEndState(adapter);
                 }
                 adapter.setVersion(datastoreVersion);
-                if(pojo.jdoIsDeleted()) {
+                if(pojo.dnIsDeleted()) {
                     adapter.changeState(ResolveState.DESTROYED);
                 }
 
@@ -149,7 +151,7 @@ public class FrameworkSynchronizer {
      * The implementation therefore uses Isis' {@link org.apache.isis.core.metamodel.adapter.oid.Oid#isTransient() oid}
      * to determine which callback to fire.
      */
-    public void preStoreProcessingFor(final PersistenceCapable pojo, final CalledFrom calledFrom) {
+    public void preStoreProcessingFor(final Persistable pojo, final CalledFrom calledFrom) {
         withLogging(pojo, new Runnable() {
             @Override
             public void run() {
@@ -183,14 +185,14 @@ public class FrameworkSynchronizer {
      * The implementation therefore uses Isis' {@link org.apache.isis.core.metamodel.adapter.oid.Oid#isTransient() oid}
      * to determine which callback to fire.
      */
-    public void postStoreProcessingFor(final PersistenceCapable pojo, CalledFrom calledFrom) {
+    public void postStoreProcessingFor(final Persistable pojo, CalledFrom calledFrom) {
         withLogging(pojo, new Runnable() {
             @Override
             public void run() {
                 ensureRootObject(pojo);
 
                 // assert is persistent
-                if(!pojo.jdoIsPersistent()) {
+                if(!pojo.dnIsPersistent()) {
                     throw new IllegalStateException("Pojo JDO state is not persistent! pojo dnOid: " + JDOHelper.getObjectId(pojo));
                 }
 
@@ -225,7 +227,7 @@ public class FrameworkSynchronizer {
         }, calledFrom);
     }
 
-    public void preDirtyProcessingFor(final PersistenceCapable pojo, CalledFrom calledFrom) {
+    public void preDirtyProcessingFor(final Persistable pojo, CalledFrom calledFrom) {
         withLogging(pojo, new Runnable() {
             @Override
             public void run() {
@@ -265,7 +267,7 @@ public class FrameworkSynchronizer {
     }
 
 
-    public ObjectAdapter lazilyLoaded(final PersistenceCapable pojo, CalledFrom calledFrom) {
+    public ObjectAdapter lazilyLoaded(final Persistable pojo, CalledFrom calledFrom) {
         return withLogging(pojo, new Callable<ObjectAdapter>() {
             @Override
             public ObjectAdapter call() {
@@ -280,7 +282,7 @@ public class FrameworkSynchronizer {
     }
 
     
-    public void preDeleteProcessingFor(final PersistenceCapable pojo, final CalledFrom calledFrom) {
+    public void preDeleteProcessingFor(final Persistable pojo, final CalledFrom calledFrom) {
         withLogging(pojo, new Runnable() {
             @Override
             public void run() {
@@ -296,7 +298,7 @@ public class FrameworkSynchronizer {
         
     }
 
-    public void postDeleteProcessingFor(final PersistenceCapable pojo, final CalledFrom calledFrom) {
+    public void postDeleteProcessingFor(final Persistable pojo, final CalledFrom calledFrom) {
         withLogging(pojo, new Runnable() {
             @Override
             public void run() {
@@ -327,7 +329,7 @@ public class FrameworkSynchronizer {
     // Helpers
     // /////////////////////////////////////////////////////////
     
-    private <T> T withLogging(PersistenceCapable pojo, Callable<T> runnable, CalledFrom calledFrom) {
+    private <T> T withLogging(Persistable pojo, Callable<T> runnable, CalledFrom calledFrom) {
         if (LOG.isDebugEnabled()) {
             LOG.debug(logString(calledFrom, LoggingLocation.ENTRY, pojo));
         }
@@ -342,7 +344,7 @@ public class FrameworkSynchronizer {
         }
     }
     
-    private void withLogging(PersistenceCapable pojo, final Runnable runnable, CalledFrom calledFrom) {
+    private void withLogging(Persistable pojo, final Runnable runnable, CalledFrom calledFrom) {
         withLogging(pojo, new Callable<Void>() {
 
             @Override
@@ -354,7 +356,7 @@ public class FrameworkSynchronizer {
         }, calledFrom);
     }
     
-    private String logString(CalledFrom calledFrom, LoggingLocation location, PersistenceCapable pojo) {
+    private String logString(CalledFrom calledFrom, LoggingLocation location, Persistable pojo) {
         final AdapterManager adapterManager = getAdapterManager();
         final ObjectAdapter adapter = adapterManager.getAdapterFor(pojo);
         // initial spaces just to look better in log when wrapped by IsisLifecycleListener...
@@ -366,11 +368,11 @@ public class FrameworkSynchronizer {
     // More Helpers...
     // /////////////////////////////////////////////////////////
 
-    void ensureFrameworksInAgreement(final PersistenceCapable pojo) {
+    void ensureFrameworksInAgreement(final Persistable pojo) {
         final ObjectAdapter adapter = getAdapterManager().getAdapterFor(pojo);
         final Oid oid = adapter.getOid();
 
-        if(!pojo.jdoIsPersistent()) {
+        if(!pojo.dnIsPersistent()) {
             // make sure the adapter is transient
             if (!adapter.getResolveState().isTransient()) {
                 throw new IsisException(MessageFormat.format("adapter oid={0} has resolve state in invalid state; should be transient but is {1}; pojo: {2}", oid, adapter.getResolveState(), pojo));
@@ -381,7 +383,7 @@ public class FrameworkSynchronizer {
                 throw new IsisException(MessageFormat.format("adapter oid={0} has oid in invalid state; should be transient; pojo: {1}", oid, pojo));
             }
 
-        } else if(pojo.jdoIsDeleted()) {
+        } else if(pojo.dnIsDeleted()) {
             
             // make sure the adapter is destroyed
             if (!adapter.getResolveState().isDestroyed()) {
@@ -406,19 +408,19 @@ public class FrameworkSynchronizer {
 
     // make sure the entity is known to Isis and is a root
     // TODO: will probably need to handle aggregated entities at some point...
-    void ensureRootObject(final PersistenceCapable pojo) {
+    void ensureRootObject(final Persistable pojo) {
         final Oid oid = getAdapterManager().adapterFor(pojo).getOid();
         if (!(oid instanceof RootOid)) {
             throw new IsisException(MessageFormat.format("Not a RootOid: oid={0}, for {1}", oid, pojo));
         }
     }
 
-    private Version getVersionIfAny(final PersistenceCapable pojo) {
+    private Version getVersionIfAny(final Persistable pojo) {
         return Utils.getVersionIfAny(pojo, getAuthenticationSession());
     }
 
     @SuppressWarnings("unused")
-    private void ensureObjectNotLoaded(final PersistenceCapable pojo) {
+    private void ensureObjectNotLoaded(final Persistable pojo) {
         final ObjectAdapter adapter = getAdapterManager().getAdapterFor(pojo);
         if(adapter != null) {
             final Oid oid = adapter.getOid();

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
index 33c7680..dc8a5e7 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
@@ -29,17 +29,16 @@ import javax.jdo.listener.DirtyLifecycleListener;
 import javax.jdo.listener.InstanceLifecycleEvent;
 import javax.jdo.listener.LoadLifecycleListener;
 import javax.jdo.listener.StoreLifecycleListener;
-import javax.jdo.spi.PersistenceCapable;
 
 import com.google.common.collect.Maps;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer.CalledFrom;
+import org.datanucleus.enhancer.Persistable;
 
 public class IsisLifecycleListener implements AttachLifecycleListener, ClearLifecycleListener, CreateLifecycleListener, DeleteLifecycleListener, DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLifecycleListener, SuspendableListener {
 
@@ -76,7 +75,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
         withLogging(Phase.POST, event, new RunnableAbstract(event){
             @Override
             protected void doRun() {
-                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                final Persistable pojo = Utils.persistenceCapableFor(event);
                 synchronizer.postLoadProcessingFor(pojo, CalledFrom.EVENT_LOAD);
             }});
     }
@@ -86,7 +85,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
         withLogging(Phase.PRE, event, new RunnableAbstract(event){
             @Override
             protected void doRun() {
-                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                final Persistable pojo = Utils.persistenceCapableFor(event);
                 synchronizer.preStoreProcessingFor(pojo, CalledFrom.EVENT_PRESTORE);
 
             }});
@@ -97,7 +96,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
         withLogging(Phase.POST, event, new RunnableAbstract(event){
             @Override
             protected void doRun() {
-                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                final Persistable pojo = Utils.persistenceCapableFor(event);
                 synchronizer.postStoreProcessingFor(pojo, CalledFrom.EVENT_POSTSTORE);
             }});
     }
@@ -107,7 +106,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
         withLogging(Phase.PRE, event, new RunnableAbstract(event){
             @Override
             protected void doRun() {
-                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                final Persistable pojo = Utils.persistenceCapableFor(event);
                 synchronizer.preDirtyProcessingFor(pojo, CalledFrom.EVENT_PREDIRTY);
             }});
     }
@@ -129,7 +128,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
         withLogging(Phase.PRE, event, new RunnableAbstract(event){
             @Override
             protected void doRun() {
-                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                final Persistable pojo = Utils.persistenceCapableFor(event);
                 synchronizer.preDeleteProcessingFor(pojo, CalledFrom.EVENT_PREDELETE);
             }
         });
@@ -140,7 +139,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
         withLogging(Phase.POST, event, new RunnableAbstract(event){
             @Override
             protected void doRun() {
-                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                final Persistable pojo = Utils.persistenceCapableFor(event);
                 synchronizer.postDeleteProcessingFor(pojo, CalledFrom.EVENT_POSTDELETE);
             }
         });
@@ -221,7 +220,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
             super(event);
         }
         protected void doRun() {
-            final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+            final Persistable pojo = Utils.persistenceCapableFor(event);
             synchronizer.ensureRootObject(pojo);
             synchronizer.ensureFrameworksInAgreement(pojo);
         } 
@@ -268,7 +267,7 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
     }
 
     private String logString(Phase phase, LoggingLocation location, InstanceLifecycleEvent event) {
-        final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+        final Persistable pojo = Utils.persistenceCapableFor(event);
         final AdapterManager adapterManager = getAdapterManager();
         final ObjectAdapter adapter = adapterManager.getAdapterFor(pojo);
         return phase + " " + location.prefix + " " + LifecycleEventType.lookup(event.getEventType()) + ": oid=" + (adapter !=null? adapter.getOid(): "(null)") + " ,pojo " + pojo;

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/Utils.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/Utils.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/Utils.java
index 2577708..6577788 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/Utils.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/Utils.java
@@ -27,26 +27,27 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
 import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.datanucleus.enhancer.Persistable;
 
 public class Utils {
 
     @SuppressWarnings("unused")
     private static Object jdoObjectIdFor(InstanceLifecycleEvent event) {
-        PersistenceCapable persistenceCapable = Utils.persistenceCapableFor(event);
-        Object jdoObjectId = persistenceCapable.jdoGetObjectId();
+        Persistable persistenceCapable = Utils.persistenceCapableFor(event);
+        Object jdoObjectId = persistenceCapable.dnGetObjectId();
         return jdoObjectId;
     }
 
-    static PersistenceCapable persistenceCapableFor(InstanceLifecycleEvent event) {
-        return (PersistenceCapable)event.getSource();
+    static Persistable persistenceCapableFor(InstanceLifecycleEvent event) {
+        return (Persistable)event.getSource();
     }
 
     static void clearDirtyFor(final ObjectAdapter adapter) {
         adapter.getSpecification().clearDirty(adapter);
     }
 
-    static Version getVersionIfAny(final PersistenceCapable pojo, final AuthenticationSession authenticationSession) {
-        Object jdoVersion = pojo.jdoGetVersion();
+    static Version getVersionIfAny(final Persistable pojo, final AuthenticationSession authenticationSession) {
+        Object jdoVersion = pojo.dnGetVersion();
         if(jdoVersion instanceof Long) {
             return SerialNumberVersion.create((Long) jdoVersion, authenticationSession.getUserName(), null); 
         } 

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
index d6d3eeb..e7bb229 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
@@ -19,12 +19,14 @@
 package org.apache.isis.objectstore.jdo.datanucleus.persistence.queries;
 
 import java.util.List;
+
 import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.listener.InstanceLifecycleEvent;
 import javax.jdo.metadata.TypeMetadata;
-import javax.jdo.spi.PersistenceCapable;
+
 import com.google.common.collect.Lists;
+
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
@@ -36,6 +38,7 @@ import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer.CalledFrom;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener;
+import org.datanucleus.enhancer.Persistable;
 
 public abstract class PersistenceQueryProcessorAbstract<T extends PersistenceQuery>
         implements PersistenceQueryProcessor<T> {
@@ -77,9 +80,9 @@ public abstract class PersistenceQueryProcessorAbstract<T extends PersistenceQue
         	// ought not to be necessary, however for some queries it seems that the 
         	// lifecycle listener is not called
             ObjectAdapter adapter;
-            if(pojo instanceof PersistenceCapable) {
+            if(pojo instanceof Persistable) {
                 // an entity
-                frameworkSynchronizer.postLoadProcessingFor((PersistenceCapable) pojo, CalledFrom.OS_QUERY);
+                frameworkSynchronizer.postLoadProcessingFor((Persistable) pojo, CalledFrom.OS_QUERY);
                 adapter = getAdapterManager().getAdapterFor(pojo);
             } else {
                 // a value type

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
index 9387f00..c0c87e4 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -79,7 +79,8 @@ isis.authorization=shiro
 # additional programming model facets
 #
 
-#isis.reflector.facets.include=
+isis.reflector.facets.include=org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoPersistableEnhancementTypesFacetFactory, \
+org.apache.isis.core.metamodel.facets.object.ignore.datanucleus.RemoveDatanucleusPersistableTypesFacetFactory
 #isis.reflector.facets.exclude=
 
 
@@ -102,7 +103,7 @@ isis.authorization=shiro
 #
 # patterns for applying CssClassFa facet (font-awesome icons) to member names
 #
-isis.reflector.facet.cssClassFa.patterns=\
+isis.reflector.facet.cssClassFa.patterns=new.*\:fa-plus,add.*\:fa-plus-square,create.*\:fa-plus,update.*\:fa-edit,change.*\:fa-edit,remove.*\:fa-minus-square,move.*\:fa-exchange,first.*\:fa-star,find.*\:fa-search,lookup.*\:fa-search,clear.*\:fa-remove,previous.*\:fa-step-backward,next.*\:fa-step-forward,list.*\:fa-list, all.*\:fa-list, download.*\:fa-download, upload.*\:fa-upload, execute.*\:fa-bolt, run.*\:fa-bolt, calculate.*\:fa-calculator, verify.*\:fa-check-circle, refresh.*\:fa-refresh, install.*\:fa-wrench
                         new.*:fa-plus,\
                         add.*:fa-plus-square,\
                         create.*:fa-plus,\
@@ -128,7 +129,7 @@ isis.reflector.facet.cssClassFa.patterns=\
                         install.*:fa-wrench
 
 
-isis.reflector.facet.cssClass.patterns=\
+isis.reflector.facet.cssClass.patterns=update.*\:btn-default,delete.*\:btn-warning,.*\:btn-primary
                         update.*:btn-default,\
                         delete.*:btn-warning,\
                         .*:btn-primary
@@ -176,11 +177,11 @@ isis.reflector.facet-decorators=org.apache.isis.core.metamodel.facetdecorator.i1
 # end-user gains access to other domain objects by invoking the actions of the domain services.
 #
 isis.services-installer=configuration-and-annotation
-isis.services.ServicesInstallerFromAnnotation.packagePrefix=dom.simple,\
+isis.services.ServicesInstallerFromAnnotation.packagePrefix=dom.simple,fixture.simple,webapp.prototyping
                                                             fixture.simple,\
                                                             webapp.prototyping
 
-isis.services = \
+isis.services = org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\# customizable exception handling, org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\#
                 org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
                 \
                 # customizable exception handling, \

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
index 1ad6572..22ee6d0 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
@@ -37,9 +37,9 @@ isis.persistor.datanucleus.RegisterEntities.packagePrefix=dom
 #
 #####################################################################
 
-isis.persistor.datanucleus.impl.datanucleus.autoCreateSchema=true
-isis.persistor.datanucleus.impl.datanucleus.validateTables=true
-isis.persistor.datanucleus.impl.datanucleus.validateConstraints=true
+isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
 
 
 #
@@ -53,8 +53,7 @@ isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=fa
 # How column names are identified 
 # (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
 #
-isis.persistor.datanucleus.impl.datanucleus.identifier.case=PreserveCase
-
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
 
 #
 # L2 cache

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java b/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
index d4eab58..6998f93 100644
--- a/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
+++ b/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
@@ -65,6 +65,7 @@ public class ToDoItemIntegTest extends AbstractToDoIntegTest {
 
     @Before
     public void setUpData() throws Exception {
+    	final ToDoItem testToDo = toDoItems.newToDo("new todo", ToDoItem.Category.Professional, ToDoItem.Subcategory.OpenSource, null, null);
         fixtureScript = new ToDoItemsRecreateAndCompleteSeveral();
         fixtureScripts.runFixtureScript(fixtureScript, null);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
index bb0d6dd..5b10931 100644
--- a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -79,7 +79,8 @@ isis.authorization=shiro
 # additional programming model facets
 #
 
-#isis.reflector.facets.include=
+isis.reflector.facets.include=org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoPersistableEnhancementTypesFacetFactory, \
+org.apache.isis.core.metamodel.facets.object.ignore.datanucleus.RemoveDatanucleusPersistableTypesFacetFactory
 #isis.reflector.facets.exclude=
 
 
@@ -102,7 +103,7 @@ isis.authorization=shiro
 #
 # patterns for applying CssClassFa facet (font-awesome icons) to member names
 #
-isis.reflector.facet.cssClassFa.patterns=\
+isis.reflector.facet.cssClassFa.patterns=new.*\:fa-plus,add.*\:fa-plus-square,create.*\:fa-plus,update.*\:fa-edit,change.*\:fa-edit,remove.*\:fa-minus-square,move.*\:fa-exchange,first.*\:fa-star,find.*\:fa-search,lookup.*\:fa-search,clear.*\:fa-remove,previous.*\:fa-step-backward,next.*\:fa-step-forward,list.*\:fa-list, all.*\:fa-list, download.*\:fa-download, upload.*\:fa-upload, execute.*\:fa-bolt, run.*\:fa-bolt, calculate.*\:fa-calculator, verify.*\:fa-check-circle, refresh.*\:fa-refresh, install.*\:fa-wrench
                         new.*:fa-plus,\
                         add.*:fa-plus-square,\
                         create.*:fa-plus,\
@@ -127,7 +128,7 @@ isis.reflector.facet.cssClassFa.patterns=\
                         refresh.*:fa-refresh, \
                         install.*:fa-wrench
 
-isis.reflector.facet.cssClass.patterns=\
+isis.reflector.facet.cssClass.patterns=delete.*\:btn-warning,.*\:btn-default
                         delete.*:btn-warning,\
                         .*:btn-default
 
@@ -173,13 +174,13 @@ isis.reflector.facet-decorators=org.apache.isis.core.metamodel.facetdecorator.i1
 # end-user gains access to other domain objects by invoking the actions of the domain services.
 #
 isis.services-installer=configuration-and-annotation
-isis.services.ServicesInstallerFromAnnotation.packagePrefix=app,\
+isis.services.ServicesInstallerFromAnnotation.packagePrefix=app,dom.todo,fixture.todo,webapp.admin,webapp.prototyping
                                                             dom.todo,\
                                                             fixture.todo,\
                                                             webapp.admin,\
                                                             webapp.prototyping
 
-isis.services = \
+isis.services = org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\# customizable exception handling, org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\#,1\:webapp.CustomMementoService,1\:webapp.CustomRepresentationService
                 org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
                 \
                 # customizable exception handling, \

http://git-wip-us.apache.org/repos/asf/isis/blob/fe4ee423/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
index a60a733..051d1dc 100644
--- a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
+++ b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
@@ -38,9 +38,9 @@ isis.persistor.datanucleus.RegisterEntities.packagePrefix=dom
 #
 #####################################################################
 
-isis.persistor.datanucleus.impl.datanucleus.autoCreateSchema=true
-isis.persistor.datanucleus.impl.datanucleus.validateTables=true
-isis.persistor.datanucleus.impl.datanucleus.validateConstraints=true
+isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
 
 
 #
@@ -54,7 +54,7 @@ isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=fa
 # How column names are identified 
 # (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
 #
-isis.persistor.datanucleus.impl.datanucleus.identifier.case=PreserveCase
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
 
 
 #