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 2016/05/20 13:33:45 UTC

[10/51] [abbrv] isis git commit: ISIS-1406: lots more refactoring around IsisConfiguration and IsisConfigurationBuilder.

ISIS-1406: lots more refactoring around IsisConfiguration and IsisConfigurationBuilder.

specifically:
- simplified IsisConfigurationBuilder, now a single class (rather than an interface with 4 different impls, only 2 of which were used).
- removed IsisRunner, so that the command line options are now a responsibility of the IsisConfigurationBuilder
- IsisConfigurationBuilder is passed from o.a.i.WebServer to IsisWicketApplication (not just the "primers"
- removed OptionValidator, wasn't being used
- FacetFactoryAbstract responsible for providing IsisConfiguration to all subclass impls
- InstallerLookup simplified, no longer responsible for appending to the IsisConfigurationBuilder
- InstallerAbstract impls now all have the IsisConfiguration injected into them (constructor injection).
- removed duplication between IsisWebAppBootstrapper and IsisWicketApplication

As of this commit the app runs, but the fixtures are not being automatically installed.


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

Branch: refs/heads/master
Commit: 7456588834a18ff4b47e59af93e1ccaa29912457
Parents: dcaab8e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 19 13:53:08 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 19 13:53:08 2016 +0100

----------------------------------------------------------------------
 .../integtestsupport/IsisSystemForTest.java     |   2 +-
 .../isis/core/commons/components/Installer.java |  34 --
 .../commons/components/InstallerAbstract.java   | 117 ++++++
 .../core/commons/config/InstallerAbstract.java  | 176 ---------
 .../core/commons/config/IsisConfiguration.java  |   3 +-
 .../config/IsisConfigurationBuilder.java        |  73 ----
 .../config/IsisConfigurationBuilderAware.java   |  25 --
 .../config/IsisConfigurationBuilderDefault.java |  76 ----
 .../IsisConfigurationBuilderFileSystem.java     |  57 ---
 .../config/IsisConfigurationBuilderPrimer.java  |  26 --
 ...IsisConfigurationBuilderResourceStreams.java | 289 ---------------
 .../config/IsisConfigurationDefault.java        |   4 -
 .../isis/core/commons/config/JmxBeanServer.java |  73 ----
 .../core/commons/config/PropertiesReader.java   |  54 ---
 .../isis/core/commons/config/package-info.java  |   2 +-
 .../ConfigurationResourceAndPolicy.java         |  46 +++
 .../configbuilder/IsisConfigurationBuilder.java | 371 +++++++++++++++++++
 .../commons/configbuilder/PropertiesReader.java |  54 +++
 .../isis/core/commons/factory/InstanceUtil.java |  69 +++-
 .../isis/core/commons/jmx/JmxBeanServer.java    |  67 ++++
 ...sourceStreamSourceChainOfResponsibility.java |   3 +
 .../metamodel/facets/FacetFactoryAbstract.java  |  11 +-
 ...llectionIdentifyingFacetFactoryAbstract.java |  14 -
 .../action/ActionAnnotationFacetFactory.java    |  20 +-
 .../paged/PagedFacetOnActionFactory.java        |  10 +-
 .../CollectionAnnotationFacetFactory.java       |   7 +-
 .../paged/PagedFacetOnCollectionFactory.java    |  10 +-
 .../facets/fallback/FallbackFacetFactory.java   |  16 -
 ...FacetOnActionFromConfiguredRegexFactory.java |  18 +-
 .../annotprop/CssClassFacetOnMemberFactory.java |   7 +-
 .../CssClassFaFacetOnMemberFactory.java         |   8 +-
 .../ViewModelSemanticCheckingFacetFactory.java  |  14 +-
 ...FacetAnnotationElseConfigurationFactory.java |  26 +-
 .../DomainObjectAnnotationFacetFactory.java     |  26 +-
 .../DomainObjectLayoutFacetFactory.java         |  19 +-
 ...FacetAnnotationElseConfigurationFactory.java |  20 +-
 ...FacetAnnotationElseConfigurationFactory.java |  25 +-
 ...ueFacetAnnotationOrConfigurationFactory.java |  24 +-
 ...ValueFacetUsingSemanticsProviderFactory.java |  14 -
 .../PropertyAnnotationFacetFactory.java         |   8 +-
 .../ConfigurationServiceInternal.java           |   2 -
 .../facetprocessor/FacetProcessor.java          |   1 -
 ...icationManagerStandardInstallerAbstract.java |  14 +-
 ...izationManagerStandardInstallerAbstract.java |  20 +-
 .../runtime/optionhandler/OptionHandler.java    |  11 +-
 .../runtime/runner/opts/OptionValidator.java    |  28 ++
 .../IsisConfigurationBuilderForWebapp.java      |  44 ---
 .../progmodels/dflt/JavaReflectorInstaller.java |   5 +
 .../JavaReflectorInstallerNoDecorators.java     |  47 ++-
 .../ConfigurationBuilderFileSystemTest.java     |  76 ----
 ...ourceStreamsConfigResourceAndPolicyTest.java |  47 ---
 .../ConfigurationBuilderTwoDirectoriesTest.java |  37 --
 ...ourceStreamsConfigResourceAndPolicyTest.java |  49 +++
 .../ObjectReflectorDefaultTestAbstract.java     |   3 -
 ...StandardInstallerAbstractForDfltRuntime.java |   7 +-
 .../fixtures/FixturesInstallerAbstract.java     |   7 +-
 .../FixturesInstallerFromConfiguration.java     |   9 +-
 .../runtime/fixtures/FixturesInstallerNoop.java |  44 ---
 .../installerregistry/InstallerLookup.java      |   8 +-
 .../PersistenceMechanismInstaller.java          |   5 +-
 .../core/runtime/runner/IsisBootstrapper.java   |  29 --
 .../isis/core/runtime/runner/IsisRunner.java    | 276 --------------
 .../opts/OptionHandlerAdditionalProperty.java   |   4 +-
 .../runner/opts/OptionHandlerAppManifest.java   |   6 +-
 .../runner/opts/OptionHandlerConfiguration.java |   4 +-
 .../runtime/runner/opts/OptionHandlerDebug.java |   4 +-
 .../opts/OptionHandlerDeploymentType.java       |  10 +-
 .../runner/opts/OptionHandlerDiagnostics.java   |   4 +-
 .../opts/OptionHandlerFixtureAbstract.java      |   4 +-
 ...onHandlerFixtureFromEnvironmentVariable.java |   4 +-
 .../runtime/runner/opts/OptionHandlerHelp.java  |   4 +-
 .../opts/OptionHandlerInitParameters.java       |   4 +-
 .../runner/opts/OptionHandlerNoSplash.java      |   4 +-
 .../runner/opts/OptionHandlerPassword.java      |   4 +-
 .../runtime/runner/opts/OptionHandlerQuiet.java |   4 +-
 .../runner/opts/OptionHandlerReflector.java     |   4 +-
 .../opts/OptionHandlerSystemProperties.java     |   4 +-
 .../runtime/runner/opts/OptionHandlerUser.java  |   4 +-
 .../runner/opts/OptionHandlerVerbose.java       |   4 +-
 .../runner/opts/OptionHandlerVersion.java       |   4 +-
 .../runtime/runner/opts/OptionValidator.java    |  28 --
 .../OptionValidatorUserAndPasswordCombo.java    |  48 ---
 .../runtime/services/ServicesInstaller.java     |   4 +-
 .../services/ServicesInstallerAbstract.java     |  10 +-
 .../ServicesInstallerFromAnnotation.java        |  67 +++-
 .../ServicesInstallerFromConfiguration.java     |  16 +-
 ...InstallerFromConfigurationAndAnnotation.java |  33 +-
 .../core/runtime/system/IsisSystemFactory.java  |   3 -
 .../system/persistence/PersistenceSession.java  |  28 +-
 .../IsisComponentProviderDefault2.java          |  26 +-
 .../IsisComponentProviderUsingInstallers.java   |   4 +-
 .../core/webapp/IsisWebAppBootstrapper.java     | 142 +++----
 .../isis/core/webapp/WebAppConstants.java       |  13 +-
 ...ataNucleusPersistenceMechanismInstaller.java |  24 +-
 .../ShiroAuthenticationManagerInstaller.java    |  17 +-
 .../ShiroAuthorizationManagerInstaller.java     |  10 +-
 .../BypassAuthenticationManagerInstaller.java   |  10 +-
 .../BypassAuthorizationManagerInstaller.java    |   8 +-
 .../wicket/viewer/IsisWicketApplication.java    |  80 +---
 .../wicket/viewer/IsisWicket_providers.java     |   2 +-
 .../apache/isis/core/webserver/WebServer.java   | 180 ++++++---
 .../core/webserver/WebServerBootstrapper.java   | 125 -------
 .../internal/OptionHandlerAddress.java          |   4 +-
 .../webserver/internal/OptionHandlerPort.java   |   4 +-
 .../internal/OptionHandlerResourceBase.java     |   4 +-
 .../internal/OptionHandlerStartupMode.java      |   4 +-
 106 files changed, 1326 insertions(+), 2335 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index 475420e..82bf0d5 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -240,7 +240,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
                     Joiner.on(",").join(packagePrefixes)
             );
 
