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:53 UTC

[01/20] isis git commit: changed datanucleus to 4.0.4

Repository: isis
Updated Branches:
  refs/heads/ISIS-789 [created] e2dffa844


changed datanucleus to 4.0.4

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

Branch: refs/heads/ISIS-789
Commit: 5ba11f0dd2eb2039e5de136568624ff29903eb95
Parents: 81dbfd8
Author: jdbranham <Je...@Sprint.com>
Authored: Wed Dec 24 00:41:56 2014 -0600
Committer: jdbranham <Je...@Sprint.com>
Committed: Wed Dec 24 00:43:06 2014 -0600

----------------------------------------------------------------------
 .../classsubstitutor/ClassSubstitutor.java      |  4 ++
 .../dflt/ObjectSpecificationDefault.java        |  5 +-
 core/pom.xml                                    |  6 +-
 .../DataNucleusApplicationComponents.java       |  9 ++-
 .../jdo/datanucleus/JDOStateManagerForIsis.java | 65 +++-----------------
 .../persistence/spi/JdoObjectIdSerializer.java  |  8 +--
 .../datanucleus/valuetypes/IsisDateMapping.java |  9 ++-
 .../valuetypes/IsisDateTimeMapping.java         |  9 ++-
 .../src/main/webapp/WEB-INF/logging.properties  |  2 +-
 9 files changed, 38 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
