You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2016/11/02 00:19:08 UTC

svn commit: r1767592 [1/2] - in /qpid/java/trunk: bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ broker-core/src/main/java/org/apache/qpid/server/ broker-core/src/main/java/org/apache/qpid/server/configuration/ broker-core/src/main/jav...

Author: rgodfrey
Date: Wed Nov  2 00:19:08 2016
New Revision: 1767592

URL: http://svn.apache.org/viewvc?rev=1767592&view=rev
Log:
QPID-7486 : Refactor broker startup code

Added:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncher.java
      - copied, changed from r1767591, qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Broker.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncherListener.java   (with props)
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/SystemLauncherTest.java
      - copied, changed from r1767591, qpid/java/trunk/broker/src/test/java/org/apache/qpid/server/BrokerTest.java
    qpid/java/trunk/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/LogbackLoggingSystemLauncherListener.java   (with props)
Removed:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/BrokerOptionsTest.java
    qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Broker.java
    qpid/java/trunk/broker/src/test/java/org/apache/qpid/server/BrokerTest.java
Modified:
    qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBSystemConfig.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/JsonSystemConfig.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerRecovererTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecovererTest.java
    qpid/java/trunk/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfig.java
    qpid/java/trunk/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerMemoryLoggerTest.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
    qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Main.java
    qpid/java/trunk/broker/src/test/java/org/apache/qpid/server/MainTest.java
    qpid/java/trunk/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
    qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/AbstractBrokerHolder.java
    qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
    qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
    qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/AuthenticationProviderRestTest.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/PortRestTest.java