-            final ServicesInstaller installer = new ServicesInstallerFromConfigurationAndAnnotation();
+            final ServicesInstaller installer = new ServicesInstallerFromConfigurationAndAnnotation(configuration);
 
             //installer.setConfiguration(configuration);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Installer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Installer.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Installer.java
index b756b19..48badad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Installer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Installer.java
@@ -49,47 +49,13 @@ public interface Installer extends ApplicationScopedComponent {
      * Because all implementations of a given subinterface of {@link Installer}
      * should return the same value for this method, by convention these
      * subinterfaces define a constant which the implementation can just return.
-     * 
-     * <p>
-     * Used, with {@link #getName()}, to determine the config files and config
-     * keys for this installer.
-     * 
-     * @see #getConfigurationResources()
      */
     String getType();
 
     /**
      * The name (qualified by type).
-     * 
-     * <p>
-     * Used, with {@link #getType()}, to determine the config files and config
-     * keys for this installer.
-     * 
-     * @see #getConfigurationResources()
      */
     String getName();
 
-    /**
-     * The configuration resources (files) to merge in configuration properties.
-     * 
-     * <p>
-     * For example, would return list of [<tt>persistor.properties</tt>, and
-     * <tt>persistor_in-memory.properties</tt>] for the in-memory object store.
-     * 
-     * <p>
-     * The implementation should look under keys prefixed either
-     * <tt>isis.persistor</tt> or <tt>isis.persistor.in-memory</tt>.
-     * 
-     * <p>
-     * Note that we use an '_' underscore to join the {@link #getType() type}
-     * and {@link #getName() name} in the filenames, but a '.' (period) for the
-     * keys.
-     */
-    List<String> getConfigurationResources();
-
-    /**
-     * The (classes of) the types that this installer makes available in the
-     * {@link #getModule() module}.
-     */
     List<Class<?>> getTypes();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/components/InstallerAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/InstallerAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/InstallerAbstract.java
new file mode 100644
index 0000000..a9238ab
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/InstallerAbstract.java
@@ -0,0 +1,117 @@
+/*
+ *  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.commons.components;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
+
+public abstract class InstallerAbstract implements Installer {
+
+    //region > constructor, fields
+
+    private final String type;
+    private final String name;
+    private final IsisConfigurationDefault isisConfiguration;
+
+    /**
+     * Subclasses should pass in the type defined as a constant in the
+     * subinterface of Installer.
+     * 
+     * <p>
+     * For example, <tt>PersistenceMechanismInstaller</tt> has a constant
+     * <tt>PersistenceMechanismInstaller#TYPE</tt>. Any implementation of
+     * <tt>PersistenceMechanismInstaller</tt> should pass this constant value up
+     * to this constructor.
+     */
+    public InstallerAbstract(
+            final String type,
+            final String name,
+            final IsisConfigurationDefault isisConfiguration) {
+        this.type = type;
+        this.name = name;
+        this.isisConfiguration = isisConfiguration;
+    }
+
+    //endregion
+
+    //region > type, name
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    //endregion
+
+    //region > configuration (injected)
+
+    public IsisConfigurationDefault getConfiguration() {
+        return isisConfiguration;
+    }
+    //endregion
+
+    //region > init, shutdown
+
+    /**
+     * Default implementation does nothing.
+     */
+    public void init() {
+        // no-op implementation, subclasses may override!
+    }
+
+    /**
+     * Default implementation does nothing.
+     */
+    public void shutdown() {
+        // no-op implementation, subclasses may override!
+    }
+
+    //endregion
+
+    //region > helpers (for subclasses)
+
+    /**
+     * Helper for subclasses implementing {@link #getTypes()}.
+     */
+    protected static List<Class<?>> listOf(final Class<?>... classes) {
+        return Collections.unmodifiableList(Lists.<Class<?>> newArrayList(classes));
+    }
+
+    /**
+     * Helper for subclasses implementing {@link #getTypes()}.
+     */
+    protected static List<Class<?>> listOf(final List<Class<?>> classList, final Class<?>... classes) {
+        final List<Class<?>> arrayList = Lists.<Class<?>> newArrayList(classes);
+        arrayList.addAll(0, classList);
+        return Collections.unmodifiableList(arrayList);
+    }
+
+    //endregion
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/InstallerAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/InstallerAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/InstallerAbstract.java
deleted file mode 100644
index 21048ef..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/InstallerAbstract.java
+++ /dev/null
@@ -1,176 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-import java.util.Collections;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.core.commons.components.Installer;
-
-public abstract class InstallerAbstract implements Installer, IsisConfigurationBuilderAware {
-
-    private final String type;
-    private final String name;
-
-    private IsisConfigurationBuilder isisConfigurationBuilder;
-    private IsisConfiguration configuration;
-
-    /**
-     * Subclasses should pass in the type defined as a constant in the
-     * subinterface of Installer.
-     * 
-     * <p>
-     * For example, <tt>PersistenceMechanismInstaller</tt> has a constant
-     * <tt>PersistenceMechanismInstaller#TYPE</tt>. Any implementation of
-     * <tt>PersistenceMechanismInstaller</tt> should pass this constant value up
-     * to this constructor.
-     */
-    public InstallerAbstract(final String type, final String name) {
-        this.type = type;
-        this.name = name;
-    }
-
-    @Override
-    public String getType() {
-        return type;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns <tt>[type.properties, type_name.properties</tt>.
-     * 
-     * <p>
-     * For example,
-     * <tt>[persistor.properties, persistor_in-memory.properties]</tt>.
-     * 
-     * @see #getType()
-     * @see #getName()
-     */
-    @Override
-    public List<String> getConfigurationResources() {
-        final List<String> resourceList = Lists.newArrayList();
-        final String componentImplementationFile = getType() + "_" + getName() + ".properties";
-        resourceList.add(componentImplementationFile);
-        final String componentFile = getType() + ".properties";
-        resourceList.add(componentFile);
-        addConfigurationResources(resourceList);
-        return Collections.unmodifiableList(resourceList);
-    }
-
-    /**
-     * Optional hook method to allow subclasses to specify any additional config
-     * resources.
-     */
-    protected void addConfigurationResources(final List<String> configurationResources) {
-    }
-
-    // ////////////////////////////////////////////////////
-    // init, shutdown
-    // ////////////////////////////////////////////////////
-
-    /**
-     * Default implementation does nothing.
-     */
-    public void init() {
-        // no-op implementation, subclasses may override!
-    }
-
-    /**
-     * Default implementation does nothing.
-     */
-    public void shutdown() {
-        // no-op implementation, subclasses may override!
-    }
-
-    /**
-     * Either this method or {@link #setConfiguration(IsisConfiguration)} should
-     * be called prior to calling {@link #getConfiguration()}.
-     * 
-     * <p>
-     * If a {@link #setConfiguration(IsisConfiguration) configuration} has
-     * already been provided, then throws {@link IllegalStateException}.
-     */
-    @Override
-    public void setConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder) {
-        if (configuration != null) {
-            throw new IllegalStateException("A IsisConfiguration has already been provided.");
-        }
-        this.isisConfigurationBuilder = isisConfigurationBuilder;
-    }
-
-    /**
-     * Either this method or
-     * {@link #setConfigurationBuilder(IsisConfigurationBuilder)} should be
-     * called prior to calling {@link #getConfiguration()}.
-     * 
-     * <p>
-     * If a {@link #setConfigurationBuilder(IsisConfigurationBuilder)
-     * configuration builder} has already been provided, then throws
-     * {@link IllegalStateException}.
-     */
-    public void setConfiguration(final IsisConfiguration configuration) {
-        if (isisConfigurationBuilder != null) {
-            throw new IllegalStateException("An IsisConfigurationBuilder has already been provided.");
-        }
-        this.configuration = configuration;
-    }
-
-    /**
-     * Returns a <i>snapshot</i> of the current configuration provided by the
-     * {@link #setConfigurationBuilder(IsisConfigurationBuilder) injected}
-     * {@link IsisConfigurationBuilder}.
-     * 
-     * <p>
-     * Implementation note: the implementation is in fact just
-     * {@link InstallerLookup}.
-     */
-    public IsisConfiguration getConfiguration() {
-        if (isisConfigurationBuilder != null) {
-            return isisConfigurationBuilder.getConfiguration();
-        } else if (configuration != null) {
-            return configuration;
-        } else {
-            throw new IllegalStateException("Neither a ConfigurationBuilder nor Configuration has not been provided");
-        }
-    }
-
-    /**
-     * Helper for subclasses implementing {@link #getTypes()}.
-     */
-    protected static List<Class<?>> listOf(final Class<?>... classes) {
-        return Collections.unmodifiableList(Lists.<Class<?>> newArrayList(classes));
-    }
-
-    /**
-     * Helper for subclasses implementing {@link #getTypes()}.
-     */
-    protected static List<Class<?>> listOf(final List<Class<?>> classList, final Class<?>... classes) {
-        final List<Class<?>> arrayList = Lists.<Class<?>> newArrayList(classes);
-        arrayList.addAll(0, classList);
-        return Collections.unmodifiableList(arrayList);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
index 59e8039..12a0c11 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
+import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
 
 /**
@@ -43,8 +44,6 @@ import org.apache.isis.core.commons.resource.ResourceStreamSource;
  */
 public interface IsisConfiguration extends Iterable<String>, ApplicationScopedComponent {
 
-    void injectInto(Object candidate);
-
     /**
      * Creates a new IsisConfiguration containing the properties starting with
      * the specified prefix. The names of the new properties will have the

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
deleted file mode 100644
index c118c87..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
+++ /dev/null
@@ -1,73 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-import org.apache.isis.core.commons.resource.ResourceStreamSource;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
-
-/**
- * Holds a mutable set of properties representing the configuration.
- * 
- * <p>
- * Mutable/immutable pair with the {@link IsisConfiguration}. To obtain the
- * configuration, use {@link #getConfiguration()}.
- * 
- * @see IsisConfiguration for more details on the mutable/immutable pair
- *      pattern.
- */
-public interface IsisConfigurationBuilder {
-
-    void injectInto(Object candidate);
-
-    /**
-     * Returns a currently known {@link IsisConfiguration}.
-     */
-    IsisConfigurationDefault getConfiguration();
-
-    void addDefaultConfigurationResources();
-    
-    void addConfigurationResource(final String installerName, final NotFoundPolicy notFoundPolicy);
-
-    /**
-     * Adds additional property; if already present then will _not_ be replaced.
-     */
-    void add(final String key, final String value);
-
-    /**
-     * Adds/updates property; if already present then _will_ be replaced.
-     */
-    void put(final String key, final String value);
-
-    /**
-     * The underlying {@link ResourceStreamSource} from which the configuration
-     * is being read.
-     * 
-     * <p>
-     * Note that this may be a {@link ResourceStreamSourceChainOfResponsibility composite}.
-     */
-    ResourceStreamSource getResourceStreamSource();
-    
-    /**
-     * Log a summary of resources found or not found.
-     */
-    void dumpResourcesToLog();
-
-    void lockConfiguration();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderAware.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderAware.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderAware.java
deleted file mode 100644
index 07023b7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderAware.java
+++ /dev/null
@@ -1,25 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-public interface IsisConfigurationBuilderAware {
-
-    void setConfigurationBuilder(IsisConfigurationBuilder configurationLoader);
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderDefault.java
deleted file mode 100644
index ed06d2b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderDefault.java
+++ /dev/null
@@ -1,76 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.resource.ResourceStreamSource;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-
-/**
- * Convenience implementation of {@link IsisConfigurationBuilder} that loads
- * configuration resource as per {@link IsisConfigurationBuilderFileSystem} and
- * otherwise from the {@link ResourceStreamSourceContextLoaderClassPath
- * classpath}.
- * 
- * @see ResourceStreamSourceFileSystem
- */
-public class IsisConfigurationBuilderDefault extends IsisConfigurationBuilderResourceStreams {
-
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilderDefault.class);
-
-    public IsisConfigurationBuilderDefault() {
-        super(resourceStreamSources(null));
-    }
-
-    public IsisConfigurationBuilderDefault(final String firstDirectory) {
-        super(resourceStreamSources(firstDirectory));
-    }
-
-    private static ResourceStreamSource[] resourceStreamSources(final String firstDirectory) {
-        final ArrayList<ResourceStreamSource> rssList = Lists.newArrayList();
-        if (firstDirectory != null) {
-            rssList.add(fromFileSystem(firstDirectory));
-        }
-        rssList.addAll(Arrays.asList(fromFileSystem(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY), fromFileSystem(ConfigurationConstants.WEBINF_FULL_DIRECTORY), fromClassPath(), fromClassPath(ConfigurationConstants.WEBINF_DIRECTORY)));
-        return rssList.toArray(new ResourceStreamSource[0]);
-    }
-
-    private static ResourceStreamSource fromFileSystem(final String directory) {
-        return ResourceStreamSourceFileSystem.create(directory);
-    }
-
-    private static ResourceStreamSource fromClassPath() {
-        return ResourceStreamSourceContextLoaderClassPath.create();
-    }
-
-    private static ResourceStreamSource fromClassPath(final String prefix) {
-        return ResourceStreamSourceContextLoaderClassPath.create(prefix);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderFileSystem.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderFileSystem.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderFileSystem.java
deleted file mode 100644
index f481ce7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderFileSystem.java
+++ /dev/null
@@ -1,57 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.resource.ResourceStreamSource;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-
-/**
- * Convenience implementation of {@link IsisConfigurationBuilder} that loads
- * configuration resource from a specified directory (or directories) on the
- * filesystem.
- * 
- * @see ResourceStreamSourceFileSystem
- */
-public class IsisConfigurationBuilderFileSystem extends IsisConfigurationBuilderResourceStreams {
-
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilderFileSystem.class);
-
-    private static ResourceStreamSource createResourceStreamSource(final String... directories) {
-        final ResourceStreamSourceChainOfResponsibility composite = new ResourceStreamSourceChainOfResponsibility();
-        for (final String directory : directories) {
-            composite.addResourceStreamSource(new ResourceStreamSourceFileSystem(directory));
-        }
-        return composite;
-    }
-
-    public IsisConfigurationBuilderFileSystem(final String... directories) {
-        super(createResourceStreamSource(directories));
-    }
-
-    public IsisConfigurationBuilderFileSystem() {
-        super(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderPrimer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderPrimer.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderPrimer.java
deleted file mode 100644
index 70e4df8..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderPrimer.java
+++ /dev/null
@@ -1,26 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-public interface IsisConfigurationBuilderPrimer {
-
-    void primeConfigurationBuilder(IsisConfigurationBuilder isisConfigurationBuilder);
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
deleted file mode 100644
index 695cfd9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
+++ /dev/null
@@ -1,289 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Sets;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.resource.ResourceStreamSource;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-
-/**
- * Adapter for {@link IsisConfigurationBuilder}, loading the specified
- * configuration resource (file) from the given {@link ResourceStreamSource}(s).
- * 
- * <p>
- * If a property is in multiple configuration resources then the latter
- * resources will overwrite the former.
- */
-public class IsisConfigurationBuilderResourceStreams implements IsisConfigurationBuilder {
-
-    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilderResourceStreams.class);
-    
-    static class ConfigurationResourceAndPolicy {
-        private final String configurationResource;
-        private final NotFoundPolicy notFoundPolicy;
-
-        public ConfigurationResourceAndPolicy(final String configurationResource, final NotFoundPolicy notFoundPolicy) {
-            this.configurationResource = configurationResource;
-            this.notFoundPolicy = notFoundPolicy;
-        }
-
-        public String getConfigurationResource() {
-            return configurationResource;
-        }
-
-        public NotFoundPolicy getNotFoundPolicy() {
-            return notFoundPolicy;
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%s{%s}", configurationResource, notFoundPolicy);
-        }
-    }
-
-    private final Set<String> configurationResourcesFound = Sets.newLinkedHashSet();
-    private final Set<String> configurationResourcesNotFound = Sets.newLinkedHashSet();
-    private final ResourceStreamSource resourceStreamSource;
-    private final IsisConfigurationDefault configuration;
-    private final List<ConfigurationResourceAndPolicy> configurationResources = new ArrayList<ConfigurationResourceAndPolicy>();
-    private boolean locked;
-
-    // ////////////////////////////////////////////////////////////
-    // Constructor, initialization
-    // ////////////////////////////////////////////////////////////
-
-    private static ResourceStreamSource createComposite(final ResourceStreamSource... resourceStreamSources) {
-        final ResourceStreamSourceChainOfResponsibility composite = new ResourceStreamSourceChainOfResponsibility();
-        for (final ResourceStreamSource rss : resourceStreamSources) {
-            if (rss == null) {
-                continue;
-            }
-            composite.addResourceStreamSource(rss);
-        }
-        return composite;
-    }
-
-    public IsisConfigurationBuilderResourceStreams() {
-        this(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
-    }
-
-    public IsisConfigurationBuilderResourceStreams(final ResourceStreamSource... resourceStreamSources) {
-        this(createComposite(resourceStreamSources));
-    }
-
-    public IsisConfigurationBuilderResourceStreams(final ResourceStreamSource resourceStreamSource) {
-        this.resourceStreamSource = resourceStreamSource;
-        configuration = new IsisConfigurationDefault(resourceStreamSource);
-    }
-
-    public void addDefaultConfigurationResources() {
-        addConfigurationResource(ConfigurationConstants.DEFAULT_CONFIG_FILE, NotFoundPolicy.FAIL_FAST);
-        addConfigurationResource(ConfigurationConstants.WEB_CONFIG_FILE, NotFoundPolicy.CONTINUE); //web.properties
-        addConfigurationResource("war.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("viewer_wicket.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("viewer_restful.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("viewer_restfulobjects.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("persistor_datanucleus.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("persistor.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("authentication_shiro.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("authentication_bypass.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("authentication.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("authorization_shiro.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("authorization_bypass.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("authorization.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("reflector_java.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("reflector.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("fixtures-installer_configuration.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("fixtures-installer_noop.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("fixtures-installer.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("services-installer_annotation.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("services-installer_configuration.properties", NotFoundPolicy.CONTINUE);
-
-        addConfigurationResource("services-installer_configuration-and-annotation.properties", NotFoundPolicy.CONTINUE);
-        addConfigurationResource("services-installer.properties", NotFoundPolicy.CONTINUE);
-
-    }
-
-    // ////////////////////////////////////////////////////////////
-    // ResourceStreamSource
-    // ////////////////////////////////////////////////////////////
-
-    @Override
-    public ResourceStreamSource getResourceStreamSource() {
-        return resourceStreamSource;
-    }
-
-    // ////////////////////////////////////////////////////////////
-    // populating or updating
-    // ////////////////////////////////////////////////////////////
-
-    /**
-     * Registers the configuration resource (usually, a file) with the specified
-     * name from the first {@link ResourceStreamSource} available.
-     * 
-     * <p>
-     * If the configuration resource cannot be found then the provided
-     * {@link NotFoundPolicy} determines whether an exception is thrown or not.
-     * 
-     * <p>
-     * Must be called before {@link IsisConfigurationBuilder#getConfiguration()}; the resource is
-     * actually read on {@link IsisConfigurationBuilder#getConfiguration()}.
-     */
-    @Override
-    public synchronized void addConfigurationResource(final String configurationResource, final NotFoundPolicy notFoundPolicy) {
-        LOG.debug("looking for properties file " + configurationResource);
-        loadConfigurationResource(configuration, new ConfigurationResourceAndPolicy(configurationResource, notFoundPolicy));
-        configurationResources.add(new ConfigurationResourceAndPolicy(configurationResource, notFoundPolicy));
-    }
-
-    @Override
-    public synchronized void add(final String key, final String value) {
-        if (locked) {
-            throw new IsisException("Configuration has been locked and cannot be changed");
-        }
-        configuration.add(key, value);
-    }
-
-    @Override
-    public synchronized void put(final String key, final String value) {
-        if (locked) {
-            throw new IsisException("Configuration has been locked and cannot be changed");
-        }
-        configuration.put(key, value);
-    }
-
-    public void lockConfiguration() {
-        locked = true;
-    }
-    
-    // ////////////////////////////////////////////////////////////
-    // getConfiguration
-    // ////////////////////////////////////////////////////////////
-
-    /**
-     * Returns the current {@link IsisConfiguration configuration}.
-     */
-    @Override
-    public synchronized IsisConfigurationDefault getConfiguration() {
-        if(!locked) {
-            lockConfiguration();
-            dumpResourcesToLog();
-        }
-        return configuration;
-     }
-
-    private void loadConfigurationResource(final IsisConfigurationDefault configuration, final ConfigurationResourceAndPolicy configResourceAndPolicy) {
-        final String configurationResource = configResourceAndPolicy.getConfigurationResource();
-        final NotFoundPolicy notFoundPolicy = configResourceAndPolicy.getNotFoundPolicy();
-        LOG.debug("checking availability of configuration resource: " + configurationResource + ", notFoundPolicy: " + notFoundPolicy);
-        loadConfigurationResource(configuration, configurationResource, notFoundPolicy);
-    }
-
-    /**
-     * Loads the configuration resource (usually, a file) with the specified
-     * name from the first {@link ResourceStreamSource} available.
-     * 
-     * <p>
-     * If the configuration resource cannot be found then the provided
-     * {@link NotFoundPolicy} determines whether an exception is thrown or not.
-     */
-    protected void loadConfigurationResource(final IsisConfigurationDefault configuration, final String configurationResource, final NotFoundPolicy notFoundPolicy) {
-        try {
-            final PropertiesReader propertiesReader = loadConfigurationResource(resourceStreamSource, configurationResource);
-            LOG.info("loading properties from " + configurationResource);
-            configuration.add(propertiesReader.getProperties());
-            configurationResourcesFound.add(configurationResource);
-            return;
-        } catch (final IOException ignore) { }
-        if (notFoundPolicy == NotFoundPolicy.FAIL_FAST) {
-            throw new IsisException("failed to load '" + configurationResource + "'; tried using: " + resourceStreamSource.getName());
-        } else {
-            configurationResourcesNotFound.add(configurationResource);
-            LOG.debug("'" + configurationResource + "' not found, but not needed");
-        }
-    }
-
-    private PropertiesReader loadConfigurationResource(final ResourceStreamSource resourceStreamSource, final String configurationResource) throws IOException {
-        return new PropertiesReader(resourceStreamSource, configurationResource);
-    }
-
-    
-    // TODO review this, should this option default to yes?
-    private void addShowExplorationOptionsIfNotSpecified(final IsisConfigurationDefault configuration) {
-        if (configuration.getString(ConfigurationConstants.SHOW_EXPLORATION_OPTIONS) == null) {
-            configuration.add(ConfigurationConstants.SHOW_EXPLORATION_OPTIONS, "yes");
-        }
-    }
-    
-    // ////////////////////////////////////////////////////////////
-    // Logging
-    // ////////////////////////////////////////////////////////////
-
-    @Override
-    public void dumpResourcesToLog() {
-        if (LOG.isInfoEnabled()) {
-            LOG.info("Configuration resources FOUND:");
-            for (String resource : configurationResourcesFound) {
-                LOG.info("*  " + resource);
-            }
-            LOG.info("Configuration resources NOT FOUND (but not needed):");
-            for (String resource : configurationResourcesNotFound) {
-                LOG.info("*  " + resource);
-            }
-        }
-    }
-
-
-    // ////////////////////////////////////////////////////////////
-    // Injectable
-    // ////////////////////////////////////////////////////////////
-
-    public void injectInto(final Object candidate) {
-        if (IsisConfigurationBuilderAware.class.isAssignableFrom(candidate.getClass())) {
-            final IsisConfigurationBuilderAware cast = IsisConfigurationBuilderAware.class.cast(candidate);
-            cast.setConfigurationBuilder(this);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).add("resourceStream", resourceStreamSource).add("configResources", configurationResources).toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
index 72f2c40..d433584 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
@@ -458,10 +458,6 @@ public class IsisConfigurationDefault implements IsisConfiguration, Configuratio
     // ////////////////////////////////////////////////////////////////////
 
     @Override
-    public void injectInto(final Object candidate) {
-    }
-
-    @Override
     public Map<String,String> asMap() {
         final Map<String, String> map = Maps.newHashMap();
         for(String propertyName: this) {

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/JmxBeanServer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/JmxBeanServer.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/JmxBeanServer.java
deleted file mode 100644
index 71d7363..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/JmxBeanServer.java
+++ /dev/null
@@ -1,73 +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.
- */
-package org.apache.isis.core.commons.config;
-
-import java.lang.management.ManagementFactory;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.NotCompliantMBeanException;
-import javax.management.ObjectName;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JmxBeanServer {
-
-    private static final Logger LOG = LoggerFactory.getLogger(JmxBeanServer.class);
-
-    private static JmxBeanServer instance;
-    private final MBeanServer server;
-
-    private JmxBeanServer() {
-        server = ManagementFactory.getPlatformMBeanServer();
-        instance = this;
-    }
-
-    public static JmxBeanServer getInstance() {
-        if (instance == null) {
-            LOG.info("JMX bean server created");
-            instance = new JmxBeanServer();
-        }
-        return instance;
-    }
-
-    public void register(final String name, final Object object) {
-        try {
-            final ObjectName objectName = new ObjectName("Isis:name=" + name);
-            server.registerMBean(object, objectName);
-            LOG.info(name + " JMX mbean registered: " + object);
-        } catch (final MalformedObjectNameException e) {
-            throw new RuntimeException(e);
-        } catch (final NullPointerException e) {
-            throw new RuntimeException(e);
-        } catch (final InstanceAlreadyExistsException e) {
-            LOG.info(name + " JMX mbean already registered: " + object);
-        } catch (final MBeanRegistrationException e) {
-            throw new RuntimeException(e);
-        } catch (final NotCompliantMBeanException e) {
-            throw new RuntimeException(e);
-        }
-
-    }
-}
-
-// Copyright (c) Naked Objects Group Ltd.

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/PropertiesReader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/PropertiesReader.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/PropertiesReader.java
deleted file mode 100644
index 7e5f09d..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/PropertiesReader.java
+++ /dev/null
@@ -1,54 +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.
- */
-
-package org.apache.isis.core.commons.config;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import org.apache.isis.core.commons.lang.CloseableExtensions;
-import org.apache.isis.core.commons.resource.ResourceStreamSource;
-
-/**
- * Loads properties using the specified {@link ResourceStreamSource}.
- */
-class PropertiesReader {
-
-    private final Properties properties = new Properties();
-
-    public PropertiesReader(final ResourceStreamSource resourceStream, final String configurationResource) throws IOException {
-
-        InputStream in = null;
-        try {
-            in = resourceStream.readResource(configurationResource);
-            if (in == null) {
-                throw new IOException("Unable to find resource " + configurationResource);
-            }
-            properties.load(in);
-        } finally {
-            CloseableExtensions.closeSafely(in);
-        }
-    }
-
-    public Properties getProperties() {
-        return properties;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/config/package-info.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/package-info.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/package-info.java
index db80586..17030cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/package-info.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/package-info.java
@@ -32,7 +32,7 @@
  * 
  * <p>
  * The {@link org.apache.isis.core.commons.config.ConfigurationBuilder} is used
- * by {@link org.apache.isis.core.commons.config.InstallerAbstract}, an
+ * by {@link org.apache.isis.core.commons.components.InstallerAbstract}, an
  * implementation of {@link org.apache.isis.core.commons.components.Installer} 
  * that allows the configuration to be added to as each component is
  * installed. 

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/ConfigurationResourceAndPolicy.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/ConfigurationResourceAndPolicy.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/ConfigurationResourceAndPolicy.java
new file mode 100644
index 0000000..f36bb83
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/ConfigurationResourceAndPolicy.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.commons.configbuilder;
+
+import org.apache.isis.core.commons.config.NotFoundPolicy;
+
+class ConfigurationResourceAndPolicy {
+
+    private final String configurationResource;
+    private final NotFoundPolicy notFoundPolicy;
+
+    public ConfigurationResourceAndPolicy(
+            final String configurationResource,
+            final NotFoundPolicy notFoundPolicy) {
+        this.configurationResource = configurationResource;
+        this.notFoundPolicy = notFoundPolicy;
+    }
+
+    public String getConfigurationResource() {
+        return configurationResource;
+    }
+    public NotFoundPolicy getNotFoundPolicy() {
+        return notFoundPolicy;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s{%s}", configurationResource, notFoundPolicy);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
new file mode 100644
index 0000000..ed229ef
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
@@ -0,0 +1,371 @@
+/*
+ *  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.commons.configbuilder;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import org.apache.commons.cli.BasicParser;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+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.config.IsisConfigurationDefault;
+import org.apache.isis.core.commons.config.NotFoundPolicy;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.resource.ResourceStreamSource;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
+import org.apache.isis.core.runtime.optionhandler.BootPrinter;
+import org.apache.isis.core.runtime.optionhandler.OptionHandler;
+
+/**
+ * Holds a mutable set of properties representing the configuration.
+ *
+ * This implementation loads the specified
+ * configuration resource (file) from the given {@link ResourceStreamSource}(s).
+ *
+ * <p>
+ * If a property is in multiple configuration resources then the latter
+ * resources will overwrite the former.
+ *
+ * <p>
+ * Mutable/immutable pair with the {@link IsisConfiguration}. To obtain the
+ * configuration, use {@link #getConfiguration()}.
+ *
+ * @see {@link IsisConfiguration} for more details on the mutable/immutable pair pattern.
+ *
+ */
+public final class IsisConfigurationBuilder {
+
+    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilder.class);
+
+    //region > constructor, fields
+
+    private final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain;
+    private final List<ConfigurationResourceAndPolicy> configurationResources = Lists.newArrayList();
+
+    private final IsisConfigurationDefault configuration;
+    private boolean locked;
+
+    private final Set<String> configurationResourcesFound = Sets.newLinkedHashSet();
+    private final Set<String> configurationResourcesNotFound = Sets.newLinkedHashSet();
+
+    public IsisConfigurationBuilder() {
+        this(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
+    }
+
+    public IsisConfigurationBuilder(final ResourceStreamSource... resourceStreamSources) {
+        this(createComposite(Arrays.asList(resourceStreamSources)));
+    }
+
+    public IsisConfigurationBuilder(final List<ResourceStreamSource> resourceStreamSources) {
+        this(createComposite(resourceStreamSources));
+    }
+
+    public IsisConfigurationBuilder(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
+        this.resourceStreamSourceChain = resourceStreamSourceChain;
+        configuration = new IsisConfigurationDefault(resourceStreamSourceChain);
+    }
+
+    private static ResourceStreamSourceChainOfResponsibility createComposite(
+            final List<ResourceStreamSource> resourceStreamSources) {
+        final ResourceStreamSourceChainOfResponsibility composite = new ResourceStreamSourceChainOfResponsibility();
+        for (final ResourceStreamSource rss : resourceStreamSources) {
+            if (rss == null) {
+                continue;
+            }
+            composite.addResourceStreamSource(rss);
+        }
+        return composite;
+    }
+
+    public void addDefaultConfigurationResources() {
+        addConfigurationResource(ConfigurationConstants.DEFAULT_CONFIG_FILE, NotFoundPolicy.FAIL_FAST);
+        addConfigurationResource(ConfigurationConstants.WEB_CONFIG_FILE, NotFoundPolicy.CONTINUE); //web.properties
+        addConfigurationResource("war.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("viewer_wicket.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("viewer_restful.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("viewer_restfulobjects.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("persistor_datanucleus.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("persistor.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("authentication_shiro.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("authentication_bypass.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("authentication.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("authorization_shiro.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("authorization_bypass.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("authorization.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("reflector_java.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("reflector.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("fixtures-installer_configuration.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("fixtures-installer.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("services-installer_annotation.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("services-installer_configuration.properties", NotFoundPolicy.CONTINUE);
+
+        addConfigurationResource("services-installer_configuration-and-annotation.properties", NotFoundPolicy.CONTINUE);
+        addConfigurationResource("services-installer.properties", NotFoundPolicy.CONTINUE);
+    }
+
+    //endregion
+
+    //region > addResourceStreamSource, addResourceStreamSources
+
+    public void addResourceStreamSource(final ResourceStreamSource resourceStreamSource) {
+        addResourceStreamSources(resourceStreamSource);
+    }
+
+    public void addResourceStreamSources(final ResourceStreamSource... resourceStreamSources) {
+        addResourceStreamSources(Arrays.asList(resourceStreamSources));
+    }
+
+    public void addResourceStreamSources(final List<ResourceStreamSource> resourceStreamSources) {
+        ensureNotLocked();
+        for (ResourceStreamSource resourceStreamSource : resourceStreamSources) {
+            this.resourceStreamSourceChain.addResourceStreamSource(resourceStreamSource);
+        }
+    }
+
+    //endregion
+
+    //region > addConfigurationResource
+
+    /**
+     * Registers the configuration resource (usually, a file) with the specified
+     * name from the first {@link ResourceStreamSource} available.
+     *
+     * <p>
+     * If the configuration resource cannot be found then the provided
+     * {@link NotFoundPolicy} determines whether an exception is thrown or not.
+     *
+     * <p>
+     * Must be called before {@link IsisConfigurationBuilder#getConfiguration()}; the resource is
+     * actually read on {@link IsisConfigurationBuilder#getConfiguration()}.
+     */
+    public synchronized void addConfigurationResource(
+            final String configurationResource,
+            final NotFoundPolicy notFoundPolicy) {
+
+        ensureNotLocked();
+
+        if(LOG.isDebugEnabled()) {
+            LOG.debug(String.format(
+                    "checking availability of configuration resource: %s, notFoundPolicy: %s",
+                    configurationResource, notFoundPolicy));
+        }
+        loadConfigurationResource(configurationResource, notFoundPolicy);
+        configurationResources.add(new ConfigurationResourceAndPolicy(configurationResource, notFoundPolicy));
+    }
+
+    /**
+     * Loads the configuration resource (usually, a file) with the specified
+     * name from the first {@link ResourceStreamSource} available.
+     *
+     * <p>
+     * If the configuration resource cannot be found then the provided
+     * {@link NotFoundPolicy} determines whether an exception is thrown or not.
+     */
+    private void loadConfigurationResource(
+            final String configurationResource,
+            final NotFoundPolicy notFoundPolicy) {
+        try {
+            final PropertiesReader propertiesReader =
+                    loadConfigurationResource(resourceStreamSourceChain, configurationResource);
+            LOG.info("loading properties from " + configurationResource);
+            configuration.add(propertiesReader.getProperties());
+            configurationResourcesFound.add(configurationResource);
+            return;
+        } catch (final IOException ignore) {
+            // ignore
+        }
+        if (notFoundPolicy == NotFoundPolicy.FAIL_FAST) {
+            throw new IsisException(String.format(
+                    "failed to load '%s'; tried using: %s",
+                    configurationResource, resourceStreamSourceChain.getName()));
+        }
+        configurationResourcesNotFound.add(configurationResource);
+        if(LOG.isDebugEnabled()) {
+            LOG.debug(String.format("'%s' not found, but not needed", configurationResource));
+
+        }
+    }
+
+    private PropertiesReader loadConfigurationResource(final ResourceStreamSource resourceStreamSource, final String configurationResource) throws IOException {
+        return new PropertiesReader(resourceStreamSource, configurationResource);
+    }
+
+
+    //endregion
+
+    //region > add, put
+
+    /**
+     * Adds additional property; if already present then will _not_ be replaced.
+     */
+    public synchronized void add(final String key, final String value) {
+        ensureNotLocked();
+        configuration.add(key, value);
+    }
+
+    /**
+     * Adds/updates property; if already present then _will_ be replaced.
+     */
+    public synchronized void put(final String key, final String value) {
+        ensureNotLocked();
+        configuration.put(key, value);
+    }
+
+
+    //endregion
+
+    //region > parseAndPrimeWith, primeWith
+
+    public boolean parseAndPrimeWith(final List<OptionHandler> optionHandlers, final String[] args) {
+
+        // add options (ie cmd line flags)
+        final Options options = new Options();
+        for (final OptionHandler optionHandler : optionHandlers) {
+            optionHandler.addOption(options);
+        }
+
+        // parse options from the cmd line
+        final boolean parsedOk = parseAndPrimeWith(options, optionHandlers, args);
+
+        if(parsedOk) {
+            for (final OptionHandler optionHandler : optionHandlers) {
+                primeWith(optionHandler);
+            }
+        }
+
+        return parsedOk;
+    }
+
+    private boolean parseAndPrimeWith(final Options options, final List<OptionHandler> optionHandlers, final String[] args) {
+        final BootPrinter printer = new BootPrinter(getClass());
+        final CommandLineParser parser = new BasicParser();
+        try {
+            final CommandLine commandLine = parser.parse(options, args);
+            for (final OptionHandler optionHandler : optionHandlers) {
+                if (!optionHandler.handle(commandLine, printer, options)) {
+                    return false;
+                }
+            }
+        } catch (final ParseException e) {
+            printer.printErrorMessage(e.getMessage());
+            printer.printHelp(options);
+            return false;
+        }
+        return true;
+    }
+
+    public void primeWith(final OptionHandler optionHandler) {
+        ensureNotLocked();
+
+        LOG.debug("priming configurations for '{}'", optionHandler);
+        optionHandler.prime(this);
+    }
+
+    //endregion
+
+    //region > getConfiguration, peekConfiguration, isLocked
+
+    /**
+     * Returns the {@link IsisConfiguration}; this will cause the configuration to be locked
+     */
+    public synchronized IsisConfigurationDefault getConfiguration() {
+        if(!locked) {
+            locked = true;
+            dumpResourcesToLog();
+        }
+        return configuration;
+    }
+
+    /**
+     * Set once {@link #getConfiguration()} is called.
+     */
+    public boolean isLocked() {
+        return locked;
+    }
+
+    /**
+     * Creates a copy of the current {@link #getConfiguration()}, without locking.
+     *
+     * <p>
+     *     Used while bootstrapping, to obtain the web.server port etc.
+     * </p>
+     */
+    public synchronized IsisConfigurationDefault peekConfiguration() {
+        return new IsisConfigurationDefault(resourceStreamSourceChain);
+    }
+
+    private void ensureNotLocked() {
+        if (locked) {
+            throw new IsisException("Configuration has been locked and cannot be changed");
+        }
+    }
+
+    //endregion
+
+    //region > dumpResourcesToLog, toString
+
+    /**
+     * Log a summary of resources found or not found.
+     */
+    public void dumpResourcesToLog() {
+        if (LOG.isInfoEnabled()) {
+            LOG.info("Configuration resources FOUND:");
+            for (String resource : configurationResourcesFound) {
+                LOG.info("*  " + resource);
+            }
+            LOG.info("Configuration resources NOT FOUND (but not needed):");
+            for (String resource : configurationResourcesNotFound) {
+                LOG.info("*  " + resource);
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(this)
+                .add("resourceStream", resourceStreamSourceChain)
+                .add("configResources", configurationResources).toString();
+    }
+
+    //endregion
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/PropertiesReader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/PropertiesReader.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/PropertiesReader.java
new file mode 100644
index 0000000..2c58d15
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/PropertiesReader.java
@@ -0,0 +1,54 @@
+/*
+ *  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.commons.configbuilder;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.apache.isis.core.commons.lang.CloseableExtensions;
+import org.apache.isis.core.commons.resource.ResourceStreamSource;
+
+/**
+ * Loads properties using the specified {@link ResourceStreamSource}.
+ */
+class PropertiesReader {
+
+    private final Properties properties = new Properties();
+
+    public PropertiesReader(final ResourceStreamSource resourceStream, final String configurationResource) throws IOException {
+
+        InputStream in = null;
+        try {
+            in = resourceStream.readResource(configurationResource);
+            if (in == null) {
+                throw new IOException("Unable to find resource " + configurationResource);
+            }
+            properties.load(in);
+        } finally {
+            CloseableExtensions.closeSafely(in);
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
index 2d29fdb..d9df199 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.commons.factory;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 
@@ -27,23 +30,27 @@ public final class InstanceUtil {
     private InstanceUtil() {
     }
 
-    public static Object createInstance(final String className) {
-        return createInstance(className, (Class<?>) null, null);
+    public static Object createInstance(final String className, Object... args) {
+        return createInstance(className, (Class<?>) null, null, args);
     }
 
-    public static Object createInstance(final Class<?> cls) {
-        return createInstance(cls, (Class<?>) null, null);
+    public static Object createInstance(final Class<?> cls, Object... args) {
+        return createInstance(cls, (Class<?>) null, null, args);
     }
 
-    public static <T> T createInstance(final String className, final Class<T> requiredClass) {
-        return createInstance(className, (Class<T>) null, requiredClass);
+    public static <T> T createInstance(final String className, final Class<T> requiredClass, Object... args) {
+        return createInstance(className, (Class<T>) null, requiredClass, args);
     }
 
-    public static <T> T createInstance(final Class<?> cls, final Class<T> requiredClass) {
-        return createInstance(cls, (Class<T>) null, requiredClass);
+    public static <T> T createInstance(final Class<?> cls, final Class<T> requiredClass, Object... args) {
+        return createInstance(cls, (Class<T>) null, requiredClass, args);
     }
 
-    public static <T> T createInstance(final String className, final String defaultTypeName, final Class<T> requiredType) {
+    public static <T> T createInstance(
+            final String className,
+            final String defaultTypeName,
+            final Class<T> requiredType,
+            Object... args) {
         Class<? extends T> defaultType = null;
         if (defaultTypeName != null) {
             try {
@@ -57,10 +64,14 @@ public final class InstanceUtil {
                 throw new InstanceCreationClassException(String.format("Default type '%s' found, but is missing a dependent class: %s", defaultTypeName, e.getMessage()), e);
             }
         }
-        return createInstance(className, defaultType, requiredType);
+        return createInstance(className, defaultType, requiredType, args);
     }
 
-    public static <T> T createInstance(final Class<?> cls, final String defaultTypeName, final Class<T> requiredType) {
+    public static <T> T createInstance(
+            final Class<?> cls,
+            final String defaultTypeName,
+            final Class<T> requiredType,
+            Object... args) {
         Class<? extends T> defaultType = null;
         if (defaultTypeName != null) {
             defaultType = loadClass(defaultTypeName, requiredType);
@@ -75,18 +86,21 @@ public final class InstanceUtil {
                 throw new InstanceCreationClassException(String.format("Default type '%s' found, but is missing a dependent class: %s", defaultTypeName, e.getMessage()), e);
             }
         }
-        return createInstance(cls, defaultType, requiredType);
+        return createInstance(cls, defaultType, requiredType, args);
     }
 
-    public static <T> T createInstance(final String className, final Class<? extends T> defaultType, final Class<T> requiredType) {
+    public static <T> T createInstance(
+            final String className,
+            final Class<? extends T> defaultType,
+            final Class<T> requiredType,
+            Object... args) {
         Assert.assertNotNull("Class to instantiate must be specified", className);
-        Class<?> cls = null;
         try {
-            cls = Thread.currentThread().getContextClassLoader().loadClass(className);
+            final Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(className);
             if (cls == null) {
                 throw new InstanceCreationClassException(String.format("Failed to load class '%s'", className));
             }
-            return createInstance(cls, defaultType, requiredType);
+            return createInstance(cls, defaultType, requiredType, args);
         } catch (final ClassNotFoundException e) {
             if (className.indexOf('.') == -1) {
                 throw new UnavailableClassException(String.format("The component '%s' cannot be found", className));
@@ -97,21 +111,38 @@ public final class InstanceUtil {
         }
     }
 
-    public static <T> T createInstance(final Class<?> cls, final Class<? extends T> defaultType, final Class<T> requiredType) {
+    public static <T> T createInstance(
+            final Class<?> cls,
+            final Class<? extends T> defaultType,
+            final Class<T> requiredType,
+            Object... args) {
         Assert.assertNotNull("Class to instantiate must be specified", cls);
         try {
             if (requiredType == null || requiredType.isAssignableFrom(cls)) {
                 final Class<T> tClass = ObjectExtensions.asT(cls);
-                return tClass.newInstance();
+
+                if(args == null || args.length == 0) {
+                    return tClass.newInstance();
+                } else {
+                    Class<?>[] paramTypes = new Class[args.length];
+                    for (int i = 0; i < args.length; i++) {
+                        final Object arg = args[i];
+                        paramTypes[i] = arg.getClass();
+                    }
+                    final Constructor<T> constructor = tClass.getConstructor(paramTypes);
+                    return constructor.newInstance(args);
+                }
             } else {
                 throw new InstanceCreationClassException(String.format("Class '%s' is not of type '%s'", cls.getName(), requiredType));
             }
         } catch (final NoClassDefFoundError e) {
             throw new InstanceCreationClassException(String.format("Class '%s'found , but is missing a dependent class: %s", cls, e.getMessage()), e);
-        } catch (final InstantiationException e) {
+        } catch (final InstantiationException | InvocationTargetException e) {
             throw new InstanceCreationException(String.format("Could not instantiate an object of class '%s'; %s", cls.getName(), e.getMessage()));
         } catch (final IllegalAccessException e) {
             throw new InstanceCreationException(String.format("Could not access the class '%s'; %s", cls.getName(), e.getMessage()));
+        } catch (NoSuchMethodException e) {
+            throw new InstanceCreationException(String.format("Could not find constructor in the class '%s'; %s", cls.getName(), e.getMessage()));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/74565888/core/metamodel/src/main/java/org/apache/isis/core/commons/jmx/JmxBeanServer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/jmx/JmxBeanServer.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/jmx/JmxBeanServer.java
new file mode 100644
index 0000000..86a1e9d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/jmx/JmxBeanServer.java
@@ -0,0 +1,67 @@
+/*
+ *  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.commons.jmx;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JmxBeanServer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JmxBeanServer.class);
+
+    private static JmxBeanServer instance;
+    private final MBeanServer server;
+
+    private JmxBeanServer() {
+        server = ManagementFactory.getPlatformMBeanServer();
+        instance = this;
+    }
+
+    public static JmxBeanServer getInstance() {
+        if (instance == null) {
+            LOG.info("JMX bean server created");
+            instance = new JmxBeanServer();
+        }
+        return instance;
+    }
+
+    public void register(final String name, final Object object) {
+        try {
+            final ObjectName objectName = new ObjectName("Isis:name=" + name);
+            server.registerMBean(object, objectName);
+            LOG.info(name + " JMX mbean registered: " + object);
+        } catch (final MalformedObjectNameException | NullPointerException | MBeanRegistrationException | NotCompliantMBeanException e) {
+            throw new RuntimeException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOG.info(name + " JMX mbean already registered: " + object);
+        }
+
+    }
+}
+
+// Copyright (c) Naked Objects Group Ltd.