index c69fe9a..2f61b43 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
@@ -49,6 +49,10 @@ public class ClassSubstitutor {
     //region > getClass(Class)
 
     public Class<?> getClass(final Class<?> cls) {
+    	
+    	if (cls == null) {
+			return null;
+		}
 
         // ignore datanucleus proxies
         if(cls.getName().startsWith("org.datanucleus")) {

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index e0d90bb..6e598de 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -25,8 +25,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+
 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.filter.Filter;
@@ -145,7 +147,8 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
         for (final Class<?> interfaceType : interfaceTypes) {
             final Class<?> substitutedInterfaceType = classSubstitutor.getClass(interfaceType);
             if (substitutedInterfaceType != null) {
-                final ObjectSpecification interfaceSpec = getSpecificationLookup().loadSpecification(substitutedInterfaceType);
+            	SpecificationLoader specificationLoader = getSpecificationLookup();
+                final ObjectSpecification interfaceSpec = specificationLoader.loadSpecification(substitutedInterfaceType);
                 interfaceSpecList.add(interfaceSpec);
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 8747fed..361f841 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -86,9 +86,9 @@
 [6] https://github.com/moment/moment/blob/develop/LICENSE</license.additional-notes>
 
         <!-- from Datanucleus Objectstore -->
-        <datanucleus-accessplatform-jdo-rdbms.version>3.3.6</datanucleus-accessplatform-jdo-rdbms.version>
-        <datanucleus-jodatime.version>3.2.1</datanucleus-jodatime.version>
-        <datanucleus-maven-plugin.version>3.3.2</datanucleus-maven-plugin.version>
+        <datanucleus-accessplatform-jdo-rdbms.version>4.0.4</datanucleus-accessplatform-jdo-rdbms.version>
+        <datanucleus-jodatime.version>4.0.4</datanucleus-jodatime.version>
+        <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version>
 
         <!-- ensure compatible with version aggregated in datanucleus-accessplatform-jdo-rdbms -->
         <jdo-api.version>3.1-rc1</jdo-api.version>

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
index 6ca9e5d..c7c27b3 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
@@ -120,12 +120,15 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     }
 
     private void createSchema(final Map<String, String> props, final Set<String> classesToBePersisted) {
-        final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
+    	//TODO: Cleanup - Schema creation should be handled by configuration
+    	//REF: http://www.datanucleus.org/products/datanucleus/jdo/schema.html
+    	
+        /*final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
         final NucleusContext nucleusContext = jdopmf.getNucleusContext();
         final StoreManager storeManager = nucleusContext.getStoreManager();
         if (storeManager instanceof SchemaAwareStoreManager) {
-            ((SchemaAwareStoreManager)storeManager).createSchema(classesToBePersisted, asProperties(props));
-		}
+            ((SchemaAwareStoreManager)storeManager).createSchemaForClasses(classesToBePersisted, asProperties(props));
+		}*/
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/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 e1c660a..b3dfe7a 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,23 +19,18 @@
 
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-import javax.jdo.spi.PersistenceCapable;
-import javax.jdo.spi.StateManager;
-
+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 org.datanucleus.ExecutionContext;
 import org.datanucleus.cache.CachedPC;
+import org.datanucleus.enhancer.Persistable;
 import org.datanucleus.metadata.AbstractClassMetaData;
-import org.datanucleus.state.JDOStateManager;
 import org.datanucleus.state.ObjectProvider;
-import org.datanucleus.state.ReferentialJDOStateManager;
-import org.datanucleus.store.FieldValues;
+import org.datanucleus.state.ReferentialStateManagerImpl;
 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 ReferentialJDOStateManager implements StateManager, ObjectProvider {
+public class JDOStateManagerForIsis extends ReferentialStateManagerImpl implements ObjectProvider<Persistable> {
 
     public JDOStateManagerForIsis(ExecutionContext ec, AbstractClassMetaData cmd) {
         super(ec, cmd);
@@ -56,51 +51,7 @@ public class JDOStateManagerForIsis extends ReferentialJDOStateManager implement
         };
     };
 
-    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, Object pc) {
-        super.initialiseForHollowPreConstructed(id, pc);
-        mapIntoIsis(myPC);
-    }
-
-    public void initialiseForPersistentClean(Object id, Object pc) {
-        super.initialiseForPersistentClean(id, pc);
-        mapIntoIsis(myPC);
-    }
-
-    public void initialiseForEmbedded(Object pc, boolean copyPc) {
-        super.initialiseForEmbedded(pc, copyPc);
-        mapIntoIsis(myPC);
-    }
-
-    public void initialiseForPersistentNew(Object pc,
-            FieldValues preInsertChanges) {
-        super.initialiseForPersistentNew(pc, preInsertChanges);
-        mapIntoIsis(myPC);
-    }
-
-    public void initialiseForTransactionalTransient(Object pc) {
-        super.initialiseForTransactionalTransient(pc);
-        mapIntoIsis(myPC);
-    }
-
-    public void initialiseForDetached(Object pc, Object id, Object version) {
-        super.initialiseForDetached(pc, id, version);
-        mapIntoIsis(myPC);
-    }
-
-    public void initialiseForPNewToBeDeleted(Object pc) {
-        super.initialiseForPNewToBeDeleted(pc);
-        mapIntoIsis(myPC);
-    }
 
     public void initialiseForCachedPC(CachedPC cachedPC, Object id) {
         super.initialiseForCachedPC(cachedPC, id);
@@ -150,8 +101,8 @@ public class JDOStateManagerForIsis extends ReferentialJDOStateManager implement
         }
     }
 
-    protected void mapIntoIsis(PersistenceCapable pc) {
-        getServicesInjector().injectServicesInto(pc);
+    protected void mapIntoIsis(Persistable myPC) {
+        getServicesInjector().injectServicesInto(myPC);
     }
 
     protected ServicesInjectorSpi getServicesInjector() {

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
index b7374f2..5d4468b 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
@@ -32,7 +32,7 @@ import javax.jdo.identity.LongIdentity;
 import javax.jdo.identity.ObjectIdentity;
 import javax.jdo.identity.StringIdentity;
 
-import org.datanucleus.identity.OID;
+import org.datanucleus.identity.DatastoreId;
 
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -74,9 +74,9 @@ public final class JdoObjectIdSerializer {
                 return "u" + SEPARATOR + uuid.toString(); 
             }
         }
-        if(jdoOid instanceof OID) {
-            OID dnOid = (OID) jdoOid;
-            Object keyValue = dnOid.getKeyValue();
+        if(jdoOid instanceof DatastoreId) {
+        	DatastoreId dnOid = (DatastoreId) jdoOid;
+            Object keyValue = dnOid.getKeyAsObject();
             
             // prettier handling of these common cases
             if(keyValue instanceof String) {

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
index f1664ea..880c0f3 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
@@ -18,11 +18,10 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus.valuetypes;
 
-import org.datanucleus.store.rdbms.mapping.java.ObjectAsLongMapping;
-
+import org.datanucleus.store.rdbms.mapping.java.ObjectMapping;
 import org.apache.isis.applib.value.Date;
 
-public class IsisDateMapping extends ObjectAsLongMapping {
+public class IsisDateMapping extends ObjectMapping {
 
     private final IsisDateConverter dateConverter = new IsisDateConverter();
     
@@ -35,12 +34,12 @@ public class IsisDateMapping extends ObjectAsLongMapping {
         return org.apache.isis.applib.value.Date.class;
     }
 
-    @Override
+    // TODO: Need to check maping
+    
     protected Long objectToLong(Object object) {
         return dateConverter.toDatastoreType((Date) object);
     }
 
-    @Override
     protected Object longToObject(Long datastoreValue) {
         return dateConverter.toMemberType(datastoreValue);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateTimeMapping.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateTimeMapping.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateTimeMapping.java
index 5234942..22b6e77 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateTimeMapping.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateTimeMapping.java
@@ -18,11 +18,10 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus.valuetypes;
 
-import org.datanucleus.store.rdbms.mapping.java.ObjectAsLongMapping;
-
 import org.apache.isis.applib.value.DateTime;
+import org.datanucleus.store.rdbms.mapping.java.ObjectMapping;
 
-public class IsisDateTimeMapping extends ObjectAsLongMapping {
+public class IsisDateTimeMapping extends ObjectMapping {
 
     private final IsisDateTimeConverter dateConverter = new IsisDateTimeConverter();
     
@@ -30,17 +29,17 @@ public class IsisDateTimeMapping extends ObjectAsLongMapping {
         
     }
     
+    //TODO: Configure mapping
+    
     @Override
     public Class<?> getJavaType() {
         return org.apache.isis.applib.value.DateTime.class;
     }
 
-    @Override
     protected Long objectToLong(Object object) {
         return dateConverter.toDatastoreType((DateTime) object);
     }
 
-    @Override
     protected Object longToObject(Long datastoreValue) {
         return dateConverter.toMemberType(datastoreValue);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5ba11f0d/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
index 0467c62..3b5235a 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
@@ -19,7 +19,7 @@
 #
 # Isis uses log4j is used to provide system logging
 #
-log4j.rootCategory=INFO, Console
+log4j.rootCategory=TRACE, Console
 #log4j.rootCategory=DEBUG, Console
 
 


[08/20] isis git commit: minor grammar correction

Posted by da...@apache.org.
minor grammar correction


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

Branch: refs/heads/ISIS-789
Commit: 27052183f88db1768e2da4e0450701b23a351634
Parents: 4a78b4f
Author: jdb6853 <jd...@hotmail.com>
Authored: Thu Jan 1 11:11:44 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Thu Jan 1 11:11:44 2015 -0600

----------------------------------------------------------------------
 .../isis/core/runtime/system/persistence/PersistenceSession.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/27052183/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index 8d4c1cb..b81e851 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -685,7 +685,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
 
     /**
      * Makes an {@link ObjectAdapter} persistent. The specified object should be
-     * stored away via this object store's persistence mechanism, and have an
+     * stored away via this object store's persistence mechanism, and have a
      * new and unique OID assigned to it. The object, should also be added to
      * the {@link org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault} as the object is implicitly 'in use'.
      *


[20/20] isis git commit: Merge commit 'f7284d8fb4fbe58479e819b37e7ee3cc731d57ad' into ISIS-789a

Posted by da...@apache.org.
Merge commit 'f7284d8fb4fbe58479e819b37e7ee3cc731d57ad' into ISIS-789a

Merging Jeremy Branham's work on upgrading DN to 4.0.x.

Resolved conflicts:
	README.md
	core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
	example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
	mothballed/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
	mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties


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

Branch: refs/heads/ISIS-789
Commit: e2dffa844323f4ffcd715fe0f9a94326c58da21e
Parents: 55e569c f7284d8
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Mar 3 19:43:07 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Mar 3 19:43:07 2015 +0000

----------------------------------------------------------------------
 ...DatanucleusPersistableTypesFacetFactory.java |  14 +
 .../RemoveDnPrefixedMethodsFacetFactory.java    |  28 ++
 .../classsubstitutor/ClassSubstitutor.java      |   4 +
 .../dflt/ProgrammingModelFacetsJava5.java       |   5 +
 core/pom.xml                                    |   6 +-
 .../IdentifierGeneratorForDataNucleus.java      |   4 +-
 .../system/persistence/PersistenceSession.java  |   2 +-
 .../DataNucleusApplicationComponents.java       |  30 +-
 .../jdo/datanucleus/DataNucleusObjectStore.java |  11 +-
 ...ataNucleusPersistenceMechanismInstaller.java |  18 +-
 .../IsisConfigurationForJdoIntegTests.java      |  11 +-
 .../jdo/datanucleus/JDOStateManagerForIsis.java |  93 ++++-
 .../persistence/FrameworkSynchronizer.java      |  42 +-
 .../persistence/IsisLifecycleListener.java      |  19 +-
 .../jdo/datanucleus/persistence/Utils.java      |  14 +-
 .../PersistenceQueryProcessorAbstract.java      |   9 +-
 .../persistence/spi/JdoObjectIdSerializer.java  |   8 +-
 .../datanucleus/valuetypes/IsisDateMapping.java |   9 +-
 .../valuetypes/IsisDateTimeMapping.java         |   9 +-
 example/application/neoapp/dom/.gitignore       |   2 +
 example/application/neoapp/dom/log4j.properties |  41 ++
 example/application/neoapp/dom/pom.xml          | 172 ++++++++
 .../dom/src/main/java/META-INF/persistence.xml  |  26 ++
 .../src/main/java/dom/simple/SimpleObject.java  |  76 ++++
 .../java/dom/simple/SimpleObject.layout.json    |  44 ++
 .../src/main/java/dom/simple/SimpleObject.png   | Bin 0 -> 557 bytes
 .../src/main/java/dom/simple/SimpleObjects.java |  63 +++
 .../test/java/dom/simple/SimpleObjectTest.java  |  51 +++
 .../test/java/dom/simple/SimpleObjectsTest.java | 102 +++++
 example/application/neoapp/fixture/.gitignore   |   3 +
 example/application/neoapp/fixture/pom.xml      |  40 ++
 .../simple/SimpleObjectsFixturesService.java    |  69 ++++
 .../simple/SimpleObjectsTearDownFixture.java    |  36 ++
 .../simple/objects/SimpleObjectAbstract.java    |  36 ++
 .../simple/objects/SimpleObjectForBar.java      |  31 ++
 .../simple/objects/SimpleObjectForBaz.java      |  31 ++
 .../simple/objects/SimpleObjectForFoo.java      |  31 ++
 .../simple/scenario/SimpleObjectsFixture.java   |  45 +++
 .../application/neoapp/integtests/.gitignore    |   3 +
 .../neoapp/integtests/logging.properties        | 103 +++++
 example/application/neoapp/integtests/pom.xml   | 159 ++++++++
 .../integration/SimpleAppSystemInitializer.java |  72 ++++
 .../integration/glue/BootstrappingGlue.java     |  53 +++
 .../integration/glue/CatalogOfFixturesGlue.java |  46 +++
 .../glue/InMemoryDBForSimpleApp.java            |  40 ++
 .../glue/simple/SimpleObjectGlue.java           |  96 +++++
 .../java/integration/specs/simple/RunSpecs.java |  38 ++
 .../SimpleObjectSpec_listAllAndCreate.feature   |  37 ++
 .../integration/tests/SimpleAppIntegTest.java   |  38 ++
 .../tests/smoke/SimpleObjectTest.java           |  82 ++++
 .../tests/smoke/SimpleObjectsTest.java          | 148 +++++++
 example/application/neoapp/pom.xml              | 378 ++++++++++++++++++
 example/application/neoapp/webapp/.gitignore    |   3 +
 .../launch/SimpleApp-PROTOTYPE-jrebel.launch    |  31 ++
 .../SimpleApp-PROTOTYPE-no-fixtures.launch      |  23 ++
 .../SimpleApp-PROTOTYPE-with-fixtures.launch    |  20 +
 .../launch/SimpleApp-SERVER-no-fixtures.launch  |  23 ++
 .../webapp/ide/intellij/launch/README.txt       |   2 +
 .../ide/intellij/launch/SimpleApp_PROTOTYPE.xml |  28 ++
 .../launch/SimpleApp__enhance_only_.xml         |  22 +
 .../application/neoapp/webapp/lib/.gitignore    |   5 +
 example/application/neoapp/webapp/messages.log  |   0
 example/application/neoapp/webapp/pom.xml       | 399 +++++++++++++++++++
 .../src/main/java/webapp/SimpleApplication.java | 150 +++++++
 .../src/main/jettyconsole/isis-banner.pdn       | Bin 0 -> 69658 bytes
 .../src/main/jettyconsole/isis-banner.png       | Bin 0 -> 30776 bytes
 .../src/main/resources/webapp/welcome.html      |  35 ++
 .../src/main/webapp/WEB-INF/isis.properties     | 232 +++++++++++
 .../src/main/webapp/WEB-INF/logging.properties  | 185 +++++++++
 .../main/webapp/WEB-INF/persistor.properties    | 128 ++++++
 .../WEB-INF/persistor_datanucleus.properties    |  86 ++++
 .../webapp/src/main/webapp/WEB-INF/shiro.ini    |  93 +++++
 .../WEB-INF/viewer_restfulobjects.properties    |  66 +++
 .../webapp/WEB-INF/viewer_wicket.properties     |  84 ++++
 .../webapp/src/main/webapp/WEB-INF/web.xml      | 309 ++++++++++++++
 .../src/main/webapp/about/images/isis-logo.png  | Bin 0 -> 14160 bytes
 .../webapp/src/main/webapp/about/index.html     | 104 +++++
 .../webapp/src/main/webapp/css/application.css  |  19 +
 .../src/main/webapp/images/spinning-icon.gif    | Bin 0 -> 5266 bytes
 .../src/main/webapp/scripts/application.js      |   3 +
 .../webapp/src/test/resources/NeoBrowser.PNG    | Bin 0 -> 39360 bytes
 example/application/simpleapp/webapp/pom.xml    |  16 +-
 .../src/main/webapp/WEB-INF/logging.properties  |   4 +-
 .../WEB-INF/persistor_datanucleus.properties    |   9 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |   9 +-
 .../integration/tests/ToDoItemIntegTest.java    |   2 +-
 .../example/application/todoapp/webapp/pom.xml  |  16 +-
 .../src/main/webapp/WEB-INF/isis.properties     |   4 +-
 .../WEB-INF/persistor_datanucleus.properties    |   8 +-
 pom.xml                                         |   9 +
 90 files changed, 4523 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IdentifierGeneratorForDataNucleus.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
----------------------------------------------------------------------
diff --cc core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
index fe5b82e,cbcf222..56fcb3b
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
@@@ -24,11 -25,16 +25,14 @@@ import java.util.Set
  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 org.datanucleus.NucleusContext;
+ import org.datanucleus.NucleusContextHelper;
+ import org.datanucleus.PropertyNames;
+ import org.datanucleus.StoreNucleusContext;
  import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
 +import org.datanucleus.metadata.MetaDataListener;
  import org.datanucleus.metadata.MetaDataManager;
  import org.datanucleus.store.StoreManager;
  import org.datanucleus.store.schema.SchemaAwareStoreManager;
@@@ -101,30 -104,36 +105,40 @@@ public class DataNucleusApplicationComp
          instance = this;
      }
  
 -    private void init(final Map<String, String> props, final Set<String> persistableClassNameSet) {
 +    private void initialize() {
          final String persistableClassNames = Joiner.on(',').join(persistableClassNameSet);
          
 -        props.put("datanucleus.autoStartClassNames", persistableClassNames);
 -        persistenceManagerFactory = JDOHelper.getPersistenceManagerFactory(props);
 +        datanucleusProps.put("datanucleus.autoStartClassNames", persistableClassNames);
 +        persistenceManagerFactory = JDOHelper.getPersistenceManagerFactory(datanucleusProps);
  
-         final boolean createSchema = Boolean.parseBoolean(datanucleusProps.get("datanucleus.autoCreateSchema"));
 -        final boolean createSchema = (Boolean.parseBoolean( props.get(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA) ) ||
 -                Boolean.parseBoolean( props.get(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_ALL) ));
++        final boolean createSchema = (Boolean.parseBoolean( datanucleusProps.get(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA) ) ||
++                Boolean.parseBoolean( datanucleusProps.get(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_ALL) ));
          if(createSchema) {
 -            createSchema(props, persistableClassNameSet);
 +            createSchema();
          }
  
          namedQueryByName = catalogNamedQueries(persistableClassNameSet);
 -
      }
      
++
+     public PersistenceManagerFactory getPersistenceManagerFactory() {
+         return persistenceManagerFactory;
+     }
+ 
 -    private void createSchema(final Map<String, String> props, final Set<String> classesToBePersisted) {
 +    private void createSchema() {
+     	//REF: http://www.datanucleus.org/products/datanucleus/jdo/schema.html
+     	
          final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
          final NucleusContext nucleusContext = jdopmf.getNucleusContext();
-         final StoreManager storeManager = nucleusContext.getStoreManager();
-         final MetaDataManager metaDataManager = nucleusContext.getMetaDataManager();
- 
-         registerMetadataListener(metaDataManager);
-         if (storeManager instanceof SchemaAwareStoreManager) {
-             final SchemaAwareStoreManager schemaAwareStoreManager = (SchemaAwareStoreManager) storeManager;
-             schemaAwareStoreManager.createSchema(persistableClassNameSet, asProperties(datanucleusProps));
+         if (nucleusContext instanceof StoreNucleusContext) {
+             final StoreManager storeManager = ((StoreNucleusContext)nucleusContext).getStoreManager();
++        	final MetaDataManager metaDataManager = nucleusContext.getMetaDataManager();
++
++	        registerMetadataListener(metaDataManager);
+             if (storeManager instanceof SchemaAwareStoreManager) {
 -                ((SchemaAwareStoreManager)storeManager).createSchemaForClasses(classesToBePersisted, asProperties(props));
++    	        final SchemaAwareStoreManager schemaAwareStoreManager = (SchemaAwareStoreManager) storeManager;
++        	    schemaAwareStoreManager.createSchema(classesToBePersisted, asProperties(props));
+             }
          }
      }
  

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
----------------------------------------------------------------------
diff --cc core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
index 828115d,fdf36b8..013041e
--- 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
@@@ -72,18 -70,12 +74,19 @@@ import org.apache.isis.objectstore.jdo.
  import org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand;
  import org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusDeleteObjectCommand;
  import org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusUpdateObjectCommand;
 -import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.*;
 +import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor;
 +import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindByPatternProcessor;
 +import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindByTitleProcessor;
 +import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
 +import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
 +import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.QueryUtil;
  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.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 +import static org.apache.isis.core.commons.ensure.Ensure.ensureThatContext;
 +import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
  import static org.hamcrest.CoreMatchers.is;
  import static org.hamcrest.CoreMatchers.notNullValue;
  

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/example/application/simpleapp/webapp/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --cc example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
index 62fd8ea,3b5235a..dc32391
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
@@@ -183,5 -181,5 +183,5 @@@ log4j.additivity.log4j.logger.org.apach
  
  
  # Application-specific logging
 -log4j.logger.dom.todo.ToDoItem=DEBUG, Stderr
 -log4j.additivity.dom.todo.ToDoItem=false
 +log4j.logger.dom.simple.SimpleObject=DEBUG, Stderr
- log4j.additivity.dom.simple.SimpleObject=false
++log4j.additivity.dom.simple.SimpleObject=false

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/mothballed/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --cc mothballed/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index 75f5583,0000000..679e4cd
mode 100644,000000..100644
--- a/mothballed/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/mothballed/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@@ -1,979 -1,0 +1,982 @@@
 +/*
 + *  Licensed to the Apache Software Foundation (ASF) under one
 + *  or more contributor license agreements.  See the NOTICE file
 + *  distributed with this work for additional information
 + *  regarding copyright ownership.  The ASF licenses this file
 + *  to you under the Apache License, Version 2.0 (the
 + *  "License"); you may not use this file except in compliance
 + *  with the License.  You may obtain a copy of the License at
 + *
 + *        http://www.apache.org/licenses/LICENSE-2.0
 + *
 + *  Unless required by applicable law or agreed to in writing,
 + *  software distributed under the License is distributed on an
 + *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + *  KIND, either express or implied.  See the License for the
 + *  specific language governing permissions and limitations
 + *  under the License.
 + */
 +package dom.todo;
 +
 +import java.math.BigDecimal;
 +import java.net.MalformedURLException;
 +import java.net.URL;
 +import java.util.Arrays;
 +import java.util.Collections;
 +import java.util.Comparator;
 +import java.util.List;
 +import java.util.Set;
 +import java.util.SortedSet;
 +import java.util.TreeSet;
 +import javax.jdo.JDOHelper;
 +import javax.jdo.annotations.IdentityType;
 +import javax.jdo.annotations.VersionStrategy;
 +import com.google.common.base.Objects;
 +import com.google.common.base.Predicate;
 +import com.google.common.collect.Ordering;
++import org.datanucleus.enhancer.Persistable;
 +import org.joda.time.LocalDate;
 +import org.apache.isis.applib.DomainObjectContainer;
 +import org.apache.isis.applib.Identifier;
 +import org.apache.isis.applib.NonRecoverableException;
 +import org.apache.isis.applib.RecoverableException;
 +import org.apache.isis.applib.annotation.Action;
 +import org.apache.isis.applib.annotation.BookmarkPolicy;
 +import org.apache.isis.applib.annotation.Collection;
 +import org.apache.isis.applib.annotation.CollectionLayout;
 +import org.apache.isis.applib.annotation.DomainObject;
 +import org.apache.isis.applib.annotation.DomainObjectLayout;
 +import org.apache.isis.applib.annotation.Editing;
 +import org.apache.isis.applib.annotation.RestrictTo;
 +import org.apache.isis.applib.annotation.InvokeOn;
 +import org.apache.isis.applib.annotation.InvokedOn;
 +import org.apache.isis.applib.annotation.Optionality;
 +import org.apache.isis.applib.annotation.Parameter;
 +import org.apache.isis.applib.annotation.ParameterLayout;
 +import org.apache.isis.applib.annotation.Programmatic;
 +import org.apache.isis.applib.annotation.Property;
 +import org.apache.isis.applib.annotation.SemanticsOf;
 +import org.apache.isis.applib.annotation.Where;
 +import org.apache.isis.applib.security.UserMemento;
 +import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 +import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
 +import org.apache.isis.applib.services.eventbus.EventBusService;
 +import org.apache.isis.applib.services.scratchpad.Scratchpad;
 +import org.apache.isis.applib.services.wrapper.HiddenException;
 +import org.apache.isis.applib.services.wrapper.WrapperFactory;
 +import org.apache.isis.applib.util.ObjectContracts;
 +import org.apache.isis.applib.util.TitleBuffer;
 +import org.apache.isis.applib.value.Blob;
 +import org.apache.isis.applib.value.Clob;
 +
 +@javax.jdo.annotations.PersistenceCapable(identityType=IdentityType.DATASTORE)
 +@javax.jdo.annotations.DatastoreIdentity(
 +        strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY,
 +         column="id")
 +@javax.jdo.annotations.Version(
 +        strategy=VersionStrategy.VERSION_NUMBER, 
 +        column="version")
 +@javax.jdo.annotations.Uniques({
 +    @javax.jdo.annotations.Unique(
 +            name="ToDoItem_description_must_be_unique", 
 +            members={"ownedBy","description"})
 +})
 +@javax.jdo.annotations.Queries( {
 +    @javax.jdo.annotations.Query(
 +            name = "findByOwnedBy", language = "JDOQL",
 +            value = "SELECT "
 +                    + "FROM dom.todo.ToDoItem "
 +                    + "WHERE ownedBy == :ownedBy"),
 +    @javax.jdo.annotations.Query(
 +            name = "findByOwnedByAndCompleteIsFalse", language = "JDOQL",
 +            value = "SELECT "
 +                    + "FROM dom.todo.ToDoItem "
 +                    + "WHERE ownedBy == :ownedBy "
 +                    + "   && complete == false"),
 +    @javax.jdo.annotations.Query(
 +            name = "findByOwnedByAndCompleteIsTrue", language = "JDOQL",
 +            value = "SELECT "
 +                    + "FROM dom.todo.ToDoItem "
 +                    + "WHERE ownedBy == :ownedBy "
 +                    + "&& complete == true"),
 +    @javax.jdo.annotations.Query(
 +            name = "findByOwnedByAndCategory", language = "JDOQL",
 +            value = "SELECT "
 +                    + "FROM dom.todo.ToDoItem "
 +                    + "WHERE ownedBy == :ownedBy "
 +                    + "&& category == :category"),
 +    @javax.jdo.annotations.Query(
 +            name = "findByOwnedByAndDescriptionContains", language = "JDOQL",
 +            value = "SELECT "
 +                    + "FROM dom.todo.ToDoItem "
 +                    + "WHERE ownedBy == :ownedBy && "
 +                    + "description.indexOf(:description) >= 0")
 +})
 +@DomainObject(
 +        autoCompleteRepository = ToDoItems.class, // for drop-downs, unless autoCompleteNXxx() is present
 +        autoCompleteAction = "autoComplete",
 +        // bounded = true,  // for drop-downs if only a small number of instances only (overrides autoComplete)
 +        objectType = "TODO"
 +)
 +@DomainObjectLayout(
 +        bookmarking = BookmarkPolicy.AS_ROOT
 +)
 +public class ToDoItem implements Categorized, Comparable<ToDoItem> {
 +
 +    //region > LOG
 +    /**
 +     * It isn't common for entities to log, but they can if required.  
 +     * Isis uses slf4j API internally (with log4j as implementation), and is the recommended API to use. 
 +     */
 +    private final static org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(ToDoItem.class);
 +    //endregion
 +
 +    // region > title, icon
 +    public String title() {
 +        final TitleBuffer buf = new TitleBuffer();
 +        buf.append(getDescription());
 +        if (isComplete()) {
 +            buf.append("- Completed!");
 +        } else {
 +            try {
 +                final LocalDate dueBy = wrapperFactory.wrap(this).getDueBy();
 +                if (dueBy != null) {
 +                    buf.append(" due by", dueBy);
 +                }
 +            } catch(final HiddenException ignored) {
 +            }
 +        }
 +        return buf.toString();
 +    }
 +    
 +    public String iconName() {
 +        return !isComplete() ? "todo" : "done";
 +    }
 +
 +    public String cssClass() { return iconName(); }
 +
 +    //endregion
 +
 +    //region > description (property)
 +    private String description;
 +
 +    @javax.jdo.annotations.Column(allowsNull="false", length=100)
 +    @Property(
 +        regexPattern = "\\w[@&:\\-\\,\\.\\+ \\w]*"
 +    )
 +    public String getDescription() {
 +        return description;
 +    }
 +
 +    public void setDescription(final String description) {
 +        this.description = description;
 +    }
 +    public void modifyDescription(final String description) {
 +        setDescription(description);
 +    }
 +    public void clearDescription() {
 +        setDescription(null);
 +    }
 +    //endregion
 +
 +    //region > dueBy (property)
 +    @javax.jdo.annotations.Persistent(defaultFetchGroup="true")
 +    private LocalDate dueBy;
 +
 +    @javax.jdo.annotations.Column(allowsNull="true")
 +    public LocalDate getDueBy() {
 +        return dueBy;
 +    }
 +
 +    /**
 +     * Demonstrates how to perform security checks within the domain code.
 +     *
 +     * <p>
 +     *     Generally speaking this approach is not recommended; such checks should
 +     *     wherever possible be externalized in the security subsystem.
 +     * </p>
 +     */
 +    public boolean hideDueBy() {
 +        final UserMemento user = container.getUser();
 +        return user.hasRole("realm1:noDueBy_role");
 +    }
 +
 +    public void setDueBy(final LocalDate dueBy) {
 +        this.dueBy = dueBy;
 +    }
 +    public void clearDueBy() {
 +        setDueBy(null);
 +    }
 +    // proposed new value is validated before setting
 +    public String validateDueBy(final LocalDate dueBy) {
 +        if (dueBy == null) {
 +            return null;
 +        }
 +        return toDoItems.validateDueBy(dueBy);
 +    }
 +    //endregion
 +
 +    //region > category and subcategory (property)
 +
 +    public static enum Category {
 +        Professional {
 +            @Override
 +            public List<Subcategory> subcategories() {
 +                return Arrays.asList(null, Subcategory.OpenSource, Subcategory.Consulting, Subcategory.Education, Subcategory.Marketing);
 +            }
 +        }, Domestic {
 +            @Override
 +            public List<Subcategory> subcategories() {
 +                return Arrays.asList(null, Subcategory.Shopping, Subcategory.Housework, Subcategory.Garden, Subcategory.Chores);
 +            }
 +        }, Other {
 +            @Override
 +            public List<Subcategory> subcategories() {
 +                return Arrays.asList(null, Subcategory.Other);
 +            }
 +        };
 +        
 +        public abstract List<Subcategory> subcategories();
 +    }
 +
 +    public static enum Subcategory {
 +        // professional
 +        OpenSource, Consulting, Education, Marketing,
 +        // domestic
 +        Shopping, Housework, Garden, Chores,
 +        // other
 +        Other;
 +
 +        public static List<Subcategory> listFor(final Category category) {
 +            return category != null? category.subcategories(): Collections.<Subcategory>emptyList();
 +        }
 +
 +        static String validate(final Category category, final Subcategory subcategory) {
 +            if(category == null) {
 +                return "Enter category first";
 +            }
 +            return !category.subcategories().contains(subcategory) 
 +                    ? "Invalid subcategory for category '" + category + "'" 
 +                    : null;
 +        }
 +        
 +        public static Predicate<Subcategory> thoseFor(final Category category) {
 +            return new Predicate<Subcategory>() {
 +
 +                @Override
 +                public boolean apply(final Subcategory subcategory) {
 +                    return category.subcategories().contains(subcategory);
 +                }
 +            };
 +        }
 +    }
 +
 +    // //////////////////////////////////////
 +
 +    private Category category;
 +
 +    @javax.jdo.annotations.Column(allowsNull="false")
 +    @Property(
 +            editing = Editing.DISABLED,
 +            editingDisabledReason = "Use action to update both category and subcategory"
 +    )
 +    public Category getCategory() {
 +        return category;
 +    }
 +
 +    public void setCategory(final Category category) {
 +        this.category = category;
 +    }
 +
 +    // //////////////////////////////////////
 +
 +    private Subcategory subcategory;
 +
 +    @javax.jdo.annotations.Column(allowsNull="true")
 +    @Property(
 +            editing = Editing.DISABLED,
 +            editingDisabledReason = "Use action to update both category and subcategory"
 +    )
 +    public Subcategory getSubcategory() {
 +        return subcategory;
 +    }
 +    public void setSubcategory(final Subcategory subcategory) {
 +        this.subcategory = subcategory;
 +    }
 +    //endregion
 +
 +    //region > ownedBy (property)
 +
 +    private String ownedBy;
 +
 +    @javax.jdo.annotations.Column(allowsNull="false")
 +    public String getOwnedBy() {
 +        return ownedBy;
 +    }
 +
 +    public void setOwnedBy(final String ownedBy) {
 +        this.ownedBy = ownedBy;
 +    }
 +    //endregion
 +
 +    //region > complete (property), completed (action), notYetCompleted (action)
 +
 +    private boolean complete;
 +
 +    @Property(
 +        editing = Editing.DISABLED
 +    )
 +    public boolean isComplete() {
 +        return complete;
 +    }
 +
 +    public void setComplete(final boolean complete) {
 +        this.complete = complete;
 +    }
 +
 +    @Action(
 +            domainEvent =CompletedEvent.class,
 +            invokeOn = InvokeOn.OBJECT_AND_COLLECTION
 +    )
 +    public ToDoItem completed() {
 +        setComplete(true);
 +        
 +        //
 +        // remainder of method just demonstrates the use of the Bulk.InteractionContext service 
 +        //
 +        @SuppressWarnings("unused")
 +        final List<Object> allObjects = actionInvocationContext.getDomainObjects();
 +        
 +        LOG.debug("completed: "
 +                + actionInvocationContext.getIndex() +
 +                " [" + actionInvocationContext.getSize() + "]"
 +                + (actionInvocationContext.isFirst() ? " (first)" : "")
 +                + (actionInvocationContext.isLast() ? " (last)" : ""));
 +
 +        // if invoked as a regular action, return this object;
 +        // otherwise (if invoked as bulk), return null (so go back to the list)
 +        return actionInvocationContext.getInvokedOn() == InvokedOn.OBJECT? this: null;
 +    }
 +    // disable action dependent on state of object
 +    public String disableCompleted() {
 +        return isComplete() ? "Already completed" : null;
 +    }
 +
 +    @Action(
 +        invokeOn = InvokeOn.OBJECT_AND_COLLECTION
 +    )
 +    public ToDoItem notYetCompleted() {
 +        setComplete(false);
 +
 +        // if invoked as a regular action, return this object;
 +        // otherwise (if invoked as bulk), return null (so go back to the list)
 +        return actionInvocationContext.getInvokedOn() == InvokedOn.OBJECT ? this: null;
 +    }
 +    // disable action dependent on state of object
 +    public String disableNotYetCompleted() {
 +        return !complete ? "Not yet completed" : null;
 +    }
 +    //endregion
 +
 +    //region > completeSlowly (property)
 +    // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 +    @Action(
 +            hidden = Where.EVERYWHERE
 +    )
 +    public void completeSlowly(final int millis) {
 +        try {
 +            Thread.sleep(millis);
 +        } catch (final InterruptedException ignored) {
 +        }
 +        setComplete(true);
 +    }
 +    //endregion
 +
 +    //region > cost (property), updateCost (action)
 +    private BigDecimal cost;
 +
 +    @javax.jdo.annotations.Column(allowsNull="true", scale=2)
 +    @javax.validation.constraints.Digits(integer=10, fraction=2)
 +    @Property(
 +            editing = Editing.DISABLED,
 +            editingDisabledReason = "Update using action"
 +    )
 +    public BigDecimal getCost() {
 +        return cost;
 +    }
 +
 +    public void setCost(final BigDecimal cost) {
 +        this.cost = cost!=null?cost.setScale(2, BigDecimal.ROUND_HALF_EVEN):null;
 +    }
 +
 +    @Action(
 +            semantics = SemanticsOf.IDEMPOTENT
 +    )
 +    public ToDoItem updateCost(
 +            @Parameter(optionality = Optionality.OPTIONAL)
 +            @ParameterLayout(named = "New cost")
 +            @javax.validation.constraints.Digits(integer=10, fraction=2)
 +            final BigDecimal cost) {
 +        LOG.debug("%s: cost updated: %s -> %s", container.titleOf(this), getCost(), cost);
 +        
 +        // just to simulate a long-running action
 +        try {
 +            Thread.sleep(3000);
 +        } catch (final InterruptedException ignored) {
 +        }
 +        
 +        setCost(cost);
 +        return this;
 +    }
 +
 +    // provide a default value for argument #0
 +    public BigDecimal default0UpdateCost() {
 +        return getCost();
 +    }
 +    
 +    // validate action arguments
 +    public String validateUpdateCost(final BigDecimal proposedCost) {
 +        if(proposedCost == null) { return null; }
 +        return proposedCost.compareTo(BigDecimal.ZERO) < 0? "Cost must be positive": null;
 +    }
 +    //endregion
 +
 +    //region > notes (property)
 +    private String notes;
 +
 +    @javax.jdo.annotations.Column(allowsNull="true", length=400)
 +    public String getNotes() {
 +        return notes;
 +    }
 +
 +    public void setNotes(final String notes) {
 +        this.notes = notes;
 +    }
 +    //endregion
 +
 +    //region > attachment (property)
 +    private Blob attachment;
 +    @javax.jdo.annotations.Persistent(defaultFetchGroup="false", columns = {
 +            @javax.jdo.annotations.Column(name = "attachment_name"),
 +            @javax.jdo.annotations.Column(name = "attachment_mimetype"),
 +            @javax.jdo.annotations.Column(name = "attachment_bytes", jdbcType = "BLOB", sqlType = "BLOB")
 +    })
 +    @Property(
 +            optionality = Optionality.OPTIONAL
 +    )
 +    public Blob getAttachment() {
 +        return attachment;
 +    }
 +
 +    public void setAttachment(final Blob attachment) {
 +        this.attachment = attachment;
 +    }
 +    //endregion
 +
 +    //region > doc (property)
 +    private Clob doc;
 +    @javax.jdo.annotations.Persistent(defaultFetchGroup="false", columns = {
 +            @javax.jdo.annotations.Column(name = "doc_name"),
 +            @javax.jdo.annotations.Column(name = "doc_mimetype"),
 +            @javax.jdo.annotations.Column(name = "doc_chars", jdbcType = "CLOB", sqlType = "CLOB")
 +    })
 +    @Property(
 +            optionality = Optionality.OPTIONAL
 +    )
 +    public Clob getDoc() {
 +        return doc;
 +    }
 +
 +    public void setDoc(final Clob doc) {
 +        this.doc = doc;
 +    }
 +    //endregion
 +
 +    //region > version (derived property)
 +    public Long getVersionSequence() {
-         if(!(this instanceof javax.jdo.spi.PersistenceCapable)) {
++        if(!(this instanceof Persistable)) {
 +            return null;
 +        }
-         return (Long) JDOHelper.getVersion((javax.jdo.spi.PersistenceCapable) this);
++        Persistable persistenceCapable = (Persistable) this;
++        final Long version = (Long) JDOHelper.getVersion(persistenceCapable);
++        return version;
 +    }
 +    // hide property (imperatively, based on state of object)
 +    public boolean hideVersionSequence() {
-         return !(this instanceof javax.jdo.spi.PersistenceCapable);
++        return !(this instanceof Persistable);
 +    }
 +    //endregion
 +
 +    //region > dependencies (property), add (action), remove (action)
 +
 +    // overrides the natural ordering
 +    public static class DependenciesComparator implements Comparator<ToDoItem> {
 +        @Override
 +        public int compare(final ToDoItem p, final ToDoItem q) {
 +            final Ordering<ToDoItem> byDescription = new Ordering<ToDoItem>() {
 +                public int compare(final ToDoItem p, final ToDoItem q) {
 +                    return Ordering.natural().nullsFirst().compare(p.getDescription(), q.getDescription());
 +                }
 +            };
 +            return byDescription
 +                    .compound(Ordering.<ToDoItem>natural())
 +                    .compare(p, q);
 +        }
 +    }
 +
 +    @javax.jdo.annotations.Persistent(table="ToDoItemDependencies")
 +    @javax.jdo.annotations.Join(column="dependingId")
 +    @javax.jdo.annotations.Element(column="dependentId")
 +
 +    private Set<ToDoItem> dependencies = new TreeSet<>();
 +    //private SortedSet<ToDoItem> dependencies = new TreeSet<>();  // not compatible with neo4j (as of DN v3.2.3)
 +
 +    @Collection()
 +    @CollectionLayout(/*sortedBy = DependenciesComparator.class*/) // not compatible with neo4j (as of DN v3.2.3)
 +    public Set<ToDoItem> getDependencies() {
 +        return dependencies;
 +    }
 +
 +    public void setDependencies(final Set<ToDoItem> dependencies) {
 +        this.dependencies = dependencies;
 +    }
 +
 +    public void addToDependencies(final ToDoItem toDoItem) {
 +        getDependencies().add(toDoItem);
 +    }
 +    public void removeFromDependencies(final ToDoItem toDoItem) {
 +        getDependencies().remove(toDoItem);
 +    }
 +
 +    public ToDoItem add(
 +            @ParameterLayout(typicalLength = 20)
 +            final ToDoItem toDoItem) {
 +        // By wrapping the call, Isis will detect that the collection is modified
 +        // and it will automatically send CollectionInteractionEvents to the Event Bus.
 +        // ToDoItemSubscriptions is a demo subscriber to this event
 +        wrapperFactory.wrapSkipRules(this).addToDependencies(toDoItem);
 +        return this;
 +    }
 +    public List<ToDoItem> autoComplete0Add(
 +            @Parameter(minLength = 2)
 +            final String search) {
 +        final List<ToDoItem> list = toDoItems.autoComplete(search);
 +        list.removeAll(getDependencies());
 +        list.remove(this);
 +        return list;
 +    }
 +
 +    public String disableAdd(final ToDoItem toDoItem) {
 +        if(isComplete()) {
 +            return "Cannot add dependencies for items that are complete";
 +        }
 +        return null;
 +    }
 +    // validate the provided argument prior to invoking action
 +    public String validateAdd(final ToDoItem toDoItem) {
 +        if(getDependencies().contains(toDoItem)) {
 +            return "Already a dependency";
 +        }
 +        if(toDoItem == this) {
 +            return "Can't set up a dependency to self";
 +        }
 +        return null;
 +    }
 +
 +    public ToDoItem remove(
 +            @ParameterLayout(typicalLength = 20)
 +            final ToDoItem toDoItem) {
 +        // By wrapping the call, Isis will detect that the collection is modified
 +        // and it will automatically send a CollectionInteractionEvent to the Event Bus.
 +        // ToDoItemSubscriptions is a demo subscriber to this event
 +        wrapperFactory.wrapSkipRules(this).removeFromDependencies(toDoItem);
 +        return this;
 +    }
 +    // disable action dependent on state of object
 +    public String disableRemove(final ToDoItem toDoItem) {
 +        if(isComplete()) {
 +            return "Cannot remove dependencies for items that are complete";
 +        }
 +        return getDependencies().isEmpty()? "No dependencies to remove": null;
 +    }
 +    // validate the provided argument prior to invoking action
 +    public String validateRemove(final ToDoItem toDoItem) {
 +        if(!getDependencies().contains(toDoItem)) {
 +            return "Not a dependency";
 +        }
 +        return null;
 +    }
 +    // provide a drop-down
 +    public java.util.Collection<ToDoItem> choices0Remove() {
 +        return getDependencies();
 +    }
 +    //endregion
 +
 +    //region > clone (action)
 +
 +    // the name of the action in the UI
 +    // nb: method is not called "clone()" is inherited by java.lang.Object and
 +    // (a) has different semantics and (b) is in any case automatically ignored
 +    // by the framework
 +    public ToDoItem duplicate(
 +            @Parameter(regexPattern = "\\w[@&:\\-\\,\\.\\+ \\w]*" )
 +            @ParameterLayout(named="Description")
 +            final String description,
 +            @ParameterLayout(named="Category")
 +            final Category category,
 +            @ParameterLayout(named="Subcategory")
 +            final Subcategory subcategory,
 +            @Parameter(optionality = Optionality.OPTIONAL)
 +            @ParameterLayout(named="Due by")
 +            final LocalDate dueBy,
 +            @Parameter(optionality = Optionality.OPTIONAL)
 +            @ParameterLayout(named="Cost")
 +            final BigDecimal cost) {
 +        return toDoItems.newToDo(description, category, subcategory, dueBy, cost);
 +    }
 +    public String default0Duplicate() {
 +        return getDescription() + " - Copy";
 +    }
 +    public Category default1Duplicate() {
 +        return getCategory();
 +    }
 +    public Subcategory default2Duplicate() {
 +        return getSubcategory();
 +    }
 +    public LocalDate default3Duplicate() {
 +        return getDueBy();
 +    }
 +    public List<Subcategory> choices2Duplicate(
 +            final String description, final Category category) {
 +        return toDoItems.choices2NewToDo(description, category);
 +    }
 +    public String validateDuplicate(
 +            final String description, 
 +            final Category category, final Subcategory subcategory, 
 +            final LocalDate dueBy, final BigDecimal cost) {
 +        return toDoItems.validateNewToDo(description, category, subcategory, dueBy, cost);
 +    }
 +    //endregion
 +
 +    //region > delete (action)
 +    @Action(
 +            domainEvent =DeletedEvent.class,
 +            invokeOn = InvokeOn.OBJECT_AND_COLLECTION
 +    )
 +    public List<ToDoItem> delete() {
 +        
 +        container.removeIfNotAlready(this);
 +
 +        container.informUser("Deleted " + container.titleOf(this));
 +        
 +        // invalid to return 'this' (cannot render a deleted object)
 +        return toDoItems.notYetComplete();
 +    }
 +    //endregion
 +
 +    //region > totalCost (property)
 +    @Action(
 +            semantics = SemanticsOf.SAFE,
 +            invokeOn = InvokeOn.COLLECTION_ONLY
 +    )
 +    public BigDecimal totalCost() {
 +        BigDecimal total = (BigDecimal) scratchpad.get("runningTotal");
 +        if(getCost() != null) {
 +            total = total != null ? total.add(getCost()) : getCost();
 +            scratchpad.put("runningTotal", total);
 +        }
 +        return total.setScale(2, BigDecimal.ROUND_HALF_EVEN);
 +    }
 +    //endregion
 +
 +    //region > openSourceCodeOnGithub (action)
 +    @Action(
 +            semantics = SemanticsOf.SAFE,
 +            restrictTo = RestrictTo.PROTOTYPING
 +    )
 +    public URL openSourceCodeOnGithub() throws MalformedURLException {
 +        return new URL("https://github.com/apache/isis/tree/master/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java");
 +    }
 +    //endregion
 +
 +    //region > demoException (action)
 +
 +    static enum DemoExceptionType {
 +        RecoverableException,
 +        RecoverableExceptionAutoEscalated,
 +        NonRecoverableException;
 +    }
 +
 +    @Action(
 +            semantics = SemanticsOf.SAFE,
 +            restrictTo = RestrictTo.PROTOTYPING
 +    )
 +    public void demoException(
 +            @ParameterLayout(named="Type")
 +            final DemoExceptionType type) {
 +        switch(type) {
 +        case NonRecoverableException:
 +            throw new NonRecoverableException("Demo throwing " + type.name());
 +        case RecoverableException:
 +            throw new RecoverableException("Demo throwing " + type.name());
 +        case RecoverableExceptionAutoEscalated:
 +            try {
 +                // this will trigger an exception (because category cannot be null), causing the xactn to be aborted
 +                setCategory(null);
 +                container.flush();
 +            } catch(Exception e) {
 +                // it's a programming mistake to throw only a recoverable exception here, because of the xactn's state.
 +                // the framework should instead auto-escalate this to a non-recoverable exception
 +                throw new RecoverableException("Demo throwing " + type.name(), e);
 +            }
 +        }
 +    }
 +    //endregion
 +
 +    //region > lifecycle callbacks
 +
 +    public void created() {
 +        LOG.debug("lifecycle callback: created: " + this.toString());
 +    }
 +    public void loaded() {
 +        LOG.debug("lifecycle callback: loaded: " + this.toString());
 +    }
 +    public void persisting() {
 +        LOG.debug("lifecycle callback: persisting: " + this.toString());
 +    }
 +    public void persisted() {
 +        LOG.debug("lifecycle callback: persisted: " + this.toString());
 +    }
 +    public void updating() {
 +        LOG.debug("lifecycle callback: updating: " + this.toString());
 +    }
 +    public void updated() {
 +        LOG.debug("lifecycle callback: updated: " + this.toString());
 +    }
 +    public void removing() {
 +        LOG.debug("lifecycle callback: removing: " + this.toString());
 +    }
 +    public void removed() {
 +        LOG.debug("lifecycle callback: removed: " + this.toString());
 +    }
 +    //endregion
 +
 +    //region > object-level validation
 +
 +    /**
 +     * Prevent user from viewing another user's data.
 +     */
 +    public boolean hidden() {
 +        // uncomment to enable.  As things stand, the disabled() method below instead will make object "read-only".
 +        //return !Objects.equal(getOwnedBy(), container.getUser().getName());
 +        return false;
 +    }
 +
 +    /**
 +     * Prevent user from modifying any other user's data.
 +     */
 +    public String disabled(final Identifier.Type identifierType){
 +        final UserMemento currentUser = container.getUser();
 +        final String currentUserName = currentUser.getName();
 +        if(Objects.equal(getOwnedBy(), currentUserName)) { return null; }
 +        return "This object is owned by '" + getOwnedBy() + "' and cannot be modified by you";
 +    }
 +
 +    /**
 +     * In a real app, if this were actually a rule, then we'd expect that
 +     * invoking the {@link #completed() done} action would clear the {@link #getDueBy() dueBy}
 +     * property (rather than require the user to have to clear manually).
 +     */
 +    public String validate() {
 +        if(isComplete() && getDueBy() != null) {
 +            return "Due by date must be set to null if item has been completed";
 +        }
 +        return null;
 +    }
 +
 +
 +    //endregion
 +
 +
 +    //region > programmatic helpers
 +    @Programmatic // excluded from the framework's metamodel
 +    public boolean isDue() {
 +        if (getDueBy() == null) {
 +            return false;
 +        }
 +        return !toDoItems.isMoreThanOneWeekInPast(getDueBy());
 +    }
 +    //endregion
 +
 +    //region > events
 +
 +    public static abstract class AbstractActionDomainEvent extends ActionDomainEvent<ToDoItem> {
 +        private static final long serialVersionUID = 1L;
 +        private final String description;
 +        public AbstractActionDomainEvent(
 +                final String description,
 +                final ToDoItem source,
 +                final Identifier identifier,
 +                final Object... arguments) {
 +            super(source, identifier, arguments);
 +            this.description = description;
 +        }
 +        public String getEventDescription() {
 +            return description;
 +        }
 +    }
 +
 +    public static class CompletedEvent extends AbstractActionDomainEvent {
 +        private static final long serialVersionUID = 1L;
 +        public CompletedEvent(
 +                final ToDoItem source, 
 +                final Identifier identifier, 
 +                final Object... arguments) {
 +            super("completed", source, identifier, arguments);
 +        }
 +    }
 +
 +    public static class NoLongerCompletedEvent extends AbstractActionDomainEvent {
 +        private static final long serialVersionUID = 1L;
 +        public NoLongerCompletedEvent(
 +                final ToDoItem source, 
 +                final Identifier identifier, 
 +                final Object... arguments) {
 +            super("no longer completed", source, identifier, arguments);
 +        }
 +    }
 +
 +    public static class DeletedEvent extends AbstractActionDomainEvent {
 +        private static final long serialVersionUID = 1L;
 +        public DeletedEvent(
 +                final ToDoItem source, 
 +                final Identifier identifier, 
 +                final Object... arguments) {
 +            super("deleted", source, identifier, arguments);
 +        }
 +    }
 +
 +    //endregion
 +
 +    //region > predicates
 +
 +    public static class Predicates {
 +        
 +        public static Predicate<ToDoItem> thoseOwnedBy(final String currentUser) {
 +            return new Predicate<ToDoItem>() {
 +                @Override
 +                public boolean apply(final ToDoItem toDoItem) {
 +                    return Objects.equal(toDoItem.getOwnedBy(), currentUser);
 +                }
 +            };
 +        }
 +
 +        public static Predicate<ToDoItem> thoseCompleted(
 +                final boolean completed) {
 +            return new Predicate<ToDoItem>() {
 +                @Override
 +                public boolean apply(final ToDoItem t) {
 +                    return Objects.equal(t.isComplete(), completed);
 +                }
 +            };
 +        }
 +
 +        public static Predicate<ToDoItem> thoseWithSimilarDescription(final String description) {
 +            return new Predicate<ToDoItem>() {
 +                @Override
 +                public boolean apply(final ToDoItem t) {
 +                    return t.getDescription().contains(description);
 +                }
 +            };
 +        }
 +
 +        @SuppressWarnings("unchecked")
 +        public static Predicate<ToDoItem> thoseSimilarTo(final ToDoItem toDoItem) {
 +            return com.google.common.base.Predicates.and(
 +                    thoseNot(toDoItem),
 +                    thoseOwnedBy(toDoItem.getOwnedBy()),
 +                    thoseCategorised(toDoItem.getCategory()));
 +        }
 +
 +        public static Predicate<ToDoItem> thoseNot(final ToDoItem toDoItem) {
 +            return new Predicate<ToDoItem>() {
 +                @Override
 +                public boolean apply(final ToDoItem t) {
 +                    return t != toDoItem;
 +                }
 +            };
 +        }
 +
 +        public static Predicate<ToDoItem> thoseCategorised(final Category category) {
 +            return new Predicate<ToDoItem>() {
 +                @Override
 +                public boolean apply(final ToDoItem toDoItem) {
 +                    return Objects.equal(toDoItem.getCategory(), category);
 +                }
 +            };
 +        }
 +
 +        public static Predicate<ToDoItem> thoseSubcategorised(
 +                final Subcategory subcategory) {
 +            return new Predicate<ToDoItem>() {
 +                @Override
 +                public boolean apply(final ToDoItem t) {
 +                    return Objects.equal(t.getSubcategory(), subcategory);
 +                }
 +            };
 +        }
 +
 +        public static Predicate<ToDoItem> thoseCategorised(
 +                final Category category, final Subcategory subcategory) {
 +            return com.google.common.base.Predicates.and(
 +                    thoseCategorised(category), 
 +                    thoseSubcategorised(subcategory)); 
 +        }
 +
 +    }
 +
 +    //endregion
 +
 +    //region > toString, compareTo
 +    @Override
 +    public String toString() {
 +        return ObjectContracts.toString(this, "description,complete,dueBy,ownedBy");
 +    }
 +
 +    /**
 +     * Required so can store in {@link SortedSet sorted set}s (eg {@link #getDependencies()}). 
 +     */
 +    @Override
 +    public int compareTo(final ToDoItem other) {
 +        return ObjectContracts.compare(this, other, "complete,dueBy,description");
 +    }
 +    //endregion
 +
 +    //region > injected services
 +    @javax.inject.Inject
 +    DomainObjectContainer container;
 +
 +    @javax.inject.Inject
 +    ToDoItems toDoItems;
 +
 +    @javax.inject.Inject
 +    Scratchpad scratchpad;
 +
 +    /**
 +     * public only so can be injected from integ tests
 +     */
 +    @javax.inject.Inject
 +    public ActionInvocationContext actionInvocationContext;
 +
 +    /**
 +     * public only so can be injected from integ tests
 +     */
 +    @javax.inject.Inject
 +    public EventBusService eventBusService;
 +
 +    @javax.inject.Inject
 +    WrapperFactory wrapperFactory;
 +
 +    //endregion
 +
 +}


[15/20] isis git commit: Based on the simpleapp, there is now a neoapp that runs Neo4j version 2.1.6 embedded. It also includes the Neo4j client browser that runs on port 7474 by default alongside Isis.

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/pom.xml b/example/application/neoapp/pom.xml
new file mode 100644
index 0000000..ad6aa57
--- /dev/null
+++ b/example/application/neoapp/pom.xml
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.apache.isis.example.application</groupId>
+    <artifactId>neoapp</artifactId>
+    <version>1.8.0-SNAPSHOT</version>
+
+    <name>Neo4j App</name>
+
+    <packaging>pom</packaging>
+
+    <prerequisites>
+        <maven>3.0.4</maven>
+    </prerequisites>
+
+    <properties>
+        <isis.version>1.8.0-SNAPSHOT</isis.version>
+        <isis-viewer-wicket.version>1.8.0-SNAPSHOT</isis-viewer-wicket.version>
+
+        <!-- must be consistent with the versions defined by the JDO Objectstore -->
+        <datanucleus-accessplatform-jdo-rdbms.version>4.0.4</datanucleus-accessplatform-jdo-rdbms.version>
+        <datanucleus-jodatime.version>4.0.4</datanucleus-jodatime.version>
+        <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version>
+
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots</id>
+            <name>Apache Snapshots</name>
+            <url>https://repository.apache.org/content/repositories/snapshots/</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>Cloudbees snapshots</id>
+            <url>http://repository-estatio.forge.cloudbees.com/snapshot/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </repository>
+    </repositories>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.1</version>
+                    <configuration>
+                        <source>1.7</source>
+                        <target>1.7</target>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <id>source</id>
+                            <phase>compile</phase>
+                        </execution>
+                        <execution>
+                            <id>test</id>
+                            <phase>test-compile</phase>
+                        </execution>
+                    </executions>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.16</version>
+                    <configuration>
+                        <includes>
+                            <include>**/*Test.java</include>
+                            <include>**/*Test$*.java</include>
+                            <include>**/*Test_*.java</include>
+                            <include>**/*Spec*.java</include>
+                        </includes>
+                        <excludes>
+                            <exclude>**/Test*.java</exclude>
+                            <exclude>**/*ForTesting.java</exclude>
+                            <exclude>**/*Abstract*.java</exclude>
+                        </excludes>
+                        <useFile>true</useFile>
+                        <printSummary>true</printSummary>
+                        <outputDirectory>${project.build.directory}/surefire-reports</outputDirectory>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-report-plugin</artifactId>
+                    <version>2.16</version>
+                    <configuration>
+                        <includes>
+                            <include>**/*Test.java</include>
+                            <include>**/*Test$*.java</include>
+                            <include>**/*Test_*.java</include>
+                            <include>**/*Spec*.java</include>
+                        </includes>
+                        <excludes>
+                            <exclude>**/Test*.java</exclude>
+                            <exclude>**/*ForTesting.java</exclude>
+                            <exclude>**/*Abstract*.java</exclude>
+                        </excludes>
+                        <showSuccess>false</showSuccess>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <phase>test</phase>
+                        </execution>
+                    </executions>
+                </plugin>
+
+                <plugin>
+                    <artifactId>maven-clean-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.6</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>2.4</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-install-plugin</artifactId>
+                    <version>2.5.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>2.8.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.3</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>2.4</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.eclipse.jetty</groupId>
+                    <artifactId>jetty-maven-plugin</artifactId>
+                    <version>9.0.5.v20130815</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-shade-plugin</artifactId>
+                    <version>2.2</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-antrun-plugin</artifactId>
+                    <version>1.7</version>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>run</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <!-- http://simplericity.com/2009/11/10/1257880778509.html -->
+                <plugin>
+                    <groupId>org.simplericity.jettyconsole</groupId>
+                    <artifactId>jetty-console-maven-plugin</artifactId>
+                    <!-- update to 1.54 reversed,since seems compiled against 1.7 (major.minor version 51.0) -->
+                    <version>1.43</version>
+                </plugin>
+
+                <!-- Apache Release Audit Tool -->
+                <plugin>
+                    <groupId>org.apache.rat</groupId>
+                    <artifactId>apache-rat-plugin</artifactId>
+                    <version>0.10</version>
+                    <configuration>
+                        <addDefaultLicenseMatchers>true</addDefaultLicenseMatchers>
+                        <excludeSubProjects>true</excludeSubProjects>
+                        <excludes>
+                            <exclude>**/target/**</exclude>
+                            <exclude>**/target-ide/**</exclude>
+
+                            <exclude>**/*.project</exclude>
+                            <exclude>**/.classpath</exclude>
+                            <exclude>**/.settings/**</exclude>
+                            <exclude>**/*.launch</exclude>
+                            <exclude>**/ide/eclipse/launch/**</exclude>
+                            <exclude>**/ide/intellij/launch/**</exclude>
+                            <exclude>src/site/resources/ide/eclipse/**</exclude>
+
+                            <exclude>**/rebel.xml</exclude>
+                            <exclude>**/*.gitignore</exclude>
+                            <exclude>**/*.log</exclude>
+                            <exclude>**/*.pdn</exclude>
+                            <exclude>**/*.svg</exclude>
+                            <exclude>**/*.json</exclude>
+                            <exclude>**/*.min.js</exclude>
+                            <exclude>**/*.js</exclude>
+                        </excludes>
+                        <licenses>
+                            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+                                <licenseFamilyCategory>AL2</licenseFamilyCategory>
+                                <licenseFamilyName>Apache License 2.0</licenseFamilyName>
+                                <notes/>
+                                <patterns>
+                                    <pattern>Licensed to the Apache Software Foundation (ASF) under one</pattern>
+                                </patterns>
+                            </license>
+                            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+                                <licenseFamilyCategory>JQRY</licenseFamilyCategory>
+                                <licenseFamilyName>MIT</licenseFamilyName>
+                                <notes/>
+                                <patterns>
+                                    <pattern>Dual licensed under the MIT or GPL Version 2 licenses.</pattern>
+                                </patterns>
+                            </license>
+                            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+                                <licenseFamilyCategory>JMOCK</licenseFamilyCategory>
+                                <licenseFamilyName>JMock</licenseFamilyName>
+                                <notes/>
+                                <patterns>
+                                    <pattern>Copyright (c) 2000-2007, jMock.org</pattern>
+                                </patterns>
+                            </license>
+                            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+                                <licenseFamilyCategory>DOCBK</licenseFamilyCategory>
+                                <licenseFamilyName>DocBook 4.5</licenseFamilyName>
+                                <notes/>
+                                <patterns>
+                                    <pattern>Permission to copy in any form is granted for use</pattern>
+                                    <pattern>Permission to use, copy, modify and distribute the DocBook DTD</pattern>
+                                    <pattern>is hereby granted in perpetuity, provided that the above copyright
+                                    </pattern>
+                                    <pattern>This is the catalog data file for DocBook XML V4.5. It is provided as
+                                    </pattern>
+                                    <pattern>XML Catalog data for DocBook XML V4.5</pattern>
+                                    <pattern>DocBook additional general entities V4.5</pattern>
+                                    <pattern>XML EXCHANGE TABLE MODEL DECLARATION MODULE</pattern>
+                                </patterns>
+                            </license>
+                            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+                                <licenseFamilyCategory>W3C</licenseFamilyCategory>
+                                <licenseFamilyName>XHTML</licenseFamilyName>
+                                <notes/>
+                                <patterns>
+                                    <pattern>Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),</pattern>
+                                </patterns>
+                            </license>
+                        </licenses>
+                        <licenseFamilies>
+                            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+                                <familyName>Apache License 2.0</familyName>
+                            </licenseFamily>
+                            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+                                <familyName>MIT</familyName>
+                            </licenseFamily>
+                            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+                                <familyName>JMock</familyName>
+                            </licenseFamily>
+                            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+                                <familyName>DocBook 4.5</familyName>
+                            </licenseFamily>
+                            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+                                <familyName>XHTML</familyName>
+                            </licenseFamily>
+                        </licenseFamilies>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-report-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <modules>
+        <module>dom</module>
+        <module>fixture</module>
+        <module>integtests</module>
+        <module>webapp</module>
+    </modules>
+
+    <dependencyManagement>
+        <dependencies>
+
+            <dependency>
+                <groupId>org.apache.isis.core</groupId>
+                <artifactId>isis</artifactId>
+                <version>${isis.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.isis.viewer</groupId>
+                <artifactId>isis-viewer-wicket</artifactId>
+                <version>${isis-viewer-wicket.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- this project's own modules -->
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>neoapp-dom</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>neoapp-fixture</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>neoapp-webapp</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+
+        </dependencies>
+    </dependencyManagement>
+
+
+    <profiles>
+        <profile>
+            <id>m2e</id>
+            <activation>
+                <property>
+                    <name>m2e.version</name>
+                </property>
+            </activation>
+            <build>
+                <directory>target-ide</directory>
+            </build>
+        </profile>
+    </profiles>
+
+</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/.gitignore b/example/application/neoapp/webapp/.gitignore
new file mode 100644
index 0000000..3faa3ab
--- /dev/null
+++ b/example/application/neoapp/webapp/.gitignore
@@ -0,0 +1,3 @@
+/neo4j_DB/
+target
+target-ide
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
new file mode 100644
index 0000000..e45f7f0
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-jrebel.launch
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;sourceLookupDirector&gt;&#13;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;isis-jrebel-plugin&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;default/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.default&quot;/&gt;&#13;&#10;&lt;/sourceContainers&gt;&#13;&#10;&lt;/sourceLookupDirector&gt;&#13;&#10
 ;"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;simple_wicket_restful_jdo-webapp&quot; type=&quot;1&quot;/&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER&quot; path=&quot;3&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type PROTOTYPE"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simpleapp-webapp"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="${jrebel_args} -Drebel.log=false -Drebel.check_class_hash=true -Drebel.packages_exclude=org.apache.isis -Dproject.root=${project_loc}/.. -Dtarget.dir=target-ide -Drebel.plugins=C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar -Disis-jrebel-plugin.packagePrefix=dom.simple,org.apache.isis.objectstore.jdo.applib -Disis-jrebel-plugin.loggingLevel=warn -XX:MaxPermSize=128m"/>
+</launchConfiguration>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
new file mode 100644
index 0000000..96a9a54
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-no-fixtures.launch
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type SERVER_PROTOTYPE"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simpleapp-webapp"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+</launchConfiguration>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
new file mode 100644
index 0000000..dbfb2b3
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-PROTOTYPE-with-fixtures.launch
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 -D isis.persistor.datanucleus.install-fixtures=true --type SERVER_PROTOTYPE"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simpleapp-webapp"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+</launchConfiguration>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
new file mode 100644
index 0000000..238b5a6
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/eclipse/launch/SimpleApp-SERVER-no-fixtures.launch
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/isis-core-webserver/src/main/java/org/apache/isis/WebServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
+<mapEntry key="[debug]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+<mapEntry key="[run]" value="org.eclipse.jdt.launching.localJavaApplication"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.isis.WebServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--port 8080 --type SERVER"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="simpleapp-webapp"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+</launchConfiguration>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/intellij/launch/README.txt
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/README.txt b/example/application/neoapp/webapp/ide/intellij/launch/README.txt
new file mode 100644
index 0000000..5f8e5ab
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/intellij/launch/README.txt
@@ -0,0 +1,2 @@
+Copy into workspace\.idea\runConfigurations directory, and adjust file paths for Maven tasks.
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
new file mode 100644
index 0000000..a226ce6
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml
@@ -0,0 +1,28 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="SimpleApp-PROTOTYPE" type="Application" factoryName="Application" singleton="true">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="org.apache.isis.WebServer" />
+    <option name="VM_PARAMETERS" value="" />
+    <option name="PROGRAM_PARAMETERS" value="--type SERVER_PROTOTYPE --port 8080" />
+    <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+    <option name="ALTERNATIVE_JRE_PATH" value="" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="simpleapp-webapp" />
+    <envs />
+    <RunnerSettings RunnerId="Debug">
+      <option name="DEBUG_PORT" value="" />
+      <option name="TRANSPORT" value="0" />
+      <option name="LOCAL" value="true" />
+    </RunnerSettings>
+    <RunnerSettings RunnerId="Run" />
+    <ConfigurationWrapper RunnerId="Debug" />
+    <ConfigurationWrapper RunnerId="Run" />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="Maven.BeforeRunTask" enabled="true" file="C:/Apache/Isis/example/application/simpleapp/dom/pom.xml" goal="datanucleus:enhance -o" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
new file mode 100644
index 0000000..1a312f9
--- /dev/null
+++ b/example/application/neoapp/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+s  <configuration default="false" name="SimpleApp (enhance only)" type="Application" factoryName="Application">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="org.apache.isis.Dummy" />
+    <option name="VM_PARAMETERS" value="" />
+    <option name="PROGRAM_PARAMETERS" value="" />
+    <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+    <option name="ALTERNATIVE_JRE_PATH" value="" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="simpleapp-webapp" />
+    <envs />
+    <RunnerSettings RunnerId="Run" />
+    <ConfigurationWrapper RunnerId="Run" />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="Maven.BeforeRunTask" enabled="true" file="C:/Apache/Isis/example/application/simpleapp/dom/pom.xml" goal="datanucleus:enhance -o" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/lib/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/lib/.gitignore b/example/application/neoapp/webapp/lib/.gitignore
new file mode 100644
index 0000000..70eee7e
--- /dev/null
+++ b/example/application/neoapp/webapp/lib/.gitignore
@@ -0,0 +1,5 @@
+#
+# explicitly ignoring Microsoft JDBC4 jar
+# (cannot redistribute, licensing)
+#
+sqljdbc4.jar

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/messages.log
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/messages.log b/example/application/neoapp/webapp/messages.log
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/pom.xml b/example/application/neoapp/webapp/pom.xml
new file mode 100644
index 0000000..e89d059
--- /dev/null
+++ b/example/application/neoapp/webapp/pom.xml
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.example.application</groupId>
+        <artifactId>neoapp</artifactId>
+        <version>1.8.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>neoapp-webapp</artifactId>
+    <name>Neo4j App Webapp</name>
+
+    <description>This module runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the datanucleus object store.</description>
+
+    <packaging>war</packaging>
+
+    <properties>
+        <siteBaseDir>..</siteBaseDir>
+        <neo4j-version>2.1.6</neo4j-version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>neo4j-release-repository</id>
+            <name>Neo4j Maven 2 release repository</name>
+            <url>http://m2.neo4j.org/releases</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-maven-plugin</artifactId>
+            </plugin>
+
+            <!-- mvn package -->
+            <plugin>
+                <groupId>org.simplericity.jettyconsole</groupId>
+                <artifactId>jetty-console-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>createconsole</goal>
+                        </goals>
+                        <configuration>
+                            <backgroundImage>${basedir}/src/main/jettyconsole/isis-banner.png</backgroundImage>
+                            <destinationFile>${project.build.directory}/${project.build.finalName}-jetty-console.jar</destinationFile>
+                        </configuration>
+                        <phase>package</phase>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>1.8</version>
+                  <executions>
+                    <execution>
+                      <phase>validate</phase>
+                      <goals>
+                        <goal>maven-version</goal>
+                      </goals>
+                    </execution>
+                  </executions>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <warName>neoapp</warName>
+                    <archive>
+                        <manifest>
+                            <addClasspath>false</addClasspath>
+                        </manifest>
+                        <manifestEntries>
+                            <Build-Time>${maven.build.timestamp}</Build-Time>
+                            <Build-Host>${agent.name}</Build-Host>
+                            <Build-User>${user.name}</Build-User>
+                            <Build-Maven>Maven ${maven.version}</Build-Maven>
+                            <Build-Java>${java.version}</Build-Java>
+                            <Build-OS>${os.name}</Build-OS>
+                            <Build-Label>${project.version}</Build-Label>
+                        </manifestEntries>
+                    </archive>
+                </configuration>
+            </plugin>
+
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>
+                                            org.codehaus.mojo
+                                        </groupId>
+                                        <artifactId>
+                                            build-helper-maven-plugin
+                                        </artifactId>
+                                        <versionRange>
+                                            [1.5,)
+                                        </versionRange>
+                                        <goals>
+                                            <goal>maven-version</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore></ignore>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <dependencies>
+    
+        <!-- other modules in this project -->
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>neoapp-dom</artifactId>
+            <exclusions>
+                <exclusion>
+                    <!-- so don't pick up transitive dependency to asm 4.0.0 -->
+                    <groupId>org.datanucleus</groupId>
+                    <artifactId>datanucleus-enhancer</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>neoapp-fixture</artifactId>
+            <exclusions>
+                <exclusion>
+                    <!-- so don't pick up transitive dependency to asm 4.0.0 -->
+                    <groupId>org.datanucleus</groupId>
+                    <artifactId>datanucleus-enhancer</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        
+        <!-- other isis components -->
+        <dependency>
+            <groupId>org.apache.isis.viewer</groupId>
+            <artifactId>isis-viewer-wicket-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-viewer-restfulobjects-server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-security-shiro</artifactId>
+        </dependency>
+
+
+        <!-- isis core -->
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-runtime</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-wrapper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-security</artifactId>
+        </dependency>
+
+
+        <!-- to run using WebServer (optional) -->
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-webserver</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.mortbay.jetty</groupId>
+                    <artifactId>jetty</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+            <version>9.0.5.v20130815</version>
+        </dependency>
+
+
+        <!--<dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-servlet_2.5_spec</artifactId>-->
+            <!--
+            removed so can run o.a.i.WebServer from within IntelliJ;
+            can rely on servlet container to ignore this in war file
+            <scope>provided</scope>
+            -->
+        <!--</dependency>-->
+
+        <!-- 
+          JDBC drivers 
+          (for jdo objectstore)
+          -->
+        <dependency>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+        </dependency>
+
+        <!-- 
+        <dependency>
+            <groupId>postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>9.1-901.jdbc4</version>
+        </dependency>
+         -->
+
+        <!-- 
+        mvn install:install-file -Dfile=sqljdbc4.jar \
+                                 -DgroupId=com.microsoft.sqlserver \
+                                 -DartifactId=jdbc \
+                                 -Dversion=4.0 \
+                                 -Dpackaging=jar
+         -->
+         <!-- 
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>sqljdbc4</artifactId>
+            <version>4.0</version>
+        </dependency>
+          -->
+
+        <dependency>
+          <groupId>org.lazyluke</groupId>
+          <artifactId>log4jdbc-remix</artifactId>
+          <exclusions>
+            <exclusion>
+              <groupId>org.slf4j</groupId>
+              <artifactId>slf4j-api</artifactId>
+            </exclusion>
+          </exclusions>
+        </dependency>
+
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>self-host</id>
+            <build>
+                <plugins>
+                    <!-- 
+                    mvn -P self-host antrun:run
+                    -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <configuration>
+                            <tasks>
+                                <exec executable="java" failonerror="true">
+                                    <arg value="-jar" />
+                                    <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.jar" />
+                                </exec>
+                            </tasks>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>jrebel</id>
+            <properties>
+                <!-- as used in the rebel.xml in the dom project -->
+                <target.dir>target</target.dir>
+                <isis-jrebel-plugin.packagePrefix>dom.simple,org.apache.isis.objectstore.jdo.applib</isis-jrebel-plugin.packagePrefix>
+                <isis-jrebel-plugin.loggingLevel>warn</isis-jrebel-plugin.loggingLevel>
+            </properties>
+            <build>
+                <plugins>
+                    <!--
+                    mvn -P jrebel antrun:run \
+                        -Djrebel.jar="C:/Users/Dan/.IdeaIC13/config/plugins/jr-ide-idea/lib/jrebel/jrebel.jar" \
+                        -Disis_jrebel_plugin.jar="C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar"
+                    -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <configuration>
+                            <target>
+                                <property name="compile_classpath" refid="maven.compile.classpath"/>
+                                <property name="runtime_classpath" refid="maven.runtime.classpath"/>
+                                <property name="test_classpath" refid="maven.test.classpath"/>
+                                <property name="plugin_classpath" refid="maven.plugin.classpath"/>
+
+                                <echo message=""/>
+                                <echo message=""/>
+                                <echo message="jrebel.jar             = ${jrebel.jar}"/>
+                                <echo message="isis_jrebel_plugin.jar = ${isis_jrebel_plugin.jar}"/>
+                                <echo message="target.dir             = ${target.dir}"/>
+                                <echo message=""/>
+                                <echo message=""/>
+
+                                <exec executable="java" failonerror="true">
+                                    <arg value="-javaagent:${jrebel.jar}"/>
+                                    <arg value="-Drebel.log=false"/>
+                                    <arg value="-Drebel.check_class_hash=true"/>
+                                    <arg value="-Drebel.packages_exclude=org.apache.isis"/>
+
+                                    <!-- as used in the rebel.xml in the dom project -->
+                                    <arg value="-Dproject.root=${project.basedir}/.."/>
+                                    <arg value="-Dtarget.dir=${target.dir}"/>
+
+                                    <arg value="-Drebel.plugins=${isis_jrebel_plugin.jar}"/>
+                                    <arg value="-Disis-jrebel-plugin.packagePrefix=${isis-jrebel-plugin.packagePrefix}"/>
+                                    <arg value="-Disis-jrebel-plugin.loggingLevel=${isis-jrebel-plugin.loggingLevel}"/>
+                                    <arg value="-XX:MaxPermSize=128m"/>
+                                    <arg value="-classpath"/>
+                                    <arg value="${runtime_classpath}"/>
+                                    <arg value="org.apache.isis.WebServer"/>
+                                </exec>
+                            </target>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <version>2.9</version>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+        	<id>neo4j</id>
+
+        	<dependencies>
+		        <dependency>
+		        	<groupId>org.datanucleus</groupId>
+		        	<artifactId>datanucleus-neo4j</artifactId>
+		        	<version>4.0.4</version>
+		        </dependency>
+                <dependency>
+                    <groupId>com.sprint</groupId>
+                    <artifactId>isis-neo4j</artifactId>
+                    <version>0.1.0-SNAPSHOT</version>
+                </dependency>
+<!--
+                <dependency>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
+                </dependency>-->
+
+            </dependencies>
+        </profile>
+    </profiles>
+
+
+
+</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java b/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
new file mode 100644
index 0000000..deadfc3
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/java/webapp/SimpleApplication.java
@@ -0,0 +1,150 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package webapp;
+
+import de.agilecoders.wicket.core.Bootstrap;
+import de.agilecoders.wicket.core.settings.IBootstrapSettings;
+import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
+import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.List;
+import com.google.common.base.Joiner;
+import com.google.common.io.Resources;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.name.Names;
+import com.google.inject.util.Modules;
+import com.google.inject.util.Providers;
+import org.apache.wicket.Session;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
+import org.apache.isis.viewer.wicket.viewer.integration.wicket.AuthenticatedWebSessionForIsis;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+/**
+ * As specified in <tt>web.xml</tt>.
+ * 
+ * <p>
+ * See:
+ * <pre>
+ * &lt;filter>
+ *   &lt;filter-name>wicket&lt;/filter-name>
+ *    &lt;filter-class>org.apache.wicket.protocol.http.WicketFilter&lt;/filter-class>
+ *    &lt;init-param>
+ *      &lt;param-name>applicationClassName&lt;/param-name>
+ *      &lt;param-value>webapp.SimpleApplication&lt;/param-value>
+ *    &lt;/init-param>
+ * &lt;/filter>
+ * </pre>
+ * 
+ */
+public class SimpleApplication extends IsisWicketApplication {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * uncomment for a (slightly hacky) way of allowing logins using query args, eg:
+     * 
+     * <tt>?user=sven&pass=pass</tt>
+     * 
+     * <p>
+     * for demos only, obvious.
+     */
+    private final static boolean DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS = false;
+
+
+    @Override
+    protected void init() {
+        super.init();
+
+        IBootstrapSettings settings = Bootstrap.getSettings();
+        settings.setThemeProvider(new BootswatchThemeProvider(BootswatchTheme.Flatly));
+    }
+
+    @Override
+    public Session newSession(final Request request, final Response response) {
+        if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) {
+            return super.newSession(request, response);
+        } 
+        
+        // else demo mode
+        final AuthenticatedWebSessionForIsis s = (AuthenticatedWebSessionForIsis) super.newSession(request, response);
+        IRequestParameters requestParameters = request.getRequestParameters();
+        final org.apache.wicket.util.string.StringValue user = requestParameters.getParameterValue("user");
+        final org.apache.wicket.util.string.StringValue password = requestParameters.getParameterValue("pass");
+        s.signIn(user.toString(), password.toString());
+        return s;
+    }
+
+    @Override
+    public WebRequest newWebRequest(HttpServletRequest servletRequest, String filterPath) {
+        if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) {
+            return super.newWebRequest(servletRequest, filterPath);
+        } 
+
+        // else demo mode
+        try {
+            String uname = servletRequest.getParameter("user");
+            if (uname != null) {
+                servletRequest.getSession().invalidate();
+            }
+        } catch (Exception e) {
+        }
+        WebRequest request = super.newWebRequest(servletRequest, filterPath);
+        return request;
+    }
+    
+    @Override
+    protected Module newIsisWicketModule() {
+        final Module isisDefaults = super.newIsisWicketModule();
+        
+        final Module overrides = new AbstractModule() {
+            @Override
+            protected void configure() {
+                bind(String.class).annotatedWith(Names.named("applicationName")).toInstance("Simple App");
+                bind(String.class).annotatedWith(Names.named("applicationCss")).toInstance("css/application.css");
+                bind(String.class).annotatedWith(Names.named("applicationJs")).toInstance("scripts/application.js");
+                bind(String.class).annotatedWith(Names.named("welcomeMessage")).toInstance(readLines(getClass(), "welcome.html"));
+                bind(String.class).annotatedWith(Names.named("aboutMessage")).toInstance("Simple App");
+                bind(InputStream.class).annotatedWith(Names.named("metaInfManifest")).toProvider(Providers.of(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")));
+            }
+        };
+
+        return Modules.override(isisDefaults).with(overrides);
+    }
+
+    private static String readLines(final Class<?> contextClass, final String resourceName) {
+        try {
+            List<String> readLines = Resources.readLines(Resources.getResource(contextClass, resourceName), Charset.defaultCharset());
+            final String aboutText = Joiner.on("\n").join(readLines);
+            return aboutText;
+        } catch (IOException e) {
+            return "This is a simple app";
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn
new file mode 100644
index 0000000..37543c9
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.pdn differ

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png
new file mode 100644
index 0000000..cd9ecfe
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/jettyconsole/isis-banner.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html b/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
new file mode 100644
index 0000000..49cfbcd
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/resources/webapp/welcome.html
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<p class="intro">
+    <a href="http://isis.apache.org" target="_blank">Apache Isis</a>&trade; is a platform to let you rapidly develop
+    domain-driven apps in Java.
+    <br/>
+    <br/>
+    This app has been generated using Isis' 
+    <a href="http://isis.apache.org/intro/getting-started/simple%61pp-archetype.html" target="_blank">SimpleApp</a> archetype,
+    which configures Isis' most commonly used components as part of a very simple and purposefully minimal application.
+    <br/>
+    <br/>
+    The app itself consists of a single domain class, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObject.java"  target="_blank">SimpleObject</a>,
+    along with an equally simple (factory/repository) domain service, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObjects.java"  target="_blank">SimpleObjects</a>.
+    <br/>
+    <br/>
+    For more details, see the <a href="http://isis.apache.org/documentation.html" target="_blank">Isis website</a>.
+</p>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
new file mode 100644
index 0000000..09f6c94
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -0,0 +1,232 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+
+#################################################################################
+#
+# specify system components.
+#
+# The values correspond to the named components in the installer-registry.properties file
+# in the org.apache.isis.core:isis-core-runtime JAR (in the org.apache.isis.core.runtime package)
+#
+# Although all configuration could reside in isis.properties, the recommendation is
+# to split out into component specific files:
+# 
+#    xxx_yyy.properties files
+#
+# where
+#    * xxx is the component type, and
+#    * yyy is the component name.
+#
+# For example, viewer_wicket.properties holds configuration information specific to the Wicket viewer.
+#
+#################################################################################
+
+
+#
+# configure the persistor (object store) to use
+#
+
+# JDO/DataNucleus objectstore
+isis.persistor=datanucleus
+
+
+
+#
+# configure authentication mechanism to use (to logon to the system)
+#
+ 
+#isis.authentication=bypass
+isis.authentication=shiro
+
+
+#
+# configure authorization mechanism to use
+#
+ 
+#isis.authorization=bypass
+isis.authorization=shiro
+
+
+
+
+
+#################################################################################
+#
+# MetaModel
+#
+# The metamodel typically does not require additional configuration, although
+# the system components (defined above) may refine the metamodel for their needs.
+#
+#################################################################################
+
+
+#
+# additional programming model facets
+#
+
+#isis.reflector.facets.include=
+#isis.reflector.facets.exclude=
+
+
+#
+# metamodel validator
+#
+
+#isis.reflector.validator=
+
+
+
+#
+# layoutMetadataReader(s)
+#
+
+# isis.reflector.layoutMetadataReaders=org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson
+
+
+
+#
+# patterns for applying CssClassFa facet (font-awesome icons) to member names
+#
+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,\
+                        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
+
+
+isis.reflector.facet.cssClass.patterns=update.*\:btn-default,delete.*\:btn-warning,.*\:btn-primary
+                        update.*:btn-default,\
+                        delete.*:btn-warning,\
+                        .*:btn-primary
+
+
+
+#################################################################################
+#
+# Value facet defaults
+#
+# (see also viewer-specific config files, eg viewer_wicket.properties)
+#
+#################################################################################
+
+# as used by @Title of a date
+isis.value.format.date=dd-MM-yyyy
+
+
+
+#################################################################################
+#
+# Facet Decorators
+#
+#################################################################################
+
+#
+# Providing such capabilities as i18n
+#
+
+isis.reflector.facet-decorators=org.apache.isis.core.metamodel.facetdecorator.i18n.resourcebundle.I18nDecoratorUsingResourceBundleInstaller
+
+
+#################################################################################
+#
+# Application Services and fixtures
+#
+#################################################################################
+
+#
+# Specify the domain services.
+# 
+# These are the most important configuration properties in the system, as they define
+# the set of the classes for Isis to instantiate as domain service singletons.
+# From these domain service instances the rest of the metamodel is discovered, while the 
+# 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,fixture.simple,webapp.prototyping, \
+                                                            fixture.simple,\
+                                                            webapp.prototyping
+
+isis.services = org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions, \
+                org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
+                org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
+                com.sprint.isis.neo4j.server.Wrapper
+
+
+# Specify the (optional) test fixtures
+#
+# Fixtures are used to seed the object store with an initial set of data.  For the 
+# in-memory object store, the fixtures are installed on every run.  For other
+# object stores, they are used only when the object store is first initialized.
+#
+isis.fixtures=fixture.simple.scenario.SimpleObjectsFixture
+
+
+#
+# whether ExceptionRecognizers should also log any recognized exceptions
+# (default false; enable for diagnostics/debugging)
+#
+#isis.services.exceprecog.logRecognizedExceptions=true
+
+
+#
+# Audit changes to all objects; can opt out using @Audited(disabled=true)
+#
+#isis.services.audit.objects=all|none
+
+#
+# Treat all actions as commands; can opt out using @Command(disabled=true)
+#
+#isis.services.command.actions=all|none|ignoreQueryOnly
+
+
+
+
+################################################################################
+#
+# Viewer defaults
+#
+#################################################################################
+
+#
+# Specify viewer defaults
+# 
+#isis.viewers.paged.standalone=30
+#isis.viewers.paged.parented=10
+
+
+#isis.viewers.propertyLayout.labelPosition=LEFT
+#isis.viewers.parameterLayout.labelPosition=LEFT

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
new file mode 100644
index 0000000..3b5235a
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/logging.properties
@@ -0,0 +1,185 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+
+#
+# Isis uses log4j is used to provide system logging
+#
+log4j.rootCategory=TRACE, Console
+#log4j.rootCategory=DEBUG, Console
+
+
+# The console appender
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.target=System.out
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE}  [%-20c{1} %-10t %-5p]  %m%n
+
+
+# The stderr appender
+log4j.appender.Stderr=org.apache.log4j.ConsoleAppender
+log4j.appender.Stderr.target=System.err
+log4j.appender.Stderr.layout=org.apache.log4j.PatternLayout
+log4j.appender.Stderr.layout.ConversionPattern=%d{ABSOLUTE}  [%-20c{1} %-10t %-5p]  %m%n
+
+
+# other appenders
+log4j.appender.File=org.apache.log4j.RollingFileAppender
+log4j.appender.File.file=isis.log
+log4j.appender.File.append=false
+log4j.appender.File.layout=org.apache.log4j.PatternLayout
+log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p]  %m%n
+
+log4j.appender.sql=org.apache.log4j.FileAppender
+log4j.appender.sql.File=./logs/sql.log
+log4j.appender.sql.Append=false
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n
+
+log4j.appender.sqltiming=org.apache.log4j.FileAppender
+log4j.appender.sqltiming.File=./logs/sqltiming.log
+log4j.appender.sqltiming.Append=false
+log4j.appender.sqltiming.layout=org.apache.log4j.PatternLayout
+log4j.appender.sqltiming.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n
+
+log4j.appender.jdbc=org.apache.log4j.FileAppender
+log4j.appender.jdbc.File=./logs/jdbc.log
+log4j.appender.jdbc.Append=false
+log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout
+log4j.appender.jdbc.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+
+log4j.appender.connection=org.apache.log4j.FileAppender
+log4j.appender.connection.File=./logs/connection.log
+log4j.appender.connection.Append=false
+log4j.appender.connection.layout=org.apache.log4j.PatternLayout
+log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+
+
+
+
+
+! turn on the internal log4j debugging flag so we can see what it is doing
+#log4j.debug=true
+
+
+# DataNucleus
+# the first two log the DML and DDL (if set to DEBUG)
+log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console
+log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
+# the remainder can probably be left to WARN
+log4j.logger.DataNucleus.Persistence=WARN, Console
+log4j.logger.DataNucleus.Transaction=WARN, Console
+log4j.logger.DataNucleus.Connection=WARN, Console
+log4j.logger.DataNucleus.Query=WARN, Console
+log4j.logger.DataNucleus.Cache=WARN, Console
+log4j.logger.DataNucleus.MetaData=WARN, Console
+log4j.logger.DataNucleus.Datastore=WARN, Console
+log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
+log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
+log4j.logger.DataNucleus.General=WARN, Console
+log4j.logger.DataNucleus.Lifecycle=WARN, Console
+log4j.logger.DataNucleus.ValueGeneration=WARN, Console
+log4j.logger.DataNucleus.Enhancer=WARN, Console
+log4j.logger.DataNucleus.SchemaTool=ERROR, Console
+log4j.logger.DataNucleus.JDO=WARN, Console
+log4j.logger.DataNucleus.JPA=ERROR, Console
+log4j.logger.DataNucleus.JCA=WARN, Console
+log4j.logger.DataNucleus.IDE=ERROR, Console
+
+log4j.additivity.DataNucleus.Datastore.Native=false
+log4j.additivity.DataNucleus.Datastore.Schema=false
+log4j.additivity.DataNucleus.Datastore.Persistence=false
+log4j.additivity.DataNucleus.Datastore.Transaction=false
+log4j.additivity.DataNucleus.Datastore.Connection=false
+log4j.additivity.DataNucleus.Datastore.Query=false
+log4j.additivity.DataNucleus.Datastore.Cache=false
+log4j.additivity.DataNucleus.Datastore.MetaData=false
+log4j.additivity.DataNucleus.Datastore.Datastore=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
+log4j.additivity.DataNucleus.Datastore.General=false
+log4j.additivity.DataNucleus.Datastore.Lifecycle=false
+log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
+log4j.additivity.DataNucleus.Datastore.Enhancer=false
+log4j.additivity.DataNucleus.Datastore.SchemaTool=false
+log4j.additivity.DataNucleus.Datastore.JDO=false
+log4j.additivity.DataNucleus.Datastore.JPA=false
+log4j.additivity.DataNucleus.Datastore.JCA=false
+log4j.additivity.DataNucleus.Datastore.IDE=false
+
+
+# if using log4jdbc-remix as JDBC driver
+#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
+#log4j.additivity.jdbc.sqlonly=false
+#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
+#log4j.additivity.jdbc.resultsettable=false
+
+#log4j.logger.jdbc.audit=WARN,jdbc, Console
+#log4j.additivity.jdbc.audit=false
+#log4j.logger.jdbc.resultset=WARN,jdbc
+#log4j.additivity.jdbc.resultset=false
+#log4j.logger.jdbc.sqltiming=WARN,sqltiming
+#log4j.additivity.jdbc.sqltiming=false
+#log4j.logger.jdbc.connection=FATAL,connection
+#log4j.additivity.jdbc.connection=false
+
+
+
+# track Isis/JDO lifecycle integration
+
+#log4j.logger.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=DEBUG, Console
+#log4j.additivity.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=false
+
+#log4j.logger.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=DEBUG,Console
+#log4j.additivity.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=false
+
+
+
+
+# track Isis/Wicket lifecycle integration
+
+#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=DEBUG, Console
+#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=false
+
+#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=INFO,Console
+#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=false
+
+
+
+
+# quieten some of the noisier classes in Isis' bootstrapping
+log4j.logger.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=WARN,Console
+log4j.additivity.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=false
+
+log4j.logger.org.apache.isis.core.metamodel.specloader.ServiceInitializer=WARN,Console
+log4j.additivity.org.apache.isis.core.metamodel.specloader.ServiceInitializer=false
+
+log4j.logger.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=WARN,Console
+log4j.additivity.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=false
+    
+log4j.logger.org.apache.isis.core.commons.config.IsisConfigurationDefault=WARN,Console
+log4j.additivity.org.apache.isis.core.commons.config.IsisConfigurationDefault=false
+
+log4j.logger.org.apache.isis.core.runtime.installers.InstallerLookupDefault=WARN,Console
+log4j.additivity.org.apache.isis.core.runtime.installers.InstallerLookupDefault=false
+
+
+
+
+# Application-specific logging
+log4j.logger.dom.todo.ToDoItem=DEBUG, Stderr
+log4j.additivity.dom.todo.ToDoItem=false
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
new file mode 100644
index 0000000..edb7c13
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
@@ -0,0 +1,128 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+
+
+#################################################################################
+#
+# Persistor
+#
+#################################################################################
+
+
+
+# generally speaking this should not be enabled
+isis.persistor.disableConcurrencyChecking=false
+
+
+
+
+#################################################################################
+#
+# JDBC configuration
+#
+#################################################################################
+
+#
+# configuration file holding the JDO objectstore's JDBC configuration
+# (this is a bit of a hack... just exploiting fact that Isis also loads this file)
+#
+
+
+#
+# JDBC connection details
+# (also update the pom.xml to reference the appropriate JDBC driver)
+#
+
+#
+# HSQLDB in-memory
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:mem:test
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+#
+# HSQLDB in-memory (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:mem:test
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+
+
+#
+# HSQLDB to file
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+#
+# HSQLDB to file (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
+
+
+
+#
+# PostgreSQL Server 
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.postgresql.Driver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:postgresql://localhost:5432/isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
+
+#
+# PostgreSQL Server (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:postgresql://localhost:5432/isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
+
+
+
+#
+# MS SQL Server
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=com.microsoft.sqlserver.jdbc.SQLServerDriver
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:sqlserver://127.0.0.1:1433;instance=.;databaseName=simple
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=p4ssword
+
+#
+# MS SQL Server (using log4jdbc-remix)
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:sqlserver://127.0.0.1:1433;instance=SQLEXPRESS;databaseName=jdo
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=jdo
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=jdopass
+
+
+
+#
+# neo4j
+# (experimental; run with -P neo4j profile in webapp project)
+#
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:neo4j_DB
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
new file mode 100644
index 0000000..22ee6d0
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
@@ -0,0 +1,86 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+#
+# configuration file for the JDO/DataNucleus objectstore
+#
+
+# identifies @PersistenceCapable entities to be eagerly registered
+# if move class to other package (eg com.mycompany.myapp.dom) then update 
+isis.persistor.datanucleus.RegisterEntities.packagePrefix=dom
+
+# whether to persist the event data as a "clob" or as a "zipped" byte[]
+# default is "zipped"
+#isis.persistor.datanucleus.PublishingService.serializedForm=zipped
+
+
+#####################################################################
+#
+# DataNucleus' configuration
+#
+# The 'isis.persistor.datanucleus.impl' prefix is stripped off,
+# remainder is passed through to DataNucleus
+#
+#####################################################################
+
+isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
+
+
+#
+# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo).
+# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html
+#
+isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
+
+
+#
+# How column names are identified 
+# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html)
+#
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
+
+#
+# L2 cache
+# off except if explicitly marked as cacheable
+# http://www.datanucleus.org/products/datanucleus/jdo/cache.html
+#
+isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none
+isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE
+
+
+
+#
+# uncomment to use JNDI rather than direct JDBC
+#
+#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName=java:comp/env/jdbc/quickstart
+
+#
+# uncomment to use JTA resource
+#
+#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name=java:comp/env/jdbc/quickstart-nontx
+#isis.persistor.datanucleus.impl.javax.jdo.option.TransactionType=JTA
+
+
+
+#
+#
+# JDBC connection details
+# ... are in persistor.properties
+#
+#


[02/20] isis git commit: Merge pull request #1 from apache/master

Posted by da...@apache.org.
Merge pull request #1 from apache/master

merging back from main

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

Branch: refs/heads/ISIS-789
Commit: fb6a37cf242eef2ac0b09b72cb233e2785647082
Parents: 81dbfd8 bbef048
Author: Jeremy <jd...@hotmail.com>
Authored: Wed Dec 24 00:57:55 2014 -0600
Committer: Jeremy <jd...@hotmail.com>
Committed: Wed Dec 24 00:57:55 2014 -0600

----------------------------------------------------------------------
 .../wicket/AuthenticatedWebSessionForIsis.java  |  7 +-
 ...enticationManagerStandardForDfltRuntime.java | 12 +--
 .../IsisConfigurationForJdoIntegTests.java      | 15 ++++
 .../application/simpleapp/integtests/.gitignore |  1 +
 example/application/simpleapp/webapp/.gitignore |  2 +-
 example/application/simpleapp/webapp/pom.xml    | 16 ++--
 .../main/webapp/WEB-INF/persistor.properties    | 14 ++--
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 14 ++--
 .../application/todoapp/integtests/.gitignore   |  1 +
 .../integration/ToDoAppSystemInitializer.java   | 77 +++++++++++++++++++
 .../java/integration/ToDoSystemInitializer.java | 77 -------------------
 .../integration/glue/BootstrappingGlue.java     |  4 +-
 .../tests/AbstractToDoIntegTest.java            |  4 +-
 .../integration/tests/ToDoItemIntegTest.java    |  2 +-
 example/application/todoapp/webapp/.gitignore   |  2 +-
 example/application/todoapp/webapp/pom.xml      | 16 ++--
 .../main/webapp/WEB-INF/persistor.properties    | 12 ++-
 .../META-INF/maven/archetype-metadata.xml       | 12 +++
 .../archetype-resources/integtests/.gitignore   |  1 +
 .../archetype-resources/webapp/.gitignore       |  1 +
 .../archetype-resources/webapp/pom.xml          | 10 +++
 .../main/webapp/WEB-INF/persistor.properties    | 11 ++-
 .../projects/basic/archetype.properties         |  2 +-
 .../META-INF/maven/archetype-metadata.xml       | 12 +++
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 14 ++--
 .../archetype-resources/integtests/.gitignore   |  1 +
 .../integration/ToDoAppSystemInitializer.java   | 80 ++++++++++++++++++++
 .../java/integration/ToDoSystemInitializer.java | 80 --------------------
 .../integration/glue/BootstrappingGlue.java     |  4 +-
 .../tests/AbstractToDoIntegTest.java            |  4 +-
 .../integration/tests/ToDoItemIntegTest.java    |  2 +-
 .../archetype-resources/webapp/.gitignore       |  1 +
 .../archetype-resources/webapp/pom.xml          | 10 +++
 .../main/webapp/WEB-INF/persistor.properties    |  9 ++-
 .../projects/basic/archetype.properties         |  2 +-
 scripts/recreate-archetype.sh                   |  2 +-
 36 files changed, 309 insertions(+), 225 deletions(-)
----------------------------------------------------------------------



[04/20] isis git commit: Update ClassSubstitutor.java

Posted by da...@apache.org.
Update ClassSubstitutor.java

whitespace issue

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

Branch: refs/heads/ISIS-789
Commit: 61dc91aebd85e0347f75c0e2ff2b8ba5e89bab3f
Parents: 8d9600a
Author: Jeremy <jd...@hotmail.com>
Authored: Wed Dec 24 18:26:49 2014 -0600
Committer: Jeremy <jd...@hotmail.com>
Committed: Wed Dec 24 18:26:49 2014 -0600

----------------------------------------------------------------------
 .../metamodel/specloader/classsubstitutor/ClassSubstitutor.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/61dc91ae/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
index 2f61b43..6387ee6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
@@ -51,8 +51,8 @@ public class ClassSubstitutor {
     public Class<?> getClass(final Class<?> cls) {
     	
     	if (cls == null) {
-			return null;
-		}
+		return null;
+	}
 
         // ignore datanucleus proxies
         if(cls.getName().startsWith("org.datanucleus")) {


[13/20] isis git commit: Corrected StoreManager access for DN4

Posted by da...@apache.org.
Corrected StoreManager access for DN4


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

Branch: refs/heads/ISIS-789
Commit: a5fb8ee21c9ace5fd884dae1fd8ca32fdf05694a
Parents: 6f4a9be
Author: jdb6853 <jd...@hotmail.com>
Authored: Fri Jan 2 02:56:24 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Fri Jan 2 02:56:24 2015 -0600

----------------------------------------------------------------------
 .../datanucleus/DataNucleusApplicationComponents.java | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a5fb8ee2/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
index 762409e..cbcf222 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
@@ -33,6 +33,7 @@ import com.google.common.collect.Maps;
 import org.datanucleus.NucleusContext;
 import org.datanucleus.NucleusContextHelper;
 import org.datanucleus.PropertyNames;
+import org.datanucleus.StoreNucleusContext;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
 import org.datanucleus.metadata.MetaDataManager;
 import org.datanucleus.store.StoreManager;
@@ -128,13 +129,12 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     	
         final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
         final NucleusContext nucleusContext = jdopmf.getNucleusContext();
-        final StoreManager storeManager = NucleusContextHelper.createStoreManagerForProperties(
-                new HashMap<String, Object>(props),
-                jdopmf.getPersistenceProperties(),
-                nucleusContext.getClassLoaderResolver(ClassLoader.getSystemClassLoader()), nucleusContext);
-        if (storeManager instanceof SchemaAwareStoreManager) {
-            ((SchemaAwareStoreManager)storeManager).createSchemaForClasses(classesToBePersisted, asProperties(props));
-		}
+        if (nucleusContext instanceof StoreNucleusContext) {
+            final StoreManager storeManager = ((StoreNucleusContext)nucleusContext).getStoreManager();
+            if (storeManager instanceof SchemaAwareStoreManager) {
+                ((SchemaAwareStoreManager)storeManager).createSchemaForClasses(classesToBePersisted, asProperties(props));
+            }
+        }
     }
 
 


[18/20] isis git commit: Update README.md

Posted by da...@apache.org.
Update README.md

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

Branch: refs/heads/ISIS-789
Commit: f7284d8fb4fbe58479e819b37e7ee3cc731d57ad
Parents: ec2a3b6
Author: Jeremy <jd...@hotmail.com>
Authored: Fri Jan 2 15:40:56 2015 -0600
Committer: Jeremy <jd...@hotmail.com>
Committed: Fri Jan 2 15:40:56 2015 -0600

----------------------------------------------------------------------
 README.md | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/f7284d8f/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 15c0bb0..96a3b04 100644
--- a/README.md
+++ b/README.md
@@ -93,3 +93,11 @@ Scalar chart, being the result of an action to analyze `ToDoItem`s by their cate
 A scalar chart is simply a wrapper around a [WickedChart](http://wicked-charts.googlecode.com).
 s
 
+
+#### Neo4j
+
+Embedded Neo4j server runs along side Isis on port 7474 by default.
+(https://github.com/Sprint/isis-neo4j/)
+
+Shown with simpleapp fixture script installed  
+![alt text](https://raw.githubusercontent.com/Sprint/isis-neo4j/master/src/test/resources/NeoBrowser.PNG "Embedded Neo4j Browser")


[16/20] isis git commit: Based on the simpleapp, there is now a neoapp that runs Neo4j version 2.1.6 embedded. It also includes the Neo4j client browser that runs on port 7474 by default alongside Isis.

Posted by da...@apache.org.
Based on the simpleapp, there is now a neoapp that runs Neo4j version 2.1.6 embedded.
It also includes the Neo4j client browser that runs on port 7474 by default alongside Isis.


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

Branch: refs/heads/ISIS-789
Commit: 8b0f86102c12627eba2462e29eff476ff834f61d
Parents: a5fb8ee
Author: jdb6853 <jd...@hotmail.com>
Authored: Fri Jan 2 15:23:03 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Fri Jan 2 15:23:03 2015 -0600

----------------------------------------------------------------------
 example/application/neoapp/dom/.gitignore       |   2 +
 example/application/neoapp/dom/log4j.properties |  41 ++
 example/application/neoapp/dom/pom.xml          | 172 ++++++++
 .../dom/src/main/java/META-INF/persistence.xml  |  26 ++
 .../src/main/java/dom/simple/SimpleObject.java  |  76 ++++
 .../java/dom/simple/SimpleObject.layout.json    |  44 ++
 .../src/main/java/dom/simple/SimpleObject.png   | Bin 0 -> 557 bytes
 .../src/main/java/dom/simple/SimpleObjects.java |  63 +++
 .../test/java/dom/simple/SimpleObjectTest.java  |  51 +++
 .../test/java/dom/simple/SimpleObjectsTest.java | 102 +++++
 example/application/neoapp/fixture/.gitignore   |   3 +
 example/application/neoapp/fixture/pom.xml      |  40 ++
 .../simple/SimpleObjectsFixturesService.java    |  69 ++++
 .../simple/SimpleObjectsTearDownFixture.java    |  36 ++
 .../simple/objects/SimpleObjectAbstract.java    |  36 ++
 .../simple/objects/SimpleObjectForBar.java      |  31 ++
 .../simple/objects/SimpleObjectForBaz.java      |  31 ++
 .../simple/objects/SimpleObjectForFoo.java      |  31 ++
 .../simple/scenario/SimpleObjectsFixture.java   |  45 +++
 .../application/neoapp/integtests/.gitignore    |   3 +
 .../neoapp/integtests/logging.properties        | 103 +++++
 example/application/neoapp/integtests/pom.xml   | 159 ++++++++
 .../integration/SimpleAppSystemInitializer.java |  72 ++++
 .../integration/glue/BootstrappingGlue.java     |  53 +++
 .../integration/glue/CatalogOfFixturesGlue.java |  46 +++
 .../glue/InMemoryDBForSimpleApp.java            |  40 ++
 .../glue/simple/SimpleObjectGlue.java           |  96 +++++
 .../java/integration/specs/simple/RunSpecs.java |  38 ++
 .../SimpleObjectSpec_listAllAndCreate.feature   |  37 ++
 .../integration/tests/SimpleAppIntegTest.java   |  38 ++
 .../tests/smoke/SimpleObjectTest.java           |  82 ++++
 .../tests/smoke/SimpleObjectsTest.java          | 148 +++++++
 example/application/neoapp/pom.xml              | 378 ++++++++++++++++++
 example/application/neoapp/webapp/.gitignore    |   3 +
 .../launch/SimpleApp-PROTOTYPE-jrebel.launch    |  31 ++
 .../SimpleApp-PROTOTYPE-no-fixtures.launch      |  23 ++
 .../SimpleApp-PROTOTYPE-with-fixtures.launch    |  20 +
 .../launch/SimpleApp-SERVER-no-fixtures.launch  |  23 ++
 .../webapp/ide/intellij/launch/README.txt       |   2 +
 .../ide/intellij/launch/SimpleApp_PROTOTYPE.xml |  28 ++
 .../launch/SimpleApp__enhance_only_.xml         |  22 +
 .../application/neoapp/webapp/lib/.gitignore    |   5 +
 example/application/neoapp/webapp/messages.log  |   0
 example/application/neoapp/webapp/pom.xml       | 397 +++++++++++++++++++
 .../src/main/java/webapp/SimpleApplication.java | 150 +++++++
 .../src/main/jettyconsole/isis-banner.pdn       | Bin 0 -> 69658 bytes
 .../src/main/jettyconsole/isis-banner.png       | Bin 0 -> 30776 bytes
 .../src/main/resources/webapp/welcome.html      |  35 ++
 .../src/main/webapp/WEB-INF/isis.properties     | 232 +++++++++++
 .../src/main/webapp/WEB-INF/logging.properties  | 185 +++++++++
 .../main/webapp/WEB-INF/persistor.properties    | 128 ++++++
 .../WEB-INF/persistor_datanucleus.properties    |  86 ++++
 .../webapp/src/main/webapp/WEB-INF/shiro.ini    |  93 +++++
 .../WEB-INF/viewer_restfulobjects.properties    |  66 +++
 .../webapp/WEB-INF/viewer_wicket.properties     |  84 ++++
 .../webapp/src/main/webapp/WEB-INF/web.xml      | 309 +++++++++++++++
 .../src/main/webapp/about/images/isis-logo.png  | Bin 0 -> 14160 bytes
 .../webapp/src/main/webapp/about/index.html     | 104 +++++
 .../webapp/src/main/webapp/css/application.css  |  19 +
 .../src/main/webapp/images/spinning-icon.gif    | Bin 0 -> 5266 bytes
 .../src/main/webapp/scripts/application.js      |   3 +
 .../webapp/src/test/resources/NeoBrowser.PNG    | Bin 0 -> 39360 bytes
 .../src/main/webapp/WEB-INF/isis.properties     |   3 +-
 63 files changed, 4241 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/.gitignore b/example/application/neoapp/dom/.gitignore
new file mode 100644
index 0000000..76414b3
--- /dev/null
+++ b/example/application/neoapp/dom/.gitignore
@@ -0,0 +1,2 @@
+target
+target-ide
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/log4j.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/log4j.properties b/example/application/neoapp/dom/log4j.properties
new file mode 100644
index 0000000..ca165ac
--- /dev/null
+++ b/example/application/neoapp/dom/log4j.properties
@@ -0,0 +1,41 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+# LOG4J Configuration
+# ===================
+
+# Basic logging goes to "datanucleus.log"
+log4j.appender.A1=org.apache.log4j.FileAppender
+log4j.appender.A1.File=datanucleus.log
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%t) %-5p [%c] - %m%n
+#log4j.appender.A1.Threshold=INFO
+
+# Categories
+# Each category can be set to a "level", and to direct to an appender
+
+# Default to DEBUG level for all DataNucleus categories
+log4j.logger.DataNucleus = DEBUG, A1
+
+log4j.category.com.mchange.v2.c3p0=INFO, A1
+log4j.category.com.mchange.v2.resourcepool=INFO, A1
+log4j.category.org.logicalcobwebs.proxool=INFO,A1
+
+
+# Hbase libs logging
+log4j.category.org.apache.hadoop=INFO,A1
+log4j.category.org.apache.zookeeper=INFO,A1
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/pom.xml b/example/application/neoapp/dom/pom.xml
new file mode 100644
index 0000000..a5a491b
--- /dev/null
+++ b/example/application/neoapp/dom/pom.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.example.application</groupId>
+        <artifactId>neoapp</artifactId>
+        <version>1.8.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>neoapp-dom</artifactId>
+    <name>Neo4j App DOM</name>
+
+    <build>
+        <resources>
+            <resource>
+                <filtering>false</filtering>
+                <directory>src/main/resources</directory>
+            </resource>
+            <resource>
+                <filtering>false</filtering>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**</include>
+                </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.datanucleus</groupId>
+                <artifactId>datanucleus-maven-plugin</artifactId>
+                <version>${datanucleus-maven-plugin.version}</version>
+                <configuration>
+                    <fork>false</fork>
+                    <log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
+                    <verbose>true</verbose>
+                    <props>${basedir}/datanucleus.properties</props>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>enhance</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>
+                                            org.datanucleus
+                                        </groupId>
+                                        <artifactId>
+                                            datanucleus-maven-plugin
+                                        </artifactId>
+                                        <versionRange>
+                                            [3.2.0-release,)
+                                        </versionRange>
+                                        <goals>
+                                            <goal>enhance</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore></ignore>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-applib</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-unittestsupport</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Bytecode libraries (for mocking) -->
+        <dependency>
+            <groupId>org.objenesis</groupId>
+            <artifactId>objenesis</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>isis-validate</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.isis.tool</groupId>
+                        <artifactId>isis-maven-plugin</artifactId>
+                        <version>1.8.0-SNAPSHOT</version>
+                        <configuration>
+                            <isisConfigDir>../webapp/src/main/webapp/WEB-INF</isisConfigDir>
+                        </configuration>
+                        <dependencies>
+                            <dependency>
+                                <groupId>org.apache.isis.example.application</groupId>
+                                <artifactId>todoapp-dom</artifactId>
+                                <version>1.8.0-SNAPSHOT</version>
+                            </dependency>
+                            <!--
+                            ... workaround to avoid conflict with plexus-default
+                                (not sure why exclusions in the isis-maven-plugin aren't sufficient, though ...
+                            -->
+                            <dependency>
+                                <groupId>com.google.guava</groupId>
+                                <artifactId>guava</artifactId>
+                                <version>16.0.1</version>
+                            </dependency>
+                        </dependencies>
+                        <executions>
+                            <execution>
+                                <phase>test</phase>
+                                <goals>
+                                    <goal>validate</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml b/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
new file mode 100644
index 0000000..8824aa1
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/META-INF/persistence.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
+
+    <persistence-unit name="simple">
+    </persistence-unit>
+</persistence>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
new file mode 100644
index 0000000..74cef09
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.java
@@ -0,0 +1,76 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package dom.simple;
+
+import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.VersionStrategy;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ObjectType;
+import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.applib.util.ObjectContracts;
+
+@javax.jdo.annotations.PersistenceCapable(identityType=IdentityType.DATASTORE)
+@javax.jdo.annotations.DatastoreIdentity(
+        strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY,
+         column="id")
+@javax.jdo.annotations.Version(
+        strategy=VersionStrategy.VERSION_NUMBER, 
+        column="version")
+@javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"})
+@ObjectType("SIMPLE")
+@Bookmarkable
+public class SimpleObject implements Comparable<SimpleObject> {
+
+    //region > name (property)
+
+    private String name;
+
+    @javax.jdo.annotations.Column(allowsNull="false")
+    @Title(sequence="1")
+    @MemberOrder(sequence="1")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    //endregion
+
+    //region > compareTo
+
+    @Override
+    public int compareTo(SimpleObject other) {
+        return ObjectContracts.compare(this, other, "name");
+    }
+
+    //endregion
+
+    //region > injected services
+
+    @javax.inject.Inject
+    @SuppressWarnings("unused")
+    private DomainObjectContainer container;
+
+    //endregion
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
new file mode 100644
index 0000000..35f57bb
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.layout.json
@@ -0,0 +1,44 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+{
+  "columns": [
+    {
+      "span": 6,
+      "memberGroups": {
+        "General": {
+          "members": {
+            "name": {}
+          }
+        }
+      }
+    },
+    {
+      "span": 0,
+      "memberGroups": {}
+    },
+    {
+      "span": 0,
+      "memberGroups": {}
+    },
+    {
+      "span": 6,
+      "collections": {}
+    }
+  ],
+  "actions": {}
+}
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png
new file mode 100644
index 0000000..3f91282
Binary files /dev/null and b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObject.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
new file mode 100644
index 0000000..5540293
--- /dev/null
+++ b/example/application/neoapp/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package dom.simple;
+
+import java.util.List;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.ActionSemantics.Of;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+
+@DomainService(menuOrder = "10", repositoryFor = SimpleObject.class)
+public class SimpleObjects {
+
+    //region > listAll (action)
+
+    @Bookmarkable
+    @ActionSemantics(Of.SAFE)
+    @MemberOrder(sequence = "1")
+    public List<SimpleObject> listAll() {
+        return container.allInstances(SimpleObject.class);
+    }
+
+    //endregion
+
+    //region > create (action)
+    @MemberOrder(sequence = "2")
+    public SimpleObject create(
+            final @ParameterLayout(named="Name") String name) {
+        final SimpleObject obj = container.newTransientInstance(SimpleObject.class);
+        obj.setName(name);
+        container.persistIfNotAlready(obj);
+        return obj;
+    }
+
+    //endregion
+
+    //region > injected services
+
+    @javax.inject.Inject 
+    DomainObjectContainer container;
+
+    //endregion
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
new file mode 100644
index 0000000..fe6f0ac
--- /dev/null
+++ b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectTest.java
@@ -0,0 +1,51 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package dom.simple;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectTest {
+
+    SimpleObject simpleObject;
+
+    @Before
+    public void setUp() throws Exception {
+        simpleObject = new SimpleObject();
+    }
+
+    public static class Name extends SimpleObjectTest {
+
+        @Test
+        public void happyCase() throws Exception {
+            // given
+            String name = "Foobar";
+            assertThat(simpleObject.getName(), is(nullValue()));
+
+            // when
+            simpleObject.setName(name);
+
+            // then
+            assertThat(simpleObject.getName(), is(name));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
new file mode 100644
index 0000000..27b9ac3
--- /dev/null
+++ b/example/application/neoapp/dom/src/test/java/dom/simple/SimpleObjectsTest.java
@@ -0,0 +1,102 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package dom.simple;
+
+import java.util.List;
+import com.google.common.collect.Lists;
+import org.jmock.Expectations;
+import org.jmock.Sequence;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectsTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+    @Mock
+    DomainObjectContainer mockContainer;
+    
+    SimpleObjects simpleObjects;
+
+    @Before
+    public void setUp() throws Exception {
+        simpleObjects = new SimpleObjects();
+        simpleObjects.container = mockContainer;
+    }
+
+    public static class Create extends SimpleObjectsTest {
+
+        @Test
+        public void happyCase() throws Exception {
+
+            // given
+            final SimpleObject simpleObject = new SimpleObject();
+
+            final Sequence seq = context.sequence("create");
+            context.checking(new Expectations() {
+                {
+                    oneOf(mockContainer).newTransientInstance(SimpleObject.class);
+                    inSequence(seq);
+                    will(returnValue(simpleObject));
+
+                    oneOf(mockContainer).persistIfNotAlready(simpleObject);
+                    inSequence(seq);
+                }
+            });
+
+            // when
+            final SimpleObject obj = simpleObjects.create("Foobar");
+
+            // then
+            assertThat(obj, is(simpleObject));
+            assertThat(obj.getName(), is("Foobar"));
+        }
+
+    }
+
+    public static class ListAll extends SimpleObjectsTest {
+
+        @Test
+        public void happyCase() throws Exception {
+
+            // given
+            final List<SimpleObject> all = Lists.newArrayList();
+
+            context.checking(new Expectations() {
+                {
+                    oneOf(mockContainer).allInstances(SimpleObject.class);
+                    will(returnValue(all));
+                }
+            });
+
+            // when
+            final List<SimpleObject> list = simpleObjects.listAll();
+
+            // then
+            assertThat(list, is(all));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/.gitignore b/example/application/neoapp/fixture/.gitignore
new file mode 100644
index 0000000..63c135d
--- /dev/null
+++ b/example/application/neoapp/fixture/.gitignore
@@ -0,0 +1,3 @@
+/target-ide
+target
+target-ide
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/pom.xml b/example/application/neoapp/fixture/pom.xml
new file mode 100644
index 0000000..2f1da42
--- /dev/null
+++ b/example/application/neoapp/fixture/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.example.application</groupId>
+        <artifactId>neoapp</artifactId>
+        <version>1.8.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>neoapp-fixture</artifactId>
+    <name>Neo4j App Fixtures</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>neoapp-dom</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
new file mode 100644
index 0000000..690b7b6
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.simple;
+
+import fixture.simple.scenario.SimpleObjectsFixture;
+
+import java.util.List;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Prototype;
+import org.apache.isis.applib.fixturescripts.FixtureResult;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+import org.apache.isis.applib.fixturescripts.SimpleFixtureScript;
+
+/**
+ * Enables fixtures to be installed from the application.
+ */
+@DomainService
+@DomainServiceLayout(named="Prototyping", menuBar = DomainServiceLayout.MenuBar.SECONDARY, menuOrder = "20")
+public class SimpleObjectsFixturesService extends FixtureScripts {
+
+    public SimpleObjectsFixturesService() {
+        super("fixture.simple");
+    }
+
+    @Override
+    public FixtureScript default0RunFixtureScript() {
+        return findFixtureScriptFor(SimpleFixtureScript.class);
+    }
+
+    /**
+     * Raising visibility to <tt>public</tt> so that choices are available for first param
+     * of {@link #runFixtureScript(FixtureScript, String)}.
+     */
+    @Override
+    public List<FixtureScript> choices0RunFixtureScript() {
+        return super.choices0RunFixtureScript();
+    }
+
+
+    // //////////////////////////////////////
+
+    @Prototype
+    @MemberOrder(sequence="20")
+    public Object installFixturesAndReturnFirst() {
+        final List<FixtureResult> run = findFixtureScriptFor(SimpleObjectsFixture.class).run(null);
+        return run.get(0).getObject();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
new file mode 100644
index 0000000..2f9be56
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/SimpleObjectsTearDownFixture.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.objectstore.jdo.applib.service.support.IsisJdoSupport;
+
+public class SimpleObjectsTearDownFixture extends FixtureScript {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+        isisJdoSupport.executeUpdate("delete from \"SimpleObject\"");
+    }
+
+
+    @javax.inject.Inject
+    private IsisJdoSupport isisJdoSupport;
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
new file mode 100644
index 0000000..0edd80b
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public abstract class SimpleObjectAbstract extends FixtureScript {
+
+    protected SimpleObject create(final String name, ExecutionContext executionContext) {
+        return executionContext.addResult(this, simpleObjects.create(name));
+    }
+
+    @javax.inject.Inject
+    private SimpleObjects simpleObjects;
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
new file mode 100644
index 0000000..a59aea4
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForBar extends SimpleObjectAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        create("Bar", executionContext);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
new file mode 100644
index 0000000..b71baeb
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForBaz extends SimpleObjectAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        create("Baz", executionContext);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
new file mode 100644
index 0000000..fa3d488
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForFoo extends SimpleObjectAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        create("Foo", executionContext);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java b/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
new file mode 100644
index 0000000..c44af4b
--- /dev/null
+++ b/example/application/neoapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
@@ -0,0 +1,45 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.scenario;
+
+import fixture.simple.SimpleObjectsTearDownFixture;
+import fixture.simple.objects.SimpleObjectForBar;
+import fixture.simple.objects.SimpleObjectForBaz;
+import fixture.simple.objects.SimpleObjectForFoo;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public class SimpleObjectsFixture extends FixtureScript {
+
+    public SimpleObjectsFixture() {
+        withDiscoverability(Discoverability.DISCOVERABLE);
+    }
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        executionContext.executeChild(this, new SimpleObjectsTearDownFixture());
+
+        executionContext.executeChild(this, new SimpleObjectForFoo());
+        executionContext.executeChild(this, new SimpleObjectForBar());
+        executionContext.executeChild(this, new SimpleObjectForBaz());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/.gitignore
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/.gitignore b/example/application/neoapp/integtests/.gitignore
new file mode 100644
index 0000000..3faa3ab
--- /dev/null
+++ b/example/application/neoapp/integtests/.gitignore
@@ -0,0 +1,3 @@
+/neo4j_DB/
+target
+target-ide
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/logging.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/logging.properties b/example/application/neoapp/integtests/logging.properties
new file mode 100644
index 0000000..d0b81cb
--- /dev/null
+++ b/example/application/neoapp/integtests/logging.properties
@@ -0,0 +1,103 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+
+#
+# Isis uses log4j is used to provide system logging
+#
+log4j.rootCategory=INFO, Console
+
+# The console appender
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.target=System.out
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE}  [%-20c{1} %-10t %-5p]  %m%n
+
+log4j.appender.File=org.apache.log4j.RollingFileAppender
+log4j.appender.File.file=isis.log
+log4j.appender.File.append=false
+log4j.appender.File.layout=org.apache.log4j.PatternLayout
+log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p]  %m%n
+
+
+! turn on the internal log4j debugging flag so we can see what it is doing
+#log4j.debug=true
+
+
+# DataNucleus
+# the first two log the DML and DDL (if set to DEBUG)
+log4j.logger.DataNucleus.Datastore.Native=WARN, Console
+log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
+# the remainder can probably be left to WARN
+log4j.logger.DataNucleus.Persistence=WARN, Console
+log4j.logger.DataNucleus.Transaction=WARN, Console
+log4j.logger.DataNucleus.Connection=WARN, Console
+log4j.logger.DataNucleus.Query=WARN, Console
+log4j.logger.DataNucleus.Cache=WARN, Console
+log4j.logger.DataNucleus.MetaData=WARN, Console
+log4j.logger.DataNucleus.Datastore=WARN, Console
+log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
+log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
+log4j.logger.DataNucleus.General=WARN, Console
+log4j.logger.DataNucleus.Lifecycle=WARN, Console
+log4j.logger.DataNucleus.ValueGeneration=WARN, Console
+log4j.logger.DataNucleus.Enhancer=WARN, Console
+log4j.logger.DataNucleus.SchemaTool=ERROR, Console
+log4j.logger.DataNucleus.JDO=WARN, Console
+log4j.logger.DataNucleus.JPA=ERROR, Console
+log4j.logger.DataNucleus.JCA=WARN, Console
+log4j.logger.DataNucleus.IDE=ERROR, Console
+
+log4j.additivity.DataNucleus.Datastore.Native=false
+log4j.additivity.DataNucleus.Datastore.Schema=false
+log4j.additivity.DataNucleus.Datastore.Persistence=false
+log4j.additivity.DataNucleus.Datastore.Transaction=false
+log4j.additivity.DataNucleus.Datastore.Connection=false
+log4j.additivity.DataNucleus.Datastore.Query=false
+log4j.additivity.DataNucleus.Datastore.Cache=false
+log4j.additivity.DataNucleus.Datastore.MetaData=false
+log4j.additivity.DataNucleus.Datastore.Datastore=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
+log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
+log4j.additivity.DataNucleus.Datastore.General=false
+log4j.additivity.DataNucleus.Datastore.Lifecycle=false
+log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
+log4j.additivity.DataNucleus.Datastore.Enhancer=false
+log4j.additivity.DataNucleus.Datastore.SchemaTool=false
+log4j.additivity.DataNucleus.Datastore.JDO=false
+log4j.additivity.DataNucleus.Datastore.JPA=false
+log4j.additivity.DataNucleus.Datastore.JCA=false
+log4j.additivity.DataNucleus.Datastore.IDE=false
+
+
+
+
+# if using log4jdbc-remix as JDBC driver
+#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
+#log4j.additivity.jdbc.sqlonly=false
+#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
+#log4j.additivity.jdbc.resultsettable=false
+
+#log4j.logger.jdbc.audit=WARN,jdbc, Console
+#log4j.additivity.jdbc.audit=false
+#log4j.logger.jdbc.resultset=WARN,jdbc
+#log4j.additivity.jdbc.resultset=false
+#log4j.logger.jdbc.sqltiming=WARN,sqltiming
+#log4j.additivity.jdbc.sqltiming=false
+#log4j.logger.jdbc.connection=FATAL,connection
+#log4j.additivity.jdbc.connection=false
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/pom.xml b/example/application/neoapp/integtests/pom.xml
new file mode 100644
index 0000000..846c856
--- /dev/null
+++ b/example/application/neoapp/integtests/pom.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.isis.example.application</groupId>
+        <artifactId>neoapp</artifactId>
+        <version>1.8.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>neoapp-integtests</artifactId>
+    <name>Neo4j App Integration Tests</name>
+
+    <build>
+        <testResources>
+            <testResource>
+                <filtering>false</filtering>
+                <directory>src/test/resources</directory>
+            </testResource>
+            <testResource>
+                <filtering>false</filtering>
+                <directory>src/test/java</directory>
+                <includes>
+                    <include>**</include>
+                </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </testResource>
+        </testResources>
+        <plugins>
+            <!-- 
+            uncomment for enhanced cucumber-jvm reporting
+            http://www.masterthought.net/section/cucumber-reporting
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <testfailureignore>true</testfailureignore>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>net.masterthought</groupId>
+                <artifactId>maven-cucumber-reporting</artifactId>
+                <version>0.0.3</version>
+                <executions>
+                    <execution>
+                        <id>execution</id>
+                        <phase>verify</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <projectname>cucumber-jvm-example</projectname>
+                            <outputdirectory>${project.build.directory}/cucumber-reports</outputdirectory>
+                            <cucumberoutput>${project.build.directory}/cucumber.json</cucumberoutput>
+                            <enableflashcharts>false</enableflashcharts>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>  
+            -->
+        </plugins>
+    </build>
+    <dependencies>
+
+        <!-- other modules in this project -->
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>neoapp-fixture</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-unittestsupport</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-integtestsupport</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-specsupport</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-library</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-wrapper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-runtime</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+        </dependency>
+
+        <!-- 
+        uncomment to enable enhanced cucumber-jvm reporting
+        http://www.masterthought.net/section/cucumber-reporting
+        <dependency>  
+            <groupId>com.googlecode.totallylazy</groupId>  
+            <artifactId>totallylazy</artifactId>  
+            <version>991</version>  
+        </dependency>
+
+        <dependency>
+            <groupId>net.masterthought</groupId>
+            <artifactId>cucumber-reporting</artifactId>
+            <version>0.0.21</version>
+        </dependency>
+        <dependency>
+            <groupId>net.masterthought</groupId>
+            <artifactId>maven-cucumber-reporting</artifactId>
+            <version>0.0.4</version>
+        </dependency>  
+        -->
+    </dependencies>
+
+    <!-- 
+    uncomment for enhanced cucumber-jvm reporting
+    http://www.masterthought.net/section/cucumber-reporting
+    <repositories>  
+        <repository>  
+            <id>repo.bodar.com</id>  
+            <url>http://repo.bodar.com</url>  
+        </repository>  
+    </repositories>  
+     -->
+
+
+</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java b/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
new file mode 100644
index 0000000..fa67f2a
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/SimpleAppSystemInitializer.java
@@ -0,0 +1,72 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package integration;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.integtestsupport.IsisSystemForTest;
+import org.apache.isis.core.runtime.persistence.PersistenceConstants;
+import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller;
+import org.apache.isis.objectstore.jdo.datanucleus.IsisConfigurationForJdoIntegTests;
+
+/**
+ * Holds an instance of an {@link IsisSystemForTest} as a {@link ThreadLocal} on the current thread,
+ * initialized with ToDo app's domain services. 
+ */
+public class SimpleAppSystemInitializer {
+    
+    private SimpleAppSystemInitializer(){}
+
+    public static IsisSystemForTest initIsft() {
+        IsisSystemForTest isft = IsisSystemForTest.getElseNull();
+        if(isft == null) {
+            isft = new SimpleAppSystemBuilder().build().setUpSystem();
+            IsisSystemForTest.set(isft);
+        }
+        return isft;
+    }
+
+    private static class SimpleAppSystemBuilder extends IsisSystemForTest.Builder {
+
+        public SimpleAppSystemBuilder() {
+            withLoggingAt(org.apache.log4j.Level.INFO);
+            with(testConfiguration());
+            with(new DataNucleusPersistenceMechanismInstaller());
+
+            // services annotated with @DomainService
+            withServicesIn( "dom.simple"
+                            ,"fixture.simple"
+                            ,"org.apache.isis.core.wrapper"
+                            ,"org.apache.isis.applib"
+                            ,"org.apache.isis.core.metamodel.services"
+                            ,"org.apache.isis.core.runtime.services"
+                            ,"org.apache.isis.objectstore.jdo.datanucleus.service.support" // IsisJdoSupportImpl
+                            ,"org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" // EventBusServiceJdo
+                            );
+        }
+
+        private static IsisConfiguration testConfiguration() {
+            final IsisConfigurationForJdoIntegTests testConfiguration = new IsisConfigurationForJdoIntegTests();
+
+            // enable stricter checking
+            testConfiguration.put(PersistenceConstants.ENFORCE_SAFE_SEMANTICS, "true");
+
+            testConfiguration.addRegisterEntitiesPackagePrefix("dom");
+            return testConfiguration;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
new file mode 100644
index 0000000..1950881
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/BootstrappingGlue.java
@@ -0,0 +1,53 @@
+/**
+O *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package integration.glue;
+
+import cucumber.api.java.After;
+import cucumber.api.java.Before;
+import integration.SimpleAppSystemInitializer;
+
+import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope;
+import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
+
+public class BootstrappingGlue extends CukeGlueAbstract {
+
+    // //////////////////////////////////////
+    
+    @Before(value={"@unit"}, order=100)
+    public void beforeScenarioUnitScope() {
+        before(ScenarioExecutionScope.UNIT);
+    }
+
+    @Before(value={"@integration"}, order=100)
+    public void beforeScenarioIntegrationScope() {
+        org.apache.log4j.PropertyConfigurator.configure("logging.properties");
+        SimpleAppSystemInitializer.initIsft();
+        
+        before(ScenarioExecutionScope.INTEGRATION);
+    }
+
+    @After
+    public void afterScenario(cucumber.api.Scenario sc) {
+        assertMocksSatisfied();
+        after(sc);
+    }
+
+    // //////////////////////////////////////
+    
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
new file mode 100644
index 0000000..508a3a0
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
@@ -0,0 +1,46 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package integration.glue;
+
+import cucumber.api.java.Before;
+import dom.simple.SimpleObject;
+import fixture.simple.scenario.SimpleObjectsFixture;
+
+import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
+import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
+
+public class CatalogOfFixturesGlue extends CukeGlueAbstract {
+
+    
+    @Before(value={"@unit", "@SimpleObjectsFixture"}, order=20000)
+    public void unitFixtures() throws Throwable {
+        final InMemoryDB inMemoryDB = new InMemoryDBForSimpleApp(this.scenarioExecution());
+        inMemoryDB.getElseCreate(SimpleObject.class, "Foo");
+        inMemoryDB.getElseCreate(SimpleObject.class, "Bar");
+        inMemoryDB.getElseCreate(SimpleObject.class, "Baz");
+        putVar("isis", "in-memory-db", inMemoryDB);
+    }
+
+    // //////////////////////////////////////
+
+    @Before(value={"@integration", "@SimpleObjectsFixture"}, order=20000)
+    public void integrationFixtures() throws Throwable {
+        scenarioExecution().install(new SimpleObjectsFixture());
+    }
+    
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java b/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
new file mode 100644
index 0000000..50f0a51
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/InMemoryDBForSimpleApp.java
@@ -0,0 +1,40 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package integration.glue;
+
+import dom.simple.SimpleObject;
+
+import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
+import org.apache.isis.core.specsupport.scenarios.ScenarioExecution;
+
+public class InMemoryDBForSimpleApp extends InMemoryDB {
+    
+    public InMemoryDBForSimpleApp(ScenarioExecution scenarioExecution) {
+        super(scenarioExecution);
+    }
+    
+    /**
+     * Hook to initialize if possible.
+     */
+    @Override
+    protected void init(Object obj, String str) {
+        if(obj instanceof SimpleObject) {
+            SimpleObject toDoItem = (SimpleObject) obj;
+            toDoItem.setName(str);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java b/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
new file mode 100644
index 0000000..13831ae
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/glue/simple/SimpleObjectGlue.java
@@ -0,0 +1,96 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package integration.glue.simple;
+
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.When;
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+
+import java.util.List;
+import java.util.UUID;
+import org.hamcrest.Description;
+import org.jmock.Expectations;
+import org.jmock.api.Action;
+import org.jmock.api.Invocation;
+import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
+import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectGlue extends CukeGlueAbstract {
+
+    @Given("^there are.* (\\d+) simple objects$")
+    public void there_are_N_simple_objects(int n) throws Throwable {
+        if(supportsMocks()) {
+            checking(new Expectations() {
+                {
+                    allowing(service(SimpleObjects.class)).listAll();
+                    will(returnValue(allSimpleObjects()));
+                }
+            });
+        }
+        try {
+            final List<SimpleObject> findAll = service(SimpleObjects.class).listAll();
+            assertThat(findAll.size(), is(n));
+            putVar("list", "all", findAll);
+            
+        } finally {
+            assertMocksSatisfied();
+        }
+    }
+    
+    @When("^I create a new simple object$")
+    public void I_create_a_new_simple_object() throws Throwable {
+        if(supportsMocks()) {
+            checking(new Expectations() {
+                {
+                    oneOf(service(SimpleObjects.class)).create(with(any(String.class)));
+                    will(addToInMemoryDB());
+                }
+            });
+        }
+        service(SimpleObjects.class).create(UUID.randomUUID().toString());
+    }
+    
+    private Action addToInMemoryDB() {
+        return new Action() {
+            
+            @Override
+            public Object invoke(Invocation invocation) throws Throwable {
+                final InMemoryDB inMemoryDB = getVar("isis", "in-memory-db", InMemoryDB.class);
+                final String name = (String)invocation.getParameter(0);
+                final SimpleObject obj = new SimpleObject();
+                obj.setName(name);
+                inMemoryDB.put(SimpleObject.class, name, obj);
+                return obj;
+            }
+            
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("add to database");
+            }
+        };
+    }
+
+    // helper
+    private List<SimpleObject> allSimpleObjects() {
+        final InMemoryDB inMemoryDB = getVar("isis", "in-memory-db", InMemoryDB.class);
+        return inMemoryDB.findAll(SimpleObject.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
new file mode 100644
index 0000000..b4d0913
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/RunSpecs.java
@@ -0,0 +1,38 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package integration.specs.simple;
+
+import cucumber.api.junit.Cucumber;
+
+import org.junit.runner.RunWith;
+
+
+/**
+ * Runs scenarios in all <tt>.feature</tt> files (this package and any subpackages). 
+ */
+@RunWith(Cucumber.class)
+@Cucumber.Options(
+        format = {
+                "html:target/cucumber-html-report"
+                ,"json:target/cucumber.json"
+        },
+        glue={"classpath:integration.glue"},
+        strict = true,
+        tags = { "~@backlog", "~@ignore" })
+public class RunSpecs {
+    // intentionally empty 
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
new file mode 100644
index 0000000..aa7aeb6
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/specs/simple/SimpleObjectSpec_listAllAndCreate.feature
@@ -0,0 +1,37 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+@SimpleObjectsFixture
+Feature: List and Create New Simple Objectts
+
+  # the scenario is listed twice here just to demonstrate that it
+  # can be run either at @unit-level scope (using mocks) or
+  # at @integration-level scope (against the running system).
+  
+  @unit
+  Scenario: Existing simple objects can be listed and new ones created
+    Given there are initially 3 simple objects
+    When  I create a new simple object
+    Then  there are 4 simple objects 
+
+
+  @integration
+  Scenario: Existing simple objects can be listed and new ones created
+    Given there are initially 3 simple objects
+    When  I create a new simple object
+    Then  there are 4 simple objects 
+
+    
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
new file mode 100644
index 0000000..634476c
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/tests/SimpleAppIntegTest.java
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package integration.tests;
+
+import integration.SimpleAppSystemInitializer;
+
+import org.junit.BeforeClass;
+import org.apache.isis.core.integtestsupport.IntegrationTestAbstract;
+import org.apache.isis.core.integtestsupport.scenarios.ScenarioExecutionForIntegration;
+
+public abstract class SimpleAppIntegTest extends IntegrationTestAbstract {
+
+    @BeforeClass
+    public static void initClass() {
+        org.apache.log4j.PropertyConfigurator.configure("logging.properties");
+        SimpleAppSystemInitializer.initIsft();
+        
+        // instantiating will install onto ThreadLocal
+        new ScenarioExecutionForIntegration();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
new file mode 100644
index 0000000..13e24f9
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package integration.tests.smoke;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+import fixture.simple.scenario.SimpleObjectsFixture;
+import fixture.simple.SimpleObjectsTearDownFixture;
+import integration.tests.SimpleAppIntegTest;
+
+import javax.inject.Inject;
+import org.junit.Test;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectTest extends SimpleAppIntegTest {
+
+    @Inject
+    FixtureScripts fixtureScripts;
+    @Inject
+    SimpleObjects simpleObjects;
+
+    FixtureScript fixtureScript;
+
+    public static class Name extends SimpleObjectTest {
+
+        @Test
+        public void exists() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+
+            final SimpleObject simpleObjectPojo =
+                    fixtureScript.lookup("simple-objects-fixture/simple-object-for-foo/item-1", SimpleObject.class);
+
+            // when
+            assertThat(simpleObjectPojo, is(not(nullValue())));
+            final SimpleObject simpleObjectWrapped = wrap(simpleObjectPojo);
+
+            // then
+            assertThat(simpleObjectWrapped.getName(), is("Foo"));
+        }
+
+        @Test
+        public void doesNotExist() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+
+            // when
+            SimpleObject simpleObjectPojo = fixtureScript.lookup("non-existent", SimpleObject.class);
+
+            // then
+            assertThat(simpleObjectPojo, is(nullValue()));
+
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
new file mode 100644
index 0000000..3963c8c
--- /dev/null
+++ b/example/application/neoapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
@@ -0,0 +1,148 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package integration.tests.smoke;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+import fixture.simple.scenario.SimpleObjectsFixture;
+import fixture.simple.SimpleObjectsTearDownFixture;
+import integration.tests.SimpleAppIntegTest;
+
+import java.sql.SQLIntegrityConstraintViolationException;
+import java.util.List;
+import javax.inject.Inject;
+import com.google.common.base.Throwables;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectsTest extends SimpleAppIntegTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Inject
+    FixtureScripts fixtureScripts;
+    @Inject
+    SimpleObjects simpleObjects;
+
+    FixtureScript fixtureScript;
+
+    public static class ListAll extends SimpleObjectsTest {
+
+        @Test
+        public void happyCase() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+
+            // when
+            final List<SimpleObject> all = wrap(simpleObjects).listAll();
+
+            // then
+            assertThat(all.size(), is(3));
+
+            SimpleObject simpleObject = wrap(all.get(0));
+            assertThat(simpleObject.getName(), is("Foo"));
+        }
+
+        @Test
+        public void whenNone() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+
+            // when
+            final List<SimpleObject> all = wrap(simpleObjects).listAll();
+
+            // then
+            assertThat(all.size(), is(0));
+        }
+    }
+
+    public static class Create extends SimpleObjectsTest {
+
+        @Test
+        public void happyCase() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+
+            // when
+            wrap(simpleObjects).create("Faz");
+
+            // then
+            final List<SimpleObject> all = wrap(simpleObjects).listAll();
+            assertThat(all.size(), is(1));
+        }
+
+        @Test
+        public void whenAlreadyExists() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+            wrap(simpleObjects).create("Faz");
+            nextTransaction();
+
+            // then
+            expectedException.expectCause(causalChainContains(SQLIntegrityConstraintViolationException.class));
+
+            // when
+            wrap(simpleObjects).create("Faz");
+            nextTransaction();
+        }
+
+        private static Matcher<? extends Throwable> causalChainContains(final Class<?> cls) {
+            return new TypeSafeMatcher<Throwable>() {
+                @Override
+                protected boolean matchesSafely(Throwable item) {
+                    final List<Throwable> causalChain = Throwables.getCausalChain(item);
+                    for (Throwable throwable : causalChain) {
+                        if(cls.isAssignableFrom(throwable.getClass())){
+                            return true;
+                        }
+                    }
+                    return false;
+                }
+
+                @Override
+                public void describeTo(Description description) {
+                    description.appendText("exception with causal chain containing " + cls.getSimpleName());
+                }
+            };
+        }
+    }
+
+}
\ No newline at end of file


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

Posted by da...@apache.org.
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
 
 
 #


[07/20] isis git commit: Fixed schema creation

Posted by da...@apache.org.
Fixed schema creation


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

Branch: refs/heads/ISIS-789
Commit: 4a78b4f5ff671b690e0e4a90b35699e6a1ffde61
Parents: fe4ee42
Author: jdb6853 <jd...@hotmail.com>
Authored: Wed Dec 31 17:24:44 2014 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Wed Dec 31 19:39:46 2014 -0600

----------------------------------------------------------------------
 ...DatanucleusPersistableTypesFacetFactory.java | 28 ++++++++++----------
 ...PersistableEnhancementTypesFacetFactory.java | 28 ++++++++++----------
 2 files changed, 28 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4a78b4f5/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
index 67402d1..c897656 100644
--- 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
@@ -1,14 +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");
-    }
-
-}
+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/4a78b4f5/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
index 070d722..2b30e9d 100644
--- 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
@@ -1,14 +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");
-    }
-
-}
+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");
+    }
+
+}


[11/20] isis git commit: Reverted some unnecessary changes

Posted by da...@apache.org.
Reverted some unnecessary changes


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

Branch: refs/heads/ISIS-789
Commit: a7423cb26cbb9c086f67c537a8d8927c2cc436cb
Parents: 5944ae2
Author: jdb6853 <jd...@hotmail.com>
Authored: Fri Jan 2 01:04:43 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Fri Jan 2 01:04:43 2015 -0600

----------------------------------------------------------------------
 example/application/simpleapp/webapp/pom.xml             |  2 +-
 .../test/java/integration/tests/ToDoItemIntegTest.java   |  3 +--
 example/application/todoapp/webapp/pom.xml               |  2 +-
 .../webapp/src/main/webapp/WEB-INF/isis.properties       |  5 ++---
 .../webapp/src/main/webapp/WEB-INF/persistor.properties  | 11 ++++++-----
 5 files changed, 11 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a7423cb2/example/application/simpleapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/pom.xml b/example/application/simpleapp/webapp/pom.xml
index c12cf6f..e218023 100644
--- a/example/application/simpleapp/webapp/pom.xml
+++ b/example/application/simpleapp/webapp/pom.xml
@@ -341,7 +341,7 @@
 		        <dependency>
 		        	<groupId>org.datanucleus</groupId>
 		        	<artifactId>datanucleus-neo4j</artifactId>
-		        	<version>3.2.3</version>
+		        	<version>4.0.4</version>
 		        </dependency>
         	</dependencies>
         </profile>

http://git-wip-us.apache.org/repos/asf/isis/blob/a7423cb2/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 6998f93..83807c1 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,8 +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();
+    	fixtureScript = new ToDoItemsRecreateAndCompleteSeveral();
         fixtureScripts.runFixtureScript(fixtureScript, null);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a7423cb2/example/application/todoapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/pom.xml b/example/application/todoapp/webapp/pom.xml
index 753b3b5..964a931 100644
--- a/example/application/todoapp/webapp/pom.xml
+++ b/example/application/todoapp/webapp/pom.xml
@@ -341,7 +341,7 @@
 		        <dependency>
 		        	<groupId>org.datanucleus</groupId>
 		        	<artifactId>datanucleus-neo4j</artifactId>
-		        	<version>3.2.3</version>
+		        	<version>4.0.4</version>
 		        </dependency>
         	</dependencies>
         </profile>

http://git-wip-us.apache.org/repos/asf/isis/blob/a7423cb2/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 5b10931..e081634 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,8 +79,7 @@ isis.authorization=shiro
 # additional programming model facets
 #
 
-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.include=
 #isis.reflector.facets.exclude=
 
 
@@ -174,7 +173,7 @@ 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,dom.todo,fixture.todo,webapp.admin,webapp.prototyping
+isis.services.ServicesInstallerFromAnnotation.packagePrefix=app,dom.todo,fixture.todo,webapp.admin,webapp.prototyping, \
                                                             dom.todo,\
                                                             fixture.todo,\
                                                             webapp.admin,\

http://git-wip-us.apache.org/repos/asf/isis/blob/a7423cb2/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor.properties b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
index d365634..9778330 100644
--- a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
+++ b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor.properties
@@ -50,11 +50,6 @@ isis.persistor.disableConcurrencyChecking=false
 #
 
 #
-# neo4j
-#
-#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:testDB
-
-#
 # HSQLDB in-memory
 #
 isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver
@@ -123,3 +118,9 @@ isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=
 #isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:sqlserver://127.0.0.1:1433;instance=.;databaseName=isis
 #isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis
 #isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis
+
+
+#
+# neo4j
+#
+#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:/temp/neo_DB
\ No newline at end of file


[17/20] isis git commit: Added link to repository for 'isis-neo4j'

Posted by da...@apache.org.
Added link to repository for 'isis-neo4j'


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

Branch: refs/heads/ISIS-789
Commit: ec2a3b6e41b2377317c1c4860e64b6e0238e7332
Parents: 8b0f861
Author: jdb6853 <jd...@hotmail.com>
Authored: Fri Jan 2 15:28:55 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Fri Jan 2 15:28:55 2015 -0600

----------------------------------------------------------------------
 example/application/neoapp/webapp/pom.xml | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ec2a3b6e/example/application/neoapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/pom.xml b/example/application/neoapp/webapp/pom.xml
index e89d059..da2c002 100644
--- a/example/application/neoapp/webapp/pom.xml
+++ b/example/application/neoapp/webapp/pom.xml
@@ -376,6 +376,8 @@
 		        	<artifactId>datanucleus-neo4j</artifactId>
 		        	<version>4.0.4</version>
 		        </dependency>
+
+                <!-- https://github.com/Sprint/isis-neo4j -->
                 <dependency>
                     <groupId>com.sprint</groupId>
                     <artifactId>isis-neo4j</artifactId>


[09/20] isis git commit: reverted metamodel pom

Posted by da...@apache.org.
reverted metamodel pom


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

Branch: refs/heads/ISIS-789
Commit: dbe22392f0a02663f970d7ab2a50ab19e12d3557
Parents: 2705218
Author: jdb6853 <jd...@hotmail.com>
Authored: Thu Jan 1 18:27:46 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Thu Jan 1 18:27:46 2015 -0600

----------------------------------------------------------------------
 core/metamodel/pom.xml | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/dbe22392/core/metamodel/pom.xml
----------------------------------------------------------------------
diff --git a/core/metamodel/pom.xml b/core/metamodel/pom.xml
index 7c7b1b0..f4cb1bc 100644
--- a/core/metamodel/pom.xml
+++ b/core/metamodel/pom.xml
@@ -105,6 +105,20 @@
             <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>


[05/20] isis git commit: Update ClassSubstitutor.java

Posted by da...@apache.org.
Update ClassSubstitutor.java

whitespace issue

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

Branch: refs/heads/ISIS-789
Commit: 9752a09c774558d0f75fcd2cf64fce4f5988b4cb
Parents: 61dc91a
Author: Jeremy <jd...@hotmail.com>
Authored: Wed Dec 24 18:27:27 2014 -0600
Committer: Jeremy <jd...@hotmail.com>
Committed: Wed Dec 24 18:27:27 2014 -0600

----------------------------------------------------------------------
 .../metamodel/specloader/classsubstitutor/ClassSubstitutor.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9752a09c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
index 6387ee6..2db5b60 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
@@ -51,7 +51,7 @@ public class ClassSubstitutor {
     public Class<?> getClass(final Class<?> cls) {
     	
     	if (cls == null) {
-		return null;
+	    return null;
 	}
 
         // ignore datanucleus proxies


[03/20] isis git commit: Update IsisDateMapping.java

Posted by da...@apache.org.
Update IsisDateMapping.java

corrected spelling

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

Branch: refs/heads/ISIS-789
Commit: 8d9600a633b5e83e568b21c0ad33a95215cb4a4d
Parents: 5ba11f0
Author: Jeremy <jd...@hotmail.com>
Authored: Wed Dec 24 18:18:58 2014 -0600
Committer: Jeremy <jd...@hotmail.com>
Committed: Wed Dec 24 18:18:58 2014 -0600

----------------------------------------------------------------------
 .../objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8d9600a6/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
index 880c0f3..3107881 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/valuetypes/IsisDateMapping.java
@@ -34,7 +34,7 @@ public class IsisDateMapping extends ObjectMapping {
         return org.apache.isis.applib.value.Date.class;
     }
 
-    // TODO: Need to check maping
+    // TODO: Need to check mapping
     
     protected Long objectToLong(Object object) {
         return dateConverter.toDatastoreType((Date) object);


[12/20] isis git commit: Merge remote-tracking branch 'remotes/origin/master' into DN_404

Posted by da...@apache.org.
Merge remote-tracking branch 'remotes/origin/master' into DN_404

Conflicts:
	example/application/simpleapp/webapp/pom.xml
	example/application/todoapp/webapp/pom.xml
	example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor.properties


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

Branch: refs/heads/ISIS-789
Commit: 6f4a9be739ea4f8c751d6f806de05c4e0446ad18
Parents: a7423cb fb6a37c
Author: jdb6853 <jd...@hotmail.com>
Authored: Fri Jan 2 01:16:30 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Fri Jan 2 01:16:30 2015 -0600

----------------------------------------------------------------------
 .../wicket/AuthenticatedWebSessionForIsis.java  |  7 +-
 ...enticationManagerStandardForDfltRuntime.java | 12 +--
 .../IsisConfigurationForJdoIntegTests.java      | 15 ++++
 .../application/simpleapp/integtests/.gitignore |  1 +
 example/application/simpleapp/webapp/.gitignore |  2 +-
 .../main/webapp/WEB-INF/persistor.properties    | 14 ++--
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 14 ++--
 .../application/todoapp/integtests/.gitignore   |  1 +
 .../integration/ToDoAppSystemInitializer.java   | 77 +++++++++++++++++++
 .../java/integration/ToDoSystemInitializer.java | 77 -------------------
 .../integration/glue/BootstrappingGlue.java     |  4 +-
 .../tests/AbstractToDoIntegTest.java            |  4 +-
 .../integration/tests/ToDoItemIntegTest.java    |  2 +-
 example/application/todoapp/webapp/.gitignore   |  2 +-
 .../main/webapp/WEB-INF/persistor.properties    |  5 +-
 .../META-INF/maven/archetype-metadata.xml       | 12 +++
 .../archetype-resources/integtests/.gitignore   |  1 +
 .../archetype-resources/webapp/.gitignore       |  1 +
 .../archetype-resources/webapp/pom.xml          | 10 +++
 .../main/webapp/WEB-INF/persistor.properties    | 11 ++-
 .../projects/basic/archetype.properties         |  2 +-
 .../META-INF/maven/archetype-metadata.xml       | 12 +++
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 14 ++--
 .../archetype-resources/integtests/.gitignore   |  1 +
 .../integration/ToDoAppSystemInitializer.java   | 80 ++++++++++++++++++++
 .../java/integration/ToDoSystemInitializer.java | 80 --------------------
 .../integration/glue/BootstrappingGlue.java     |  4 +-
 .../tests/AbstractToDoIntegTest.java            |  4 +-
 .../integration/tests/ToDoItemIntegTest.java    |  2 +-
 .../archetype-resources/webapp/.gitignore       |  1 +
 .../archetype-resources/webapp/pom.xml          | 10 +++
 .../main/webapp/WEB-INF/persistor.properties    |  9 ++-
 .../projects/basic/archetype.properties         |  2 +-
 scripts/recreate-archetype.sh                   |  2 +-
 34 files changed, 289 insertions(+), 206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6f4a9be7/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/IsisConfigurationForJdoIntegTests.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/6f4a9be7/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/6f4a9be7/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
----------------------------------------------------------------------


[14/20] isis git commit: Based on the simpleapp, there is now a neoapp that runs Neo4j version 2.1.6 embedded. It also includes the Neo4j client browser that runs on port 7474 by default alongside Isis.

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
new file mode 100644
index 0000000..a643d86
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/shiro.ini
@@ -0,0 +1,93 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+[main]
+
+contextFactory = org.apache.isis.security.shiro.IsisLdapContextFactory
+contextFactory.url = ldap://localhost:10389
+contextFactory.authenticationMechanism = CRAM-MD5
+contextFactory.systemAuthenticationMechanism = simple
+contextFactory.systemUsername = uid=admin,ou=system
+contextFactory.systemPassword = secret
+
+ldapRealm = org.apache.isis.security.shiro.IsisLdapRealm
+ldapRealm.contextFactory = $contextFactory
+
+ldapRealm.searchBase = ou=groups,o=mojo
+ldapRealm.groupObjectClass = groupOfUniqueNames
+ldapRealm.uniqueMemberAttribute = uniqueMember
+ldapRealm.uniqueMemberAttributeValueTemplate = uid={0}
+
+# optional mapping from physical groups to logical application roles
+#ldapRealm.rolesByGroup = \
+#    LDN_USERS: user_role,\
+#    NYK_USERS: user_role,\
+#    HKG_USERS: user_role,\
+#    GLOBAL_ADMIN: admin_role,\
+#    DEMOS: self-install_role
+
+ldapRealm.permissionsByRole=\
+   user_role = *:ToDoItemsJdo:*:*,\
+               *:ToDoItem:*:*; \
+   self-install_role = *:ToDoItemsFixturesService:install:* ; \
+   admin_role = *
+
+# to use ldap...
+# (see docs for details of how to setup users/groups in Apache Directory Studio).
+#securityManager.realms = $ldapRealm
+
+# to use .ini file
+securityManager.realms = $iniRealm
+
+
+
+# -----------------------------------------------------------------------------
+# Users and their assigned roles
+#
+# Each line conforms to the format defined in the
+# org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions JavaDoc
+# -----------------------------------------------------------------------------
+
+[users]
+# user = password, role1, role2, role3, ...
+
+
+sven = pass, admin_role
+dick = pass, user_role, self-install_role
+bob  = pass, user_role, self-install_role
+joe  = pass, user_role, self-install_role
+guest = guest, user_role
+
+
+
+# -----------------------------------------------------------------------------
+# Roles with assigned permissions
+# 
+# Each line conforms to the format defined in the
+# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc
+# -----------------------------------------------------------------------------
+
+[roles]
+# role = perm1, perm2, perm3, ...
+# perm in format: packageName:className:memberName:r,w
+
+user_role =   *:ToDoItemsJdo:*:*,\
+              *:ToDoItem:*:*
+self-install_role = *:ToDoItemsFixturesService:install:*
+admin_role = *

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
new file mode 100644
index 0000000..0a85fb6
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties
@@ -0,0 +1,66 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+#
+# configuration file for the Restful Objects viewer
+#
+
+# the baseUrl for hrefs in the events generated by the RO EventSerializer 
+isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/
+
+# renders param details in the (incorrect) form that they were for GSOC2013 viewers
+# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true
+
+# whether to honor UI hints, in particular Render(EAGERLY).  Defaults to false.
+#isis.viewer.restfulobjects.honorUiHints=false
+
+
+
+###############################################################################
+# Non-standard configuration settings.
+#
+# If enabled of the following are enabled then the viewer is deviating from the
+# RO spec standard; compatibility may be compromised with RO clients.
+###############################################################################
+
+# whether to show only object properties for object members
+# (on the object representation only)
+# Takes precedence over the other 'suppress' below.
+#isis.viewer.restfulobjects.objectPropertyValuesOnly=true
+
+# whether to suppress "describedby" links.  Defaults to false.
+#isis.viewer.restfulobjects.suppressDescribedByLinks=true
+
+# whether to suppress "update" links.  Defaults to false.
+#isis.viewer.restfulobjects.suppressUpdateLink=true
+
+# whether to suppress "id" json-prop for object members.  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberId=true
+
+# whether to suppress "links" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberLinks=true
+
+# whether to suppress "extensions" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberExtensions=true
+
+# whether to suppress "disabledReason" json-prop for object members
+# (on the object representation only).  Defaults to false.
+#isis.viewer.restfulobjects.suppressMemberDisabledReason=true
+
+###############################################################################

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
new file mode 100644
index 0000000..79ddf66
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties
@@ -0,0 +1,84 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#  
+#         http://www.apache.org/licenses/LICENSE-2.0
+#         
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+#
+# configuration file for the Wicket viewer
+#
+
+#
+# The maximum length of titles to display in standalone or parented tables.
+# Titles longer than this length will be truncated with trailing ellipses (...)
+#
+# For example, if set to 12, the title
+# "Buy milk on 15-Feb-13" will be truncated to "Buy milk ..."
+#
+# If set to 0, then only the icon will be shown.
+#
+isis.viewer.wicket.maxTitleLengthInStandaloneTables=0
+isis.viewer.wicket.maxTitleLengthInParentedTables=0
+
+
+#isis.viewer.wicket.datePattern=dd-MM-yyyy
+#isis.viewer.wicket.dateTimePattern=dd-MM-yyyy HH:mm
+#isis.viewer.wicket.datePickerPattern=DD-MM-YYYY
+
+#isis.viewer.wicket.datePattern=dd/MM/yy
+#isis.viewer.wicket.dateTimePattern=dd/MM/yy HH:mm
+#isis.viewer.wicket.datePickerPattern=DD/MM/YY
+
+
+#
+# whether to strip wicket tags from markup (default is true, as they may break some CSS rules)
+#
+#isis.viewer.wicket.stripWicketTags=false
+
+
+#
+# whether to suppress the 'rememberMe' checkbox on the login page (default is false)
+#
+#isis.viewer.wicket.suppressRememberMe=false
+
+#
+# if user attempts to access a protected URL before signing in, then as a convenience the viewer will continue
+# through to that destination after successful login.  If you consider this to be a security risk then this flag
+# disables that behaviour (default is false).
+#
+#isis.viewer.wicket.clearOriginalDestination=true
+
+
+#
+# whether to show action dialogs on their own page rather than as a modal dialog (default is false)
+#
+#isis.viewer.wicket.disableModalDialogs=false
+
+
+#
+# the maximum number of pages to list in bookmark (default is 15)
+#
+#isis.viewer.wicket.bookmarkedPages.maxSize=15
+
+
+#
+# whether to show the bootstrap theme chooser (defaults false)
+#
+#isis.viewer.wicket.themes.showChooser=false
+isis.viewer.wicket.themes.showChooser=true
+
+#
+# comma-separated list of themes to choose from (default is to show all themes from bootswatch.com).
+#
+#isis.viewer.wicket.themes.enabled=bootstrap-theme,Cosmo,Flatly,Darkly,Sandstone,United
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..b169b00
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<web-app id="WebApp_ID" version="2.4"
+    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+    <display-name>Simple app</display-name>
+
+    <welcome-file-list>
+        <welcome-file>about/index.html</welcome-file>
+    </welcome-file-list>
+
+    <!-- shiro security configuration -->
+    <listener>
+        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
+    </listener>
+
+    <filter>
+        <filter-name>ShiroFilter</filter-name>
+        <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>ShiroFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+
+
+    <!-- which configuration directory to read overloaded property files from -->
+    <!-- 
+    Normally configuration like this should be done from outside your web 
+    application. Especially if your configuration is not know in advance or
+    if it can change depending on where the application gets deployed.
+    
+    For instance to configure this in Tomcat outside the application WAR add
+    the following line to your application context ( For more detail see:
+    http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters )
+     
+    <Parameter name="isis.config.dir" value="/usr/local/tomcat/conf/"
+         override="true"/>
+         
+    If your configuration directory is fixed you can enable the following 
+    context parameter in here and forget about the outside part.
+         
+    <context-param>
+      <param-name>isis.config.dir</param-name>
+      <param-value>location of your config directory if fixed</param-value>
+    </context-param>
+    -->
+
+
+    <!--
+    determines which additional configuration files to search for 
+     -->
+    <context-param>
+        <param-name>isis.viewers</param-name>
+        <param-value>wicket,restfulobjects</param-value>
+    </context-param>
+
+
+
+    <!-- 
+    for diagnostics
+    -->
+    <filter>
+        <filter-name>IsisLogOnExceptionFilter</filter-name>
+        <filter-class>org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>IsisLogOnExceptionFilter</filter-name>
+        <url-pattern>/wicket/*</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>IsisLogOnExceptionFilter</filter-name>
+        <url-pattern>/restful/*</url-pattern>
+    </filter-mapping>
+
+
+
+    <!-- cache static resources for 1 day -->
+    <filter>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <filter-class>org.apache.isis.core.webapp.content.ResourceCachingFilter</filter-class>
+        <init-param>
+            <param-name>CacheTime</param-name>
+            <param-value>86400</param-value>
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.js</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.css</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.png</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.jpg</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.gif</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.html</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>ResourceCachingFilter</filter-name>
+        <url-pattern>*.swf</url-pattern>
+    </filter-mapping>
+    
+    <servlet>
+        <servlet-name>Resource</servlet-name>
+        <servlet-class>org.apache.isis.core.webapp.content.ResourceServlet</servlet-class>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.css</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.png</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.jpg</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.gif</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.js</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.html</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Resource</servlet-name>
+        <url-pattern>*.swf</url-pattern>
+    </servlet-mapping>
+    
+
+
+    <!--
+    -
+    - config specific to the wicket-viewer
+    -
+    -->
+    <filter>
+        <filter-name>WicketFilter</filter-name>
+        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
+        <init-param>
+            <param-name>applicationClassName</param-name>
+            <param-value>webapp.SimpleApplication</param-value>
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>WicketFilter</filter-name>
+        <url-pattern>/wicket/*</url-pattern>
+    </filter-mapping>
+
+
+    <context-param>
+        <param-name>configuration</param-name>
+        <!-- 
+        <param-value>deployment</param-value>
+         -->
+        <param-value>development</param-value>
+    </context-param>
+    
+   
+    <!--
+    -
+    - config specific to the restfulobjects-viewer
+    -
+    -->
+
+    <!--
+    THE FOLLOWING CONFIGURATION IS NOT REQUIRED IF THE WICKET VIEWER IS IN USE.
+    IF THE WICKET VIEWER CONFIGURATION IS REMOVED, THEN UNCOMMENT
+    
+    <listener>
+        <listener-class>org.apache.isis.core.webapp.IsisWebAppBootstrapper</listener-class>
+    </listener>
+
+    <context-param>
+        <param-name>deploymentType</param-name>
+        <param-value>SERVER_EXPLORATION</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>isis.viewers</param-name>
+        <param-value>restfulobjects</param-value>
+    </context-param>    
+    -->    
+    
+    <!-- bootstrap the RestEasy framework -->
+    <listener>
+        <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+    </listener>
+
+    <!-- used by RestEasy to determine the JAX-RS resources and other related configuration -->
+    <context-param>
+        <param-name>javax.ws.rs.Application</param-name>
+        <param-value>org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplication</param-value>
+    </context-param>
+    
+    <context-param>
+        <param-name>resteasy.servlet.mapping.prefix</param-name>
+        <param-value>/restful/</param-value>
+    </context-param>
+    
+
+    <!-- authenticate user, set up an Isis session -->
+    <filter>
+        <filter-name>IsisSessionFilterForRestfulObjects</filter-name>
+        <filter-class>org.apache.isis.core.webapp.IsisSessionFilter</filter-class>
+        <!-- authentication required for REST -->
+        <init-param>
+            <param-name>authenticationSessionStrategy</param-name>
+            <param-value>org.apache.isis.viewer.restfulobjects.server.authentication.AuthenticationSessionStrategyBasicAuth</param-value>
+        </init-param>
+        <init-param>
+            <!-- what to do if no session was found; we indicate to issue a 401 basic authentication challenge -->
+            <param-name>whenNoSession</param-name>
+            <param-value>basicAuthChallenge</param-value>
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <!-- this is mapped to the entire app; however the IsisSessionFilter will "notice" if the session filter has already been
+             executed for the request pipeline, and if so will do nothing -->
+        <filter-name>IsisSessionFilterForRestfulObjects</filter-name>
+        <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+    </filter-mapping>
+
+    <filter>
+        <filter-name>IsisTransactionFilterForRestfulObjects</filter-name>
+        <filter-class>org.apache.isis.viewer.restfulobjects.server.webapp.IsisTransactionFilterForRestfulObjects</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>IsisTransactionFilterForRestfulObjects</filter-name>
+        <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+    </filter-mapping>
+
+
+    <servlet>
+        <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>RestfulObjectsRestEasyDispatcher</servlet-name>
+        <url-pattern>/restful/*</url-pattern>
+    </servlet-mapping>
+
+
+    <!-- 
+    uncomment to use container-managed datasource;
+    for both container-managed (JTA) and non-container-managed transactions
+     -->
+     <!-- 
+    <resource-ref>
+        <description>db</description>
+        <res-ref-name>jdbc/quickstart</res-ref-name>
+        <res-type>javax.sql.DataSource</res-type>
+        <res-auth>Container</res-auth>
+    </resource-ref>
+      -->
+
+    <!--
+    uncomment to use container-managed datasource
+    with container-managed transactions (JTA).
+    -->
+    <!-- 
+    <resource-ref>
+        <description>db</description>
+        <res-ref-name>jdbc/quickstart-nontx</res-ref-name>
+        <res-type>javax.sql.DataSource</res-type>
+        <res-auth>Container</res-auth>
+    </resource-ref>
+     -->
+
+</web-app>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png b/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png
new file mode 100644
index 0000000..5284fe7
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/about/images/isis-logo.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/about/index.html
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/about/index.html b/example/application/neoapp/webapp/src/main/webapp/about/index.html
new file mode 100644
index 0000000..8d32f47
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/about/index.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+        <title>Apache Isis&trade; SimpleApp</title>
+        
+        <style type="text/css">
+body {
+    background-color: #1A467B;
+    font-family: Verdana, Helvetica, Arial;
+    font-size: 90%;
+}
+
+li {
+    margin-top: 6px;
+    margin-bottom: 6px;
+}
+table {
+    border-collapse: collapse;
+}
+table, th, td {
+    border: 1px;
+    border-style: solid;
+    border-color: lightgray;
+}
+th, td {
+    padding: 10px;
+}
+#wrapper {
+    background-color: #ffffff;
+    width: 900px;
+    margin: 8px auto;
+    padding: 12px;
+}
+        </style>
+    </head>
+    <body>
+        <div id="wrapper">
+            <img alt="Isis Logo" src="about/images/isis-logo.png" />
+             
+            <p>
+            <a href="http://isis.apache.org" target="_blank">Apache Isis</a>&trade; is a framework to let you rapidly develop
+            domain-driven apps in Java.  This app has been generated using Isis' 
+            <a href="http://isis.apache.org/intro/getting-started/simple%61pp-archetype.html" target="_blank">SimpleApp</a> archetype,
+            which configures Isis to run a very simple and purposefully minimal application.
+            
+            <p>
+            The app itself consists of a single domain class, 
+            <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObject.java"  target="_blank"><tt>SimpleObject</tt></a>,
+            along with an equally simple (factory/repository) domain service, <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/dom/src/main/java/dom/simple/SimpleObjects.java" target="_blank"><tt>SimpleObjects</tt></a>.
+            </p>
+
+            <p>To access the app:</p>
+            <ul>
+                <li>
+                    <p>
+                        <b><a href="wicket/">wicket/</a></b>
+                    </p>
+                    <p>
+                        provides accesses to a generic UI for end-users,
+                        Isis' <a href="http://isis.apache.org/components/viewers/wicket/about.html" target="_blank">Wicket Viewer</a>.
+                        As its name suggests, this viewer is built on top of <a href="http://wicket.apache.org" target="_blank">Apache Wicket</a>&trade;.
+                    </p>
+                </li>
+                <li>
+                    <p>
+                        <b>
+                            <a href="restful/">restful/</a>
+                        </b>
+                    </p>
+                    <p>
+                        provides access to a RESTful API conformant with the
+                        <a href="http://restfulobjects.org">Restful Objects</a> spec</td>.  This is part of Isis Core.  The
+                        implementation technology is JBoss RestEasy.
+                    </p>
+                </li>
+            </ul>
+
+            <p>
+            The default user/password is <b><i>sven/pass</i></b> (as configured in the
+            <a href="https://github.com/apache/isis/blob/master/example/application/simple%61pp/webapp/src/main/webapp/WEB-INF/shiro.ini" target="_blank">shiro.ini</a> file).
+            </p>
+            
+        </div>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/css/application.css
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/css/application.css b/example/application/neoapp/webapp/src/main/webapp/css/application.css
new file mode 100644
index 0000000..9f1612a
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/css/application.css
@@ -0,0 +1,19 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif b/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif
new file mode 100644
index 0000000..75e3b1e
Binary files /dev/null and b/example/application/neoapp/webapp/src/main/webapp/images/spinning-icon.gif differ

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/main/webapp/scripts/application.js b/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
new file mode 100644
index 0000000..d8cf6fe
--- /dev/null
+++ b/example/application/neoapp/webapp/src/main/webapp/scripts/application.js
@@ -0,0 +1,3 @@
+$(document).ready(function() {
+	/// here...
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG
----------------------------------------------------------------------
diff --git a/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG b/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG
new file mode 100644
index 0000000..b6907d1
Binary files /dev/null and b/example/application/neoapp/webapp/src/test/resources/NeoBrowser.PNG differ

http://git-wip-us.apache.org/repos/asf/isis/blob/8b0f8610/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 c0c87e4..dbf0244 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,8 +79,7 @@ isis.authorization=shiro
 # additional programming model facets
 #
 
-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.include=
 #isis.reflector.facets.exclude=
 
 


[19/20] isis git commit: Merge commit 'f7284d8fb4fbe58479e819b37e7ee3cc731d57ad' into ISIS-789a

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/mothballed/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
----------------------------------------------------------------------
diff --cc mothballed/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
index 5bb2f0f,0000000..f71b6ea
mode 100644,000000..100644
--- a/mothballed/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
+++ b/mothballed/example/application/todoapp/integtests/src/test/java/integration/tests/ToDoItemIntegTest.java
@@@ -1,1057 -1,0 +1,1057 @@@
 +/*
 + *  Licensed to the Apache Software Foundation (ASF) under one
 + *  or more contributor license agreements.  See the NOTICE file
 + *  distributed with this work for additional information
 + *  regarding copyright ownership.  The ASF licenses this file
 + *  to you under the Apache License, Version 2.0 (the
 + *  "License"); you may not use this file except in compliance
 + *  with the License.  You may obtain a copy of the License at
 + *
 + *        http://www.apache.org/licenses/LICENSE-2.0
 + *
 + *  Unless required by applicable law or agreed to in writing,
 + *  software distributed under the License is distributed on an
 + *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + *  KIND, either express or implied.  See the License for the
 + *  specific language governing permissions and limitations
 + *  under the License.
 + */
 +package integration.tests;
 +
 +import dom.todo.ToDoItem;
 +import dom.todo.ToDoItemSubscriptions;
 +import dom.todo.ToDoItems;
 +import fixture.todo.scenarios.ToDoItemsRecreateAndCompleteSeveral;
 +
 +import java.math.BigDecimal;
 +import java.nio.charset.Charset;
 +import java.util.EventObject;
 +import java.util.List;
 +import javax.activation.MimeType;
 +import javax.inject.Inject;
 +import org.hamcrest.Description;
 +import org.hamcrest.Matcher;
 +import org.hamcrest.TypeSafeMatcher;
 +import org.jmock.Expectations;
 +import org.jmock.Sequence;
 +import org.jmock.auto.Mock;
 +import org.joda.time.LocalDate;
 +import org.junit.After;
 +import org.junit.Before;
 +import org.junit.Test;
 +import org.apache.isis.applib.NonRecoverableException;
 +import org.apache.isis.applib.RecoverableException;
 +import org.apache.isis.applib.clock.Clock;
 +import org.apache.isis.applib.fixturescripts.FixtureScripts;
 +import org.apache.isis.applib.services.clock.ClockService;
 +import org.apache.isis.applib.services.eventbus.AbstractInteractionEvent;
 +import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
 +import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
 +import org.apache.isis.applib.services.eventbus.EventBusService;
 +import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 +import org.apache.isis.applib.value.Blob;
 +
 +import static org.hamcrest.CoreMatchers.containsString;
 +import static org.hamcrest.CoreMatchers.equalTo;
 +import static org.hamcrest.CoreMatchers.is;
 +import static org.hamcrest.CoreMatchers.not;
 +import static org.hamcrest.CoreMatchers.notNullValue;
 +import static org.hamcrest.CoreMatchers.nullValue;
 +import static org.junit.Assert.assertThat;
 +
 +public class ToDoItemIntegTest extends AbstractToDoIntegTest {
 +
 +    ToDoItemsRecreateAndCompleteSeveral fixtureScript;
 +
 +    @Before
 +    public void setUpData() throws Exception {
-         fixtureScript = new ToDoItemsRecreateAndCompleteSeveral();
++    	fixtureScript = new ToDoItemsRecreateAndCompleteSeveral();
 +        fixtureScripts.runFixtureScript(fixtureScript, null);
 +    }
 +
 +    @Inject
 +    FixtureScripts fixtureScripts;
 +    @Inject
 +    ToDoItems toDoItems;
 +    @Inject
 +    ToDoItemSubscriptions toDoItemSubscriptions;
 +
 +    ToDoItem toDoItem;
 +
 +    @Before
 +    public void setUp() throws Exception {
 +        final List<ToDoItem> all = toDoItems.notYetComplete();
 +        toDoItem = wrap(all.get(0));
 +    }
 +
 +    @After
 +    public void tearDown() throws Exception {
 +        toDoItemSubscriptions.reset();
 +    }
 +
 +
 +    public static class Title extends ToDoItemIntegTest {
 +
 +        private LocalDate dueBy;
 +
 +        @Before
 +        public void setUp() throws Exception {
 +            super.setUp();
 +            final List<ToDoItem> all = wrap(toDoItems).notYetComplete();
 +            toDoItem = wrap(all.get(0));
 +
 +            toDoItem = wrap(fixtureScript.lookup("to-do-items-recreate-and-complete-several/to-do-item-for-buy-bread/item-1", ToDoItem.class));
 +            assertThat(toDoItem, is(not(nullValue())));
 +
 +            nextTransaction();
 +
 +            dueBy = toDoItem.getDueBy();
 +        }
 +
 +
 +        @Test
 +        public void includesDescription() throws Exception {
 +
 +            // given
 +            assertThat(container().titleOf(toDoItem), containsString("Buy bread due by"));
 +
 +            // when
 +            unwrap(toDoItem).setDescription("Buy bread and butter");
 +
 +            // then
 +            assertThat(container().titleOf(toDoItem), containsString("Buy bread and butter due by"));
 +        }
 +
 +        @Test
 +        public void includesDueDateIfAny() throws Exception {
 +
 +            // given
 +            assertThat(container().titleOf(toDoItem), containsString("due by " + dueBy.toString("yyyy-MM-dd")));
 +
 +            // when
 +            final LocalDate fiveDaysFromNow = Clock.getTimeAsLocalDate().plusDays(5);
 +            unwrap(toDoItem).setDueBy(fiveDaysFromNow);
 +
 +            // then
 +            assertThat(container().titleOf(toDoItem), containsString("due by " + fiveDaysFromNow.toString("yyyy-MM-dd")));
 +        }
 +
 +
 +        @Test
 +        public void ignoresDueDateIfNone() throws Exception {
 +
 +            // when
 +            // (since wrapped, will call clearDueBy)
 +            toDoItem.setDueBy(null);
 +
 +            // then
 +            assertThat(container().titleOf(toDoItem), not(containsString("due by")));
 +        }
 +
 +        @Test
 +        public void usesWhetherCompleted() throws Exception {
 +
 +            // given
 +            assertThat(container().titleOf(toDoItem), not(containsString("Completed!")));
 +
 +            // when
 +            toDoItem.completed();
 +
 +            // then
 +            assertThat(container().titleOf(toDoItem), not(containsString("due by")));
 +            assertThat(container().titleOf(toDoItem), containsString("Buy bread - Completed!"));
 +        }
 +    }
 +
 +    public static class Actions {
 +
 +        public static class Completed extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                // given
 +                assertThat(toDoItem.isComplete(), is(false));
 +
 +                // when
 +                toDoItem.completed();
 +
 +                // then
 +                assertThat(toDoItem.isComplete(), is(true));
 +            }
 +
 +            @Test
 +            public void cannotCompleteIfAlreadyCompleted() throws Exception {
 +
 +                // given
 +                unwrap(toDoItem).setComplete(true);
 +
 +                // when, then should fail
 +                expectedExceptions.expectMessage("Already completed");
 +                toDoItem.completed();
 +
 +                // and then
 +                final EventObject ev = toDoItemSubscriptions.mostRecentlyReceivedEvent(EventObject.class);
 +                assertThat(ev, is(nullValue()));
 +            }
 +
 +
 +            @Test
 +            public void cannotSetPropertyDirectly() throws Exception {
 +
 +                // given
 +
 +                // when, then should fail
 +                expectedExceptions.expectMessage("Always disabled");
 +                toDoItem.setComplete(true);
 +
 +                // and then
 +                final EventObject ev = toDoItemSubscriptions.mostRecentlyReceivedEvent(EventObject.class);
 +                assertThat(ev, is(nullValue()));
 +            }
 +
 +            @Test
 +            public void subscriberReceivesEvents() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.reset();
 +                assertThat(toDoItemSubscriptions.getSubscriberBehaviour(), is(ToDoItemSubscriptions.Behaviour.AnyExecuteAccept));
 +                assertThat(unwrap(toDoItem).isComplete(), is(false));
 +
 +                // when
 +                toDoItem.completed();
 +
 +                // then
 +                assertThat(unwrap(toDoItem).isComplete(), is(true));
 +
 +                // and then
 +                final List<ToDoItem.CompletedEvent> receivedEvents = toDoItemSubscriptions.receivedEvents(ToDoItem.CompletedEvent.class);
 +
 +                // hide, disable, validate, executing, executed
 +                // sent to both the general on(ActionInteractionEvent ev)
 +                // and also the specific on(final ToDoItem.CompletedEvent ev)
 +                assertThat(receivedEvents.size(), is(5*2));
 +                final ToDoItem.CompletedEvent ev = receivedEvents.get(0);
 +
 +                ToDoItem source = ev.getSource();
 +                assertThat(source, is(equalTo(unwrap(toDoItem))));
 +                assertThat(ev.getIdentifier().getMemberName(), is("completed"));
 +            }
 +
 +            @Test
 +            public void subscriberVetoesEventWithRecoverableException() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithRecoverableException);
 +
 +                // then
 +                expectedExceptions.expect(RecoverableException.class);
 +
 +                // when
 +                toDoItem.completed();
 +            }
 +
 +            @Test
 +            public void subscriberVetoesEventWithNonRecoverableException() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithNonRecoverableException);
 +
 +                // then
 +                expectedExceptions.expect(NonRecoverableException.class);
 +
 +                // when
 +                toDoItem.completed();
 +            }
 +
 +            @Test
 +            public void subscriberVetoesEventWithAnyOtherException() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithOtherException);
 +
 +                // then
 +                expectedExceptions.expect(RuntimeException.class);
 +
 +                // when
 +                toDoItem.completed();
 +            }
 +
 +        }
 +
 +        /**
 +         * This test demonstrates how a single service can be replaced, eg to use a mock.
 +         */
 +        public static class Completed_withMockService extends ToDoItemIntegTest {
 +
 +            private EventBusService originalEventBusService;
 +            @Mock
 +            private EventBusService mockEventBusService;
 +
 +            @Before
 +            public void setUpMockEventBusService() throws Exception {
 +                originalEventBusService = scenarioExecution().service(EventBusService.class);
 +
 +                context.checking(new Expectations() {{
 +                    ignoring(mockEventBusService).register(with(any(Object.class)));
 +                    ignoring(mockEventBusService).unregister(with(any(Object.class)));
 +                }});
 +
 +                scenarioExecution().replaceService(originalEventBusService, mockEventBusService);
 +                scenarioExecution().closeSession();
 +                scenarioExecution().openSession();
 +
 +                final List<ToDoItem> all = toDoItems.notYetComplete();
 +                toDoItem = wrap(all.get(0));
 +            }
 +
 +
 +            @After
 +            public void reinstateOriginalEventBusService() throws Exception {
 +                scenarioExecution().replaceService(mockEventBusService, originalEventBusService);
 +            }
 +
 +            @Test
 +            public void raisesEvent() throws Exception {
 +
 +                final Sequence busRulesThenExec = context.sequence("busRulesThenExec");
 +                // then
 +                context.checking(new Expectations() {{
 +                    oneOf(mockEventBusService).post(with(completedEvent(AbstractInteractionEvent.Phase.HIDE)));
 +                    inSequence(busRulesThenExec);
 +                    oneOf(mockEventBusService).post(with(completedEvent(AbstractInteractionEvent.Phase.DISABLE)));
 +                    inSequence(busRulesThenExec);
 +                    oneOf(mockEventBusService).post(with(completedEvent(AbstractInteractionEvent.Phase.VALIDATE)));
 +                    inSequence(busRulesThenExec);
 +                    oneOf(mockEventBusService).post(with(completedEvent(AbstractInteractionEvent.Phase.EXECUTING)));
 +                    inSequence(busRulesThenExec);
 +                    oneOf(mockEventBusService).post(with(completedEvent(AbstractInteractionEvent.Phase.EXECUTED)));
 +                    inSequence(busRulesThenExec);
 +                }});
 +
 +                // when
 +                toDoItem.completed();
 +            }
 +
 +            private Matcher<Object> completedEvent(final AbstractInteractionEvent.Phase phase) {
 +                return new TypeSafeMatcher<Object>() {
 +                    @Override
 +                    protected boolean matchesSafely(Object item) {
 +                        if (!(item instanceof ToDoItem.CompletedEvent)) {
 +                            return false;
 +                        }
 +
 +                        final ToDoItem.CompletedEvent completedEvent = (ToDoItem.CompletedEvent) item;
 +                        return completedEvent.getPhase() == phase;
 +
 +                    }
 +
 +                    @Override
 +                    public void describeTo(Description description) {
 +                        description.appendText(" instance of a ToDoItem.CompletedEvent, " + phase);
 +                    }
 +                };
 +            }
 +        }
 +
 +
 +        public static class Duplicate extends ToDoItemIntegTest {
 +
 +            ToDoItem duplicateToDoItem;
 +
 +            @Inject
 +            private ClockService clockService;
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                // given
 +                final LocalDate todaysDate = clockService.now();
 +                toDoItem.setDueBy(todaysDate);
 +                toDoItem.updateCost(new BigDecimal("123.45"));
 +
 +                duplicateToDoItem = toDoItem.duplicate(
 +                        unwrap(toDoItem).default0Duplicate(),
 +                        unwrap(toDoItem).default1Duplicate(),
 +                        unwrap(toDoItem).default2Duplicate(),
 +                        unwrap(toDoItem).default3Duplicate(),
 +                        new BigDecimal("987.65"));
 +
 +                // then
 +                assertThat(duplicateToDoItem.getDescription(), is(toDoItem.getDescription() + " - Copy"));
 +                assertThat(duplicateToDoItem.getCategory(), is(toDoItem.getCategory()));
 +                assertThat(duplicateToDoItem.getDueBy(), is(todaysDate));
 +                assertThat(duplicateToDoItem.getCost(), is(new BigDecimal("987.65")));
 +            }
 +        }
 +
 +        public static class NotYetCompleted extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                // given
 +                unwrap(toDoItem).setComplete(true);
 +
 +                // when
 +                toDoItem.notYetCompleted();
 +
 +                // then
 +                assertThat(toDoItem.isComplete(), is(false));
 +            }
 +
 +            @Test
 +            public void cannotUndoIfNotYetCompleted() throws Exception {
 +
 +                // given
 +                assertThat(toDoItem.isComplete(), is(false));
 +
 +                // when, then should fail
 +                expectedExceptions.expectMessage("Not yet completed");
 +                toDoItem.notYetCompleted();
 +            }
 +
 +            /**
 +             * Even though {@link dom.todo.ToDoItem#notYetCompleted()} is not annotated with
 +             * {@link org.apache.isis.applib.annotation.ActionInteraction}, an event is still raised.
 +             */
 +            @Test
 +            public void subscriberReceivesEvent() throws Exception {
 +
 +                // given
 +                assertThat(toDoItemSubscriptions.getSubscriberBehaviour(), is(ToDoItemSubscriptions.Behaviour.AnyExecuteAccept));
 +                unwrap(toDoItem).setComplete(true);
 +
 +                // when
 +                toDoItem.notYetCompleted();
 +
 +                // then
 +                assertThat(unwrap(toDoItem).isComplete(), is(false));
 +
 +                // and then
 +                final ActionDomainEvent<ToDoItem> ev = toDoItemSubscriptions.mostRecentlyReceivedEvent(ActionDomainEvent.class);
 +                assertThat(ev, is(not(nullValue())));
 +
 +                ToDoItem source = ev.getSource();
 +                assertThat(source, is(equalTo(unwrap(toDoItem))));
 +                assertThat(ev.getIdentifier().getMemberName(), is("notYetCompleted"));
 +            }
 +        }
 +    }
 +
 +    public static class Collections {
 +
 +        public static class Dependencies {
 +            public static class Add extends ToDoItemIntegTest {
 +
 +                private ToDoItem otherToDoItem;
 +
 +                @Before
 +                public void setUp() throws Exception {
 +                    super.setUp();
 +                    final List<ToDoItem> items = wrap(toDoItems).notYetComplete();
 +                    otherToDoItem = wrap(items.get(1));
 +                }
 +
 +                @After
 +                public void tearDown() throws Exception {
 +                    unwrap(toDoItem).getDependencies().clear();
 +                    super.tearDown();
 +                }
 +
 +                @Test
 +                public void happyCase() throws Exception {
 +
 +                    // given
 +                    assertThat(toDoItem.getDependencies().size(), is(0));
 +
 +                    // when
 +                    toDoItem.add(otherToDoItem);
 +
 +                    // then
 +                    assertThat(toDoItem.getDependencies().size(), is(1));
 +                    assertThat(toDoItem.getDependencies().iterator().next(), is(unwrap(otherToDoItem)));
 +                }
 +
 +
 +                @Test
 +                public void cannotDependOnSelf() throws Exception {
 +
 +                    // then
 +                    expectedExceptions.expectMessage("Can't set up a dependency to self");
 +
 +                    // when
 +                    toDoItem.add(toDoItem);
 +                }
 +
 +                @Test
 +                public void cannotAddIfComplete() throws Exception {
 +
 +                    // given
 +                    unwrap(toDoItem).setComplete(true);
 +
 +                    // then
 +                    expectedExceptions.expectMessage("Cannot add dependencies for items that are complete");
 +
 +                    // when
 +                    toDoItem.add(otherToDoItem);
 +                }
 +
 +
 +                @Test
 +                public void subscriberReceivesEvent() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.reset();
 +
 +                    // when
 +                    toDoItem.add(otherToDoItem);
 +
 +                    // then received events
 +                    @SuppressWarnings("unchecked")
 +                    final List<EventObject> receivedEvents = toDoItemSubscriptions.receivedEvents();
 +
 +                    assertThat(receivedEvents.size(), is(7));
 +                    assertThat(receivedEvents.get(0) instanceof ActionDomainEvent, is(true)); // ToDoItem#add() executed
 +                    assertThat(receivedEvents.get(1) instanceof CollectionDomainEvent, is(true)); // ToDoItem#dependencies add, executed
 +                    assertThat(receivedEvents.get(2) instanceof CollectionDomainEvent, is(true)); // ToDoItem#dependencies add, executing
 +                    assertThat(receivedEvents.get(3) instanceof ActionDomainEvent, is(true)); // ToDoItem#add executing
 +                    assertThat(receivedEvents.get(4) instanceof ActionDomainEvent, is(true)); // ToDoItem#add validate
 +                    assertThat(receivedEvents.get(5) instanceof ActionDomainEvent, is(true)); // ToDoItem#add disable
 +                    assertThat(receivedEvents.get(6) instanceof ActionDomainEvent, is(true)); // ToDoItem#add hide
 +
 +                    // inspect the collection interaction (posted programmatically in ToDoItem#add)
 +                    final CollectionDomainEvent<ToDoItem,ToDoItem> ciEv = (CollectionDomainEvent<ToDoItem, ToDoItem>) toDoItemSubscriptions.mostRecentlyReceivedEvent(CollectionDomainEvent.class);
 +                    assertThat(ciEv, is(notNullValue()));
 +
 +                    assertThat(ciEv.getSource(), is(equalTo(unwrap(toDoItem))));
 +                    assertThat(ciEv.getIdentifier().getMemberName(), is("dependencies"));
 +                    assertThat(ciEv.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
 +                    assertThat(ciEv.getValue(), is(unwrap(otherToDoItem)));
 +
 +                    // inspect the action interaction (posted declaratively by framework)
 +                    final ActionDomainEvent<ToDoItem> aiEv = (ActionDomainEvent<ToDoItem>) toDoItemSubscriptions.mostRecentlyReceivedEvent(ActionDomainEvent.class);
 +                    assertThat(aiEv, is(notNullValue()));
 +
 +                    assertThat(aiEv.getSource(), is(equalTo(unwrap(toDoItem))));
 +                    assertThat(aiEv.getIdentifier().getMemberName(), is("add"));
 +                    assertThat(aiEv.getArguments().size(), is(1));
 +                    assertThat(aiEv.getArguments().get(0), is(unwrap((Object)otherToDoItem)));
 +                    assertThat(aiEv.getCommand(), is(notNullValue()));
 +                }
 +
 +                @Test
 +                public void subscriberVetoesEventWithRecoverableException() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithRecoverableException);
 +
 +                    // then
 +                    expectedExceptions.expect(RecoverableException.class);
 +
 +                    // when
 +                    toDoItem.add(otherToDoItem);
 +                }
 +
 +                @Test
 +                public void subscriberVetoesEventWithNonRecoverableException() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithNonRecoverableException);
 +
 +                    // then
 +                    expectedExceptions.expect(NonRecoverableException.class);
 +
 +                    // when
 +                    toDoItem.add(otherToDoItem);
 +                }
 +
 +                @Test
 +                public void subscriberVetoesEventWithAnyOtherException() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithOtherException);
 +
 +                    // then
 +                    expectedExceptions.expect(RuntimeException.class);
 +
 +                    // when
 +                    toDoItem.add(otherToDoItem);
 +                }
 +            }
 +            public static class Remove extends ToDoItemIntegTest {
 +
 +                private ToDoItem otherToDoItem;
 +                private ToDoItem yetAnotherToDoItem;
 +
 +                @Before
 +                public void setUp() throws Exception {
 +                    super.setUp();
 +                    final List<ToDoItem> items = wrap(toDoItems).notYetComplete();
 +                    otherToDoItem = wrap(items.get(1));
 +                    yetAnotherToDoItem = wrap(items.get(2));
 +
 +                    toDoItem.add(otherToDoItem);
 +                }
 +
 +                @After
 +                public void tearDown() throws Exception {
 +                    unwrap(toDoItem).getDependencies().clear();
 +                    super.tearDown();
 +                }
 +
 +                @Test
 +                public void happyCase() throws Exception {
 +
 +                    // given
 +                    assertThat(toDoItem.getDependencies().size(), is(1));
 +
 +                    // when
 +                    toDoItem.remove(otherToDoItem);
 +
 +                    // then
 +                    assertThat(toDoItem.getDependencies().size(), is(0));
 +                }
 +
 +
 +                @Test
 +                public void cannotRemoveItemIfNotADependency() throws Exception {
 +
 +                    // then
 +                    expectedExceptions.expectMessage("Not a dependency");
 +
 +                    // when
 +                    toDoItem.remove(yetAnotherToDoItem);
 +                }
 +
 +                @Test
 +                public void cannotRemoveDependencyIfComplete() throws Exception {
 +
 +                    // given
 +                    unwrap(toDoItem).setComplete(true);
 +
 +                    // then
 +                    expectedExceptions.expectMessage("Cannot remove dependencies for items that are complete");
 +
 +                    // when
 +                    toDoItem.remove(otherToDoItem);
 +                }
 +
 +                @Test
 +                public void subscriberVetoesEventWithRecoverableException() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithRecoverableException);
 +
 +                    // then
 +                    expectedExceptions.expect(RecoverableException.class);
 +
 +                    // when
 +                    toDoItem.remove(otherToDoItem);
 +                }
 +
 +                @Test
 +                public void subscriberVetoesEventWithNonRecoverableException() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithNonRecoverableException);
 +
 +                    // then
 +                    expectedExceptions.expect(NonRecoverableException.class);
 +
 +                    // when
 +                    toDoItem.remove(otherToDoItem);
 +                }
 +
 +                @Test
 +                public void subscriberVetoesEventWithAnyOtherException() throws Exception {
 +
 +                    // given
 +                    toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithOtherException);
 +
 +                    // then
 +                    expectedExceptions.expect(RuntimeException.class);
 +
 +                    // when
 +                    toDoItem.remove(otherToDoItem);
 +                }
 +            }
 +        }
 +
 +    }
 +
 +    public static class Properties {
 +
 +        public static class Attachment extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                byte[] bytes = "{\"foo\": \"bar\"}".getBytes(Charset.forName("UTF-8"));
 +                final Blob newAttachment = new Blob("myfile.json", new MimeType("application/json"), bytes);
 +
 +                // when
 +                toDoItem.setAttachment(newAttachment);
 +
 +                // then
 +                assertThat(toDoItem.getAttachment(), is(newAttachment));
 +            }
 +
 +            @Test
 +            public void canBeNull() throws Exception {
 +
 +                // when
 +                toDoItem.setAttachment((Blob)null);
 +
 +                // then
 +                assertThat(toDoItem.getAttachment(), is((Blob)null));
 +            }
 +        }
 +
 +        public static class Category extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void cannotModify() throws Exception {
 +
 +                // when, then
 +                expectedExceptions.expectMessage(containsString("Reason: Use action to update both category and subcategory."));
 +                toDoItem.setCategory(ToDoItem.Category.Professional);
 +            }
 +        }
 +
 +        public static class Cost extends ToDoItemIntegTest {
 +
 +            private BigDecimal cost;
 +
 +            @Before
 +            public void setUp() throws Exception {
 +                super.setUp();
 +                cost = toDoItem.getCost();
 +            }
 +
 +            @Test
 +            public void happyCaseUsingProperty() throws Exception {
 +
 +                final BigDecimal newCost = new BigDecimal("123.45");
 +
 +                // when
 +                toDoItem.updateCost(newCost);
 +
 +                // then
 +                assertThat(toDoItem.getCost(), is(newCost));
 +            }
 +
 +            @Test
 +            public void happyCaseUsingAction() throws Exception {
 +
 +                final BigDecimal newCost = new BigDecimal("123.45");
 +
 +                // when
 +                toDoItem.updateCost(newCost);
 +
 +                // then
 +                assertThat(toDoItem.getCost(), is(newCost));
 +            }
 +
 +            @Test
 +            public void canBeNull() throws Exception {
 +
 +                // when
 +                toDoItem.updateCost((BigDecimal)null);
 +
 +                // then
 +                assertThat(toDoItem.getCost(), is((BigDecimal)null));
 +            }
 +
 +            @Test
 +            public void defaultForAction() throws Exception {
 +
 +                // then
 +                assertThat(unwrap(toDoItem).default0UpdateCost(), is(cost));
 +            }
 +
 +        }
 +
 +        public static class Description extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                // given
 +                assertThat(toDoItem.getDescription(), is("Buy bread"));
 +
 +                // when
 +                toDoItem.setDescription("Buy bread and butter");
 +
 +                // then
 +                assertThat(toDoItem.getDescription(), is("Buy bread and butter"));
 +            }
 +
 +
 +            @Test
 +            public void failsRegex() throws Exception {
 +
 +                // when
 +                expectedExceptions.expectMessage("Doesn't match pattern");
 +                toDoItem.setDescription("exclamation marks are not allowed!!!");
 +            }
 +
 +            @Test
 +            public void cannotBeNull() throws Exception {
 +
 +                // when, then
 +                expectedExceptions.expectMessage("Mandatory");
 +                toDoItem.setDescription(null);
 +            }
 +
 +            @Test
 +            public void cannotUseModify() throws Exception {
 +
 +                expectedExceptions.expectMessage("Cannot invoke supporting method for 'Description'; use only property accessor/mutator");
 +
 +                // given
 +                assertThat(toDoItem.getDescription(), is("Buy bread"));
 +
 +                // when
 +                toDoItem.modifyDescription("Buy bread and butter");
 +
 +                // then
 +                assertThat(toDoItem.getDescription(), is("Buy bread"));
 +            }
 +
 +            @Test
 +            public void cannotUseClear() throws Exception {
 +
 +                expectedExceptions.expectMessage("Cannot invoke supporting method for 'Description'; use only property accessor/mutator");
 +
 +                // given
 +                assertThat(toDoItem.getDescription(), is("Buy bread"));
 +
 +                // when
 +                toDoItem.clearDescription();
 +
 +                // then
 +                assertThat(toDoItem.getDescription(), is("Buy bread"));
 +            }
 +
 +
 +            @Test
 +            public void onlyJustShortEnough() throws Exception {
 +
 +                // when, then
 +                toDoItem.setDescription(characters(100));
 +            }
 +
 +            @Test
 +            public void tooLong() throws Exception {
 +
 +                // then
 +                expectedExceptions.expectMessage("The value proposed exceeds the maximum length of 100");
 +
 +                // when
 +                toDoItem.setDescription(characters(101));
 +            }
 +
 +
 +            @Test
 +            public void subscriberReceivesEvent() throws Exception {
 +
 +                // given
 +                assertThat(toDoItemSubscriptions.getSubscriberBehaviour(), is(ToDoItemSubscriptions.Behaviour.AnyExecuteAccept));
 +                assertThat(toDoItem.getDescription(), is("Buy bread"));
 +
 +                // when
 +                toDoItem.setDescription("Buy bread and butter");
 +
 +                // then published and received
 +                @SuppressWarnings("unchecked")
 +                final PropertyDomainEvent<ToDoItem,String> ev = toDoItemSubscriptions.mostRecentlyReceivedEvent(PropertyDomainEvent.class);
 +                assertThat(ev, is(not(nullValue())));
 +
 +                ToDoItem source = ev.getSource();
 +                assertThat(source, is(equalTo(unwrap(toDoItem))));
 +                assertThat(ev.getIdentifier().getMemberName(), is("description"));
 +                assertThat(ev.getOldValue(), is("Buy bread"));
 +                assertThat(ev.getNewValue(), is("Buy bread and butter"));
 +            }
 +
 +            @Test
 +            public void subscriberVetoesEventWithRecoverableException() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithRecoverableException);
 +
 +                // then
 +                expectedExceptions.expect(RecoverableException.class);
 +
 +                // when
 +                toDoItem.setDescription("Buy bread and butter");
 +            }
 +
 +
 +            @Test
 +            public void subscriberVetoesEventWithNonRecoverableException() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithNonRecoverableException);
 +
 +                // then
 +                expectedExceptions.expect(NonRecoverableException.class);
 +
 +                // when
 +                toDoItem.setDescription("Buy bread and butter");
 +            }
 +
 +
 +            @Test
 +            public void subscriberVetoesEventWithAnyOtherException() throws Exception {
 +
 +                // given
 +                toDoItemSubscriptions.subscriberBehaviour(ToDoItemSubscriptions.Behaviour.AnyExecuteVetoWithOtherException);
 +
 +                // then
 +                expectedExceptions.expect(RuntimeException.class);
 +
 +                // when
 +                toDoItem.setDescription("Buy bread and butter");
 +            }
 +
 +
 +            private static String characters(final int n) {
 +                StringBuffer buf = new StringBuffer();
 +                for(int i=0; i<n; i++) {
 +                    buf.append("a");
 +                }
 +                return buf.toString();
 +            }
 +        }
 +
 +        public static class DueBy extends ToDoItemIntegTest {
 +
 +            @Inject
 +            private ClockService clockService;
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                // when
 +                final LocalDate fiveDaysFromNow = clockService.now().plusDays(5);
 +                toDoItem.setDueBy(fiveDaysFromNow);
 +
 +                // then
 +                assertThat(toDoItem.getDueBy(), is(fiveDaysFromNow));
 +            }
 +
 +
 +            @Test
 +            public void canBeNull() throws Exception {
 +
 +                // when
 +                toDoItem.setDueBy((LocalDate)null);
 +
 +                // then
 +                assertThat(toDoItem.getDueBy(), is((LocalDate)null));
 +            }
 +
 +            @Test
 +            public void canBeUpToSixDaysInPast() throws Exception {
 +
 +                final LocalDate nowAsLocalDate = clockService.now();
 +                final LocalDate sixDaysAgo = nowAsLocalDate.plusDays(-5);
 +
 +                // when
 +                toDoItem.setDueBy(sixDaysAgo);
 +
 +                // then
 +                assertThat(toDoItem.getDueBy(), is(sixDaysAgo));
 +            }
 +
 +
 +            @Test
 +            public void cannotBeMoreThanSixDaysInPast() throws Exception {
 +
 +                final LocalDate sevenDaysAgo = Clock.getTimeAsLocalDate().plusDays(-7);
 +
 +                // when, then
 +                expectedExceptions.expectMessage("Due by date cannot be more than one week old");
 +                toDoItem.setDueBy(sevenDaysAgo);
 +            }
 +        }
 +
 +        public static class Notes extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void happyCase() throws Exception {
 +
 +                final String newNotes = "Lorem ipsum yada yada";
 +
 +                // when
 +                toDoItem.setNotes(newNotes);
 +
 +                // then
 +                assertThat(toDoItem.getNotes(), is(newNotes));
 +            }
 +
 +            @Test
 +            public void canBeNull() throws Exception {
 +
 +                // when
 +                toDoItem.setNotes((String)null);
 +
 +                // then
 +                assertThat(toDoItem.getNotes(), is((String)null));
 +            }
 +
 +            @Test
 +            public void suscriberReceivedDefaultEvent() throws Exception {
 +
 +                final String newNotes = "Lorem ipsum yada yada";
 +
 +                // when
 +                toDoItem.setNotes(newNotes);
 +
 +                // then
 +                assertThat(unwrap(toDoItem).getNotes(), is(newNotes));
 +
 +                // and then receive the default event.
 +                @SuppressWarnings("unchecked")
 +                final PropertyDomainEvent.Default ev = toDoItemSubscriptions.mostRecentlyReceivedEvent(PropertyDomainEvent.Default.class);
 +                assertThat(ev, is(notNullValue()));
 +
 +                assertThat(ev.getSource(), is((Object)unwrap(toDoItem)));
 +                assertThat(ev.getNewValue(), is((Object)newNotes));
 +            }
 +
 +
 +        }
 +
 +        public static class OwnedBy extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void cannotModify() throws Exception {
 +
 +                // when, then
 +                expectedExceptions.expectMessage("Reason: Hidden on Everywhere. Identifier: dom.todo.ToDoItem#ownedBy()");
 +                toDoItem.setOwnedBy("other");
 +            }
 +
 +
 +        }
 +
 +        public static class Subcategory extends ToDoItemIntegTest {
 +
 +            @Test
 +            public void cannotModify() throws Exception {
 +
 +                // when, then
 +                expectedExceptions.expectMessage(containsString("Reason: Use action to update both category and subcategory."));
 +                toDoItem.setSubcategory(ToDoItem.Subcategory.Chores);
 +            }
 +        }
 +
 +    }
 +
 +
 +
 +
 +}

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/mothballed/example/application/todoapp/webapp/pom.xml
----------------------------------------------------------------------
diff --cc mothballed/example/application/todoapp/webapp/pom.xml
index 785d17e,0000000..1dca6f3
mode 100644,000000..100644
--- a/mothballed/example/application/todoapp/webapp/pom.xml
+++ b/mothballed/example/application/todoapp/webapp/pom.xml
@@@ -1,352 -1,0 +1,352 @@@
 +<?xml version="1.0" encoding="UTF-8"?>
 +<!--
 +  Licensed to the Apache Software Foundation (ASF) under one
 +  or more contributor license agreements.  See the NOTICE file
 +  distributed with this work for additional information
 +  regarding copyright ownership.  The ASF licenses this file
 +  to you under the Apache License, Version 2.0 (the
 +  "License"); you may not use this file except in compliance
 +  with the License.  You may obtain a copy of the License at
 +  
 +         http://www.apache.org/licenses/LICENSE-2.0
 +         
 +  Unless required by applicable law or agreed to in writing,
 +  software distributed under the License is distributed on an
 +  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +  KIND, either express or implied.  See the License for the
 +  specific language governing permissions and limitations
 +  under the License.
 +--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 +    <modelVersion>4.0.0</modelVersion>
 +
 +    <parent>
 +        <groupId>org.apache.isis.example.application</groupId>
 +        <artifactId>todoapp</artifactId>
 +        <version>1.9.0-SNAPSHOT</version>
 +    </parent>
 +
 +    <artifactId>todoapp-webapp</artifactId>
 +    <name>ToDo App Webapp</name>
 +
 +    <description>This module runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the datanucleus object store.</description>
 +
 +    <packaging>war</packaging>
 +
 +    <properties>
 +        <siteBaseDir>..</siteBaseDir>
 +    </properties>
 +    
 +    <build>
 +        <plugins>
 +            <plugin>
 +                <groupId>org.mortbay.jetty</groupId>
 +                <artifactId>maven-jetty-plugin</artifactId>
 +            </plugin>
 +
 +            <!-- mvn package -->
 +            <plugin>
 +                <groupId>org.simplericity.jettyconsole</groupId>
 +                <artifactId>jetty-console-maven-plugin</artifactId>
 +                <executions>
 +                    <execution>
 +                        <goals>
 +                            <goal>createconsole</goal>
 +                        </goals>
 +                        <configuration>
 +                            <backgroundImage>${basedir}/src/main/jettyconsole/isis-banner.png</backgroundImage>
 +                            <destinationFile>${project.build.directory}/${project.build.finalName}-jetty-console.jar</destinationFile>
 +                        </configuration>
 +                        <phase>package</phase>
 +                    </execution>
 +                </executions>
 +            </plugin>
 +
 +            <plugin>
 +                <groupId>org.codehaus.mojo</groupId>
 +                <artifactId>build-helper-maven-plugin</artifactId>
 +                <version>1.8</version>
 +                  <executions>
 +                    <execution>
 +                      <phase>validate</phase>
 +                      <goals>
 +                        <goal>maven-version</goal>
 +                      </goals>
 +                    </execution>
 +                  </executions>
 +            </plugin>
 +
 +            <plugin>
 +                <artifactId>maven-war-plugin</artifactId>
 +                <configuration>
 +                    <warName>todoapp</warName>
 +                    <archive>
 +                        <manifest>
 +                            <addClasspath>false</addClasspath>
 +                        </manifest>
 +                        <manifestEntries>
 +                            <Build-Time>${maven.build.timestamp}</Build-Time>
 +                            <Build-Host>${agent.name}</Build-Host>
 +                            <Build-User>${user.name}</Build-User>
 +                            <Build-Maven>Maven ${maven.version}</Build-Maven>
 +                            <Build-Java>${java.version}</Build-Java>
 +                            <Build-OS>${os.name}</Build-OS>
 +                            <Build-Label>${project.version}</Build-Label>
 +                        </manifestEntries>
 +                    </archive>
 +                </configuration>
 +            </plugin>
 +
 +        </plugins>
 +        <pluginManagement>
 +            <plugins>
 +                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
 +                <plugin>
 +                    <groupId>org.eclipse.m2e</groupId>
 +                    <artifactId>lifecycle-mapping</artifactId>
 +                    <version>1.0.0</version>
 +                    <configuration>
 +                        <lifecycleMappingMetadata>
 +                            <pluginExecutions>
 +                                <pluginExecution>
 +                                    <pluginExecutionFilter>
 +                                        <groupId>
 +                                            org.codehaus.mojo
 +                                        </groupId>
 +                                        <artifactId>
 +                                            build-helper-maven-plugin
 +                                        </artifactId>
 +                                        <versionRange>
 +                                            [1.5,)
 +                                        </versionRange>
 +                                        <goals>
 +                                            <goal>maven-version</goal>
 +                                        </goals>
 +                                    </pluginExecutionFilter>
 +                                    <action>
 +                                        <ignore></ignore>
 +                                    </action>
 +                                </pluginExecution>
 +                            </pluginExecutions>
 +                        </lifecycleMappingMetadata>
 +                    </configuration>
 +                </plugin>
 +            </plugins>
 +        </pluginManagement>
 +    </build>
 +
 +    <dependencies>
 +    
 +        <!-- other modules in this project -->
 +        <dependency>
 +            <groupId>${project.groupId}</groupId>
 +            <artifactId>todoapp-dom</artifactId>
 +            <exclusions>
 +                <exclusion>
 +                    <!-- so don't pick up transitive dependency to asm 4.0.0 -->
 +                    <groupId>org.datanucleus</groupId>
 +                    <artifactId>datanucleus-enhancer</artifactId>
 +                </exclusion>
 +            </exclusions>
 +        </dependency>
 +        <dependency>
 +            <groupId>${project.groupId}</groupId>
 +            <artifactId>todoapp-fixture</artifactId>
 +            <exclusions>
 +                <exclusion>
 +                    <!-- so don't pick up transitive dependency to asm 4.0.0 -->
 +                    <groupId>org.datanucleus</groupId>
 +                    <artifactId>datanucleus-enhancer</artifactId>
 +                </exclusion>
 +            </exclusions>
 +        </dependency>
 +        
 +        <!-- other isis components -->
 +        <dependency>
 +            <groupId>org.apache.isis.viewer</groupId>
 +            <artifactId>isis-viewer-wicket-impl</artifactId>
 +        </dependency>
 +        <dependency>
 +            <groupId>org.apache.isis.core</groupId>
 +            <artifactId>isis-core-viewer-restfulobjects-server</artifactId>
 +        </dependency>
 +        <dependency>
 +            <groupId>org.apache.isis.core</groupId>
 +            <artifactId>isis-core-security-shiro</artifactId>
 +        </dependency>
 +
 +
 +        <!-- isis core -->
 +        <dependency>
 +            <groupId>org.apache.isis.core</groupId>
 +            <artifactId>isis-core-runtime</artifactId>
 +        </dependency>
 +        <dependency>
 +            <groupId>org.apache.isis.core</groupId>
 +            <artifactId>isis-core-wrapper</artifactId>
 +        </dependency>
 +        <dependency>
 +            <groupId>org.apache.isis.core</groupId>
 +            <artifactId>isis-core-security</artifactId>
 +        </dependency>
 +
 +
 +        <!-- to run using WebServer (optional) -->
 +        <dependency>
 +            <groupId>org.apache.isis.core</groupId>
 +            <artifactId>isis-core-webserver</artifactId>
 +            <scope>runtime</scope>
 +            <optional>true</optional>
 +        </dependency>
 +
 +
 +        <dependency>
 +            <groupId>org.apache.geronimo.specs</groupId>
 +            <artifactId>geronimo-servlet_2.5_spec</artifactId>
 +            <!--
 +            removed so can run o.a.i.WebServer from within IntelliJ;
 +            can rely on servlet container to ignore this in war file
 +            <scope>provided</scope>
 +            -->
 +        </dependency>
 +
 +        <!-- 
 +          JDBC drivers 
 +          (for jdo objectstore)
 +          -->
 +        <dependency>
 +            <groupId>org.hsqldb</groupId>
 +            <artifactId>hsqldb</artifactId>
 +        </dependency>
 +
 +        <!-- 
 +        <dependency>
 +            <groupId>postgresql</groupId>
 +            <artifactId>postgresql</artifactId>
 +            <version>9.1-901.jdbc4</version>
 +        </dependency>
 +         -->
 +
 +        <!-- 
 +        mvn install:install-file -Dfile=sqljdbc4.jar \
 +                                 -DgroupId=com.microsoft.sqlserver \
 +                                 -DartifactId=jdbc \
 +                                 -Dversion=4.0 \
 +                                 -Dpackaging=jar
 +         -->
 +         <!-- 
 +        <dependency>
 +            <groupId>com.microsoft.sqlserver</groupId>
 +            <artifactId>sqljdbc4</artifactId>
 +            <version>4.0</version>
 +        </dependency>
 +          -->
 +
 +        <dependency>
 +          <groupId>org.lazyluke</groupId>
 +          <artifactId>log4jdbc-remix</artifactId>
 +          <exclusions>
 +            <exclusion>
 +              <groupId>org.slf4j</groupId>
 +              <artifactId>slf4j-api</artifactId>
 +            </exclusion>
 +          </exclusions>
 +        </dependency>
 +
 +    </dependencies>
 +
 +    <profiles>
 +        <profile>
 +            <id>self-host</id>
 +            <build>
 +                <plugins>
 +                    <!-- 
 +                    mvn -P self-host antrun:run
 +                    -->
 +                    <plugin>
 +                        <groupId>org.apache.maven.plugins</groupId>
 +                        <artifactId>maven-antrun-plugin</artifactId>
 +                        <configuration>
 +                            <tasks>
 +                                <exec executable="java" failonerror="true">
 +                                    <arg value="-jar" />
 +                                    <arg value="${project.build.directory}/${project.build.finalName}-jetty-console.jar" />
 +                                </exec>
 +                            </tasks>
 +                        </configuration>
 +                    </plugin>
 +                </plugins>
 +            </build>
 +        </profile>
 +
 +        <profile>
 +            <id>jrebel</id>
 +            <properties>
 +                <!-- as used in the rebel.xml in the dom project -->
 +                <target.dir>target</target.dir>
 +                <isis-jrebel-plugin.packagePrefix>dom.todo,org.apache.isis.objectstore.jdo.applib</isis-jrebel-plugin.packagePrefix>
 +                <isis-jrebel-plugin.loggingLevel>warn</isis-jrebel-plugin.loggingLevel>
 +            </properties>
 +            <build>
 +                <plugins>
 +                    <!--
 +                    mvn -P jrebel antrun:run \
 +                        -Djrebel.jar="C:/Users/Dan/.IdeaIC13/config/plugins/jr-ide-idea/lib/jrebel/jrebel.jar" \
 +                        -Disis_jrebel_plugin.jar="C:/github/danhaywood/isis-jrebel-plugin/target/danhaywood-isis-jrebel-plugin-1.0.0-SNAPSHOT.jar"
 +                    -->
 +                    <plugin>
 +                        <groupId>org.apache.maven.plugins</groupId>
 +                        <artifactId>maven-antrun-plugin</artifactId>
 +                        <configuration>
 +                            <target>
 +                                <property name="compile_classpath" refid="maven.compile.classpath"/>
 +                                <property name="runtime_classpath" refid="maven.runtime.classpath"/>
 +                                <property name="test_classpath" refid="maven.test.classpath"/>
 +                                <property name="plugin_classpath" refid="maven.plugin.classpath"/>
 +
 +                                <echo message=""/>
 +                                <echo message=""/>
 +                                <echo message="jrebel.jar             = ${jrebel.jar}"/>
 +                                <echo message="isis_jrebel_plugin.jar = ${isis_jrebel_plugin.jar}"/>
 +                                <echo message="target.dir             = ${target.dir}"/>
 +                                <echo message=""/>
 +                                <echo message=""/>
 +
 +                                <exec executable="java" failonerror="true">
 +                                    <arg value="-javaagent:${jrebel.jar}"/>
 +                                    <arg value="-Drebel.log=false"/>
 +                                    <arg value="-Drebel.check_class_hash=true"/>
 +                                    <arg value="-Drebel.packages_exclude=org.apache.isis"/>
 +
 +                                    <!-- as used in the rebel.xml in the dom project -->
 +                                    <arg value="-Dproject.root=${project.basedir}/.."/>
 +                                    <arg value="-Dtarget.dir=${target.dir}"/>
 +
 +                                    <arg value="-Drebel.plugins=${isis_jrebel_plugin.jar}"/>
 +                                    <arg value="-Disis-jrebel-plugin.packagePrefix=${isis-jrebel-plugin.packagePrefix}"/>
 +                                    <arg value="-Disis-jrebel-plugin.loggingLevel=${isis-jrebel-plugin.loggingLevel}"/>
 +                                    <arg value="-XX:MaxPermSize=128m"/>
 +                                    <arg value="-classpath"/>
 +                                    <arg value="${runtime_classpath}"/>
 +                                    <arg value="org.apache.isis.WebServer"/>
 +                                </exec>
 +                            </target>
 +                        </configuration>
 +                    </plugin>
 +                </plugins>
 +            </build>
 +        </profile>
 +        <profile>
