You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by rm...@apache.org on 2012/12/20 00:07:34 UTC

[3/5] git commit: ISIS-288 - improvements to configuration loading at start up.

ISIS-288 - improvements to configuration loading at start up.

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

Branch: refs/heads/master
Commit: 18ab2b56accbe1654912e5e4af94731e6d79d44f
Parents: bb88aaf
Author: rmatthews <rm...@nakedobjects.org>
Authored: Wed Dec 12 23:26:57 2012 +0000
Committer: rmatthews <rm...@nakedobjects.org>
Committed: Wed Dec 19 18:50:41 2012 +0000

----------------------------------------------------------------------
 .../apache/isis/viewer/bdd/common/Scenario.java    |   10 +-
 .../wicket/viewer/IsisWicketApplication.java       |   35 ++--
 .../viewer/IsisWicketUnsecuredApplication.java     |   20 +-
 .../core/commons/config/InstallerAbstract.java     |    4 +-
 .../commons/config/IsisConfigurationBuilder.java   |   16 +-
 .../IsisConfigurationBuilderResourceStreams.java   |  130 ++--------
 .../commons/config/IsisConfigurationDefault.java   |   29 ++-
 .../config/ConfigurationBuilderFileSystemTest.java |   11 +-
 .../IsisConfigurationDefault_PropertNamesTest.java |    6 +-
 .../actions/ActionMethodsFacetFactoryTest.java     |    4 +-
 .../java/org/apache/isis/core/runtime/Isis.java    |    6 +-
 .../exploration/ExplorationAuthenticator.java      |    2 +-
 .../isis/core/runtime/runner/IsisInjectModule.java |  173 +++++++++++++
 .../isis/core/runtime/runner/IsisModule.java       |  189 ---------------
 .../isis/core/runtime/runner/IsisRunner.java       |   35 +++-
 .../isis/core/webapp/IsisWebAppBootstrapper.java   |   18 +-
 .../org/apache/isis/core/webserver/WebServer.java  |   22 +-
 .../isis/core/webserver/WebServerBootstrapper.java |    8 +-
 .../OptionHandlerDeploymentTypeWebServer.java      |    2 +-
 19 files changed, 330 insertions(+), 390 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/component/viewer/bdd/common/src/main/java/org/apache/isis/viewer/bdd/common/Scenario.java
----------------------------------------------------------------------
diff --git a/component/viewer/bdd/common/src/main/java/org/apache/isis/viewer/bdd/common/Scenario.java b/component/viewer/bdd/common/src/main/java/org/apache/isis/viewer/bdd/common/Scenario.java
index a8ea681..4daaa3d 100644
--- a/component/viewer/bdd/common/src/main/java/org/apache/isis/viewer/bdd/common/Scenario.java
+++ b/component/viewer/bdd/common/src/main/java/org/apache/isis/viewer/bdd/common/Scenario.java
@@ -31,8 +31,6 @@ import java.util.Map;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-import org.apache.log4j.FileAppender;
-
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
@@ -45,6 +43,7 @@ import org.apache.isis.core.progmodel.facets.value.ValueSemanticsProviderAbstrac
 import org.apache.isis.core.runtime.fixtures.FixturesInstallerNoop;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
 import org.apache.isis.core.runtime.installers.InstallerLookupDefault;
+import org.apache.isis.core.runtime.runner.IsisInjectModule;
 import org.apache.isis.core.runtime.runner.IsisModule;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.IsisSystem;
@@ -67,11 +66,11 @@ import org.apache.isis.viewer.bdd.common.story.registries.AliasRegistryHolder;
 /**
  * Holds the bootstrapped {@link IsisSystem} and provides access to the
  * {@link AliasRegistry aliases}.
- * 
+ *
  * <p>
  * Typically held in a thread-local by the test framework, acting as a context
  * to the story.
- * 
+ *
  * <p>
  * Implementation note: this class directly implements {@link AliasRegistrySpi},
  * though delegates to an underlying {@link AliasRegistryDefault}. This is
@@ -149,6 +148,7 @@ public class Scenario implements AliasRegistryHolder {
     }
 
     private void defaultStoryComponentsInto(final IsisConfigurationBuilder isisConfigurationBuilder) {
+        isisConfigurationBuilder.addDefaultConfigurationResources();
         isisConfigurationBuilder.add(SystemConstants.AUTHENTICATION_INSTALLER_KEY, BddAuthenticationManagerInstaller.class.getName());
         isisConfigurationBuilder.add(SystemConstants.OBJECT_PERSISTOR_INSTALLER_KEY, BddInMemoryPersistenceMechanismInstaller.class.getName());
         isisConfigurationBuilder.add(SystemConstants.PROFILE_PERSISTOR_INSTALLER_KEY, InMemoryUserProfileStoreInstaller.class.getName());
@@ -157,7 +157,7 @@ public class Scenario implements AliasRegistryHolder {
     }
 
     private Injector createGuiceInjector(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder, final InstallerLookup installerLookup) {
-        final IsisModule isisModule = new IsisModule(deploymentType, isisConfigurationBuilder, installerLookup);
+        final IsisInjectModule isisModule = new IsisInjectModule(deploymentType, isisConfigurationBuilder, installerLookup);
         return Guice.createInjector(isisModule);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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 3a82ac3..d62d13e 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
@@ -28,7 +28,6 @@ import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Module;
-import com.google.inject.name.Named;
 
 import org.apache.log4j.Logger;
 import org.apache.wicket.Application;
@@ -53,7 +52,7 @@ import org.apache.isis.core.commons.resource.ResourceStreamSource;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceCurrentClassClassPath;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.runner.IsisModule;
+import org.apache.isis.core.runtime.runner.IsisInjectModule;
 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;
@@ -81,14 +80,14 @@ import org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleFo
 /**
  * Main application, subclassing the Wicket {@link Application} and
  * bootstrapping Isis.
- * 
+ *
  * <p>
  * Its main responsibility is to allow the set of {@link ComponentFactory}s used
  * to render the domain objects to be registered. This type of customisation is
  * commonplace. At a more fundamental level, also allows the {@link Page}
  * implementation for each {@link PageType page type} to be overridden. This is
  * probably less common, because CSS can also be used for this purpose.
- * 
+ *
  * <p>
  * New {@link ComponentFactory}s can be specified in two ways. The preferred
  * approach is to use the {@link ServiceLoader} mechanism, whereby the
@@ -96,12 +95,12 @@ import org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleFo
  * <tt>META-INF/services</tt>. See <tt>views-gmaps2</tt> for an example of this.
  * Including a jar that uses this mechanism on the classpath will automatically
  * make the {@link ComponentFactory} defined within it available.
- * 
+ *
  * <p>
  * Alternatively, {@link ComponentFactory}s can be specified by overridding
  * {@link #newComponentFactoryList()}. This offers more fine-grained control for
  * the ordering, but is more fiddly.
- * 
+ *
  * <p>
  * There are also a number of other pluggable hooks (similar way to other Wicket
  * customizations)
@@ -173,12 +172,12 @@ public class IsisWicketApplication extends AuthenticatedWebApplication implement
     @Override
     protected void init() {
         super.init();
-        
+
         final RenderStrategy renderStrategy = RenderStrategy.REDIRECT_TO_RENDER;
-        
+
         getRequestCycleSettings().setRenderStrategy(renderStrategy);
-        
-        // 6.0.0 instead of subclassing newRequestCycle 
+
+        // 6.0.0 instead of subclassing newRequestCycle
         getRequestCycleListeners().add(new WebRequestCycleForIsis());
 
         getResourceSettings().setParentFolderPlaceholder("$up$");
@@ -187,17 +186,17 @@ public class IsisWicketApplication extends AuthenticatedWebApplication implement
 
         final IsisConfigurationBuilder isisConfigurationBuilder = createConfigBuilder();
 
-        final IsisModule isisModule = newIsisModule(deploymentType, isisConfigurationBuilder);
+        final IsisInjectModule isisModule = newIsisModule(deploymentType, isisConfigurationBuilder);
         final Injector injector = Guice.createInjector(isisModule, newIsisWicketModule());
         injector.injectMembers(this);
-        
+
         this.bookmarkedPagesModel = new BookmarkedPagesModel();
 
         initWicketComponentInjection(injector);
     }
 
-    protected IsisModule newIsisModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder) {
-        return new IsisModule(deploymentType, isisConfigurationBuilder);
+    protected IsisInjectModule newIsisModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder) {
+        return new IsisInjectModule(deploymentType, isisConfigurationBuilder);
     }
 
     private DeploymentType determineDeploymentType() {
@@ -247,7 +246,7 @@ public class IsisWicketApplication extends AuthenticatedWebApplication implement
      * Installs a {@link AuthenticatedWebSessionForIsis custom implementation}
      * of Wicket's own {@link AuthenticatedWebSession}, effectively associating
      * the Wicket session with the Isis's equivalent session object.
-     * 
+     *
      * <p>
      * In general, it shouldn't be necessary to override this method.
      */