Modified: qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBSystemConfig.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBSystemConfig.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBSystemConfig.java (original)
+++ qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBSystemConfig.java Wed Nov  2 00:19:08 2016
@@ -30,7 +30,7 @@ import org.apache.qpid.server.store.pref
 public interface BDBSystemConfig<X extends BDBSystemConfig<X>> extends SystemConfig<X>, FileBasedSettings,
                                                                        SizeMonitoringSettings, PreferenceStoreProvider
 {
-    @ManagedAttribute(mandatory = true)
+    @ManagedAttribute(defaultValue = "${qpid.work_dir}${file.separator}config")
     String getStorePath();
 
     @ManagedAttribute(mandatory = true, defaultValue = "0")

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncher.java (from r1767591, qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Broker.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncher.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncher.java&p1=qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Broker.java&r1=1767591&r2=1767592&rev=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Broker.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncher.java Wed Nov  2 00:19:08 2016
@@ -20,67 +20,59 @@
  */
 package org.apache.qpid.server;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.security.Principal;
 import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
+import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import javax.security.auth.Subject;
 
-import ch.qos.logback.classic.Level;
 import com.google.common.util.concurrent.ListenableFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.server.configuration.BrokerProperties;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
 import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.logging.LogMessage;
 import org.apache.qpid.server.logging.LoggingMessageLogger;
 import org.apache.qpid.server.logging.MessageLogger;
 import org.apache.qpid.server.logging.SystemOutMessageLogger;
-import org.apache.qpid.server.logging.logback.QpidLoggerTurboFilter;
-import org.apache.qpid.server.logging.logback.StartupAppender;
+import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.SystemConfig;
 import org.apache.qpid.server.plugin.PluggableFactoryLoader;
 import org.apache.qpid.server.plugin.SystemConfigFactory;
 import org.apache.qpid.server.security.auth.TaskPrincipal;
-import org.apache.qpid.server.util.Action;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class Broker
+public class SystemLauncher
 {
-    private static final Logger LOGGER = LoggerFactory.getLogger(Broker.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(SystemLauncher.class);
+    public static final SystemLauncherListener.DefaultSystemLauncherListener DEFAULT_SYSTEM_LAUNCHER_LISTENER =
+            new SystemLauncherListener.DefaultSystemLauncherListener();
 
     private EventLogger _eventLogger;
     private final TaskExecutor _taskExecutor = new TaskExecutorImpl();
 
     private volatile SystemConfig _systemConfig;
 
-    private final Action<Integer> _shutdownAction;
+    private SystemLauncherListener _listener;
+
     private final Principal _systemPrincipal = new SystemPrincipal();
     private final Subject _brokerTaskSubject;
 
 
-    public Broker()
-    {
-        this(null);
-    }
-
-    public Broker(Action<Integer> shutdownAction)
+    public SystemLauncher(SystemLauncherListener listener)
     {
-        _shutdownAction = shutdownAction;
+        _listener = listener;
         _brokerTaskSubject = new Subject(true,
                                          new HashSet<>(Arrays.asList(_systemPrincipal, new TaskPrincipal("Broker"))),
                                          Collections.emptySet(),
@@ -88,6 +80,18 @@ public class Broker
 
     }
 
+    public SystemLauncher(SystemLauncherListener... listeners)
+    {
+        this(new SystemLauncherListener.ChainedSystemLauncherListener(listeners));
+    }
+
+
+
+    public SystemLauncher()
+    {
+        this(DEFAULT_SYSTEM_LAUNCHER_LISTENER);
+    }
+
     public Principal getSystemPrincipal()
     {
         return _systemPrincipal;
@@ -112,6 +116,13 @@ public class Broker
         catch (TimeoutException | InterruptedException | ExecutionException e)
         {
             LOGGER.warn("Attempting to cleanly shutdown took too long, exiting immediately");
+            _listener.exceptionOnShutdown(e);
+
+        }
+        catch(RuntimeException e)
+        {
+            _listener.exceptionOnShutdown(e);
+            throw e;
         }
         finally
         {
@@ -123,54 +134,38 @@ public class Broker
     {
         _taskExecutor.stop();
 
-        if (_shutdownAction != null)
-        {
-            _shutdownAction.performAction(exitStatusCode);
-        }
+        _listener.onShutdown(exitStatusCode);
 
         _systemConfig = null;
     }
 
-    public void startup() throws Exception
-    {
-        startup(new BrokerOptions());
-    }
 
-    public void startup(final BrokerOptions options) throws Exception
+    public void startup(final Map<String,Object> systemConfigAttributes) throws Exception
     {
-        _eventLogger = new EventLogger(new SystemOutMessageLogger());
+        final SystemOutMessageLogger systemOutMessageLogger = new SystemOutMessageLogger();
+
+        _eventLogger = new EventLogger(systemOutMessageLogger);
         Subject.doAs(_brokerTaskSubject, new PrivilegedExceptionAction<Object>()
         {
             @Override
             public Object run() throws Exception
             {
-                ch.qos.logback.classic.Logger logger =
-                        (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-                if (!logger.iteratorForAppenders().hasNext())
-                {
-                    logger.setLevel(Level.ALL);
-                    logger.setAdditive(true);
-                }
-
-                StartupAppender startupAppender = new StartupAppender();
-                startupAppender.setContext(logger.getLoggerContext());
-                startupAppender.start();
-                logger.addAppender(startupAppender);
+                _listener.beforeStartup();
 
                 try
                 {
-                    startupImpl(options);
+                    startupImpl(systemConfigAttributes);
                 }
                 catch (RuntimeException e)
                 {
+                    systemOutMessageLogger.message(new SystemStartupMessage(e));
                     LOGGER.error("Exception during startup", e);
-                    startupAppender.logToConsole();
+                    _listener.errorOnStartup(e);
                     closeSystemConfigAndCleanUp();
                 }
                 finally
                 {
-                    logger.detachAppender(startupAppender);
-                    startupAppender.stop();
+                    _listener.afterStartup();
                 }
                 return null;
             }
@@ -178,11 +173,11 @@ public class Broker
 
     }
 
-    private void startupImpl(final BrokerOptions options) throws Exception
+    private void startupImpl(Map<String,Object> systemConfigAttributes) throws Exception
     {
-        populateSystemPropertiesFromDefaults(options.getInitialSystemProperties());
+        BrokerProperties.populateSystemPropertiesFromDefaults((String) systemConfigAttributes.get(SystemConfig.INITIAL_SYSTEM_PROPERTIES_LOCATION));
 
-        String storeType = options.getConfigurationStoreType();
+        String storeType = (String) systemConfigAttributes.get(SystemConfig.TYPE);
 
         // Create the RootLogger to be used during broker operation
         boolean statusUpdatesEnabled = Boolean.parseBoolean(System.getProperty(BrokerProperties.PROPERTY_STATUS_UPDATES, "true"));
@@ -203,41 +198,32 @@ public class Broker
         _systemConfig = configFactory.newInstance(_taskExecutor,
                                                   _eventLogger,
                                                   _systemPrincipal,
-                                                  options.convertToSystemConfigAttributes());
-
-        _systemConfig.setOnContainerResolveTask(new Runnable() {
-
-            @Override
-            public void run()
-            {
-
-                ch.qos.logback.classic.Logger rootLogger =
-                        (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+                                                  systemConfigAttributes);
 
-                StartupAppender startupAppender = (StartupAppender) rootLogger.getAppender(StartupAppender.class.getName());
-                if (startupAppender != null)
+        _systemConfig.setOnContainerResolveTask(
+                new Runnable()
                 {
-                    rootLogger.detachAppender(startupAppender);
-                    startupAppender.stop();
-                }
-
-            }
-        });
-        _systemConfig.setOnContainerCloseTask(new Runnable()
-        {
-
-            @Override
-            public void run()
-            {
+                    @Override
+                    public void run()
+                    {
+                        _listener.onContainerResolve(_systemConfig);
+                    }
+                });
 
-                QpidLoggerTurboFilter.uninstallFromRootContext();
+        _systemConfig.setOnContainerCloseTask(
+                new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        _listener.onContainerClose(_systemConfig);
 
-            }
-        });
+                    }
+                });
 
 
         _systemConfig.open();
-        if (_systemConfig.getChild(org.apache.qpid.server.model.Broker.class).getState() == State.ERRORED)
+        if (_systemConfig.getChild(Broker.class).getState() == State.ERRORED)
         {
             throw new RuntimeException("Closing broker as it cannot operate due to errors");
         }
@@ -265,46 +251,40 @@ public class Broker
         }
     }
 
-    public static void populateSystemPropertiesFromDefaults(final String initialProperties) throws IOException
+    private static final class SystemPrincipal implements Principal
     {
-        URL initialPropertiesLocation;
-        if(initialProperties == null)
-        {
-            initialPropertiesLocation = Broker.class.getClassLoader().getResource("system.properties");
-        }
-        else
+        private SystemPrincipal()
         {
-            initialPropertiesLocation = (new File(initialProperties)).toURI().toURL();
         }
 
-        Properties props = new Properties(CommonProperties.asProperties());
-        if(initialPropertiesLocation != null)
+        @Override
+        public String getName()
         {
-
-            try(InputStream inStream = initialPropertiesLocation.openStream())
-            {
-                props.load(inStream);
-            }
+            return "SYSTEM";
         }
+    }
+
+    private static class SystemStartupMessage implements LogMessage
+    {
+        private final RuntimeException _exception;
 
-        Set<String> propertyNames = new HashSet<>(props.stringPropertyNames());
-        propertyNames.removeAll(System.getProperties().stringPropertyNames());
-        for (String propName : propertyNames)
+        public SystemStartupMessage(final RuntimeException exception)
         {
-            System.setProperty(propName, props.getProperty(propName));
+            _exception = exception;
         }
-    }
 
-    private static final class SystemPrincipal implements Principal
-    {
-        private SystemPrincipal()
+        @Override
+        public String getLogHierarchy()
         {
+            return "system";
         }
 
         @Override
-        public String getName()
+        public String toString()
         {
-            return "SYSTEM";
+            StringWriter writer = new StringWriter();
+            _exception.printStackTrace(new PrintWriter(writer));
+            return "Exception during startup: \n" + writer.toString();
         }
     }
 }

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncherListener.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncherListener.java?rev=1767592&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncherListener.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncherListener.java Wed Nov  2 00:19:08 2016
@@ -0,0 +1,153 @@
+/*
+ *
+ * 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.qpid.server;
+
+import org.apache.qpid.server.model.SystemConfig;
+
+public interface SystemLauncherListener
+{
+    void beforeStartup();
+    void errorOnStartup(RuntimeException e);
+    void afterStartup();
+    void onContainerResolve(SystemConfig<?> systemConfig);
+    void onContainerClose(SystemConfig<?> systemConfig);
+    void onShutdown(int exitCode);
+
+    void exceptionOnShutdown(Exception e);
+
+    class DefaultSystemLauncherListener implements SystemLauncherListener
+    {
+        @Override
+        public void beforeStartup()
+        {
+
+        }
+
+        @Override
+        public void errorOnStartup(final RuntimeException e)
+        {
+
+        }
+
+        @Override
+        public void afterStartup()
+        {
+
+        }
+
+        @Override
+        public void onContainerResolve(final SystemConfig<?> systemConfig)
+        {
+
+        }
+
+        @Override
+        public void onContainerClose(final SystemConfig<?> systemConfig)
+        {
+
+        }
+
+        @Override
+        public void onShutdown(final int exitCode)
+        {
+
+        }
+
+        @Override
+        public void exceptionOnShutdown(final Exception e)
+        {
+        }
+    }
+
+
+    class ChainedSystemLauncherListener implements SystemLauncherListener
+    {
+        private final SystemLauncherListener[] _listeners;
+
+        public ChainedSystemLauncherListener(SystemLauncherListener... chain)
+        {
+            _listeners = chain;
+        }
+
+        @Override
+        public void beforeStartup()
+        {
+            for (SystemLauncherListener listener : _listeners)
+            {
+                listener.beforeStartup();
+            }
+        }
+
+        @Override
+        public void errorOnStartup(final RuntimeException e)
+        {
+            for (SystemLauncherListener listener : _listeners)
+            {
+                listener.errorOnStartup(e);
+            }
+        }
+
+        @Override
+        public void afterStartup()
+        {
+            for (SystemLauncherListener listener : _listeners)
+            {
+                listener.afterStartup();
+            }
+        }
+
+        @Override
+        public void onContainerResolve(final SystemConfig<?> systemConfig)
+        {
+            for (SystemLauncherListener listener : _listeners)
+            {
+                listener.onContainerResolve(systemConfig);
+            }
+        }
+
+        @Override
+        public void onContainerClose(final SystemConfig<?> systemConfig)
+        {
+            for (SystemLauncherListener listener : _listeners)
+            {
+                listener.onContainerClose(systemConfig);
+            }
+        }
+
+        @Override
+        public void onShutdown(final int exitCode)
+        {
+            for(SystemLauncherListener listener : _listeners)
+            {
+                listener.onShutdown(exitCode);
+            }
+        }
+
+        @Override
+        public void exceptionOnShutdown(final Exception e)
+        {
+            for(SystemLauncherListener listener : _listeners)
+            {
+                listener.exceptionOnShutdown(e);
+            }
+        }
+    }
+}

Propchange: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/SystemLauncherListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java Wed Nov  2 00:19:08 2016
@@ -20,7 +20,17 @@
  */
 package org.apache.qpid.server.configuration;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
 import java.util.Locale;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.qpid.configuration.CommonProperties;
+import org.apache.qpid.server.SystemLauncher;
 
 /**
  * Declares broker system property names
@@ -43,6 +53,21 @@ public class BrokerProperties
     public static final String PROPERTY_QPID_WORK = "QPID_WORK";
     public static final String POSIX_FILE_PERMISSIONS = "qpid.default_posix_file_permissions";
     public static final String PROPERTY_STARTUP_FAILOVER_CONSOLE_LOG_LEVEL = "qpid.startup_failover_console_log_level";
+    /**
+     * Configuration property name for the absolute path to use for the broker work directory.
+     *
+     * If not otherwise set, the value for this configuration property defaults to the location
+     * set in the "QPID_WORK" system property if that was set, or the 'work' sub-directory of
+     * the JVM working directory ("user.dir" property) for the Java process if it was not.
+     */
+    public static final String QPID_WORK_DIR  = "qpid.work_dir";
+    /**
+     * Configuration property name for the absolute path to use for the broker home directory.
+     *
+     * If not otherwise set, the value for this configuration property defaults to the location
+     * set in the "QPID_HOME" system property if that was set, or remains unset if it was not.
+     */
+    public static final String QPID_HOME_DIR  = "qpid.home_dir";
 
     private BrokerProperties()
     {
@@ -66,4 +91,34 @@ public class BrokerProperties
         }
         return locale;
     }
+
+    public static void populateSystemPropertiesFromDefaults(final String initialProperties) throws IOException
+    {
+        URL initialPropertiesLocation;
+        if(initialProperties == null)
+        {
+            initialPropertiesLocation = SystemLauncher.class.getClassLoader().getResource("system.properties");
+        }
+        else
+        {
+            initialPropertiesLocation = (new File(initialProperties)).toURI().toURL();
+        }
+
+        Properties props = new Properties(CommonProperties.asProperties());
+        if(initialPropertiesLocation != null)
+        {
+
+            try(InputStream inStream = initialPropertiesLocation.openStream())
+            {
+                props.load(inStream);
+            }
+        }
+
+        Set<String> propertyNames = new HashSet<>(props.stringPropertyNames());
+        propertyNames.removeAll(System.getProperties().stringPropertyNames());
+        for (String propName : propertyNames)
+        {
+            System.setProperty(propName, props.getProperty(propName));
+        }
+    }
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java Wed Nov  2 00:19:08 2016
@@ -3233,6 +3233,16 @@ public abstract class AbstractConfigured
         }
     }
 
+    static String interpolate(Model model, String value)
+    {
+            return Strings.expand(value, false,
+                                  JSON_SUBSTITUTION_RESOLVER,
+                                  Strings.JAVA_SYS_PROPS_RESOLVER,
+                                  Strings.ENV_VARS_RESOLVER,
+                                  model.getTypeRegistry().getDefaultContextResolver());
+    }
+
+
     private static OwnAttributeResolver getOwnAttributeResolver(final ConfiguredObject<?> object)
     {
         return object instanceof AbstractConfiguredObject

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java Wed Nov  2 00:19:08 2016
@@ -99,6 +99,9 @@ public abstract class AbstractSystemConf
     private String _initialConfigurationLocation;
 
     @ManagedAttributeField
+    private String _initialSystemPropertiesLocation;
+
+    @ManagedAttributeField
     private boolean _startupLoggedToSystemOut;
 
     @ManagedAttributeField
@@ -436,6 +439,12 @@ public abstract class AbstractSystemConf
     }
 
     @Override
+    public String getInitialSystemPropertiesLocation()
+    {
+        return _initialSystemPropertiesLocation;
+    }
+
+    @Override
     public boolean isStartupLoggedToSystemOut()
     {
         return _startupLoggedToSystemOut;
@@ -495,6 +504,21 @@ public abstract class AbstractSystemConf
         _onContainerCloseTask = onContainerCloseTask;
     }
 
+    public static String getDefaultValue(String attrName)
+    {
+        Model model = SystemConfigBootstrapModel.getInstance();
+        ConfiguredObjectTypeRegistry typeRegistry = model.getTypeRegistry();
+        final ConfiguredObjectAttribute<?, ?> attr = typeRegistry.getAttributeTypes(SystemConfig.class).get(attrName);
+        if(attr instanceof ConfiguredSettableAttribute)
+        {
+            return interpolate(model, ((ConfiguredSettableAttribute)attr).defaultValue());
+        }
+        else
+        {
+            return null;
+        }
+    }
+
     private class ShutdownService implements Runnable
     {
         public void run()

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java Wed Nov  2 00:19:08 2016
@@ -51,7 +51,6 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.configuration.CommonProperties;
-import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.BrokerPrincipal;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
@@ -157,7 +156,7 @@ public class BrokerImpl extends Abstract
             authManagerAttrs.put(NAME,"MANAGEMENT_MODE_AUTHENTICATION");
             authManagerAttrs.put(ID, UUID.randomUUID());
             SimpleAuthenticationManager authManager = new SimpleAuthenticationManager(authManagerAttrs, this);
-            authManager.addUser(BrokerOptions.MANAGEMENT_MODE_USER_NAME, _parent.getManagementModePassword());
+            authManager.addUser(SystemConfig.MANAGEMENT_MODE_USER_NAME, _parent.getManagementModePassword());
             _managementModeAuthenticationProvider = authManager;
             _accessControl = AccessControl.ALWAYS_ALLOWED;
         }
@@ -418,7 +417,7 @@ public class BrokerImpl extends Abstract
 
         if (isManagementMode())
         {
-            _eventLogger.message(BrokerMessages.MANAGEMENT_MODE(BrokerOptions.MANAGEMENT_MODE_USER_NAME,
+            _eventLogger.message(BrokerMessages.MANAGEMENT_MODE(SystemConfig.MANAGEMENT_MODE_USER_NAME,
                                                                 _parent.getManagementModePassword()));
         }
         setState(State.ACTIVE);

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/JsonSystemConfig.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/JsonSystemConfig.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/JsonSystemConfig.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/JsonSystemConfig.java Wed Nov  2 00:19:08 2016
@@ -24,6 +24,6 @@ import org.apache.qpid.server.store.File
 
 public interface JsonSystemConfig<X extends JsonSystemConfig<X>> extends SystemConfig<X>, FileBasedSettings
 {
-    @ManagedAttribute( mandatory = true )
+    @ManagedAttribute( defaultValue = "${qpid.work_dir}${file.separator}config.json")
     public String getStorePath();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/SystemConfig.java Wed Nov  2 00:19:08 2016
@@ -29,20 +29,32 @@ import org.apache.qpid.server.store.pref
 @ManagedObject (creatable = false)
 public interface SystemConfig<X extends SystemConfig<X>> extends ConfiguredObject<X>, ModelRoot, PreferencesRoot
 {
+
     String MANAGEMENT_MODE = "managementMode";
     
     String MANAGEMENT_MODE_QUIESCE_VIRTUAL_HOSTS = "managementModeQuiesceVirtualHosts";
     String MANAGEMENT_MODE_HTTP_PORT_OVERRIDE = "managementModeHttpPortOverride";
     String MANAGEMENT_MODE_PASSWORD = "managementModePassword";
     String INITIAL_CONFIGURATION_LOCATION = "initialConfigurationLocation";
+    String INITIAL_SYSTEM_PROPERTIES_LOCATION = "initialSystemPropertiesLocation";
     String STARTUP_LOGGED_TO_SYSTEM_OUT = "startupLoggedToSystemOut";
 
+
+    @ManagedContextDefault(name=BrokerProperties.PROPERTY_QPID_WORK)
+    String DEFAULT_QPID_WORK = "${user.dir}${file.separator}work";
+
+    @ManagedContextDefault(name=BrokerProperties.QPID_WORK_DIR)
+    String DEFAULT_QPID_WORK_DIR = "${QPID_WORK}";
+
     @ManagedContextDefault(name="qpid.broker.defaultPreferenceStoreAttributes")
     String DEFAULT_PREFERENCE_STORE_ATTRIBUTES = "{\"type\": \"JSON\", \"attributes\":{\"path\": \"${json:qpid.work_dir}${json:file.separator}preferences.json\"}}";
 
     @ManagedContextDefault(name = BrokerProperties.POSIX_FILE_PERMISSIONS)
     String DEFAULT_POSIX_FILE_PERMISSIONS = "rw-r-----";
 
+
+    String MANAGEMENT_MODE_USER_NAME = "mm_admin";
+
     @ManagedAttribute(immutable = true, defaultValue = Broker.BROKER_TYPE)
     String getDefaultContainerType();
 
@@ -58,9 +70,17 @@ public interface SystemConfig<X extends
     @ManagedAttribute(secure = true)
     String getManagementModePassword();
 
-    @ManagedAttribute
+    String DEFAULT_INITIAL_CONFIG_NAME = "initial-config.json";
+
+    @ManagedContextDefault(name="qpid.initialConfigurationLocation")
+    String DEFAULT_INITIAL_CONFIG_LOCATION = SystemConfig.class.getClassLoader().getResource(DEFAULT_INITIAL_CONFIG_NAME).toExternalForm();
+
+    @ManagedAttribute(defaultValue = "${qpid.initialConfigurationLocation}")
     String getInitialConfigurationLocation();
 
+    @ManagedAttribute
+    String getInitialSystemPropertiesLocation();
+
     @ManagedAttribute(defaultValue = "true")
     boolean isStartupLoggedToSystemOut();
 

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactory.java Wed Nov  2 00:19:08 2016
@@ -55,7 +55,7 @@ import javax.crypto.spec.SecretKeySpec;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.BrokerOptions;
+import org.apache.qpid.server.configuration.BrokerProperties;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.plugin.ConditionallyAvailable;
@@ -115,7 +115,7 @@ public class AESKeyFileEncrypterFactory
         else
         {
 
-            fileLocation = object.getContextValue(String.class, BrokerOptions.QPID_WORK_DIR)
+            fileLocation = object.getContextValue(String.class, BrokerProperties.QPID_WORK_DIR)
                            + File.separator + DEFAULT_KEYS_SUBDIR_NAME + File.separator
                            + object.getCategoryClass().getSimpleName() + "_"
                            + object.getName() + ".key";

Copied: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/SystemLauncherTest.java (from r1767591, qpid/java/trunk/broker/src/test/java/org/apache/qpid/server/BrokerTest.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/SystemLauncherTest.java?p2=qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/SystemLauncherTest.java&p1=qpid/java/trunk/broker/src/test/java/org/apache/qpid/server/BrokerTest.java&r1=1767591&r2=1767592&rev=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker/src/test/java/org/apache/qpid/server/BrokerTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/SystemLauncherTest.java Wed Nov  2 00:19:08 2016
@@ -27,17 +27,18 @@ import java.io.PrintStream;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 
+import org.apache.qpid.server.logging.messages.BrokerMessages;
 import org.apache.qpid.server.model.BrokerModel;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.JsonSystemConfigImpl;
+import org.apache.qpid.server.model.SystemConfig;
 import org.apache.qpid.test.utils.QpidTestCase;
 import org.apache.qpid.test.utils.TestFileUtils;
 import org.apache.qpid.util.FileUtils;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.MDC;
-
-public class BrokerTest extends QpidTestCase
+public class SystemLauncherTest extends QpidTestCase
 {
     private static final String INITIAL_SYSTEM_PROPERTY = "test";
     private static final String INITIAL_SYSTEM_PROPERTY_VALUE = "testValue";
@@ -45,7 +46,7 @@ public class BrokerTest extends QpidTest
     private File _initialSystemProperties;
     private File _initialConfiguration;
     private File _brokerWork;
-    private Broker _broker;
+    private SystemLauncher _systemLauncher;
 
     @Override
     public void setUp() throws Exception
@@ -75,9 +76,9 @@ public class BrokerTest extends QpidTest
         }
         finally
         {
-            if (_broker != null)
+            if (_systemLauncher != null)
             {
-                _broker.shutdown();
+                _systemLauncher.shutdown();
             }
             System.clearProperty(INITIAL_SYSTEM_PROPERTY);
             FileUtils.delete(_brokerWork, true);
@@ -88,12 +89,13 @@ public class BrokerTest extends QpidTest
 
     public void testInitialSystemPropertiesAreSetOnBrokerStartup() throws Exception
     {
-        BrokerOptions options = new BrokerOptions();
-        options.setInitialSystemProperties(_initialSystemProperties.getAbsolutePath());
-        options.setStartupLoggedToSystemOut(true);
-        options.setInitialConfigurationLocation(_initialConfiguration.getAbsolutePath());
-        _broker = new Broker();
-        _broker.startup(options);
+        Map<String,Object> attributes = new HashMap<>();
+        attributes.put(SystemConfig.INITIAL_SYSTEM_PROPERTIES_LOCATION, _initialSystemProperties.getAbsolutePath());
+        attributes.put(SystemConfig.INITIAL_CONFIGURATION_LOCATION, _initialConfiguration.getAbsolutePath());
+        attributes.put(SystemConfig.TYPE, JsonSystemConfigImpl.SYSTEM_CONFIG_TYPE);
+        attributes.put(SystemConfig.STARTUP_LOGGED_TO_SYSTEM_OUT, Boolean.TRUE);
+        _systemLauncher = new SystemLauncher();
+        _systemLauncher.startup(attributes);
 
         // test JVM system property should be set from initial system config file
         assertEquals("Unexpected JVM system property", INITIAL_SYSTEM_PROPERTY_VALUE, System.getProperty(INITIAL_SYSTEM_PROPERTY));
@@ -104,54 +106,46 @@ public class BrokerTest extends QpidTest
 
     public void testConsoleLogsOnSuccessfulStartup() throws Exception
     {
-        String startupConsoleAppenderLogPrefix = getTestName() + "__$$ ";
-        byte[] outputBytes = startBrokerAndCollectSystemOutput(startupConsoleAppenderLogPrefix);
-        String outputString = new String(outputBytes);
-        assertFalse("Detected unexpected startup console appender prefix", outputString.contains(startupConsoleAppenderLogPrefix));
+        byte[] outputBytes = startBrokerAndCollectSystemOutput();
+        String output = new String(outputBytes);
+        assertFalse("Detected unexpected Exception: " + output, output.contains("Exception"));
+        assertTrue("Output does not contain Broker Ready Message", output.contains(BrokerMessages.READY().toString()));
     }
 
     public void testConsoleLogsOnUnsuccessfulStartup() throws Exception
     {
         Map<String,Object> initialConfig = new HashMap<>();
-        initialConfig.put(ConfiguredObject.NAME, "test");
-        initialConfig.put(org.apache.qpid.server.model.Broker.MODEL_VERSION, new Integer(Integer.MAX_VALUE).toString());
 
         ObjectMapper mapper = new ObjectMapper();
         String config = mapper.writeValueAsString(initialConfig);
         TestFileUtils.saveTextContentInFile(config, _initialConfiguration);
 
-        String startupConsoleAppenderLogPrefix = getTestName() + "__$$ ";
-        byte[] outputBytes = startBrokerAndCollectSystemOutput(startupConsoleAppenderLogPrefix);
-        assertTrue("Startup console appender prefix is not found", new String(outputBytes).contains(startupConsoleAppenderLogPrefix));
+        byte[] outputBytes = startBrokerAndCollectSystemOutput();
+        String output = new String(outputBytes);
+        assertTrue("No Exception detected in output: " + output, output.contains("Exception"));
+        assertFalse("Output contains Broker Ready Message", output.contains(BrokerMessages.READY().toString()));
     }
 
-    private byte[] startBrokerAndCollectSystemOutput(String startupConsoleAppenderLogPrefix) throws Exception
+    private byte[] startBrokerAndCollectSystemOutput() throws Exception
     {
         try(ByteArrayOutputStream out = new ByteArrayOutputStream())
         {
 
             PrintStream originalOutput = System.out;
-            String originalPrefix = MDC.get("qpid.log.prefix");
-            MDC.put("qpid.log.prefix", startupConsoleAppenderLogPrefix);
             try
             {
                 System.setOut(new PrintStream(out));
-                BrokerOptions options = new BrokerOptions();
-                options.setInitialConfigurationLocation(_initialConfiguration.getAbsolutePath());
-                _broker = new Broker();
-                _broker.startup(options);
+
+                Map<String,Object> attributes = new HashMap<>();
+                attributes.put(SystemConfig.INITIAL_CONFIGURATION_LOCATION, _initialConfiguration.getAbsolutePath());
+                attributes.put(SystemConfig.TYPE, JsonSystemConfigImpl.SYSTEM_CONFIG_TYPE);
+
+                _systemLauncher = new SystemLauncher();
+                _systemLauncher.startup(attributes);
             }
             finally
             {
                 System.setOut(originalOutput);
-                if (originalPrefix == null)
-                {
-                    MDC.remove("qpid.log.prefix");
-                }
-                else
-                {
-                    MDC.put("qpid.log.prefix", originalPrefix);
-                }
             }
 
             return out.toByteArray();

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java Wed Nov  2 00:19:08 2016
@@ -42,7 +42,6 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
@@ -66,7 +65,7 @@ import org.apache.qpid.test.utils.QpidTe
 public class ManagementModeStoreHandlerTest extends QpidTestCase
 {
     private ManagementModeStoreHandler _handler;
-    private BrokerOptions _options;
+    private Map<String,Object> _systemConfigAttributes;
     private DurableConfigurationStore _store;
     private ConfiguredObjectRecord _root;
     private ConfiguredObjectRecord _portEntry;
@@ -84,7 +83,7 @@ public class ManagementModeStoreHandlerT
         _taskExecutor.start();
 
         _systemConfig = new JsonSystemConfigImpl(_taskExecutor, mock(EventLogger.class),
-                                                 null, new BrokerOptions().convertToSystemConfigAttributes());
+                                                 null, new HashMap<String, Object>());
 
 
         ConfiguredObjectRecord systemContextRecord = _systemConfig.asObjectRecord();
@@ -113,7 +112,7 @@ public class ManagementModeStoreHandlerT
                     }
                 }
                 ).when(_store).openConfigurationStore(recovererArgumentCaptor.capture());
-        _options = new BrokerOptions();
+        _systemConfigAttributes = new HashMap<>();
 
         _handler = new ManagementModeStoreHandler(_store, _systemConfig);;
 
@@ -123,8 +122,10 @@ public class ManagementModeStoreHandlerT
     private ManagementModeStoreHandler createManagementModeStoreHandler()
     {
         _systemConfig.close();
-        Map<String, Object> attributes = new HashMap<>(_options.convertToSystemConfigAttributes());
+        Map<String, Object> attributes = new HashMap<>(_systemConfigAttributes);
         attributes.put(ConfiguredObject.DESIRED_STATE, State.QUIESCED);
+        attributes.remove(ConfiguredObject.TYPE);
+
         _systemConfig = new AbstractSystemConfig(_taskExecutor,
                                                  mock(EventLogger.class),
                                                  mock(Principal.class), attributes)
@@ -236,7 +237,7 @@ public class ManagementModeStoreHandlerT
 
     public void testGetRootEntryWithHttpPortOverriden()
     {
-        _options.setManagementModeHttpPortOverride(9090);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,9090);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();
@@ -250,7 +251,7 @@ public class ManagementModeStoreHandlerT
 
     public void testGetRootEntryWithManagementPortsOverriden()
     {
-        _options.setManagementModeHttpPortOverride(1000);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,1000);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();
@@ -283,7 +284,7 @@ public class ManagementModeStoreHandlerT
 
     public void testGetEntryByCLIHttpPortId()
     {
-        _options.setManagementModeHttpPortOverride(9090);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,9090);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
 
@@ -299,7 +300,7 @@ public class ManagementModeStoreHandlerT
         Map<String, Object> attributes = new HashMap<String, Object>();
         attributes.put(Port.PROTOCOLS, Collections.singleton(Protocol.HTTP));
         when(_portEntry.getAttributes()).thenReturn(attributes);
-        _options.setManagementModeHttpPortOverride(9090);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,9090);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
 
@@ -345,7 +346,7 @@ public class ManagementModeStoreHandlerT
         State expectedState = mmQuiesceVhosts ? State.QUIESCED : null;
         if(mmQuiesceVhosts)
         {
-            _options.setManagementModeQuiesceVirtualHosts(mmQuiesceVhosts);
+            _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_QUIESCE_VIRTUAL_HOSTS, mmQuiesceVhosts);
         }
 
         _handler = createManagementModeStoreHandler();
@@ -375,7 +376,7 @@ public class ManagementModeStoreHandlerT
 
     public void testSavePort()
     {
-        _options.setManagementModeHttpPortOverride(1000);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,1000);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();
@@ -391,7 +392,7 @@ public class ManagementModeStoreHandlerT
 
     public void testSaveRoot()
     {
-        _options.setManagementModeHttpPortOverride(1000);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,1000);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();
@@ -407,7 +408,7 @@ public class ManagementModeStoreHandlerT
 
     public void testSaveCLIHttpPort()
     {
-        _options.setManagementModeHttpPortOverride(1000);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,1000);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();
@@ -432,7 +433,7 @@ public class ManagementModeStoreHandlerT
 
     public void testRemove()
     {
-        _options.setManagementModeHttpPortOverride(1000);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,1000);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();
@@ -469,7 +470,7 @@ public class ManagementModeStoreHandlerT
 
     public void testRemoveCLIPort()
     {
-        _options.setManagementModeHttpPortOverride(1000);
+        _systemConfigAttributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE,1000);
         _handler = createManagementModeStoreHandler();
         _handler.init(_systemConfig);
         Collection<ConfiguredObjectRecord> records = openAndGetRecords();

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypterFactoryTest.java Wed Nov  2 00:19:08 2016
@@ -49,7 +49,7 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-import org.apache.qpid.server.BrokerOptions;
+import org.apache.qpid.server.configuration.BrokerProperties;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.test.utils.QpidTestCase;
 
@@ -67,7 +67,7 @@ public class AESKeyFileEncrypterFactoryT
         _tmpDir = Files.createTempDirectory(getTestName());
 
         when(_broker.getContextKeys(eq(false))).thenReturn(Collections.<String>emptySet());
-        when(_broker.getContextValue(eq(String.class), eq(BrokerOptions.QPID_WORK_DIR))).thenReturn(_tmpDir.toString());
+        when(_broker.getContextValue(eq(String.class), eq(BrokerProperties.QPID_WORK_DIR))).thenReturn(_tmpDir.toString());
         when(_broker.getCategoryClass()).thenReturn(Broker.class);
         when(_broker.getName()).thenReturn(getName());
         final ArgumentCaptor<Map> attributesCaptor = ArgumentCaptor.forClass(Map.class);

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerRecovererTest.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerRecovererTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerRecovererTest.java Wed Nov  2 00:19:08 2016
@@ -29,7 +29,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
@@ -63,7 +62,7 @@ public class BrokerRecovererTest extends
         _taskExecutor.start();
         _systemConfig = new JsonSystemConfigImpl(_taskExecutor,
                                                  mock(EventLogger.class),
-                                                 null, new BrokerOptions().convertToSystemConfigAttributes())
+                                                 null, new HashMap<String,Object>())
         {
 
             {

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecovererTest.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecovererTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecovererTest.java Wed Nov  2 00:19:08 2016
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.model.BrokerModel;
@@ -78,7 +77,7 @@ public class BrokerStoreUpgraderAndRecov
         _taskExecutor.start();
         _systemConfig = new JsonSystemConfigImpl(_taskExecutor,
                                                  mock(EventLogger.class),
-                                                 null, new BrokerOptions().convertToSystemConfigAttributes());
+                                                 null, new HashMap<String,Object>());
     }
 
     public void testUpgradeVirtualHostWithJDBCStoreAndBoneCPPool()

Modified: qpid/java/trunk/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfig.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfig.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfig.java (original)
+++ qpid/java/trunk/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfig.java Wed Nov  2 00:19:08 2016
@@ -29,7 +29,7 @@ import org.apache.qpid.server.store.pref
 public interface DerbySystemConfig<X extends DerbySystemConfig<X>> extends SystemConfig<X>, FileBasedSettings,
                                                                            SizeMonitoringSettings
 {
-    @ManagedAttribute(mandatory = true)
+    @ManagedAttribute(defaultValue = "${qpid.work_dir}${file.separator}config.json")
     String getStorePath();
 
     @ManagedAttribute(mandatory = true, defaultValue = "0")

Added: qpid/java/trunk/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/LogbackLoggingSystemLauncherListener.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/LogbackLoggingSystemLauncherListener.java?rev=1767592&view=auto
==============================================================================
--- qpid/java/trunk/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/LogbackLoggingSystemLauncherListener.java (added)
+++ qpid/java/trunk/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/LogbackLoggingSystemLauncherListener.java Wed Nov  2 00:19:08 2016
@@ -0,0 +1,95 @@
+/*
+ *
+ * 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.qpid.server.logging.logback;
+
+import ch.qos.logback.classic.Level;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.SystemLauncherListener;
+import org.apache.qpid.server.model.SystemConfig;
+
+public class LogbackLoggingSystemLauncherListener implements SystemLauncherListener
+{
+    private StartupAppender _startupAppender;
+    private ch.qos.logback.classic.Logger _logger;
+
+    @Override
+    public void beforeStartup()
+    {
+        _logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+        if (!_logger.iteratorForAppenders().hasNext())
+        {
+            _logger.setLevel(Level.ALL);
+            _logger.setAdditive(true);
+        }
+
+        _startupAppender = new StartupAppender();
+        _startupAppender.setContext(_logger.getLoggerContext());
+        _startupAppender.start();
+        _logger.addAppender(_startupAppender);
+
+    }
+
+    @Override
+    public void errorOnStartup(final RuntimeException e)
+    {
+        _startupAppender.logToConsole();
+    }
+
+    @Override
+    public void afterStartup()
+    {
+        _logger.detachAppender(_startupAppender);
+        _startupAppender.stop();
+    }
+
+    @Override
+    public void onContainerResolve(SystemConfig<?> systemConfig)
+    {
+        ch.qos.logback.classic.Logger rootLogger =
+                (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+
+        StartupAppender startupAppender = (StartupAppender) rootLogger.getAppender(StartupAppender.class.getName());
+        if (startupAppender != null)
+        {
+            rootLogger.detachAppender(startupAppender);
+            startupAppender.stop();
+        }
+    }
+
+    @Override
+    public void onContainerClose(final SystemConfig<?> systemConfig)
+    {
+        QpidLoggerTurboFilter.uninstallFromRootContext();
+    }
+
+
+    @Override
+    public void onShutdown(final int exitCode)
+    {
+    }
+
+    @Override
+    public void exceptionOnShutdown(final Exception e)
+    {
+    }
+}

Propchange: qpid/java/trunk/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/LogbackLoggingSystemLauncherListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: qpid/java/trunk/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerMemoryLoggerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerMemoryLoggerTest.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerMemoryLoggerTest.java (original)
+++ qpid/java/trunk/broker-plugins/logging-logback/src/test/java/org/apache/qpid/server/logging/logback/BrokerMemoryLoggerTest.java Wed Nov  2 00:19:08 2016
@@ -29,12 +29,13 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.qpid.server.BrokerOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
-import org.apache.qpid.server.logging.logback.BrokerMemoryLogger;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerLogger;
 import org.apache.qpid.server.model.BrokerModel;
@@ -44,8 +45,6 @@ import org.apache.qpid.server.model.Syst
 import org.apache.qpid.server.store.ConfiguredObjectRecord;
 import org.apache.qpid.server.store.GenericRecoverer;
 import org.apache.qpid.test.utils.QpidTestCase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class BrokerMemoryLoggerTest extends QpidTestCase
 {
@@ -62,7 +61,7 @@ public class BrokerMemoryLoggerTest exte
         _taskExecutor.start();
         _systemConfig = new JsonSystemConfigImpl(_taskExecutor,
                                                  mock(EventLogger.class),
-                                                 null, new BrokerOptions().convertToSystemConfigAttributes())
+                                                 null, new HashMap<String,Object>())
                         {
                             {
                                 updateModel(BrokerModel.getInstance());

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConfiguredObjectToMapConverter.java Wed Nov  2 00:19:08 2016
@@ -32,6 +32,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObjectAttribute;
 import org.apache.qpid.server.model.Model;
@@ -39,6 +42,7 @@ import org.apache.qpid.server.model.Name
 
 public class ConfiguredObjectToMapConverter
 {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ConfiguredObjectToMapConverter.class);
     /** Name of the key used for the statistics map */
     public static final String STATISTICS_MAP_KEY = "statistics";
 

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Wed Nov  2 00:19:08 2016
@@ -1141,9 +1141,9 @@ public class RestServlet extends Abstrac
                 {
                     LOGGER.warn("... caused by " + t.getClass().getSimpleName() + "  : " + t.getMessage());
                 }
-                if (LOGGER.isTraceEnabled())
+                if (LOGGER.isDebugEnabled())
                 {
-                    LOGGER.trace(e.getClass().getSimpleName() + " processing request", e);
+                    LOGGER.debug(e.getClass().getSimpleName() + " processing request", e);
                 }
                 responseCode = SC_UNPROCESSABLE_ENTITY;
             }

Modified: qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Main.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Main.java?rev=1767592&r1=1767591&r2=1767592&view=diff
==============================================================================
--- qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Main.java (original)
+++ qpid/java/trunk/broker/src/main/java/org/apache/qpid/server/Main.java Wed Nov  2 00:19:08 2016
@@ -25,6 +25,9 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -35,15 +38,19 @@ import org.apache.commons.cli.OptionBuil
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.PosixParser;
-import org.apache.qpid.configuration.CommonProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.configuration.CommonProperties;
+import org.apache.qpid.server.configuration.BrokerProperties;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.logging.logback.LogbackLoggingSystemLauncherListener;
+import org.apache.qpid.server.model.AbstractSystemConfig;
+import org.apache.qpid.server.model.JsonSystemConfigImpl;
 import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.SystemConfig;
 import org.apache.qpid.server.plugin.ProtocolEngineCreator;
 import org.apache.qpid.server.plugin.QpidServiceLoader;
-import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.StringUtil;
 import org.apache.qpid.util.FileUtils;
 
@@ -72,7 +79,7 @@ public class Main
             .withLongOpt("overwrite-store").create("os");
 
     private static final Option OPTION_CREATE_INITIAL_CONFIG = OptionBuilder.withArgName("path").hasOptionalArg().withDescription("create a copy of the initial config file, either to an" +
-            " optionally specified file path, or as " + BrokerOptions.DEFAULT_INITIAL_CONFIG_NAME + " in the current directory")
+            " optionally specified file path, or as " + SystemConfig.DEFAULT_INITIAL_CONFIG_NAME + " in the current directory")
             .withLongOpt("create-initial-config").create("cic");
 
     private static final Option OPTION_CONFIGURATION_PROPERTY = OptionBuilder.withArgName("name=value").hasArg()
@@ -86,7 +93,7 @@ public class Main
     private static final Option OPTION_MM_HTTP_PORT = OptionBuilder.withArgName("port").hasArg()
             .withDescription("override http management port in management mode").withLongOpt("management-mode-http-port").create("mmhttp");
     private static final Option OPTION_MM_PASSWORD = OptionBuilder.withArgName("password").hasArg()
-            .withDescription("Set the password for the management mode user " + BrokerOptions.MANAGEMENT_MODE_USER_NAME).withLongOpt("management-mode-password").create("mmpass");
+                                                                  .withDescription("Set the password for the management mode user " + SystemConfig.MANAGEMENT_MODE_USER_NAME).withLongOpt("management-mode-password").create("mmpass");
 
     private static final Option OPTION_INITIAL_SYSTEM_PROPERTIES = OptionBuilder.withArgName("path").hasArg()
             .withDescription("set the location of initial properties file to set otherwise unset system properties").withLongOpt("system-properties-file").create("props");
@@ -156,19 +163,15 @@ public class Main
 
     protected void execute() throws Exception
     {
-        String initialProperties = _commandLine.getOptionValue(OPTION_INITIAL_SYSTEM_PROPERTIES.getOpt());
-        Broker.populateSystemPropertiesFromDefaults(initialProperties);
+        Map<String,Object> attributes = new HashMap<>();
 
-        BrokerOptions options = new BrokerOptions();
-        if (initialProperties != null)
-        {
-            options.setInitialSystemProperties(initialProperties);
-        }
+        String initialProperties = _commandLine.getOptionValue(OPTION_INITIAL_SYSTEM_PROPERTIES.getOpt());
+        BrokerProperties.populateSystemPropertiesFromDefaults(initialProperties);
 
         String initialConfigLocation = _commandLine.getOptionValue(OPTION_INITIAL_CONFIGURATION_PATH.getOpt());
-        if (initialConfigLocation != null)
+        if(initialConfigLocation != null)
         {
-            options.setInitialConfigurationLocation(initialConfigLocation);
+            attributes.put(SystemConfig.INITIAL_CONFIGURATION_LOCATION, initialConfigLocation);
         }
 
         //process the remaining options
@@ -179,115 +182,159 @@ public class Main
         }
         else if (_commandLine.hasOption(OPTION_CREATE_INITIAL_CONFIG.getOpt()))
         {
-            File destinationFile = null;
-
-            String destinationOption = _commandLine.getOptionValue(OPTION_CREATE_INITIAL_CONFIG.getOpt());
-            if (destinationOption != null)
-            {
-                destinationFile = new File(destinationOption);
-            }
-            else
-            {
-                destinationFile = new File(System.getProperty("user.dir"), BrokerOptions.DEFAULT_INITIAL_CONFIG_NAME);
-            }
-
-            copyInitialConfigFile(options, destinationFile);
-
-            System.out.println("Initial config written to: " + destinationFile.getAbsolutePath());
+            createInitialConficCopy(initialConfigLocation);
         }
         else if (_commandLine.hasOption(OPTION_VERSION.getOpt()))
         {
-            final StringBuilder protocol = new StringBuilder("AMQP version(s) [major.minor]: ");
-            boolean first = true;
-            Set<Protocol> protocols = new TreeSet<>();
-            for(ProtocolEngineCreator installedEngine : (new QpidServiceLoader()).instancesOf(ProtocolEngineCreator.class))
-            {
-                protocols.add(installedEngine.getVersion());
-            }
-            for(Protocol supportedProtocol : protocols)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    protocol.append(", ");
-                }
-
-                protocol.append(supportedProtocol.getProtocolVersion());
-            }
-
-            System.out.println(CommonProperties.getVersionString() + " (" + protocol + ")");
+            printVersion();
         }
         else
         {
             String[] configPropPairs = _commandLine.getOptionValues(OPTION_CONFIGURATION_PROPERTY.getOpt());
-            if(configPropPairs != null && configPropPairs.length > 0)
-            {
-                for(String s : configPropPairs)
-                {
-                    int firstEquals = s.indexOf("=");
-                    if(firstEquals == -1)
-                    {
-                        throw new IllegalArgumentException("Configuration property argument is not of the format name=value: " + s);
-                    }
-                    String name = s.substring(0, firstEquals);
-                    String value = s.substring(firstEquals + 1);
 
-                    if(name.equals(""))
-                    {
-                        throw new IllegalArgumentException("Configuration property argument is not of the format name=value: " + s);
-                    }
-
-                    options.setConfigProperty(name, value);
-                }
+            Map<String, String> context = calculateConfigContext(configPropPairs);
+            if(!context.isEmpty())
+            {
+                attributes.put(SystemConfig.CONTEXT, context);
             }
 
             String configurationStore = _commandLine.getOptionValue(OPTION_CONFIGURATION_STORE_PATH.getOpt());
-            if (configurationStore != null)
+            if(configurationStore != null)
             {
-                options.setConfigurationStoreLocation(configurationStore);
+                attributes.put("storePath", configurationStore);
             }
-
             String configurationStoreType = _commandLine.getOptionValue(OPTION_CONFIGURATION_STORE_TYPE.getOpt());
-            if (configurationStoreType != null)
-            {
-                options.setConfigurationStoreType(configurationStoreType);
-            }
-
-            boolean overwriteConfigurationStore = _commandLine.hasOption(OPTION_OVERWRITE_CONFIGURATION_STORE.getOpt());
-            options.setOverwriteConfigurationStore(overwriteConfigurationStore);
+            attributes.put(SystemConfig.TYPE, configurationStoreType == null ? JsonSystemConfigImpl.SYSTEM_CONFIG_TYPE : configurationStoreType);
 
             boolean managementMode = _commandLine.hasOption(OPTION_MANAGEMENT_MODE.getOpt());
             if (managementMode)
             {
-                options.setManagementMode(true);
+                attributes.put(SystemConfig.MANAGEMENT_MODE, true);
                 String httpPort = _commandLine.getOptionValue(OPTION_MM_HTTP_PORT.getOpt());
-                if (httpPort != null)
+                if(httpPort != null)
                 {
-                    options.setManagementModeHttpPortOverride(Integer.parseInt(httpPort));
+                    attributes.put(SystemConfig.MANAGEMENT_MODE_HTTP_PORT_OVERRIDE, httpPort);
                 }
 
                 boolean quiesceVhosts = _commandLine.hasOption(OPTION_MM_QUIESCE_VHOST.getOpt());
-                options.setManagementModeQuiesceVirtualHosts(quiesceVhosts);
+                attributes.put(SystemConfig.MANAGEMENT_MODE_QUIESCE_VIRTUAL_HOSTS, quiesceVhosts);
 
                 String password = _commandLine.getOptionValue(OPTION_MM_PASSWORD.getOpt());
                 if (password == null)
                 {
                     password = new StringUtil().randomAlphaNumericString(MANAGEMENT_MODE_PASSWORD_LENGTH);
                 }
-                options.setManagementModePassword(password);
+                attributes.put(SystemConfig.MANAGEMENT_MODE_PASSWORD, password);
             }
             setExceptionHandler();
 
-            startBroker(options);
+            startBroker(attributes);
+        }
+    }
+
+    private Map<String, String> calculateConfigContext(final String[] configPropPairs)
+    {
+        Map<String,String> context = new HashMap<>();
+
+        if(configPropPairs != null && configPropPairs.length > 0)
+        {
+            for(String s : configPropPairs)
+            {
+                int firstEquals = s.indexOf("=");
+                if(firstEquals == -1)
+                {
+                    throw new IllegalArgumentException("Configuration property argument is not of the format name=value: " + s);
+                }
+                String name = s.substring(0, firstEquals);
+                String value = s.substring(firstEquals + 1);
+
+                if(name.equals(""))
+                {
+                    throw new IllegalArgumentException("Configuration property argument is not of the format name=value: " + s);
+                }
+
+                context.put(name, value);
+            }
+        }
+        if(!context.containsKey(BrokerProperties.QPID_HOME_DIR))
+        {
+            Properties systemProperties = System.getProperties();
+            final Map<String, String> environment = System.getenv();
+            if(systemProperties.contains(BrokerProperties.QPID_HOME_DIR))
+            {
+                context.put(BrokerProperties.QPID_HOME_DIR, systemProperties.getProperty(BrokerProperties.QPID_HOME_DIR));
+            }
+            else if(environment.containsKey(BrokerProperties.QPID_HOME_DIR))
+            {
+                context.put(BrokerProperties.QPID_HOME_DIR, environment.get(BrokerProperties.QPID_HOME_DIR));
+            }
+            else if(context.containsKey(BrokerProperties.PROPERTY_QPID_HOME))
+            {
+                context.put(BrokerProperties.QPID_HOME_DIR, context.get(BrokerProperties.PROPERTY_QPID_HOME));
+            }
+            else if(systemProperties.contains(BrokerProperties.PROPERTY_QPID_HOME))
+            {
+                context.put(BrokerProperties.QPID_HOME_DIR, environment.get(BrokerProperties.PROPERTY_QPID_HOME));
+            }
+            else if(environment.containsKey(BrokerProperties.PROPERTY_QPID_HOME))
+            {
+                context.put(BrokerProperties.QPID_HOME_DIR, environment.get(BrokerProperties.PROPERTY_QPID_HOME));
+            }
+        }
+        return context;
+    }
+
+    private void printVersion()
+    {
+        final StringBuilder protocol = new StringBuilder("AMQP version(s) [major.minor]: ");
+        boolean first = true;
+        Set<Protocol> protocols = new TreeSet<>();
+        for(ProtocolEngineCreator installedEngine : (new QpidServiceLoader()).instancesOf(ProtocolEngineCreator.class))
+        {
+            protocols.add(installedEngine.getVersion());
+        }
+        for(Protocol supportedProtocol : protocols)
+        {
+            if (first)
+            {
+                first = false;
+            }
+            else
+            {
+                protocol.append(", ");
+            }
+
+            protocol.append(supportedProtocol.getProtocolVersion());
         }
+
+        System.out.println(CommonProperties.getVersionString() + " (" + protocol + ")");
     }
 
-    private void copyInitialConfigFile(final BrokerOptions options, final File destinationFile)
+    private void createInitialConficCopy(String initialConfigLocation)
+    {
+        File destinationFile = null;
+
+        String destinationOption = _commandLine.getOptionValue(OPTION_CREATE_INITIAL_CONFIG.getOpt());
+        if (destinationOption != null)
+        {
+            destinationFile = new File(destinationOption);
+        }
+        else
+        {
+            destinationFile = new File(System.getProperty("user.dir"), SystemConfig.DEFAULT_INITIAL_CONFIG_NAME);
+        }
+
+        if(initialConfigLocation == null)
+        {
+            initialConfigLocation = AbstractSystemConfig.getDefaultValue(SystemConfig.INITIAL_CONFIGURATION_LOCATION);
+        }
+        copyInitialConfigFile(initialConfigLocation, destinationFile);
+
+        System.out.println("Initial config written to: " + destinationFile.getAbsolutePath());
+    }
+
+    private void copyInitialConfigFile(final String initialConfigLocation, final File destinationFile)
     {
-        String initialConfigLocation = options.getInitialConfigurationLocation();
         URL url = null;
         try
         {
@@ -342,22 +389,10 @@ public class Main
             {
                 handler = (Thread.UncaughtExceptionHandler) Class.forName(handlerClass).newInstance();
             }
-            catch (ClassNotFoundException e)
-            {
-                
-            }
-            catch (InstantiationException e)
-            {
-                
-            }
-            catch (IllegalAccessException e)
+            catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ClassCastException e)
             {
                 
             }
-            catch (ClassCastException e)
-            {
-
-            }
         }
         
         if(handler == null)
@@ -400,20 +435,22 @@ public class Main
         } 
     }
 
-    protected void startBroker(final BrokerOptions options) throws Exception
+    protected void startBroker(Map<String,Object> attributes) throws Exception
     {
-        Broker broker = new Broker(new Action<Integer>()
-                                    {
-                                        @Override
-                                        public void performAction(final Integer exitStatusCode)
-                                        {
-                                            if (exitStatusCode != 0)
-                                            {
-                                                shutdown(exitStatusCode);
-                                            }
-                                        }
-                                    });
-        broker.startup(options);
+        SystemLauncher systemLauncher = new SystemLauncher(new LogbackLoggingSystemLauncherListener(),
+                                                           new SystemLauncherListener.DefaultSystemLauncherListener()
+                                                           {
+                                                               @Override
+                                                               public void onShutdown(final int exitCode)
+                                                               {
+                                                                   if (exitCode != 0)
+                                                                   {
+                                                                       shutdown(exitCode);
+                                                                   }
+                                                               }
+                                                           });
+
+        systemLauncher.startup(attributes);
     }
 
     protected void shutdown(final int status)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org