-             <id>neo4j</id>
-             <dependencies>
-                 <dependency>
-                     <groupId>org.datanucleus</groupId>
-                     <artifactId>datanucleus-neo4j</artifactId>
-                     <version>3.2.3</version>
-                 </dependency>
-             </dependencies>
++        	<id>neo4j</id>
++        	<dependencies>
++		        <dependency>
++		        	<groupId>org.datanucleus</groupId>
++		        	<artifactId>datanucleus-neo4j</artifactId>
++		        	<version>4.0.4</version>
++		        </dependency>
++        	</dependencies>
 +        </profile>
 +    </profiles>
 +
 +
 +
 +</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --cc mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
index f3366a7,0000000..e22a282
mode 100644,000000..100644
--- a/mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@@ -1,290 -1,0 +1,290 @@@
 +#  Licensed to the Apache Software Foundation (ASF) under one
 +#  or more contributor license agreements.  See the NOTICE file
 +#  distributed with this work for additional information
 +#  regarding copyright ownership.  The ASF licenses this file
 +#  to you under the Apache License, Version 2.0 (the
 +#  "License"); you may not use this file except in compliance
 +#  with the License.  You may obtain a copy of the License at
 +#  
 +#         http://www.apache.org/licenses/LICENSE-2.0
 +#         
 +#  Unless required by applicable law or agreed to in writing,
 +#  software distributed under the License is distributed on an
 +#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +#  KIND, either express or implied.  See the License for the
 +#  specific language governing permissions and limitations
 +#  under the License.
 +
 +
 +#################################################################################
 +#
 +# specify system components.
 +#
 +# The values correspond to the named components in the installer-registry.properties file
 +# in the org.apache.isis.core:isis-core-runtime JAR (in the org.apache.isis.core.runtime package)
 +#
 +# Although all configuration could reside in isis.properties, the recommendation is
 +# to split out into component specific files:
 +# 
 +#    xxx_yyy.properties files
 +#
 +# where
 +#    * xxx is the component type, and
 +#    * yyy is the component name.
 +#
 +# For example, viewer_wicket.properties holds configuration information specific to the Wicket viewer.
 +#
 +#################################################################################
 +
 +
 +#
 +# configure the persistor (object store) to use
 +#
 +
 +# JDO/DataNucleus objectstore
 +isis.persistor=datanucleus
 +
 +
 +
 +#
 +# configure authentication mechanism to use (to logon to the system)
 +#
 + 
 +#isis.authentication=bypass
 +isis.authentication=shiro
 +
 +
 +#
 +# configure authorization mechanism to use
 +#
 + 
 +#isis.authorization=bypass
 +isis.authorization=shiro
 +
 +
 +
 +
 +
 +#################################################################################
 +#
 +# MetaModel
 +#
 +# The metamodel typically does not require additional configuration, although
 +# the system components (defined above) may refine the metamodel for their needs.
 +#
 +#################################################################################
 +
 +
 +#
 +# Additional programming model facet factories, or remove standard facet factories.
 +# Comma separated list of fully qualified class names.
 +#
 +#isis.reflector.facets.include=
 +#isis.reflector.facets.exclude=
 +
 +
 +#
 +# Metamodel validation (in addition to that automatically performed by the programming model facet factories)
 +# Default implementation does nothing.
 +#
 +# Use a custom implementation to enforce additional constraints specific to your app/project/company.
 +#
 +#isis.reflector.validator=org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault
 +
 +
 +
 +#
 +# Whether to allow deprecated annotations/method prefixes (otherwise raise metamodel validation errors).
 +# If not specified, default is to allow.
 +#
 +#isis.reflector.validator.allowDeprecated=false
 +
 +
 +
 +#
 +# Implementation to use for reading dynamic layout.  Default implementation reads Xxx.layout.json files from classpath.
 +#
 +#isis.reflector.layoutMetadataReaders=org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson
 +
 +
 +
 +#
 +# patterns for applying CssClassFa facet (font-awesome icons), matching on action names
 +#
 +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
 +
 +
 +#
 +# patterns for applying CssClass facet (CSS styles), matching on member names
 +#
 +isis.reflector.facet.cssClass.patterns=\
 +                        delete.*:btn-warning,\
 +                        .*:btn-default
 +
 +
 +#################################################################################
 +#
 +# Value facet defaults
 +#
 +# (see also viewer-specific config files, eg viewer_wicket.properties)
 +#
 +#################################################################################
 +
 +# as used by @Title of a date
 +isis.value.format.date=dd-MM-yyyy
 +
 +
 +
 +#################################################################################
 +#
 +# Facet Decorators
 +#
 +#################################################################################
 +
 +#
 +# Providing such capabilities as i18n
 +#
 +
 +isis.reflector.facet-decorators=org.apache.isis.core.metamodel.facetdecorator.i18n.resourcebundle.I18nDecoratorUsingResourceBundleInstaller
 +
 +
 +#################################################################################
 +#
 +# Application Services and fixtures
 +#
 +#################################################################################
 +
 +#
 +# Specify the domain services.
 +# 
 +# These are the most important configuration properties in the system, as they define
 +# the set of the classes for Isis to instantiate as domain service singletons.
 +# From these domain service instances the rest of the metamodel is discovered, while the 
 +# 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.userprof,\
 +                                                            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, \
 +                org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
 +                #,\
 +                1:webapp.CustomMementoService,\
 +                1:webapp.CustomRepresentationService
 +
 +
 +# Specify the (optional) test fixtures
 +#
 +# Fixtures are used to seed the object store with an initial set of data.  For the 
 +# in-memory object store, the fixtures are installed on every run.  For other
 +# object stores, they are used only when the object store is first initialized.
 +#
 +#isis.fixtures=fixture.todo.scenarios.ToDoItemsRecreateForSven
 +
 +
 +#
 +# required by EmailServiceDefault
 +#
 +#isis.service.email.sender.address=some.valid@email.address
 +#isis.service.email.sender.password=the.password.for-isis.notification.email.sender.address
 +
 +
 +#
 +# whether ExceptionRecognizers should also log any recognized exceptions
 +# (default false; enable for diagnostics/debugging)
 +#
 +#isis.services.exceprecog.logRecognizedExceptions=true
 +
 +
 +################################################################################
 +#
 +# Auditing, Publishing, Command
 +#
 +################################################################################
 +
 +#
 +# Whether changes to objects should be audited; if not set, defaults to "none"
 +# - if not set or set to "none", can explicitly enable using @DomainObject(auditing=Auditing.ENABLED)
 +# - if set to "all", can explicitly disable using @Object(auditing=Auditing.DISABLED)
 +#
 +#isis.services.audit.objects=all|none
 +
 +#
 +# Whether changes to objects should be published; if not set, defaults to "none"
 +# - if not set or set to "none", can explicitly enable using @DomainObject(publishing=Publishing.ENABLED)
 +# - if set to "all", can explicitly disable using @Object(publishing=Publishing.DISABLED)
 +#
 +#isis.services.publish.objects=all|none
 +
 +#
 +# Whether all (or all non-query only) actions should be published; if not set, defaults to "none"
 +# - if not set or set to "none", can explicitly enable using @Action(publishing=Publishing.ENABLED)
 +# - if set to "all", can explicitly disable using @Action(publishing=Publishing.DISABLED)
 +#
 +#isis.services.publish.actions=all|none|ignoreQueryOnly
 +
 +
 +#
 +# Whether all (or all non-query only) actions should be reified as commands; if not set, defaults to "none"
 +# - if not set or set to "none", can explicitly enable using @Action(command=CommandReification.ENABLED)
 +# - if set to "all", can explicitly disable using @Action(command=CommandReification.DISABLED)
 +#
 +#isis.services.command.actions=all|none|ignoreQueryOnly
 +
 +
 +
 +################################################################################
 +#
 +# Policies
 +#
 +#################################################################################
 +
 +#
 +# Whether editing of object properties is allowed; if not set, defaults to "true"
 +# - if not set or set to "true", can explicitly disable using @DomainObject(editing=Editing.DISABLED)
 +# - if set to "false", can explicitly enable using @DomainObject(editing=Editing.ENABLED)
 +#
 +#isis.objects.editing=true|false
 +
 +
 +
 +################################################################################
 +#
 +# Viewer defaults
 +#
 +#################################################################################
 +
 +#isis.viewers.paged.standalone=30
 +#isis.viewers.paged.parented=10
 +
 +#isis.viewers.propertyLayout.labelPosition=LEFT
 +#isis.viewers.parameterLayout.labelPosition=LEFT

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
----------------------------------------------------------------------
diff --cc mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
index a60a733,0000000..051d1dc
mode 100644,000000..100644
--- a/mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
+++ b/mothballed/example/application/todoapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
@@@ -1,88 -1,0 +1,88 @@@
 +#  Licensed to the Apache Software Foundation (ASF) under one
 +#  or more contributor license agreements.  See the NOTICE file
 +#  distributed with this work for additional information
 +#  regarding copyright ownership.  The ASF licenses this file
 +#  to you under the Apache License, Version 2.0 (the
 +#  "License"); you may not use this file except in compliance
 +#  with the License.  You may obtain a copy of the License at
 +#  
 +#         http://www.apache.org/licenses/LICENSE-2.0
 +#         
 +#  Unless required by applicable law or agreed to in writing,
 +#  software distributed under the License is distributed on an
 +#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +#  KIND, either express or implied.  See the License for the
 +#  specific language governing permissions and limitations
 +#  under the License.
 +
 +#
 +# configuration file for the JDO/DataNucleus objectstore
 +#
 +
 +# identifies @PersistenceCapable entities to be eagerly registered
 +# if move class to other package (eg com.mycompany.myapp.dom) then update 
 +isis.persistor.datanucleus.RegisterEntities.packagePrefix=dom
 +
 +# whether to persist the event data as a "clob" or as a "zipped" byte[]
 +# default is "zipped"
 +#isis.persistor.datanucleus.PublishingService.serializedForm=zipped
 +
 +
 +
 +#####################################################################
 +#
 +# DataNucleus' configuration
 +#
 +# The 'isis.persistor.datanucleus.impl' prefix is stripped off,
 +# remainder is passed through to DataNucleus
 +#
 +#####################################################################
 +