@@ -287,7 +286,7 @@ public class IsisWicketApplication extends AuthenticatedWebApplication implement
 
     /**
      * Access to other page types.
-     * 
+     *
      * <p>
      * Non-final only for testing purposes; should not typically be overridden.
      */
@@ -332,12 +331,12 @@ public class IsisWicketApplication extends AuthenticatedWebApplication implement
     public BookmarkedPagesModel getBookmarkedPagesModel() {
         return bookmarkedPagesModel;
     }
-    
+
 
     // /////////////////////////////////////////////////
     // *Provider impl.
     // /////////////////////////////////////////////////
-    
+
     @Override
     public void injectInto(final Object candidate) {
         if (AuthenticationSessionProviderAware.class.isAssignableFrom(candidate.getClass())) {

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketUnsecuredApplication.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketUnsecuredApplication.java b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketUnsecuredApplication.java
index 1e9ea31..b478ffb 100644
--- a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketUnsecuredApplication.java
+++ b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketUnsecuredApplication.java
@@ -48,7 +48,7 @@ import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authentication.AuthenticationRequest;
 import org.apache.isis.core.runtime.authentication.standard.AuthenticationManagerStandard;
 import org.apache.isis.core.runtime.authentication.standard.AuthenticatorAbstract;
-import org.apache.isis.core.runtime.runner.IsisModule;
+import org.apache.isis.core.runtime.runner.IsisInjectModule;
 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;
@@ -121,17 +121,17 @@ public class IsisWicketUnsecuredApplication extends WebApplication implements Co
         // 6.0.0 rather than overriding getRequestCycleSettings
         // TODO: reinstate REDIRECT_TO_RENDER once WICKET-4773 implemented (Wicket 6.1.0)
         getRequestCycleSettings().setRenderStrategy(RenderStrategy.REDIRECT_TO_BUFFER);
-        // 6.0.0 instead of subclassing newRequestCycle 
+        // 6.0.0 instead of subclassing newRequestCycle
         getRequestCycleListeners().add(new WebRequestCycleForIsis());
 
-        
-        
+
+
         getResourceSettings().setParentFolderPlaceholder("$up$");
         final DeploymentType deploymentType = determineDeploymentType();
 
         final IsisConfigurationBuilder isisConfigurationBuilder = createConfigBuilder();
 
-        final IsisModule isisModule = new IsisModule(deploymentType, isisConfigurationBuilder);
+        final IsisInjectModule isisModule = new IsisInjectModule(deploymentType, isisConfigurationBuilder);
         final Injector injector = Guice.createInjector(isisModule, newIsisWicketModule());
         injector.injectMembers(this);
 
@@ -211,7 +211,7 @@ public class IsisWicketUnsecuredApplication extends WebApplication implements Co
 //     * Wicket's own {@link RequestCycle}, hooking in to provide session and
 //     * transaction management across potentially multiple concurrent requests
 //     * for the same Wicket session.
-//     * 
+//     *
 //     * <p>
 //     * In general, it shouldn't be necessary to override this method.
 //     */
@@ -223,7 +223,7 @@ public class IsisWicketUnsecuredApplication extends WebApplication implements Co
     /**
      * Installs a {@link ConverterLocator} preconfigured with a number of
      * implementations to support Isis specific objects.
-     * 
+     *
      * <p>
      * In general, it shouldn't be necessary to override this method.
      */
@@ -254,7 +254,7 @@ public class IsisWicketUnsecuredApplication extends WebApplication implements Co
 
     /**
      * Access to other page types.
-     * 
+     *
      * <p>
      * Non-final only for testing purposes; should not typically be overridden.
      */
@@ -281,11 +281,11 @@ public class IsisWicketUnsecuredApplication extends WebApplication implements Co
         return IsisContext.getAuthenticationSession();
     }
 
-    
+
     // /////////////////////////////////////////////////
     // *Provider impl.
     // /////////////////////////////////////////////////
-    
+
     @Override
     public void injectInto(final Object candidate) {
         if (AuthenticationSessionProviderAware.class.isAssignableFrom(candidate.getClass())) {

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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
index a8558c3..74b740a 100644
--- 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
@@ -72,10 +72,10 @@ public abstract class InstallerAbstract implements Installer, IsisConfigurationB
     @Override
     public List<String> getConfigurationResources() {
         final List<String> resourceList = Lists.newArrayList();
-        final String componentFile = getType() + ".properties";
-        resourceList.add(componentFile);
         final String componentImplementationFile = getType() + "_" + getName() + ".properties";
         resourceList.add(componentImplementationFile);
+        final String componentFile = getType() + ".properties";
+        resourceList.add(componentFile);
         addConfigurationResources(resourceList);
         return Collections.unmodifiableList(resourceList);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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
index ddfa5ea..3c3e64c 100644
--- 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
@@ -19,8 +19,6 @@
 
 package org.apache.isis.core.commons.config;
 
-import java.util.Properties;
-
 import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
@@ -42,11 +40,11 @@ public interface IsisConfigurationBuilder extends Injectable {
      */
     IsisConfiguration getConfiguration();
 
-    public abstract void addConfigurationResource(final String installerName, final NotFoundPolicy notFoundPolicy);
-
-    public abstract void add(final Properties properties);
+    void addDefaultConfigurationResources();
+    
+    void addConfigurationResource(final String installerName, final NotFoundPolicy notFoundPolicy);
 
-    public abstract void add(final String key, final String value);
+    void add(final String key, final String value);
 
     /**
      * The underlying {@link ResourceStreamSource} from which the configuration
@@ -55,10 +53,12 @@ public interface IsisConfigurationBuilder extends Injectable {
      * <p>
      * Note that this may be a {@link ResourceStreamSourceChainOfResponsibility composite}.
      */
-    public ResourceStreamSource getResourceStreamSource();
+    ResourceStreamSource getResourceStreamSource();
     
     /**
      * Log a summary of resources found or not found.
      */
-    public void dumpResourcesToLog();
+    void dumpResourcesToLog();
+
+    void lockConiguration();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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
index bdab1a1..cf64c6d 100644
--- 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
@@ -21,20 +21,17 @@ package org.apache.isis.core.commons.config;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
-import java.util.Properties;
 import java.util.Set;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.Sets;
-
-import org.apache.log4j.Logger;
-
 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.log4j.Logger;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Sets;
 
 /**
  * Adapter for {@link IsisConfigurationBuilder}, loading the specified
@@ -47,9 +44,6 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
 public class IsisConfigurationBuilderResourceStreams implements IsisConfigurationBuilder {
 
     private static final Logger LOG = Logger.getLogger(IsisConfigurationBuilderResourceStreams.class);
-
-    private final Set<String> configurationResourcesFound = Sets.newLinkedHashSet();
-    private final Set<String> configurationResourcesNotFound = Sets.newLinkedHashSet();
     
     static class ConfigurationResourceAndPolicy {
         private final String configurationResource;
@@ -74,20 +68,12 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
         }
     }
 
+    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 final Properties additionalProperties = new Properties();
-    private boolean includeSystemProperties = false;
-
-    /**
-     * Most recent snapshot of {@link IsisConfiguration} obtained from
-     * {@link #configurationLoader}.
-     * 
-     * <p>
-     * Whenever further configuration is merged in, this cache is invalidated.
-     */
-    private IsisConfiguration cachedConfiguration;
+    private boolean locked;
 
     // ////////////////////////////////////////////////////////////
     // Constructor, initialization
@@ -114,13 +100,13 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
 
     public IsisConfigurationBuilderResourceStreams(final ResourceStreamSource resourceStreamSource) {
         this.resourceStreamSource = resourceStreamSource;
-        addDefaultConfigurationResources();
+        configuration = new IsisConfigurationDefault(resourceStreamSource);
     }
 
     /**
      * May be overridden by subclasses if required.
      */
-    protected void addDefaultConfigurationResources() {
+    public void addDefaultConfigurationResources() {
         addConfigurationResource(ConfigurationConstants.DEFAULT_CONFIG_FILE, NotFoundPolicy.FAIL_FAST);
         addConfigurationResource(ConfigurationConstants.WEB_CONFIG_FILE, NotFoundPolicy.CONTINUE);
     }
@@ -152,13 +138,9 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
      */
     @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));
-        invalidateCache();
-    }
-
-    public synchronized void setIncludeSystemProperties(final boolean includeSystemProperties) {
-        this.includeSystemProperties = includeSystemProperties;
-        invalidateCache();
     }
 
     /**
@@ -166,29 +148,16 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
      */
     @Override
     public synchronized void add(final String key, final String value) {
-        if (key == null || value == null) {
-            return;
-        }
-        additionalProperties.setProperty(key, value);
-        if (LOG.isInfoEnabled()) {
-            LOG.info("added " + key + "=" + value);
+        if (locked) {
+            throw new IsisException("Configuration has been locked and cannot be changed");
         }
-        invalidateCache();
+        configuration.add(key, value);
     }
 
-    /**
-     * Adds additional properties.
-     */
-    @Override
-    public synchronized void add(final Properties properties) {
-        final Enumeration<?> keys = properties.propertyNames();
-        while (keys.hasMoreElements()) {
-            final String key = (String) keys.nextElement();
-            add(key, properties.getProperty(key));
-        }
-        invalidateCache();
+    public void lockConiguration() {
+        locked = true;
     }
-
+    
     // ////////////////////////////////////////////////////////////
     // getConfiguration
     // ////////////////////////////////////////////////////////////
@@ -198,32 +167,13 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
      */
     @Override
     public synchronized IsisConfiguration getConfiguration() {
-        if (cachedConfiguration != null) {
-            return cachedConfiguration;
-        }
-
-        final IsisConfigurationDefault configuration = new IsisConfigurationDefault(getResourceStreamSource());
-        loadConfigurationResources(configuration);
-        // TODO: this hack should move elsewhere, where the DeploymentType is
-        // known.
-        addShowExplorationOptionsIfNotSpecified(configuration);
-        addSystemPropertiesIfRequested(configuration);
-        addAdditionalProperties(configuration);
-        return cachedConfiguration = configuration;
-    }
-
-    private void loadConfigurationResources(final IsisConfigurationDefault configuration) {
-        for (final ConfigurationResourceAndPolicy configResourceAndPolicy : configurationResources) {
-            loadConfigurationResource(configuration, configResourceAndPolicy);
-        }
-    }
+        return configuration;
+     }
 
     private void loadConfigurationResource(final IsisConfigurationDefault configuration, final ConfigurationResourceAndPolicy configResourceAndPolicy) {
         final String configurationResource = configResourceAndPolicy.getConfigurationResource();
         final NotFoundPolicy notFoundPolicy = configResourceAndPolicy.getNotFoundPolicy();
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("loading configuration resource: " + configurationResource + ", notFoundPolicy: " + notFoundPolicy);
-        }
+        LOG.debug("checking availability of configuration resource: " + configurationResource + ", notFoundPolicy: " + notFoundPolicy);
         loadConfigurationResource(configuration, configurationResource, notFoundPolicy);
     }
 
@@ -238,22 +188,16 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
     protected void loadConfigurationResource(final IsisConfigurationDefault configuration, final String configurationResource, final NotFoundPolicy notFoundPolicy) {
         try {
             final PropertiesReader propertiesReader = loadConfigurationResource(resourceStreamSource, configurationResource);
-            addProperties(configuration, propertiesReader.getProperties());
+            LOG.info("loading properies from " + configurationResource);
+            configuration.add(propertiesReader.getProperties());
             configurationResourcesFound.add(configurationResource);
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("'" + configurationResource + "' FOUND");
-            }
             return;
-        } catch (final IOException ex) {
-            // keep going
-        }
+        } catch (final IOException ignore) { }
         if (notFoundPolicy == NotFoundPolicy.FAIL_FAST) {
             throw new IsisException("failed to load '" + configurationResource + "'; tried using: " + resourceStreamSource.getName());
         } else {
             configurationResourcesNotFound.add(configurationResource);
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("'" + configurationResource + "' not found, but not needed");
-            }
+            LOG.debug("'" + configurationResource + "' not found, but not needed");
         }
     }
 
