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 2014/10/02 18:02:38 UTC

git commit: ISIS-912: allow fixtures to be installed from command line even if using the simplericity jetty-console wrapper.

Repository: isis
Updated Branches:
  refs/heads/master 0d5d3eb43 -> a064fe362


ISIS-912: allow fixtures to be installed from command line even if using the simplericity jetty-console wrapper.


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

Branch: refs/heads/master
Commit: a064fe362dba9d652d654141c35fb56a0a57ed0d
Parents: 0d5d3eb
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Oct 2 16:46:32 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Oct 2 16:46:32 2014 +0100

----------------------------------------------------------------------
 .../wicket/viewer/IsisWicketApplication.java    | 12 ++-
 .../jdo/datanucleus/DataNucleusObjectStore.java | 56 ++++---------
 .../fixtures/FixturesInstallerDelegate.java     | 28 +------
 .../FixturesInstallerFromConfiguration.java     | 80 +++++++++++++++---
 .../isis/core/runtime/runner/IsisRunner.java    |  5 +-
 ...onHandlerFixtureFromEnvironmentVariable.java | 69 ++++++++++++++++
 .../OptionHandlerFixtureFromInitParameters.java | 86 ++++++++++++++++++++
 .../opts/OptionHandlerSystemProperties.java     | 77 ++++++++++++++++++
 .../ServicesInstallerFromConfiguration.java     |  5 ++
 .../core/webapp/IsisWebAppBootstrapper.java     | 21 +++--
 .../src/main/webapp/WEB-INF/isis.properties     |  6 +-
 .../src/main/webapp/WEB-INF/isis.properties     |  4 +-
 12 files changed, 351 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 9499efa..d87e9df 100644
--- a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -63,6 +63,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
 import org.apache.isis.core.runtime.runner.IsisInjectModule;