- 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
 +
 +
 +#
 +# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo).
 +# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html
 +#
 +isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
 +
 +
 +#
 +# 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
 +# off except if explicitly marked as cacheable
 +# http://www.datanucleus.org/products/datanucleus/jdo/cache.html
 +#
 +isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none
 +isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE
 +
 +
 +
 +#
 +# uncomment to use JNDI rather than direct JDBC
 +#
 +#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName=java:comp/env/jdbc/quickstart
 +
 +#
 +# uncomment to use JTA resource
 +#
 +#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name=java:comp/env/jdbc/quickstart-nontx
 +#isis.persistor.datanucleus.impl.javax.jdo.option.TransactionType=JTA
 +
 +
 +
 +#
 +#
 +# JDBC connection details
 +# ... are in persistor.properties
 +#
 +#

http://git-wip-us.apache.org/repos/asf/isis/blob/e2dffa84/pom.xml
----------------------------------------------------------------------


[10/20] isis git commit: Removed last 'instanceOf' references to PersistenceCapable. Added a few overrides in the JDOStateManagerForIsis

Posted by da...@apache.org.
Removed last 'instanceOf' references to PersistenceCapable.
Added a few overrides in the JDOStateManagerForIsis


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

Branch: refs/heads/ISIS-789
Commit: 5944ae2a9b58bc5303350286a342885519321fdf
Parents: dbe2239
Author: jdb6853 <jd...@hotmail.com>
Authored: Fri Jan 2 00:18:21 2015 -0600
Committer: jdb6853 <jd...@hotmail.com>
Committed: Fri Jan 2 00:18:21 2015 -0600

