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 2017/02/14 15:12:53 UTC

[03/20] isis git commit: ISIS-1478: now honours @Property(editing=ENABLED), takes precedence over isis.properties config file (if configured as isis.objects.editing=false)

ISIS-1478: now honours @Property(editing=ENABLED), takes precedence over isis.properties config file (if configured as isis.objects.editing=false)

Also, refactored simpleapp so that the majority of isis.properties and persistor_datanucleus.properties are read in programmatically by the app manifest.


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

Branch: refs/heads/master
Commit: beed85aff4d087bce9e8b77b7db571ffa5b6b898
Parents: 5666e49
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun Feb 12 18:27:59 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun Feb 12 18:27:59 2017 +0000

----------------------------------------------------------------------
 .../facets/members/disabled/DisabledFacet.java  |   9 +
 .../members/disabled/DisabledFacetAbstract.java |  25 +-
 .../disabled/DisabledFacetAbstractImpl.java     |  10 +
 .../editing/EditingObjectsConfiguration.java    |   2 +-
 ...etOnPropertyDerivedFromImmutableFactory.java |   6 +
 .../DisabledFacetForPropertyAnnotation.java     |   4 +-
 ...tForPropertyAnnotationInvertedSemantics.java |  33 ++
 .../DomainObjectAnnotationFacetFactoryTest.java |  17 +-
 .../manifest/DomainAppAppManifest.java          |  73 +++-
 .../DomainAppAppManifestBypassSecurity.java     |  10 +-
 .../DomainAppAppManifestWithFixtures.java       |  23 +-
 ...ppAppManifestWithFixturesBypassSecurity.java |  10 +-
 .../application/manifest/isis.properties        | 362 +++++++++++++++++++
 .../modules/simple/dom/impl/SimpleObject.java   |   2 +-
 .../SimpleModuleIntegTestAbstract.java          |   2 +
 example/application/simpleapp/pom.xml           |   2 +-
 .../src/main/webapp/WEB-INF/isis.properties     | 266 +-------------
 .../main/webapp/WEB-INF/persistor.properties    |  15 -
 .../WEB-INF/persistor_datanucleus.properties    |  91 -----
 19 files changed, 537 insertions(+), 425 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
index be97e7f..d1f3988 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
@@ -20,6 +20,8 @@
 package org.apache.isis.core.metamodel.facets.members.disabled;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.WhenAndWhereValueFacet;
 import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
 
@@ -37,4 +39,11 @@ public interface DisabledFacet extends WhenAndWhereValueFacet, DisablingInteract
      * or <tt>null</tt> if enabled.
      */
     public String disabledReason(ObjectAdapter target);
+
+    /**
+     * Indicates that the implementation is overridding the usual semantics, in
+     * other words that the {@link FacetHolder} to which this {@link Facet} is
+     * attached is <i>not</i> mandatory.
+     */
+    public boolean isInvertedSemantics();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstract.java
index 3e8d980..3acba7c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstract.java
@@ -37,16 +37,32 @@ public abstract class DisabledFacetAbstract extends WhenAndWhereValueFacetAbstra
         return DisabledFacet.class;
     }
 
+    private final Semantics semantics;
+
+    public enum Semantics {
+        DISABLED,
+        ENABLED;
+    }
+
     public DisabledFacetAbstract(final When when, Where where, final FacetHolder holder) {
-        this(type(), when, where, holder);
+        this(when, where, holder, Semantics.DISABLED);
     }
 