+import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureFromInitParameters;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.IsisSystem;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -387,11 +388,16 @@ public class IsisWicketApplication extends AuthenticatedWebApplication implement
 
     @SuppressWarnings("unchecked")
     private static void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder, final ServletContext servletContext) {
-        final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers = (List<IsisConfigurationBuilderPrimer>) servletContext.getAttribute(WebAppConstants.CONFIGURATION_PRIMERS_KEY);
-        if (isisConfigurationBuilderPrimers == null) {
-            return;
+        LOG.info("loading properties from option handlers");
+        final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers = Lists.newArrayList();
+        final List<IsisConfigurationBuilderPrimer> primers = (List<IsisConfigurationBuilderPrimer>) servletContext.getAttribute(WebAppConstants.CONFIGURATION_PRIMERS_KEY);
+        if(primers != null) {
+            isisConfigurationBuilderPrimers.addAll(primers);
         }
+        // also support loading from init parameters (specifically, to support simplericity's jetty-console)
+        isisConfigurationBuilderPrimers.add(new OptionHandlerFixtureFromInitParameters(servletContext));
         for (final IsisConfigurationBuilderPrimer isisConfigurationBuilderPrimer : isisConfigurationBuilderPrimers) {
+            LOG.info("priming configurations for " + isisConfigurationBuilderPrimer);
             isisConfigurationBuilderPrimer.primeConfigurationBuilder(isisConfigurationBuilder);
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/objectstore-jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
----------------------------------------------------------------------
diff --git a/core/objectstore-jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java b/core/objectstore-jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
index d0fd657..58496b6 100644
--- a/core/objectstore-jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
+++ b/core/objectstore-jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java
@@ -18,48 +18,33 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-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;
-
 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.apache.isis.core.runtime.persistence.ObjectNotFoundException;
-import org.apache.isis.core.runtime.persistence.PojoRefreshException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
-import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
+import org.apache.isis.core.metamodel.adapter.oid.*;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.persistence.PojoRefreshException;
 import org.apache.isis.core.runtime.persistence.UnsupportedFindException;
 import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
@@ -81,15 +66,14 @@ import org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchron
 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.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.queries.*;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.JdoObjectIdSerializer;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoNamedQuery;
 
+import static org.apache.isis.core.commons.ensure.Ensure.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+
 public class DataNucleusObjectStore implements ObjectStoreSpi {
 
     private static final Logger LOG = LoggerFactory.getLogger(DataNucleusObjectStore.class);
@@ -171,12 +155,12 @@ public class DataNucleusObjectStore implements ObjectStoreSpi {
      * {@inheritDoc}
      * <p>
      * Automatically {@link IsisTransactionManager#endTransaction() ends
-     * (commits)} the current (Isis) {@link Transaction}. This in turn
+     * (commits)} the current (Isis) {@link IsisTransaction}. This in turn
      * {@link DataNucleusObjectStore#commitJdoTransaction() commits the underlying
-     * JPA transaction}.
+     * JDO transaction}.
+     *
      * <p>
-     * The corresponding DataNucleus {@link Entity} is then
-     * {@link EntityManager#close() close}d.
+     * The corresponding DataNucleus entity is then closed.
      */
     public void close() {
         ensureOpened();
@@ -223,7 +207,9 @@ public class DataNucleusObjectStore implements ObjectStoreSpi {
      * the fly during bootstrapping if required.
      */
     public boolean isFixturesInstalled() {
-        return ! getConfiguration().getBoolean(INSTALL_FIXTURES_KEY, INSTALL_FIXTURES_DEFAULT);
+        final boolean installFixtures = getConfiguration().getBoolean(INSTALL_FIXTURES_KEY, INSTALL_FIXTURES_DEFAULT);
+        LOG.info("isFixturesInstalled: " + INSTALL_FIXTURES_KEY + " = " + installFixtures);
+        return !installFixtures;
     }
 
 
@@ -430,18 +416,6 @@ public class DataNucleusObjectStore implements ObjectStoreSpi {
 
 
 
-    /**
-     * Will do nothing if object is already resolved or if object is transient.
-     * <p>
-     * TODO:
-     * The final {@link ResolveState} of the adapter is set using
-     * {@link NakedLoadPostEventListener#onPostLoad(org.hibernate.event.PostLoadEvent)}
-     * Note: this is the same behaviour as MemoryObjectStore, XmlObjectStore
-     * and HibernateObjectStore.
-     * <p>
-     * REVIEW: if the initial state is RESOLVING_PART, then the
-     * {@link ResolveState} is not changed. Is this right?
-     */
     public void resolveImmediately(final ObjectAdapter adapter) {
         ensureOpened();
         ensureInTransaction();

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
index d208e26..4011b3e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
@@ -69,8 +69,6 @@ public class FixturesInstallerDelegate {
      */
     private LogonFixture logonFixture;
 
-    private boolean override;
-
     // /////////////////////////////////////////////////////////
     // Constructor
     // /////////////////////////////////////////////////////////
@@ -93,18 +91,6 @@ public class FixturesInstallerDelegate {
         this.persistenceSession = persistenceSession;
     }
     
-    /**
-     * Force the ability to install the fixtures (outside of initial bootstrapping).
-     * 
-     * 
-     * <p>
-     * Intended for programmatic reuse of installation of fixtures within the
-     * running application (eg for demo purposes).
-     */
-    public FixturesInstallerDelegate withOverride() {
-        this.override = true;
-        return this;
-    }
 
     // /////////////////////////////////////////////////////////
     // addFixture, getFixtures, clearFixtures
@@ -149,8 +135,9 @@ public class FixturesInstallerDelegate {
      * 
      * <p>
      * The set of fixtures (as per {@link #getFixtures()}) is <i>not</i> cleared
-     * after installation; this allows the {@link FixtureBuilderAbstract} to be
-     * reused across multiple tests.
+     * after installation; the intention being to allow the
+     * {@link org.apache.isis.core.runtime.fixtures.FixturesInstallerAbstract} to be
+     * reused across multiple tests (REVIEW: does that make sense?)
      */
     public final void installFixtures() {
         preInstallFixtures(getPersistenceSession());
@@ -235,12 +222,7 @@ public class FixturesInstallerDelegate {
     }
 
     private boolean shouldInstallFixture(final InstallableFixture installableFixture) {
-        if(override) {
-            return true;
-        }
-        
         final FixtureType fixtureType = installableFixture.getType();
-
         if (fixtureType == FixtureType.DOMAIN_OBJECTS) {
             return !IsisContext.getPersistenceSession().isFixturesInstalled();
         }
@@ -292,9 +274,7 @@ public class FixturesInstallerDelegate {
 
     /**
      * Returns either the {@link IsisContext#getPersistenceSession() singleton }
-     * persistor or the persistor
-     * {@link #AbstractFixtureBuilder(PersistenceSession) specified by the
-     * constructor} if specified.
+     * persistor or the persistor specified in the constructor.
      * 
      * <p>
      * Note: if a {@link PersistenceSession persistor} was specified via the

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerFromConfiguration.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerFromConfiguration.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerFromConfiguration.java
index 40b08ae..f6dc7f4 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerFromConfiguration.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerFromConfiguration.java
@@ -30,8 +30,14 @@ import org.apache.isis.core.runtime.fixtures.domainservice.ObjectLoaderFixture;
 public class FixturesInstallerFromConfiguration extends FixturesInstallerAbstract {
 
     private static final Logger LOG = LoggerFactory.getLogger(FixturesInstallerFromConfiguration.class);
-    private static final String NAKEDOBJECTS_FIXTURES = ConfigurationConstants.ROOT + "fixtures";
-    private static final String NAKEDOBJECTS_FIXTURES_PREFIX = ConfigurationConstants.ROOT + "fixtures.prefix";
+
+    private static final String FIXTURES = ConfigurationConstants.ROOT + "fixtures";
+    /**
+     * @deprecated - just adds to the cognotive load...
+     */
+    @Deprecated
+    private static final String FIXTURES_PREFIX = ConfigurationConstants.ROOT + "fixtures.prefix";
+
     private static final String EXPLORATION_OBJECTS = ConfigurationConstants.ROOT + "exploration-objects";
 
     public FixturesInstallerFromConfiguration() {
@@ -40,17 +46,13 @@ public class FixturesInstallerFromConfiguration extends FixturesInstallerAbstrac
 
     @Override
     protected void addFixturesTo(final FixturesInstallerDelegate delegate) {
-        String fixturePrefix = getConfiguration().getString(NAKEDOBJECTS_FIXTURES_PREFIX);
-        fixturePrefix = fixturePrefix == null ? "" : fixturePrefix.trim();
-        if (fixturePrefix.length() > 0 && !fixturePrefix.endsWith(ConfigurationConstants.DELIMITER)) {
-            fixturePrefix = fixturePrefix + ConfigurationConstants.DELIMITER;
-        }
+
+        final FixtureConfig fixtureConfig = getFixtureConfig();
 
         try {
-            final String[] fixtureList = getConfiguration().getList(NAKEDOBJECTS_FIXTURES);
             boolean fixtureLoaded = false;
-            for (final String element : fixtureList) {
-                final String fixtureFullyQualifiedName = fixturePrefix + element;
+            for (final String element : fixtureConfig.getFixtures()) {
+                final String fixtureFullyQualifiedName = fixtureConfig.getFixturePrefix() + element;
                 LOG.info("  adding fixture " + fixtureFullyQualifiedName);
                 final Object fixture = InstanceUtil.createInstance(fixtureFullyQualifiedName);
                 fixtureLoaded = true;
@@ -69,4 +71,62 @@ public class FixturesInstallerFromConfiguration extends FixturesInstallerAbstrac
         }
     }
 
+    private static class FixtureConfig {
+
+        //region > fixtures
+
+        private String[] fixtures;
+
+        String[] getFixtures() {
+            return fixtures;
+        }
+
+        void setFixtures(String[] fixtures) {
+            this.fixtures = fixtures;
+        }
+
+        void setFixtures(String fixturesStr) {
+            if(fixturesStr != null) {
+                setFixtures(new String[]{fixturesStr});
+            } else {
+                setFixtures(new String[]{});
+            }
+
+        }
+
+        @SuppressWarnings("unused")
+        boolean hasFixtures() {
+            return fixtures != null && fixtures.length != 0;
+        }
+        //endregion
+
+        //region > fixturePrefix
+
+        private String fixturePrefix;
+        String getFixturePrefix() {
+            return fixturePrefix;
+        }
+
+        void setFixturePrefix(String fixturePrefix) {
+            fixturePrefix = fixturePrefix == null ? "" : fixturePrefix.trim();
+            if (fixturePrefix.length() > 0 && !fixturePrefix.endsWith(ConfigurationConstants.DELIMITER)) {
+                fixturePrefix = fixturePrefix + ConfigurationConstants.DELIMITER;
+            }
+
+            this.fixturePrefix = fixturePrefix;
+        }
+        //endregion
+
+
+    }
+
+    private FixtureConfig getFixtureConfig() {
+        final FixtureConfig fixtureConfig = new FixtureConfig();
+
+        fixtureConfig.setFixtures(getConfiguration().getList(FIXTURES));
+        fixtureConfig.setFixturePrefix(getConfiguration().getString(FIXTURES_PREFIX));
+
+        return fixtureConfig;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisRunner.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisRunner.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisRunner.java
index e3ee3bf..2336d96 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisRunner.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisRunner.java
@@ -228,10 +228,9 @@ public class IsisRunner {
         addOptionHandler(optionHandlerDeploymentType);
         addOptionHandler(new OptionHandlerConfiguration());
 
-        OptionHandlerPersistor optionHandlerPersistor;
         OptionHandlerViewer optionHandlerViewer;
 
-        addOptionHandler(optionHandlerPersistor = new OptionHandlerPersistor(installerLookup));
+        addOptionHandler(new OptionHandlerPersistor(installerLookup));
         addOptionHandler(optionHandlerViewer = new OptionHandlerViewer(installerLookup));
 
         addOptionHandler(new OptionHandlerReflector(installerLookup));
@@ -240,6 +239,8 @@ public class IsisRunner {
         addOptionHandler(new OptionHandlerFixture());
         addOptionHandler(new OptionHandlerNoSplash());
         addOptionHandler(new OptionHandlerAdditionalProperty());
+        addOptionHandler(new OptionHandlerFixtureFromEnvironmentVariable());
+        addOptionHandler(new OptionHandlerSystemProperties());
 
         addOptionHandler(new OptionHandlerDebug());
         addOptionHandler(new OptionHandlerDiagnostics());

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromEnvironmentVariable.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromEnvironmentVariable.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromEnvironmentVariable.java
new file mode 100644
index 0000000..81c604a
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromEnvironmentVariable.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 org.apache.isis.core.runtime.runner.opts;
+
+import java.util.Map;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
+import org.apache.isis.core.runtime.optionhandler.BootPrinter;
+import org.apache.isis.core.runtime.optionhandler.OptionHandlerAbstract;
+
+public class OptionHandlerFixtureFromEnvironmentVariable extends OptionHandlerAbstract {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OptionHandlerFixtureFromEnvironmentVariable.class);
+
+    private String fixtureClassName;
+
+    @Override
+    @SuppressWarnings("static-access")
+    public void addOption(final Options options) {
+        // no-op
+    }
+
+    @Override
+    public boolean handle(final CommandLine commandLine, final BootPrinter bootPrinter, final Options options) {
+        Map<String, String> properties = System.getenv();
+        for (String key : properties.keySet()) {
+            if (key.equalsIgnoreCase("IsisFixture") || key.equalsIgnoreCase("IsisFixtures")) {
+                this.fixtureClassName = properties.get(key);
+                return true;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder) {
+        if(fixtureClassName == null) {
+            return;
+        }
+        prime(isisConfigurationBuilder, "isis.persistor.datanucleus.install-fixtures", "true");
+        prime(isisConfigurationBuilder, "isis.fixtures", fixtureClassName);
+    }
+
+    private static void prime(IsisConfigurationBuilder isisConfigurationBuilder, String key, String value) {
+        LOG.info("priming: " + key + "=" + value);
+        isisConfigurationBuilder.add(key, value);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromInitParameters.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromInitParameters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromInitParameters.java
new file mode 100644
index 0000000..46e8f25
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerFixtureFromInitParameters.java
@@ -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.
+ */
+
+package org.apache.isis.core.runtime.runner.opts;
+
+import java.util.Enumeration;
+import java.util.Map;
+import javax.servlet.ServletContext;
+import com.google.common.collect.Maps;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
+import org.apache.isis.core.runtime.optionhandler.BootPrinter;
+import org.apache.isis.core.runtime.optionhandler.OptionHandlerAbstract;
+
+public class OptionHandlerFixtureFromInitParameters extends OptionHandlerAbstract {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OptionHandlerFixtureFromInitParameters.class);
+    private final ServletContext servletContext;
+
+
+
+    public OptionHandlerFixtureFromInitParameters(ServletContext servletContext) {
+        this.servletContext = servletContext;
+    }
+
+    @Override
+    @SuppressWarnings("static-access")
+    public void addOption(final Options options) {
+        // no-op
+    }
+
+    @Override
+    public boolean handle(final CommandLine commandLine, final BootPrinter bootPrinter, final Options options) {
+        // no-op
+        return true;
+    }
+
+    @Override
+    public void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder) {
+        Map<String,String> additionalProperties = asMap(servletContext);
+        LOG.info("priming configuration builder: " + additionalProperties.size() + " properties to prime");
+        addConfigurationProperties(isisConfigurationBuilder, additionalProperties);
+    }
+
+    private static Map<String, String> asMap(ServletContext servletContext) {
+        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
+        final Map<String,String> map = Maps.newTreeMap();
+        while(initParameterNames.hasMoreElements()) {
+            final String initParameterName = initParameterNames.nextElement();
+            final String initParameterValue = servletContext.getInitParameter(initParameterName);
+            if (initParameterName.startsWith("isis.")) {
+                map.put(initParameterName, initParameterValue);
+            }
+        }
+        return map;
+    }
+
+    private static void addConfigurationProperties(final IsisConfigurationBuilder isisConfigurationBuilder, final Map<String, String> additionalProperties) {
+        for (final String propertyKey : additionalProperties.keySet()) {
+            final String propertyValue = additionalProperties.get(propertyKey);
+
+            LOG.info("priming: " + propertyKey + "=" + propertyValue);
+            isisConfigurationBuilder.add(propertyKey, propertyValue);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerSystemProperties.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerSystemProperties.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerSystemProperties.java
new file mode 100644
index 0000000..881bb72
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerSystemProperties.java
@@ -0,0 +1,77 @@
+/*
+ *  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.runtime.runner.opts;
+
+import java.util.Map;
+import java.util.Properties;
+import com.google.common.collect.Maps;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
+import org.apache.isis.core.runtime.optionhandler.BootPrinter;
+import org.apache.isis.core.runtime.optionhandler.OptionHandlerAbstract;
+
+public class OptionHandlerSystemProperties extends OptionHandlerAbstract {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OptionHandlerSystemProperties.class);
+
+    private Map<String,String> additionalProperties;
+
+    @Override
+    @SuppressWarnings("static-access")
+    public void addOption(final Options options) {
+        // no-op
+    }
+
+    @Override
+    public boolean handle(final CommandLine commandLine, final BootPrinter bootPrinter, final Options options) {
+        this.additionalProperties = asMap(System.getProperties());
+        return true;
+    }
+
+    private static Map<String, String> asMap(Properties properties) {
+        final Map<String,String> map = Maps.newTreeMap();
+        for (String key : properties.stringPropertyNames()) {
+            final String value = properties.getProperty(key);
+            if (key.startsWith("isis.")) {
+                map.put(key, value);
+            }
+        }
+        return map;
+    }
+
+    @Override
+    public void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder) {
+        LOG.info("priming configuration builder: " + additionalProperties.size() + " properties to prime");
+        addConfigurationProperties(isisConfigurationBuilder, additionalProperties);
+    }
+
+    private static void addConfigurationProperties(final IsisConfigurationBuilder isisConfigurationBuilder, final Map<String, String> additionalProperties) {
+        for (final String propertyKey : additionalProperties.keySet()) {
+            final String propertyValue = additionalProperties.get(propertyKey);
+
+            LOG.info("priming: " + propertyKey + "=" + propertyValue);
+            isisConfigurationBuilder.add(propertyKey, propertyValue);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java
index 06f530b..184cc68 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java
@@ -37,6 +37,11 @@ public class ServicesInstallerFromConfiguration extends InstallerAbstract implem
 
     private static final String SERVICES = "services";
     private static final String EXPLORATION_OBJECTS = "exploration-objects";
+
+    /**
+     * @deprecated - just adds to the cognotive load...
+     */
+    @Deprecated
     private static final String SERVICES_PREFIX = "services.prefix";
 
     private final static Pattern regex = Pattern.compile("((\\d+):)(.*)");

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
index 794e331..a28619d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
@@ -20,17 +20,14 @@
 package org.apache.isis.core.webapp;
 
 import java.util.List;
-
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
-
+import com.google.common.collect.Lists;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderPrimer;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderResourceStreams;
@@ -41,6 +38,7 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
 import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
 import org.apache.isis.core.runtime.runner.IsisInjectModule;
+import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureFromInitParameters;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.IsisSystem;
 import org.apache.isis.core.runtime.system.SystemConstants;
@@ -133,13 +131,15 @@ public class IsisWebAppBootstrapper implements ServletContextListener {
     }
 
     @SuppressWarnings("unchecked")
-    private void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder, final ServletContext servletContext) {
+    private static void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder, final ServletContext servletContext) {
         LOG.info("loading properties from option handlers");
-        final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers =
-                (List<IsisConfigurationBuilderPrimer>) servletContext.getAttribute(WebAppConstants.CONFIGURATION_PRIMERS_KEY);
-        if (isisConfigurationBuilderPrimers == null) {
-            return;
+        final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers = Lists.newArrayList();
+        final List<IsisConfigurationBuilderPrimer> primers = (List<IsisConfigurationBuilderPrimer>) servletContext.getAttribute(WebAppConstants.CONFIGURATION_PRIMERS_KEY);
+        if(primers != null) {
+            isisConfigurationBuilderPrimers.addAll(primers);
         }
+        // also support loading from init parameters (specifically, to support simplericity's jetty-console)
+        isisConfigurationBuilderPrimers.add(new OptionHandlerFixtureFromInitParameters(servletContext));
         for (final IsisConfigurationBuilderPrimer isisConfigurationBuilderPrimer : isisConfigurationBuilderPrimers) {
             LOG.debug("priming configurations for " + isisConfigurationBuilderPrimer);
             isisConfigurationBuilderPrimer.primeConfigurationBuilder(isisConfigurationBuilder);
@@ -153,8 +153,7 @@ public class IsisWebAppBootstrapper implements ServletContextListener {
      * {@value WebAppConstants#DEPLOYMENT_TYPE_KEY} and also
      * {@value SystemConstants#DEPLOYMENT_TYPE_KEY}.
      * <p>
-     * If no setting is found, defaults to
-     * {@value WebAppConstants#DEPLOYMENT_TYPE_DEFAULT}.
+     * If no setting is found, defaults to {@link WebAppConstants#DEPLOYMENT_TYPE_DEFAULT}.
      */
     private DeploymentType determineDeploymentType(final IsisConfigurationBuilder isisConfigurationBuilder, final ServletContext servletContext) {
         String deploymentTypeStr = null;

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/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 0cc949f..e49101a 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
@@ -145,13 +145,12 @@ isis.services.ServicesInstallerFromAnnotation.packagePrefix=dom.simple,\
                                                             fixture.simple,\
                                                             webapp.prototyping
 
-#isis.services.prefix = 
 isis.services = \
                 org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
                 \
                 # customizable exception handling, \
                 org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
-                \
+                #
 
 
 # Specify the (optional) test fixtures
@@ -160,8 +159,7 @@ isis.services = \
 # 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.prefix= 
-isis.fixtures=fixture.simple.SimpleObjectsFixture 
+isis.fixtures=fixture.simple.SimpleObjectsFixture
 
 
 #

http://git-wip-us.apache.org/repos/asf/isis/blob/a064fe36/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 6a48898..c6269a3 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
@@ -147,13 +147,12 @@ isis.services.ServicesInstallerFromAnnotation.packagePrefix=app,\
                                                             webapp.admin,\
                                                             webapp.prototyping
 
-#isis.services.prefix = 
 isis.services = \
                 org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions,\
                 \
                 # customizable exception handling, \
                 org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
-                \
+                #
 
 
 # Specify the (optional) test fixtures
@@ -162,7 +161,6 @@ isis.services = \
 # 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.prefix= 
 isis.fixtures=fixture.todo.scenarios.RecreateToDoItemsForSven