----------------------------------------------------------------------
 .../RemoveDnPrefixedMethodsFacetFactory.java    | 28 ++++++++
 .../AbstractRemoveMethodsFacetFactory.java      |  1 -
 ...PersistableEnhancementTypesFacetFactory.java | 14 ----
 .../dflt/ObjectSpecificationDefault.java        |  5 +-
 .../dflt/ProgrammingModelFacetsJava5.java       |  5 ++
 .../IdentifierGeneratorForDataNucleus.java      |  4 +-
 .../DataNucleusApplicationComponents.java       | 16 +++--
 ...ataNucleusPersistenceMechanismInstaller.java | 16 ++---
 .../jdo/datanucleus/JDOStateManagerForIsis.java | 70 ++++++++++++++++++--
 .../jdo/datanucleus/persistence/Utils.java      |  1 -
 .../persistence/spi/JdoObjectIdSerializer.java  |  2 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  9 +--
 pom.xml                                         |  9 +++
 13 files changed, 136 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDnPrefixedMethodsFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDnPrefixedMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDnPrefixedMethodsFacetFactory.java
new file mode 100644
index 0000000..29f584f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/datanucleus/RemoveDnPrefixedMethodsFacetFactory.java
@@ -0,0 +1,28 @@
+package org.apache.isis.core.metamodel.facets.object.ignore.datanucleus;
+
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+
+import java.lang.reflect.Method;
+
+/**
+ * Removes all methods inherited from <tt>org.datanucleus.enhancer.Persistable</tt> (if DN is on the classpath).
+ */
+public class RemoveDnPrefixedMethodsFacetFactory extends FacetFactoryAbstract {
+
+    public RemoveDnPrefixedMethodsFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(ProcessClassContext context) {
+        Class<?> cls = context.getCls();
+        Method[] methods = cls.getMethods();
+        for(Method method: methods) {
+            if(method.getName().startsWith("dn")) {
+                context.removeMethod(method);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/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 ab4665c..87c139d 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,7 +61,6 @@ 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/5944ae2a/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
deleted file mode 100644
index 2b30e9d..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/jdo/RemoveJdoPersistableEnhancementTypesFacetFactory.java
+++ /dev/null
@@ -1,14 +0,0 @@
-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/5944ae2a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 6e598de..e0d90bb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -25,10 +25,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-
 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.filter.Filter;
@@ -147,8 +145,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
         for (final Class<?> interfaceType : interfaceTypes) {
             final Class<?> substitutedInterfaceType = classSubstitutor.getClass(interfaceType);
             if (substitutedInterfaceType != null) {
-            	SpecificationLoader specificationLoader = getSpecificationLookup();
-                final ObjectSpecification interfaceSpec = specificationLoader.loadSpecification(substitutedInterfaceType);
+                final ObjectSpecification interfaceSpec = getSpecificationLookup().loadSpecification(substitutedInterfaceType);
                 interfaceSpecList.add(interfaceSpec);
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 6027aeb..e2bd52f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -101,6 +101,8 @@ import org.apache.isis.core.metamodel.facets.object.hidden.annotation.HiddenFace
 import org.apache.isis.core.metamodel.facets.object.hidden.method.HiddenObjectFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.object.icon.method.IconFacetMethodFactory;
 import org.apache.isis.core.metamodel.facets.object.ignore.annotation.RemoveProgrammaticOrIgnoreAnnotationMethodsFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.ignore.datanucleus.RemoveDatanucleusPersistableTypesFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.ignore.datanucleus.RemoveDnPrefixedMethodsFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.ignore.isis.RemoveSetDomainObjectContainerMethodFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.ignore.isis.RemoveStaticGettersAndSettersFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.ignore.javalang.IteratorFilteringFacetFactory;
@@ -260,6 +262,9 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(RemoveJdoEnhancementTypesFacetFactory.class);
         // so we may as well also just ignore any 'jdo' prefixed methods here also.
         addFactory(RemoveJdoPrefixedMethodsFacetFactory.class);
+        // DN 4.x
+        addFactory(RemoveDatanucleusPersistableTypesFacetFactory.class);
+        addFactory(RemoveDnPrefixedMethodsFacetFactory.class);
 
         // must be before any other FacetFactories that install
         // MandatoryFacet.class facets

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IdentifierGeneratorForDataNucleus.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IdentifierGeneratorForDataNucleus.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IdentifierGeneratorForDataNucleus.java
index 004b0e9..90c249e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IdentifierGeneratorForDataNucleus.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IdentifierGeneratorForDataNucleus.java
@@ -21,8 +21,8 @@ package org.apache.isis.core.runtime.system.persistence;
 import java.util.UUID;
 
 import javax.jdo.PersistenceManager;
-import javax.jdo.spi.PersistenceCapable;
 
+import org.datanucleus.enhancer.Persistable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,7 +74,7 @@ class IdentifierGeneratorForDataNucleus implements IdentifierGenerator {
     public String createPersistentIdentifierFor(ObjectSpecId objectSpecId, Object pojo, RootOid transientRootOid) {
         
         // hack to deal with services
-        if(!(pojo instanceof PersistenceCapable)) {
+        if(!(pojo instanceof Persistable)) {
             return "1";
         }
         

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
index c7c27b3..762409e 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusApplicationComponents.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -30,6 +31,8 @@ import com.google.common.base.Joiner;
 import com.google.common.collect.Maps;
 
 import org.datanucleus.NucleusContext;
+import org.datanucleus.NucleusContextHelper;
+import org.datanucleus.PropertyNames;
 import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
 import org.datanucleus.metadata.MetaDataManager;
 import org.datanucleus.store.StoreManager;
@@ -106,7 +109,8 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
         props.put("datanucleus.autoStartClassNames", persistableClassNames);
         persistenceManagerFactory = JDOHelper.getPersistenceManagerFactory(props);
 
-        final boolean createSchema = Boolean.parseBoolean( props.get("datanucleus.autoCreateSchema") );
+        final boolean createSchema = (Boolean.parseBoolean( props.get(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA) ) ||
+                Boolean.parseBoolean( props.get(PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_ALL) ));
         if(createSchema) {
             createSchema(props, persistableClassNameSet);
         }
@@ -120,15 +124,17 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon
     }
 
     private void createSchema(final Map<String, String> props, final Set<String> classesToBePersisted) {
-    	//TODO: Cleanup - Schema creation should be handled by configuration
     	//REF: http://www.datanucleus.org/products/datanucleus/jdo/schema.html
     	
-        /*final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
+        final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
         final NucleusContext nucleusContext = jdopmf.getNucleusContext();
-        final StoreManager storeManager = nucleusContext.getStoreManager();
+        final StoreManager storeManager = NucleusContextHelper.createStoreManagerForProperties(
+                new HashMap<String, Object>(props),
+                jdopmf.getPersistenceProperties(),
+                nucleusContext.getClassLoaderResolver(ClassLoader.getSystemClassLoader()), nucleusContext);
         if (storeManager instanceof SchemaAwareStoreManager) {
             ((SchemaAwareStoreManager)storeManager).createSchemaForClasses(classesToBePersisted, asProperties(props));
-		}*/
+		}
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/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 b55f1b7..e6cbb4c 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
@@ -25,6 +25,7 @@ import java.util.Set;
 
 import com.google.common.collect.Sets;
 
+import org.datanucleus.PropertyNames;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.components.Installer;
@@ -136,19 +137,19 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
             final Map<String, String> props) {
         
         // new feature in DN 3.2.3; enables dependency injection into entities
-        putIfNotPresent(props, "datanucleus.objectProvider.className", "org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis");
+        putIfNotPresent(props, PropertyNames.PROPERTY_OBJECT_PROVIDER_CLASS_NAME, "org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis");
         
         putIfNotPresent(props, "javax.jdo.PersistenceManagerFactoryClass", "org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
 
-        putIfNotPresent(props, "datanucleus.autoCreateSchema", "true");
-        putIfNotPresent(props, "datanucleus.validateSchema", "true");
-        putIfNotPresent(props, "datanucleus.cache.level2.type", "none");
+        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_AUTOCREATE_SCHEMA, "true");
+        putIfNotPresent(props, PropertyNames.PROPERTY_SCHEMA_VALIDATE_ALL, "true");
+        putIfNotPresent(props, PropertyNames.PROPERTY_CACHE_L2_TYPE, "none");
         
-        putIfNotPresent(props, "datanucleus.persistenceUnitLoadClasses", "true");
+        putIfNotPresent(props, PropertyNames.PROPERTY_PERSISTENCE_UNIT_LOAD_CLASSES, "true");
 
-        String connectionFactoryName = props.get("datanucleus.ConnectionFactoryName");
+        String connectionFactoryName = props.get(PropertyNames.PROPERTY_CONNECTION_FACTORY_NAME);
         if(connectionFactoryName != null) {
-            String connectionFactory2Name = props.get("datanucleus.ConnectionFactory2Name");
+            String connectionFactory2Name = props.get(PropertyNames.PROPERTY_CONNECTION_FACTORY2_NAME);
             String transactionType = props.get("javax.jdo.option.TransactionType");
             if(transactionType == null) {
                 LOG.info("found non-JTA JNDI datasource (" + connectionFactoryName + ")");
@@ -209,7 +210,6 @@ 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/5944ae2a/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 fc71c7a..d511f10 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,9 +19,6 @@
 
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-import javax.jdo.spi.PersistenceCapable;
-import javax.jdo.spi.StateManager;
-
 import org.datanucleus.ExecutionContext;
 import org.datanucleus.cache.CachedPC;
 import org.datanucleus.enhancer.Persistable;
@@ -55,58 +52,90 @@ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
         };
     };
 
+    @Override
     public void initialiseForHollow(Object id, FieldValues fv, Class pcClass) {
         super.initialiseForHollow(id, fv, pcClass);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForHollowAppId(FieldValues fv, Class pcClass) {
         super.initialiseForHollowAppId(fv, pcClass);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForHollowPreConstructed(Object id, Persistable pc) {
         super.initialiseForHollowPreConstructed(id, pc);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForPersistentClean(Object id, Persistable pc) {
         super.initialiseForPersistentClean(id, pc);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForEmbedded(Persistable pc, boolean copyPc) {
         super.initialiseForEmbedded(pc, copyPc);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForPersistentNew(Persistable pc,
             FieldValues preInsertChanges) {
         super.initialiseForPersistentNew(pc, preInsertChanges);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForTransactionalTransient(Persistable pc) {
         super.initialiseForTransactionalTransient(pc);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForDetached(Persistable pc, Object id, Object version) {
         super.initialiseForDetached(pc, id, version);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForPNewToBeDeleted(Persistable pc) {
         super.initialiseForPNewToBeDeleted(pc);
         mapIntoIsis(myPC);
     }
 
+    @Override
     public void initialiseForCachedPC(CachedPC cachedPC, Object id) {
         super.initialiseForCachedPC(cachedPC, id);
         mapIntoIsis(myPC);
     }
 
     @Override
+    public void replaceField(Persistable pc, int fieldNumber, Object value) {
+        final Hint previous = hint.get();
+        try {
+            hint.set(Hint.REPLACE_FIELDS);
+            super.replaceField(pc, fieldNumber, value);
+        } finally {
+            hint.set(previous);
+        }
+    }
+
+    @Override
+    public void replaceFieldValue(int fieldNumber, Object value) {
+        final Hint previous = hint.get();
+        try {
+            hint.set(Hint.REPLACE_FIELDS);
+            super.replaceField(fieldNumber, value);
+        } finally {
+            hint.set(previous);
+        }
+    }
+
+    @Override
     public void replaceField(int fieldNumber, Object value) {
         final Hint previous = hint.get();
         try {
@@ -116,7 +145,29 @@ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
             hint.set(previous);
         }
     }
-    
+
+    @Override
+    public void replaceFieldMakeDirty(int fieldNumber, Object value) {
+        final Hint previous = hint.get();
+        try {
+            hint.set(Hint.REPLACE_FIELDS);
+            super.replaceField(fieldNumber, value);
+        } finally {
+            hint.set(previous);
+        }
+    }
+
+    @Override
+    public void replaceField(Persistable pc, int fieldNumber, Object value, boolean makeDirty) {
+        final Hint previous = hint.get();
+        try {
+            hint.set(Hint.REPLACE_FIELDS);
+            super.replaceField(pc, fieldNumber, value, makeDirty);
+        } finally {
+            hint.set(previous);
+        }
+    }
+
     @Override
     public void replaceFields(int[] fieldNumbers, FieldManager fm) {
         final Hint previous = hint.get();
@@ -139,6 +190,17 @@ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
         }
     }
 
+    @Override
+    public void replaceNonLoadedFields(int fieldNumbers[], FieldManager fm) {
+        final Hint previous = hint.get();
+        try {
+            hint.set(Hint.REPLACE_FIELDS);
+            super.replaceNonLoadedFields(fieldNumbers, fm);
+        } finally {
+            hint.set(previous);
+        }
+    }
+
     public void postCommit(org.datanucleus.Transaction tx) {
         final Hint previous = hint.get();
         try {

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/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 6577788..6345d54 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
@@ -21,7 +21,6 @@ package org.apache.isis.objectstore.jdo.datanucleus.persistence;
 import java.util.Date;
 
 import javax.jdo.listener.InstanceLifecycleEvent;
-import javax.jdo.spi.PersistenceCapable;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
index 5d4468b..dd6b7d6 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
@@ -75,7 +75,7 @@ public final class JdoObjectIdSerializer {
             }
         }
         if(jdoOid instanceof DatastoreId) {
-        	DatastoreId dnOid = (DatastoreId) jdoOid;
+            DatastoreId dnOid = (DatastoreId) jdoOid;
             Object keyValue = dnOid.getKeyAsObject();
             
             // prettier handling of these common cases

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index 1fff120..3f18c99 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@ -34,6 +34,7 @@ import javax.jdo.annotations.VersionStrategy;
 import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Ordering;
+import org.datanucleus.enhancer.Persistable;
 import org.joda.time.LocalDate;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.Identifier;
@@ -466,16 +467,16 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
 
     //region > version (derived property)
     public Long getVersionSequence() {
-        if(!(this instanceof javax.jdo.spi.PersistenceCapable)) {
+        if(!(this instanceof Persistable)) {
             return null;
-        } 
-        javax.jdo.spi.PersistenceCapable persistenceCapable = (javax.jdo.spi.PersistenceCapable) this;
+        }
+        Persistable persistenceCapable = (Persistable) this;
         final Long version = (Long) JDOHelper.getVersion(persistenceCapable);
         return version;
     }
     // hide property (imperatively, based on state of object)
     public boolean hideVersionSequence() {
-        return !(this instanceof javax.jdo.spi.PersistenceCapable);
+        return !(this instanceof Persistable);
     }
     //endregion
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5944ae2a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index c24b464..2a06194 100644
--- a/pom.xml
+++ b/pom.xml
@@ -107,6 +107,15 @@
                 <module>example/application/simpleapp</module>
             </modules>
         </profile>
+
+        <profile>
+            <id>core-simple</id>
+            <modules>
+                <module>core</module>
+                <module>example/application/simpleapp</module>
+                <module>example/archetype/simpleapp</module>
+            </modules>
+        </profile>
     </profiles>
 
 </project>