-    private DisabledFacetAbstract(final Class<? extends Facet> type, final When when, Where where, final FacetHolder holder) {
+    public DisabledFacetAbstract(final When when, Where where, final FacetHolder holder, final Semantics semantics) {
+        this(type(), when, where, holder, semantics);
+    }
+
+    private DisabledFacetAbstract(final Class<? extends Facet> type, final When when, Where where, final FacetHolder holder, final Semantics semantics) {
         super(type, holder, when, where);
+        this.semantics = semantics;
     }
 
     @Override
     public String disables(final UsabilityContext<? extends UsabilityEvent> ic) {
+        if(isInvertedSemantics()) {
+            return null;
+        }
+
         if(ic instanceof ActionUsabilityContext && (getFacetHolder() instanceof OneToOneAssociationContributee || getFacetHolder() instanceof OneToManyAssociationContributee)) {
             // otherwise ends up vetoing the invocation of the contributing action
             return null;
@@ -63,4 +79,9 @@ public abstract class DisabledFacetAbstract extends WhenAndWhereValueFacetAbstra
         return null;
     }
 
+    @Override
+    public boolean isInvertedSemantics() {
+        return semantics == Semantics.ENABLED;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
index 45ae641..2d25ced 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
@@ -34,11 +34,20 @@ public abstract class DisabledFacetAbstractImpl extends DisabledFacetAbstract {
         this(when, where, null, holder);
     }
 
+    public DisabledFacetAbstractImpl(final When when, final Where where, final FacetHolder holder, final Semantics semantics) {
+        this(when, where, null, holder, semantics);
+    }
+
     public DisabledFacetAbstractImpl(final When when, final Where where, final String reason, final FacetHolder holder) {
         super(when, where, holder);
         this.reason = reason;
     }
 
+    public DisabledFacetAbstractImpl(final When when, final Where where, final String reason, final FacetHolder holder, final Semantics semantics) {
+        super(when, where, holder, semantics);
+        this.reason = reason;
+    }
+
     @Override
     public String disabledReason(final ObjectAdapter targetAdapter) {
         if (when() == When.ALWAYS) {
@@ -71,4 +80,5 @@ public abstract class DisabledFacetAbstractImpl extends DisabledFacetAbstract {
         return reason;
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/EditingObjectsConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/EditingObjectsConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/EditingObjectsConfiguration.java
index df98352..bd5fb23 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/EditingObjectsConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/EditingObjectsConfiguration.java
@@ -25,7 +25,7 @@ public enum EditingObjectsConfiguration {
     TRUE,
     FALSE;
 
-    private static final String EDIT_OBJECTS_KEY = "isis.objects.editing";
+    public static final String EDIT_OBJECTS_KEY = "isis.objects.editing";
 
     public static EditingObjectsConfiguration parse(final IsisConfiguration configuration) {
         final String configuredValue = configuration.getString(EDIT_OBJECTS_KEY);

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
index 346f048..88e53b3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
@@ -24,6 +24,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -44,6 +45,11 @@ public class DisabledFacetOnPropertyDerivedFromImmutableFactory extends FacetFac
         if (spec.containsDoOpFacet(ImmutableFacet.class)) {
             final ImmutableFacet immutableFacet = spec.getFacet(ImmutableFacet.class);
             final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
+            DisabledFacet facet = facetHolder.getFacet(DisabledFacet.class);
+            if(facet != null && facet.isInvertedSemantics()) {
+                // @Property(editing=ENABLED)
+                return;
+            }
             FacetUtil.addFacet(new DisabledFacetOnPropertyDerivedFromImmutable(immutableFacet, facetHolder));
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
index 3fda4be..8725cdc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotation.java
@@ -36,7 +36,6 @@ public class DisabledFacetForPropertyAnnotation extends DisabledFacetAbstractImp
         }
 
         final Editing editing = property.editing();
-        final String disabledReason = property.editingDisabledReason();
 
         switch (editing) {
             case AS_CONFIGURED:
@@ -48,9 +47,10 @@ public class DisabledFacetForPropertyAnnotation extends DisabledFacetAbstractImp
                 return null;
 
             case DISABLED:
+                final String disabledReason = property.editingDisabledReason();
                 return new DisabledFacetForPropertyAnnotation(disabledReason, holder);
             case ENABLED:
-                return null;
+                return new DisabledFacetForPropertyAnnotationInvertedSemantics(holder);
         }
         return null;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotationInvertedSemantics.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotationInvertedSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotationInvertedSemantics.java
new file mode 100644
index 0000000..257ee4e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/disabled/DisabledFacetForPropertyAnnotationInvertedSemantics.java
@@ -0,0 +1,33 @@
+/*
+ *  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 org.apache.isis.core.metamodel.facets.properties.property.disabled;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstractImpl;
+
+public class DisabledFacetForPropertyAnnotationInvertedSemantics extends DisabledFacetAbstractImpl {
+
+    DisabledFacetForPropertyAnnotationInvertedSemantics(final FacetHolder holder) {
+        super(When.ALWAYS, Where.EVERYWHERE, null, holder, Semantics.ENABLED);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 2e7e42f..505989f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -46,6 +46,7 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.Audita
 import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.AuditableFacetFromConfiguration;
 import org.apache.isis.core.metamodel.facets.object.domainobject.autocomplete.AutoCompleteFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.choices.ChoicesFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.editing.EditingObjectsConfiguration;
 import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetFromConfiguration;
 import org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid.ObjectSpecIdFacetForDomainObjectAnnotation;
@@ -699,7 +700,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void configured_value_set_to_true() {
-                allowingConfigurationToReturn("isis.objects.editing", "true");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "true");
 
                 facetFactory.process(new ProcessClassContext(Customer.class, null, mockMethodRemover, facetHolder));
 
@@ -711,7 +712,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void configured_value_set_to_false() {
-                allowingConfigurationToReturn("isis.objects.editing", "false");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "false");
 
                 facetFactory.process(new ProcessClassContext(Customer.class, null, mockMethodRemover, facetHolder));
 
@@ -724,7 +725,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void configured_value_set_to_not_recognized() {
-                allowingConfigurationToReturn("isis.objects.editing", "foobar");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "foobar");
 
                 facetFactory.process(new ProcessClassContext(Customer.class, null, mockMethodRemover, facetHolder));
 
@@ -773,7 +774,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void configured_value_set_to_true() {
-                allowingConfigurationToReturn("isis.objects.editing", "true");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "true");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, null, mockMethodRemover, facetHolder));
 
@@ -785,7 +786,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void configured_value_set_to_false() {
-                allowingConfigurationToReturn("isis.objects.editing", "false");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "false");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, null, mockMethodRemover, facetHolder));
 
@@ -798,7 +799,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void configured_value_set_to_not_recognized() {
-                allowingConfigurationToReturn("isis.objects.editing", "foobar");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "foobar");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, null, mockMethodRemover, facetHolder));
 
@@ -813,7 +814,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingConfigurationToReturn("isis.objects.editing", "false");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "false");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToEnabled.class, null, mockMethodRemover, facetHolder));
 
@@ -829,7 +830,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingConfigurationToReturn("isis.objects.editing", "true");
+                allowingConfigurationToReturn(EditingObjectsConfiguration.EDIT_OBJECTS_KEY, "true");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToDisabled.class, null, mockMethodRemover, facetHolder));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java
index bdd4d0f..973991e 100644
--- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java
+++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java
@@ -18,10 +18,16 @@
  */
 package domainapp.application.manifest;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collections;
 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.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
@@ -35,16 +41,44 @@ import domainapp.modules.simple.dom.SimpleModuleDomSubmodule;
  */
 public class DomainAppAppManifest implements AppManifest {
 
+    private final List<Class<? extends FixtureScript>> fixtureScripts;
+    private final String authMechanism;
+    private final List<Class<?>> additionalModules;
+
+    public DomainAppAppManifest() {
+        this(
+                Collections.<Class<? extends FixtureScript>>emptyList(),
+                null,
+                Collections.<Class<?>>emptyList()
+        );
+    }
+
+    public DomainAppAppManifest(
+            final List<Class<? extends FixtureScript>> fixtureScripts,
+            final String authMechanism,
+            final List<Class<?>> additionalModules) {
+        this.fixtureScripts = elseEmptyIfNull(fixtureScripts);
+        this.authMechanism = authMechanism != null ? authMechanism : "shiro";
+        this.additionalModules = elseEmptyIfNull(additionalModules);
+    }
+
+    private static <T> List<T> elseEmptyIfNull(final List<T> list) {
+        return list == null ? Collections.<T>emptyList() : list;
+    }
+
     /**
      * Load all services and entities found in (the packages and subpackages within) these modules
      */
     @Override
     public List<Class<?>> getModules() {
-        return Arrays.asList(
+        List<Class<?>> modules = Lists.newArrayList();
+        modules.addAll(Arrays.asList(
                 SimpleModuleDomSubmodule.class,
                 DomainAppApplicationModuleFixtureSubmodule.class,
                 DomainAppApplicationModuleServicesSubmodule.class
-        );
+        ));
+        modules.addAll(additionalModules);
+        return modules;
     }
 
     /**
@@ -60,7 +94,7 @@ public class DomainAppAppManifest implements AppManifest {
      */
     @Override
     public String getAuthenticationMechanism() {
-        return "shiro";
+        return authMechanism;
     }
 
     /**
@@ -68,7 +102,7 @@ public class DomainAppAppManifest implements AppManifest {
      */
     @Override
     public String getAuthorizationMechanism() {
-        return "shiro";
+        return authMechanism;
     }
 
     /**
@@ -76,7 +110,7 @@ public class DomainAppAppManifest implements AppManifest {
      */
     @Override
     public List<Class<? extends FixtureScript>> getFixtures() {
-        return Collections.emptyList();
+        return fixtureScripts;
     }
 
     /**
@@ -84,7 +118,34 @@ public class DomainAppAppManifest implements AppManifest {
      */
     @Override
     public Map<String, String> getConfigurationProperties() {
-        return null;
+        final Map<String, String> props = Maps.newHashMap();
+
+        loadPropsInto(props, "isis.properties");
+
+        if(!fixtureScripts.isEmpty()) {
+            props.put("isis.persistor.datanucleus.install-fixtures", "true");
+        }
+
+        return props;
+    }
+
+    static void loadPropsInto(final Map<String, String> props, final String propertiesFile) {
+        final Properties properties = new Properties();
+        try {
+            try (final InputStream stream =
+                    DomainAppAppManifest.class.getResourceAsStream(propertiesFile)) {
+                properties.load(stream);
+                for (Object key : properties.keySet()) {
+                    final Object value = properties.get(key);
+                    if(key instanceof String && value instanceof String) {
+                        props.put((String)key, (String)value);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(
+                    String.format("Failed to load '%s' file ", propertiesFile), e);
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestBypassSecurity.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestBypassSecurity.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestBypassSecurity.java
index fda6c19..cc96674 100644
--- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestBypassSecurity.java
+++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestBypassSecurity.java
@@ -23,13 +23,7 @@ package domainapp.application.manifest;
  */
 public class DomainAppAppManifestBypassSecurity extends DomainAppAppManifest {
 
-    @Override
-    public String getAuthenticationMechanism() {
-        return "bypass";
-    }
-
-    @Override
-    public String getAuthorizationMechanism() {
-        return "bypass";
+    public DomainAppAppManifestBypassSecurity() {
+        super(null, "bypass", null);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
index 0998455..79d0ce1 100644
--- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
+++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
@@ -18,14 +18,9 @@
  */
 package domainapp.application.manifest;
 
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.apache.isis.applib.fixturescripts.FixtureScript;
 
 import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects;
 
@@ -34,22 +29,12 @@ import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects;
  */
 public class DomainAppAppManifestWithFixtures extends DomainAppAppManifest {
 
-    /**
-     * Fixtures to be installed.
-     */
-    @Override
-    public List<Class<? extends FixtureScript>> getFixtures() {
-        return (List)Lists.newArrayList(CreateSimpleObjects.class);
+    public DomainAppAppManifestWithFixtures() {
+        this(null);
     }
 
-    /**
-     * Force fixtures to be loaded.
-     */
-    @Override
-    public Map<String, String> getConfigurationProperties() {
-        HashMap<String,String> props = Maps.newHashMap();
-        props.put("isis.persistor.datanucleus.install-fixtures","true");
-        return props;
+    public DomainAppAppManifestWithFixtures(final String authMechanism) {
+        super((List)Lists.newArrayList(CreateSimpleObjects.class), authMechanism, null);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixturesBypassSecurity.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixturesBypassSecurity.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixturesBypassSecurity.java
index 6c736b8..5390109 100644
--- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixturesBypassSecurity.java
+++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixturesBypassSecurity.java
@@ -23,13 +23,7 @@ package domainapp.application.manifest;
  */
 public class DomainAppAppManifestWithFixturesBypassSecurity extends DomainAppAppManifestWithFixtures {
 
-    @Override
-    public String getAuthenticationMechanism() {
-        return "bypass";
-    }
-
-    @Override
-    public String getAuthorizationMechanism() {
-        return "bypass";
+    public DomainAppAppManifestWithFixturesBypassSecurity() {
+        super("bypass");
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties b/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
new file mode 100644
index 0000000..9546cdb
--- /dev/null
+++ b/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
@@ -0,0 +1,362 @@
+#  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.
+
+
+
+
+#################################################################################
+#
+# 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
+
+
+#
+# Whether to ignore or honour (at least some of the) deprecated annotations/method prefixes.
+# If not specified, default is to honour
+#
+#isis.reflector.facets.ignoreDeprecated=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-danger
+
+
+#
+# whether to suppress posting of events if not specified (left as Xxx.Default); defaults to true
+#
+
+#isis.reflector.facet.actionAnnotation.domainEvent.postForDefault=false
+#isis.reflector.facet.collectionAnnotation.domainEvent.postForDefault=false
+#isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault=false
+
+#isis.reflector.facet.domainObjectLayoutAnnotation.cssClassUiEvent.postForDefault=false
+#isis.reflector.facet.domainObjectLayoutAnnotation.iconUiEvent.postForDefault=false
+#isis.reflector.facet.domainObjectLayoutAnnotation.titleUiEvent.postForDefault=false
+
+isis.reflector.facet.domainObjectAnnotation.createdLifecycleEvent.postForDefault=false
+isis.reflector.facet.domainObjectAnnotation.persistingLifecycleEvent.postForDefault=false
+isis.reflector.facet.domainObjectAnnotation.persistedLifecycleEvent.postForDefault=false
+isis.reflector.facet.domainObjectAnnotation.loadedLifecycleEvent.postForDefault=false
+isis.reflector.facet.domainObjectAnnotation.updatingLifecycleEvent.postForDefault=false
+isis.reflector.facet.domainObjectAnnotation.updatedLifecycleEvent.postForDefault=false
+isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefault=false
+
+#################################################################################
+#
+# Domain Service configuration
+#
+#################################################################################
+
+#
+# required by EmailServiceDefault
+#
+#isis.service.email.sender.address=some.valid@email.address
+#isis.service.email.sender.password=the.password.for-isis.service.email.sender.address
+
+
+#
+# whether ExceptionRecognizers should also log any recognized exceptions
+# (default false; enable for diagnostics/debugging)
+#
+#isis.services.exceprecog.logRecognizedExceptions=true
+
+
+#
+# disable to (automatically registered) ExceptionRecognizerCompositeForJdoObjectStore service
+# almost all of this service should be registered.  Since all exception recognizer implementations
+# are consulted in the event of an exception, it's not sufficient to override the implementation
+# (in isis.services); instead this configuration property disables this particular implementation.
+#
+#isis.services.ExceptionRecognizerCompositeForJdoObjectStore.disable=true
+
+
+################################################################################
+#
+# Auditing, Commands, Publishing
+#
+################################################################################
+
+#
+# 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 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|ignoreSafe
+
+
+#
+# Whether all (or all non-query only) action invocations 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|ignoreSafe
+
+
+#
+# Whether all property edits sshould be published; if not set, defaults to "none"
+# - if not set or set to "none", can explicitly enable using @Property(publishing=Publishing.ENABLED)
+# - if set to "all", can explicitly disable using @Property(publishing=Publishing.DISABLED)
+#
+#isis.services.publish.properties=all|none
+
+
+
+#
+# Whether the ApplicationFeatureRepository should eagerly initialize itself (increasing start-up times)
+# or initialize itself lazily.  Default is lazy initialization.
+#
+#isis.services.applicationFeatures.init=lazy|eager
+
+
+#
+# Whether the framework supports inject...() and set...() styles of dependency injection.   By default the former
+# is disabled, the latter is enabled.  Disabling these settings can reduce application start-up times.
+#
+#isis.services.injector.injectPrefix=false|true
+#isis.services.injector.setPrefix=false|true
+isis.services.injector.setPrefix=false
+
+
+
+
+################################################################################
+#
+# 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=false
+
+
+
+################################################################################
+#
+# i18n
+#
+#################################################################################
+
+#
+# force read translations, even if running in prototype mode
+#
+#isis.services.translation.po.mode=read
+
+
+
+################################################################################
+#
+# 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
+
+
+#################################################################################
+#
+# 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
+
+
+
+
+#################################################################################
+#
+# Persistor
+#
+#################################################################################
+
+
+
+# generally speaking this should not be enabled
+isis.persistor.disableConcurrencyChecking=false
+
+
+#
+# hook to perform additional initialization when JDO class metadata is loaded
+# default implementation will attempt to run 'create schema' for the specified schema.
+#
+# this implementation is installed by default:
+#isis.persistor.datanucleus.classMetadataLoadedListener=org.apache.isis.objectstore.jdo.datanucleus.CreateSchemaObjectFromClassMetadata
+
+
+# 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
+#
+#

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
index 52e9fe9..22f099f 100644
--- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
+++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
@@ -67,7 +67,7 @@ public class SimpleObject implements Comparable<SimpleObject> {
     }
 
     @javax.jdo.annotations.Column(allowsNull = "false", length = 40)
-    @Property(editing = Editing.DISABLED)
+    @Property() // editing disabled by default, see isis.properties
     @Getter @Setter
     @Title(prepend = "Object: ")
     private String name;

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
index c13db47..ebd601d 100644
--- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
+++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
@@ -53,6 +53,8 @@ public abstract class SimpleModuleIntegTestAbstract extends IntegrationTestAbstr
                             Util.withJavaxJdoRunInMemoryProperties(map);
                             Util.withDataNucleusProperties(map);
                             Util.withIsisIntegTestProperties(map);
+                            // same as in isis.properties
+                            map.put("isis.objects.editing","false");
                             return map;
                         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/pom.xml b/example/application/simpleapp/pom.xml
index d9f5b76..0da4e9e 100644
--- a/example/application/simpleapp/pom.xml
+++ b/example/application/simpleapp/pom.xml
@@ -34,7 +34,7 @@
     </prerequisites>
 
     <properties>
-        <isis.version>1.13.2</isis.version>
+        <isis.version>1.14.0-SNAPSHOT</isis.version>
 
         <lombok.version>1.16.10</lombok.version>
         <assertj-core.version>3.6.1</assertj-core.version>

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/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 ffc07cc..5f1b54f 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
@@ -16,19 +16,12 @@
 #  under the License.
 
 
-#################################################################################
-#
-# use GlobSpec to specify modules, system components and fixtures
-#
-#################################################################################
+
 
 #
 # Specify the modules (= entities + services) and other components that make up
 # this application.
 #
-# alternatively, can provide the AppManifest programmatically by overriding
-# IsisWicketApplication#newIsisWicketModule()
-#
 
 isis.appManifest=domainapp.application.manifest.DomainAppAppManifest
 #isis.appManifest=domainapp.application.manifest.DomainAppAppManifestBypassSecurity
@@ -36,261 +29,8 @@ isis.appManifest=domainapp.application.manifest.DomainAppAppManifest
 
 
 
-#################################################################################
-#
-# 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
-
-
-#
-# Whether to ignore or honour (at least some of the) deprecated annotations/method prefixes.
-# If not specified, default is to honour
-#
-#isis.reflector.facets.ignoreDeprecated=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-danger
-
-
-#
-# whether to suppress posting of events if not specified (left as Xxx.Default); defaults to true
-#
-
-#isis.reflector.facet.actionAnnotation.domainEvent.postForDefault=false
-#isis.reflector.facet.collectionAnnotation.domainEvent.postForDefault=false
-#isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault=false
-
-#isis.reflector.facet.domainObjectLayoutAnnotation.cssClassUiEvent.postForDefault=false
-#isis.reflector.facet.domainObjectLayoutAnnotation.iconUiEvent.postForDefault=false
-#isis.reflector.facet.domainObjectLayoutAnnotation.titleUiEvent.postForDefault=false
-
-isis.reflector.facet.domainObjectAnnotation.createdLifecycleEvent.postForDefault=false
-isis.reflector.facet.domainObjectAnnotation.persistingLifecycleEvent.postForDefault=false
-isis.reflector.facet.domainObjectAnnotation.persistedLifecycleEvent.postForDefault=false
-isis.reflector.facet.domainObjectAnnotation.loadedLifecycleEvent.postForDefault=false
-isis.reflector.facet.domainObjectAnnotation.updatingLifecycleEvent.postForDefault=false
-isis.reflector.facet.domainObjectAnnotation.updatedLifecycleEvent.postForDefault=false
-isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefault=false
-
-#################################################################################
 #
-# Domain Service configuration
+# Remaining properties are loaded programmatically by the AppManifest
+# (they are unlikely to vary between dev/test/prod so can be "baked in")
 #
-#################################################################################
-
-#
-# required by EmailServiceDefault
-#
-#isis.service.email.sender.address=some.valid@email.address
-#isis.service.email.sender.password=the.password.for-isis.service.email.sender.address
-
-
-#
-# whether ExceptionRecognizers should also log any recognized exceptions
-# (default false; enable for diagnostics/debugging)
-#
-#isis.services.exceprecog.logRecognizedExceptions=true
-
-
-#
-# disable to (automatically registered) ExceptionRecognizerCompositeForJdoObjectStore service
-# almost all of this service should be registered.  Since all exception recognizer implementations
-# are consulted in the event of an exception, it's not sufficient to override the implementation
-# (in isis.services); instead this configuration property disables this particular implementation.
-#
-#isis.services.ExceptionRecognizerCompositeForJdoObjectStore.disable=true
-
-
-################################################################################
-#
-# Auditing, Commands, Publishing
-#
-################################################################################
-
-#
-# 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 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|ignoreSafe
-
-
-#
-# Whether all (or all non-query only) action invocations 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|ignoreSafe
-
-
-#
-# Whether all property edits sshould be published; if not set, defaults to "none"
-# - if not set or set to "none", can explicitly enable using @Property(publishing=Publishing.ENABLED)
-# - if set to "all", can explicitly disable using @Property(publishing=Publishing.DISABLED)
-#
-#isis.services.publish.properties=all|none
-
-
-
-#
-# Whether the ApplicationFeatureRepository should eagerly initialize itself (increasing start-up times)
-# or initialize itself lazily.  Default is lazy initialization.
-#
-#isis.services.applicationFeatures.init=lazy|eager
-
-
-#
-# Whether the framework supports inject...() and set...() styles of dependency injection.   By default the former
-# is disabled, the latter is enabled.  Disabling these settings can reduce application start-up times.
-#
-#isis.services.injector.injectPrefix=false|true
-#isis.services.injector.setPrefix=false|true
-isis.services.injector.setPrefix=false
-
-
-
-
-################################################################################
-#
-# 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
-
-
-
-################################################################################
-#
-# i18n
-#
-#################################################################################
-
-#
-# force read translations, even if running in prototype mode
-#
-#isis.services.translation.po.mode=read
-
-
-
-################################################################################
-#
-# 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
-
-
-#################################################################################
-#
-# 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
-
-
 

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor.properties
index c73af73..763f17e 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor.properties
@@ -19,27 +19,12 @@
 
 #################################################################################
 #
-# 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)
 #
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/beed85af/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
deleted file mode 100644
index 366ba82..0000000
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties
+++ /dev/null
@@ -1,91 +0,0 @@
-#  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
-#
-
-
-#
-# hook to perform additional initialization when JDO class metadata is loaded
-# default implementation will attempt to run 'create schema' for the specified schema.
-#
-# this implementation is installed by default:
-#isis.persistor.datanucleus.classMetadataLoadedListener=org.apache.isis.objectstore.jdo.datanucleus.CreateSchemaObjectFromClassMetadata
-
-
-# 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
-#
-#