@@ -261,31 +205,13 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
         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");
         }
     }
-
-    private void addSystemPropertiesIfRequested(final IsisConfigurationDefault configuration) {
-        if (includeSystemProperties) {
-            addProperties(configuration, System.getProperties());
-        }
-    }
-
-    private void addAdditionalProperties(final IsisConfigurationDefault configuration) {
-        addProperties(configuration, additionalProperties);
-    }
-
-    protected void addProperties(final IsisConfigurationDefault configuration, final Properties properties) {
-        configuration.add(properties);
-    }
-
-    private void invalidateCache() {
-        cachedConfiguration = null;
-    }
-
-
     
     // ////////////////////////////////////////////////////////////
     // Logging
@@ -298,8 +224,6 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
             for (String resource : configurationResourcesFound) {
                 LOG.info("*  " + resource);
             }
-        }
-        if (LOG.isInfoEnabled()) {
             LOG.info("Configuration resources NOT FOUND (but not needed):");
             for (String resource : configurationResourcesNotFound) {
                 LOG.info("*  " + resource);

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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 351efba..46f257a 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
@@ -21,21 +21,18 @@ package org.apache.isis.core.commons.config;
 
 import java.awt.Color;
 import java.awt.Font;
-import java.util.Collections;
 import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
 import java.util.StringTokenizer;
 
-import com.google.common.collect.Maps;
-
-import org.apache.log4j.Logger;
-
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
+import org.apache.log4j.Logger;
+
+import com.google.common.collect.Maps;
 
 public class IsisConfigurationDefault implements IsisConfiguration {
     
@@ -53,7 +50,7 @@ public class IsisConfigurationDefault implements IsisConfiguration {
 
     public IsisConfigurationDefault(final ResourceStreamSource resourceStreamSource) {
         this.resourceStreamSource = resourceStreamSource;
-        LOG.debug("from :" + nameOf(resourceStreamSource));
+        LOG.debug("configuration intialised with streams: " + nameOf(resourceStreamSource));
     }
 
     private String nameOf(final ResourceStreamSource resourceStreamSource) {
@@ -82,18 +79,24 @@ public class IsisConfigurationDefault implements IsisConfiguration {
         	add((String)key, (String)value);
         }
     }
-
+    
     /**
      * Adds a key-value pair to this set of properties
      */
     public void add(final String key, final String value) {
+        if (value == null) {
+            LOG.debug("ignoring " + key + " as value is null");
+            return;
+        }
         if (key == null) {
             return;
         }
     	if (properties.containsKey(key)) {
-    		LOG.info("replacing " + key + "=" + properties.get(key) + " with " + value);
+    		LOG.info("skipping " + key + "=" + value + " as value already set (with " + properties.get(key) + ")" );
+    	} else {
+            LOG.info("adding " + key + "=" + value);
+            properties.put(key, value);
     	}
-    	properties.put(key, value);
     }
 
     @Override
@@ -199,9 +202,7 @@ public class IsisConfigurationDefault implements IsisConfiguration {
         final Enumeration<?> names = properties.propertyNames();
         while (names.hasMoreElements()) {
             final String name = (String) names.nextElement();
-            str.append(name, 55);
-            str.append(" = ");
-            str.appendln(properties.getProperty(name));
+            str.appendln(name, properties.getProperty(name));
         }
     }
 
@@ -319,7 +320,7 @@ public class IsisConfigurationDefault implements IsisConfiguration {
         }
         String property = properties.getProperty(key, defaultValue);
         property = property != null ? property.trim() : null;
-        LOG.debug("property: '" + key + "' =  '" + property + "'");
+        LOG.debug("get property: '" + key + "' =  '" + property + "'");
         return property;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/metamodel/src/test/java/org/apache/isis/core/commons/config/ConfigurationBuilderFileSystemTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/commons/config/ConfigurationBuilderFileSystemTest.java b/core/metamodel/src/test/java/org/apache/isis/core/commons/config/ConfigurationBuilderFileSystemTest.java
index 78402d6..d02a09f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/commons/config/ConfigurationBuilderFileSystemTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/commons/config/ConfigurationBuilderFileSystemTest.java
@@ -33,6 +33,7 @@ public class ConfigurationBuilderFileSystemTest extends TestCase {
     protected void setUp() throws Exception {
         Logger.getRootLogger().setLevel(Level.OFF);
         loader = new IsisConfigurationBuilderFileSystem("src/test/config");
+        loader.addDefaultConfigurationResources();
     }
 
     public void testDefaultConfiguration() {
@@ -51,10 +52,10 @@ public class ConfigurationBuilderFileSystemTest extends TestCase {
         assertEquals("added", configuration.getString("additional.example"));
     }
 
-    public void testAddedConfigurationOveridesEarlierProperties() {
+    public void testAddedConfigurationIsIgnoredWhenEarlierPropertyExists() {
         loader.addConfigurationResource("another.properties", NotFoundPolicy.FAIL_FAST);
         final IsisConfiguration configuration = loader.getConfiguration();
-        assertEquals("two", configuration.getString("properties.example"));
+        assertEquals("one", configuration.getString("properties.example"));
     }
 
     public void testAddedConfigurationFailsWhenFileNotFound() {
@@ -76,10 +77,4 @@ public class ConfigurationBuilderFileSystemTest extends TestCase {
         final IsisConfiguration configuration = loader.getConfiguration();
         assertEquals("added by code", configuration.getString("added.property"));
     }
-
-    public void testIncludeSystemProperty() throws Exception {
-        loader.setIncludeSystemProperties(true);
-        final IsisConfiguration configuration = loader.getConfiguration();
-        assertEquals(System.getProperty("os.name"), configuration.getString("os.name"));
-    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/metamodel/src/test/java/org/apache/isis/core/commons/config/IsisConfigurationDefault_PropertNamesTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/commons/config/IsisConfigurationDefault_PropertNamesTest.java b/core/metamodel/src/test/java/org/apache/isis/core/commons/config/IsisConfigurationDefault_PropertNamesTest.java
index f8eb879..1cfa45f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/commons/config/IsisConfigurationDefault_PropertNamesTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/commons/config/IsisConfigurationDefault_PropertNamesTest.java
@@ -44,7 +44,7 @@ public class IsisConfigurationDefault_PropertNamesTest extends TestCase {
 
         final Properties p = new Properties();
         p.put("isis.bool", "on");
-        p.put("isis.str", "string");
+        p.put("isis.str", "original");
         configuration.add(p);
 
         final Properties p1 = new Properties();
@@ -53,8 +53,8 @@ public class IsisConfigurationDefault_PropertNamesTest extends TestCase {
         configuration.add(p1);
     }
 
-    public void testDuplicatedPropertyName() {
-        assertEquals("replacement", configuration.getString("isis.str"));
+    public void testDuplicatedPropertyIsNotReplaced() {
+        assertEquals("original", configuration.getString("isis.str"));
     }
 
     public void testUniqueEntries() {

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/ActionMethodsFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/ActionMethodsFacetFactoryTest.java
index 09fab0a..2ad8860 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -775,7 +775,7 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
             }
 
             @SuppressWarnings("unused")
-            public String disableSomeAction() {
+            public String disableSomeAction(final int x, final long y) {
                 return null;
             }
         }
@@ -783,7 +783,7 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class });
         final Method choices0Method = findMethod(CustomerEx.class, "choices0SomeAction", new Class[] {});
         final Method choices1Method = findMethod(CustomerEx.class, "choices1SomeAction", new Class[] {});
-        final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] {});
+        final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] { int.class, long.class });
 
         final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java
index 6f16ba9..68d7bc3 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.runtime;
 
+import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault;
 import org.apache.isis.core.runtime.runner.IsisRunner;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerDeploymentTypeIsis;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerPassword;
@@ -36,12 +37,13 @@ public class Isis {
 
     private void run(final String[] args) {
         final IsisRunner runner = new IsisRunner(args, new OptionHandlerDeploymentTypeIsis());
-
         addOptionHandlersAndValidators(runner);
-
         if (!runner.parseAndValidate()) {
             return;
         }
+        runner.setConfigurationBuilder(new IsisConfigurationBuilderDefault());
+        runner.primeConfigurationWithCommandLineOptions();
+        runner.loadInitialProperties();
         runner.bootstrap(new RuntimeBootstrapper());
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/runtime/src/main/java/org/apache/isis/core/runtime/authentication/exploration/ExplorationAuthenticator.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/authentication/exploration/ExplorationAuthenticator.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/authentication/exploration/ExplorationAuthenticator.java
index e9d68d0..6b06faa 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/authentication/exploration/ExplorationAuthenticator.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/authentication/exploration/ExplorationAuthenticator.java
@@ -112,7 +112,7 @@ public class ExplorationAuthenticator extends AuthenticatorAbstractForDfltRuntim
     }
 
     /**
-     * Valid providing running in {@link DeploymentType#isExploring()
+     * Valid providing running in {@link DeploymentType#isExploring() 
      * exploration} mode.
      */
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
new file mode 100644
index 0000000..88f9812
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
@@ -0,0 +1,173 @@
+/*
+ *  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;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+
+import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
+import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault;
+import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
+import org.apache.isis.core.runtime.installerregistry.installerapi.IsisViewerInstaller;
+import org.apache.isis.core.runtime.installers.InstallerLookupDefault;
+import org.apache.isis.core.runtime.system.DeploymentType;
+import org.apache.isis.core.runtime.system.IsisSystem;
+import org.apache.isis.core.runtime.system.IsisSystemFactory;
+import org.apache.isis.core.runtime.systemusinginstallers.IsisSystemThatUsesInstallersFactory;
+import org.apache.isis.core.runtime.viewer.IsisViewer;
+
+public class IsisInjectModule extends AbstractModule {
+
+    private final DeploymentType deploymentType;
+    private final InstallerLookup installerLookup;
+    private final IsisConfigurationBuilder isisConfigurationBuilder;
+
+    private final List<String> viewerNames = Lists.newArrayList();
+
+    private static InstallerLookupDefault defaultInstallerLookup() {
+        return new InstallerLookupDefault();
+    }
+
+    private static IsisConfigurationBuilderDefault defaultConfigurationBuider() {
+        return new IsisConfigurationBuilderDefault();
+    }
+
+    public IsisInjectModule(final DeploymentType deploymentType) {
+        this(deploymentType, defaultConfigurationBuider(), defaultInstallerLookup());
+    }
+
+    public IsisInjectModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder) {
+        this(deploymentType, isisConfigurationBuilder, defaultInstallerLookup());
+    }
+
+    public IsisInjectModule(final DeploymentType deploymentType, final InstallerLookup installerLookup) {
+        this(deploymentType, defaultConfigurationBuider(), installerLookup);
+    }
+
+    public IsisInjectModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder, final InstallerLookup installerLookup) {
+        this.installerLookup = installerLookup;
+        this.isisConfigurationBuilder = isisConfigurationBuilder;
+        this.deploymentType = deploymentType;
+    }
+
+    /**
+     * As passed in or defaulted by the constructors.
+     */
+    @SuppressWarnings("unused")
+    @Provides
+    @Singleton
+    private DeploymentType provideDeploymentsType() {
+        return deploymentType;
+    }
+
+    /**
+     * As passed in or defaulted by the constructors.
+     */
+    @SuppressWarnings("unused")
+    @Provides
+    @Singleton
+    private IsisConfigurationBuilder providesConfigurationBuilder() {
+        return isisConfigurationBuilder;
+    }
+
+    /**
+     * As passed in or defaulted by the constructors.
+     */
+    @SuppressWarnings("unused")
+    @Provides
+    @Singleton
+    @Inject
+    private InstallerLookup providesInstallerLookup(final IsisConfigurationBuilder configBuilder) {
+        // wire up and initialize installer lookup
+        configBuilder.injectInto(installerLookup);
+        installerLookup.init();
+        return installerLookup;
+    }
+
+    /**
+     * Adjustment (as per GOOS book)
+     */
+    public void addViewerNames(final List<String> viewerNames) {
+        this.viewerNames.addAll(viewerNames);
+    }
+
+    @Override
+    protected void configure() {
+        requireBinding(DeploymentType.class);
+        requireBinding(IsisConfigurationBuilder.class);
+        requireBinding(InstallerLookup.class);
+    }
+
+    @SuppressWarnings("unused")
+    @Provides
+    @Inject
+    @Singleton
+    private IsisSystemFactory provideIsisSystemFactory(final InstallerLookup installerLookup) {
+        final IsisSystemThatUsesInstallersFactory systemFactory = new IsisSystemThatUsesInstallersFactory(installerLookup);
+        systemFactory.init();
+        return systemFactory;
+    }
+
+    @Provides
+    @Inject
+    @Singleton
+    protected IsisSystem provideIsisSystem(final DeploymentType deploymentType, final IsisSystemFactory systemFactory) {
+        final IsisSystem system = systemFactory.createSystem(deploymentType);
+        system.init();
+        return system;
+    }
+
+    public static class ViewerList {
+        private final List<IsisViewer> viewers;
+
+        public ViewerList(final List<IsisViewer> viewers) {
+            this.viewers = Collections.unmodifiableList(viewers);
+        }
+
+        public List<IsisViewer> getViewers() {
+            return viewers;
+        }
+    }
+
+    @SuppressWarnings("unused")
+    @Provides
+    @Inject
+    @Singleton
+    private ViewerList lookupViewers(final InstallerLookup installerLookup, final DeploymentType deploymentType) {
+
+        final List<String> viewersToStart = Lists.newArrayList(viewerNames);
+        deploymentType.addDefaultViewer(viewersToStart);
+
+        final List<IsisViewer> viewers = Lists.newArrayList();
+        for (final String requestedViewer : viewersToStart) {
+            final IsisViewerInstaller viewerInstaller = installerLookup.viewerInstaller(requestedViewer);
+            final IsisViewer viewer = viewerInstaller.createViewer();
+            viewers.add(viewer);
+        }
+        return new ViewerList(viewers);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisModule.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisModule.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisModule.java
deleted file mode 100644
index 1326ccf..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisModule.java
+++ /dev/null
@@ -1,189 +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.runtime.runner;
-
-import java.util.Collections;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-
-import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
-import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault;
-import org.apache.isis.core.commons.config.IsisConfigurationBuilderPrimer;
-import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
-import org.apache.isis.core.runtime.installerregistry.installerapi.IsisViewerInstaller;
-import org.apache.isis.core.runtime.installers.InstallerLookupDefault;
-import org.apache.isis.core.runtime.system.DeploymentType;
-import org.apache.isis.core.runtime.system.IsisSystem;
-import org.apache.isis.core.runtime.system.IsisSystemFactory;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisSystemThatUsesInstallersFactory;
-import org.apache.isis.core.runtime.viewer.IsisViewer;
-
-public class IsisModule extends AbstractModule {
-
-    private final DeploymentType deploymentType;
-    private final InstallerLookup installerLookup;
-    private final IsisConfigurationBuilder isisConfigurationBuilder;
-
-    private final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers = Lists.newArrayList();
-    private final List<String> viewerNames = Lists.newArrayList();
-
-    private static InstallerLookupDefault defaultInstallerLookup() {
-        return new InstallerLookupDefault();
-    }
-
-    private static IsisConfigurationBuilderDefault defaultConfigurationBuider() {
-        return new IsisConfigurationBuilderDefault();
-    }
-
-    public IsisModule(final DeploymentType deploymentType) {
-        this(deploymentType, defaultConfigurationBuider(), defaultInstallerLookup());
-    }
-
-    public IsisModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder) {
-        this(deploymentType, isisConfigurationBuilder, defaultInstallerLookup());
-    }
-
-    public IsisModule(final DeploymentType deploymentType, final InstallerLookup installerLookup) {
-        this(deploymentType, defaultConfigurationBuider(), installerLookup);
-    }
-
-    public IsisModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder, final InstallerLookup installerLookup) {
-        this.installerLookup = installerLookup;
-        this.isisConfigurationBuilder = isisConfigurationBuilder;
-        this.deploymentType = deploymentType;
-    }
-
-    /**
-     * As passed in or defaulted by the constructors.
-     */
-    @SuppressWarnings("unused")
-    @Provides
-    @Singleton
-    private DeploymentType provideDeploymentsType() {
-        return deploymentType;
-    }
-
-    /**
-     * As passed in or defaulted by the constructors.
-     */
-    @SuppressWarnings("unused")
-    @Provides
-    @Singleton
-    private IsisConfigurationBuilder providesConfigurationBuilder() {
-        return primeConfiguration(isisConfigurationBuilder);
-    }
-
-    private IsisConfigurationBuilder primeConfiguration(final IsisConfigurationBuilder configBuilder) {
-        for (final IsisConfigurationBuilderPrimer isisConfigurationBuilderPrimer : isisConfigurationBuilderPrimers) {
-            isisConfigurationBuilderPrimer.primeConfigurationBuilder(configBuilder);
-        }
-        return configBuilder;
-    }
-
-    /**
-     * As passed in or defaulted by the constructors.
-     */
-    @SuppressWarnings("unused")
-    @Provides
-    @Singleton
-    @Inject
-    private InstallerLookup providesInstallerLookup(final IsisConfigurationBuilder configBuilder) {
-        // wire up and initialize installer lookup
-        configBuilder.injectInto(installerLookup);
-        installerLookup.init();
-        return installerLookup;
-    }
-
-    /**
-     * Adjustment (as per GOOS book)
-     */
-    public void addConfigurationPrimers(final List<? extends IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers) {
-        this.isisConfigurationBuilderPrimers.addAll(isisConfigurationBuilderPrimers);
-    }
-
-    /**
-     * Adjustment (as per GOOS book)
-     */
-    public void addViewerNames(final List<String> viewerNames) {
-        this.viewerNames.addAll(viewerNames);
-    }
-
-    @Override
-    protected void configure() {
-        requireBinding(DeploymentType.class);
-        requireBinding(IsisConfigurationBuilder.class);
-        requireBinding(InstallerLookup.class);
-    }
-
-    @SuppressWarnings("unused")
-    @Provides
-    @Inject
-    @Singleton
-    private IsisSystemFactory provideIsisSystemFactory(final InstallerLookup installerLookup) {
-        final IsisSystemThatUsesInstallersFactory systemFactory = new IsisSystemThatUsesInstallersFactory(installerLookup);
-        systemFactory.init();
-        return systemFactory;
-    }
-
-    @Provides
-    @Inject
-    @Singleton
-    protected IsisSystem provideIsisSystem(final DeploymentType deploymentType, final IsisSystemFactory systemFactory) {
-        final IsisSystem system = systemFactory.createSystem(deploymentType);
-        system.init();
-        return system;
-    }
-
-    public static class ViewerList {
-        private final List<IsisViewer> viewers;
-
-        public ViewerList(final List<IsisViewer> viewers) {
-            this.viewers = Collections.unmodifiableList(viewers);
-        }
-
-        public List<IsisViewer> getViewers() {
-            return viewers;
-        }
-    }
-
-    @SuppressWarnings("unused")
-    @Provides
-    @Inject
-    @Singleton
-    private ViewerList lookupViewers(final InstallerLookup installerLookup, final DeploymentType deploymentType) {
-
-        final List<String> viewersToStart = Lists.newArrayList(viewerNames);
-        deploymentType.addDefaultViewer(viewersToStart);
-
-        final List<IsisViewer> viewers = Lists.newArrayList();
-        for (final String requestedViewer : viewersToStart) {
-            final IsisViewerInstaller viewerInstaller = installerLookup.viewerInstaller(requestedViewer);
-            final IsisViewer viewer = viewerInstaller.createViewer();
-            viewers.add(viewer);
-        }
-        return new ViewerList(viewers);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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 33d0188..775457f 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
@@ -31,6 +31,7 @@ import org.apache.commons.cli.ParseException;
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault;
+import org.apache.isis.core.commons.config.IsisConfigurationBuilderPrimer;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
 import org.apache.isis.core.runtime.installers.InstallerLookupDefault;
 import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
@@ -55,6 +56,7 @@ import org.apache.isis.core.runtime.runner.opts.OptionValidator;
 import org.apache.isis.core.runtime.runner.opts.OptionValidatorForPersistor;
 import org.apache.isis.core.runtime.runner.opts.OptionValidatorForViewers;
 import org.apache.isis.core.runtime.system.DeploymentType;
+import org.apache.log4j.Logger;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
@@ -63,6 +65,8 @@ import com.google.inject.Injector;
 
 public class IsisRunner {
 
+    private static final Logger LOG = Logger.getLogger(IsisRunner.class);
+
     private final IsisLoggingConfigurer loggingConfigurer = new IsisLoggingConfigurer();
 
     private final String[] args;
@@ -73,7 +77,7 @@ public class IsisRunner {
 
     private final List<OptionHandler> optionHandlers = Lists.newArrayList();
     private final List<OptionValidator> validators = Lists.newArrayList();
-    private IsisConfigurationBuilder isisConfigurationBuilder = new IsisConfigurationBuilderDefault();
+    private IsisConfigurationBuilder isisConfigurationBuilder;
 
     private Injector globalInjector;;
 
@@ -82,19 +86,17 @@ public class IsisRunner {
     // ///////////////////////////////////////////////////////////////////////////////////////
 
     public IsisRunner(final String[] args, final OptionHandlerDeploymentType optionHandlerDeploymentType) {
-
         this.args = args;
         this.optionHandlerDeploymentType = optionHandlerDeploymentType;
 
         // setup logging immediately
         loggingConfigurer.configureLogging(determineConfigDirectory(), args);
-
         this.installerLookup = new InstallerLookupDefault();
 
-        addOptionHandler(optionHandlerDeploymentType);
         this.optionHandlerViewer = addStandardOptionHandlersAndValidators(this.installerLookup);
     }
 
+    // REVIEW is this something that IsisConfigBuilder should know about?
     private String determineConfigDirectory() {
         if (new File(ConfigurationConstants.WEBINF_FULL_DIRECTORY).exists()) {
             return ConfigurationConstants.WEBINF_FULL_DIRECTORY;
@@ -197,10 +199,28 @@ public class IsisRunner {
         return true;
     }
 
+    public IsisConfigurationBuilder getStartupConfiguration() {
+        return isisConfigurationBuilder;
+    }
+
+    public void primeConfigurationWithCommandLineOptions() {
+        for (final IsisConfigurationBuilderPrimer isisConfigurationBuilderPrimer : optionHandlers) {
+            LOG.debug("priming configurations for " + isisConfigurationBuilderPrimer);
+            isisConfigurationBuilderPrimer.primeConfigurationBuilder(isisConfigurationBuilder);
+        }
+    }
+
+    public void loadInitialProperties() {
+        isisConfigurationBuilder.addDefaultConfigurationResources();
+    }
+
+
     // ///////////////////////////////////////////////////////////////////////////////////////
     // Bootstrapping
     // ///////////////////////////////////////////////////////////////////////////////////////
 
+    // TODO remove and use is desktop runner
+
     public final void bootstrap(final IsisBootstrapper bootstrapper) {
 
         final DeploymentType deploymentType = optionHandlerDeploymentType.getDeploymentType();
@@ -208,11 +228,12 @@ public class IsisRunner {
         this.globalInjector = createGuiceInjector(deploymentType, isisConfigurationBuilder, installerLookup, optionHandlers);
 
         bootstrapper.bootstrap(globalInjector);
+        isisConfigurationBuilder.lockConiguration();
+        isisConfigurationBuilder.dumpResourcesToLog();
     }
 
     private Injector createGuiceInjector(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder, final InstallerLookup installerLookup, final List<OptionHandler> optionHandlers) {
-        final IsisModule isisModule = new IsisModule(deploymentType, isisConfigurationBuilder, installerLookup);
-        isisModule.addConfigurationPrimers(optionHandlers);
+        final IsisInjectModule isisModule = new IsisInjectModule(deploymentType, isisConfigurationBuilder, installerLookup);
         isisModule.addViewerNames(optionHandlerViewer.getViewerNames());
         return Guice.createInjector(isisModule);
     }
@@ -226,7 +247,7 @@ public class IsisRunner {
     }
 
     private OptionHandlerViewer addStandardOptionHandlersAndValidators(final InstallerLookup installerLookup) {
-
+        addOptionHandler(optionHandlerDeploymentType);
         addOptionHandler(new OptionHandlerConfiguration());
 
         OptionHandlerPersistor optionHandlerPersistor;

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/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 60a7460..2a3c668 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
@@ -41,7 +41,7 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
 import org.apache.isis.core.runtime.installers.InstallerLookupDefault;
 import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
-import org.apache.isis.core.runtime.runner.IsisModule;
+import org.apache.isis.core.runtime.runner.IsisInjectModule;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.IsisSystem;
 import org.apache.isis.core.runtime.system.SystemConstants;
@@ -97,6 +97,8 @@ public class IsisWebAppBootstrapper implements ServletContextListener {
 
             primeConfigurationBuilder(isisConfigurationBuilder, servletContext);
 
+            isisConfigurationBuilder.addDefaultConfigurationResources();
+
             final DeploymentType deploymentType = determineDeploymentType(isisConfigurationBuilder, servletContext);
 
             addConfigurationResourcesForWebApps(isisConfigurationBuilder);
@@ -111,7 +113,8 @@ public class IsisWebAppBootstrapper implements ServletContextListener {
             injector = createGuiceInjector(isisConfigurationBuilder, deploymentType, installerLookup);
 
             final IsisSystem system = injector.getInstance(IsisSystem.class);
-            
+
+            isisConfigurationBuilder.lockConiguration();
             isisConfigurationBuilder.dumpResourcesToLog();
 
             servletContext.setAttribute(WebAppConstants.ISIS_SYSTEM_KEY, system);
@@ -123,17 +126,20 @@ public class IsisWebAppBootstrapper implements ServletContextListener {
     }
 
     private Injector createGuiceInjector(final IsisConfigurationBuilder isisConfigurationBuilder, final DeploymentType deploymentType, final InstallerLookup installerLookup) {
-        final IsisModule isisModule = new IsisModule(deploymentType, isisConfigurationBuilder, installerLookup);
+        final IsisInjectModule isisModule = new IsisInjectModule(deploymentType, isisConfigurationBuilder, installerLookup);
         return Guice.createInjector(isisModule);
     }
 
     @SuppressWarnings("unchecked")
     private void primeConfigurationBuilder(final IsisConfigurationBuilder isisConfigurationBuilder, final ServletContext servletContext) {
-        final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers = (List<IsisConfigurationBuilderPrimer>) servletContext.getAttribute(WebAppConstants.CONFIGURATION_PRIMERS_KEY);
+        LOG.info("loading properties from option handlers");
+        final List<IsisConfigurationBuilderPrimer> isisConfigurationBuilderPrimers =
+                (List<IsisConfigurationBuilderPrimer>) servletContext.getAttribute(WebAppConstants.CONFIGURATION_PRIMERS_KEY);
         if (isisConfigurationBuilderPrimers == null) {
             return;
         }
         for (final IsisConfigurationBuilderPrimer isisConfigurationBuilderPrimer : isisConfigurationBuilderPrimers) {
+            LOG.debug("priming configurations for " + isisConfigurationBuilderPrimer);
             isisConfigurationBuilderPrimer.primeConfigurationBuilder(isisConfigurationBuilder);
         }
     }
@@ -150,9 +156,7 @@ public class IsisWebAppBootstrapper implements ServletContextListener {
      */
     private DeploymentType determineDeploymentType(final IsisConfigurationBuilder isisConfigurationBuilder, final ServletContext servletContext) {
         String deploymentTypeStr = null;
-        if (deploymentTypeStr == null) {
-            deploymentTypeStr = servletContext.getInitParameter(WebAppConstants.DEPLOYMENT_TYPE_KEY);
-        }
+        deploymentTypeStr = servletContext.getInitParameter(WebAppConstants.DEPLOYMENT_TYPE_KEY);
         if (deploymentTypeStr == null) {
             deploymentTypeStr = servletContext.getInitParameter(SystemConstants.DEPLOYMENT_TYPE_KEY);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
----------------------------------------------------------------------
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
index deb7b89..72e41dd 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
@@ -26,6 +26,7 @@ import org.mortbay.jetty.Connector;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.webapp.WebAppContext;
 
+import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault;
 import org.apache.isis.core.commons.lang.ArrayUtils;
 import org.apache.isis.core.commons.lang.StringUtils;
 import org.apache.isis.core.runtime.runner.Constants;
@@ -80,20 +81,25 @@ public class WebServer {
 
     public void run(final String[] args) {
         final IsisRunner runner = new IsisRunner(args, new OptionHandlerDeploymentTypeWebServer());
+        addOptionHandlersAndValidators(runner);
+        if (!runner.parseAndValidate()) {
+            return;
+        }
+        runner.setConfigurationBuilder(new IsisConfigurationBuilderDefault());
+        runner.primeConfigurationWithCommandLineOptions();
+        runner.loadInitialProperties();
+        
+        final WebServerBootstrapper bootstrapper = new WebServerBootstrapper(runner);
+        bootstrapper.bootstrap(null);
+        jettyServer = bootstrapper.getJettyServer();
+    }
 
+    private void addOptionHandlersAndValidators(IsisRunner runner) {
         // adjustments
         runner.addOptionHandler(new OptionHandlerPort());
         runner.addOptionHandler(new OptionHandlerAddress());
         runner.addOptionHandler(new OptionHandlerResourceBase());
         runner.addOptionHandler(new OptionHandlerStartupMode());
-
-        if (!runner.parseAndValidate()) {
-            return;
-        }
-
-        final WebServerBootstrapper bootstrapper = new WebServerBootstrapper(runner);
-        runner.bootstrap(bootstrapper);
-        jettyServer = bootstrapper.getJettyServer();
     }
 
     public void stop() {

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServerBootstrapper.java
----------------------------------------------------------------------
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServerBootstrapper.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServerBootstrapper.java
index 7b93799..d3bd971 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServerBootstrapper.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServerBootstrapper.java
@@ -44,9 +44,11 @@ import org.apache.isis.core.runtime.runner.IsisBootstrapper;
 import org.apache.isis.core.runtime.runner.IsisRunner;
 import org.apache.isis.core.webapp.WebAppConstants;
 import org.apache.isis.core.webserver.WebServer.StartupMode;
+import org.apache.log4j.Logger;
 
 final class WebServerBootstrapper implements IsisBootstrapper {
 
+    private static final Logger LOG = Logger.getLogger(WebServerBootstrapper.class);
     private static final String SRC_MAIN_WEBAPP = "src/main/webapp";
 
     private final IsisRunner runner;
@@ -63,7 +65,7 @@ final class WebServerBootstrapper implements IsisBootstrapper {
     @Override
     public void bootstrap(final Injector injector) {
 
-        final IsisConfigurationBuilder isisConfigurationBuilder = injector.getInstance(IsisConfigurationBuilder.class);
+        final IsisConfigurationBuilder isisConfigurationBuilder = runner.getStartupConfiguration();
 
         // we don't actually bootstrap the system here; instead we expect it to
         // be bootstrapped
@@ -72,6 +74,7 @@ final class WebServerBootstrapper implements IsisBootstrapper {
         final int port = configuration.getInteger(EMBEDDED_WEB_SERVER_PORT_KEY, EMBEDDED_WEB_SERVER_PORT_DEFAULT);
         final String webappContextPath = configuration.getString(EMBEDDED_WEB_SERVER_RESOURCE_BASE_KEY, EMBEDDED_WEB_SERVER_RESOURCE_BASE_DEFAULT);
         final StartupMode startupMode = StartupMode.lookup(configuration.getString(EMBEDDED_WEB_SERVER_STARTUP_MODE_KEY, EMBEDDED_WEB_SERVER_STARTUP_MODE_DEFAULT));
+        // TODO get and use the address
 
         jettyServer = new Server(port);
         final WebAppContext context = new WebAppContext(SRC_MAIN_WEBAPP, webappContextPath);
@@ -80,6 +83,7 @@ final class WebServerBootstrapper implements IsisBootstrapper {
 
         jettyServer.setHandler(context);
 
+        LOG.info("starting Jetty on port " + port + " to serve webapp");
         try {
             jettyServer.start();
             if (startupMode.isForeground()) {
@@ -97,7 +101,7 @@ final class WebServerBootstrapper implements IsisBootstrapper {
     /**
      * Bound to the {@link WebAppContext} so that they can be used when
      * bootstrapping.
-     * 
+     *
      * @param context
      */
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/isis/blob/18ab2b56/core/webserver/src/main/java/org/apache/isis/core/webserver/internal/OptionHandlerDeploymentTypeWebServer.java
----------------------------------------------------------------------
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/internal/OptionHandlerDeploymentTypeWebServer.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/internal/OptionHandlerDeploymentTypeWebServer.java
index f543175..9bddfb8 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/internal/OptionHandlerDeploymentTypeWebServer.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/internal/OptionHandlerDeploymentTypeWebServer.java
@@ -31,6 +31,6 @@ public class OptionHandlerDeploymentTypeWebServer extends OptionHandlerDeploymen
     private static final String TYPES = TYPE_SERVER_EXPLORATION + "; " + TYPE_SERVER_PROTOTYPE + " (default); " + TYPE_SERVER;
 
     public OptionHandlerDeploymentTypeWebServer() {
-        super(DeploymentType.SERVER, TYPES);
+        super(DeploymentType.SERVER_PROTOTYPE, TYPES);
     }
 }