You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2013/02/22 01:14:54 UTC

svn commit: r1448866 - in /qpid/trunk/qpid/java: broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/ broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/ broker/src/main/java/org/apache/qpid/server/...

Author: orudyy
Date: Fri Feb 22 00:14:53 2013
New Revision: 1448866

URL: http://svn.apache.org/r1448866
Log:
[QPID-4594] Add command line option to start java broker in a management mode and options to set JMX and HTTP ports in management mode

Added:
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java
Modified:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
    qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ConfigurationEntry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/BrokerOptionsTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java Fri Feb 22 00:14:53 2013
@@ -222,6 +222,10 @@ public class HttpManagement extends Abst
         Server server = new Server();
         for (Port port : ports)
         {
+            if (State.QUIESCED.equals(port.getActualState()))
+            {
+                continue;
+            }
             final Collection<Protocol> protocols = port.getProtocols();
             Connector connector = null;
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java Fri Feb 22 00:14:53 2013
@@ -134,6 +134,11 @@ public class JMXManagement extends Abstr
         Collection<Port> ports = _broker.getPorts();
         for (Port port : ports)
         {
+            if (State.QUIESCED.equals(port.getActualState()))
+            {
+                continue;
+            }
+
             if(isRegistryPort(port))
             {
                 registryPort = port;

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java Fri Feb 22 00:14:53 2013
@@ -33,6 +33,7 @@ import org.apache.qpid.framing.AMQShortS
 import org.apache.qpid.server.configuration.BrokerProperties;
 import org.apache.qpid.server.configuration.ConfigurationEntryStore;
 import org.apache.qpid.server.configuration.BrokerConfigurationStoreCreator;
+import org.apache.qpid.server.configuration.store.ManagementModeStoreHandler;
 import org.apache.qpid.server.logging.SystemOutMessageLogger;
 import org.apache.qpid.server.logging.actors.BrokerActor;
 import org.apache.qpid.server.logging.actors.CurrentActor;
@@ -131,6 +132,11 @@ public class Broker
         ConfigurationEntryStore store = storeCreator.createStore(storeLocation, storeType,
                 options.getInitialConfigurationStoreLocation(), options.getInitialConfigurationStoreLocation());
 
+        if (options.isManagementMode())
+        {
+            store = new ManagementModeStoreHandler(store, options);
+        }
+
         _applicationRegistry = new ApplicationRegistry(store);
         try
         {

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java Fri Feb 22 00:14:53 2013
@@ -35,6 +35,11 @@ public class BrokerOptions
     private String _initialConfigurationStoreLocation;
     private String _initialConfigurationStoreType = DEFAULT_STORE_TYPE;
 
+    private boolean _managementMode;
+    private int _managementModeRmiPort;
+    private int _managementModeConnectorPort;
+    private int _managementModeHttpPort;
+
     public String getLogConfigFile()
     {
         return _logConfigFile;
@@ -99,4 +104,43 @@ public class BrokerOptions
         return _initialConfigurationStoreType;
     }
 
+    public boolean isManagementMode()
+    {
+        return _managementMode;
+    }
+
+    public void setManagementMode(boolean managementMode)
+    {
+        _managementMode = managementMode;
+    }
+
+    public int getManagementModeRmiPort()
+    {
+        return _managementModeRmiPort;
+    }
+
+    public void setManagementModeRmiPort(int managementModeRmiPort)
+    {
+        _managementModeRmiPort = managementModeRmiPort;
+    }
+
+    public int getManagementModeConnectorPort()
+    {
+        return _managementModeConnectorPort;
+    }
+
+    public void setManagementModeConnectorPort(int managementModeConnectorPort)
+    {
+        _managementModeConnectorPort = managementModeConnectorPort;
+    }
+
+    public int getManagementModeHttpPort()
+    {
+        return _managementModeHttpPort;
+    }
+
+    public void setManagementModeHttpPort(int managementModeHttpPort)
+    {
+        _managementModeHttpPort = managementModeHttpPort;
+    }
 }
\ No newline at end of file

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java Fri Feb 22 00:14:53 2013
@@ -65,6 +65,15 @@ public class Main
                     .withDescription("monitor the log file configuration file for changes. Units are seconds. "
                                      + "Zero means do not check for changes.").withLongOpt("logwatch").create("w");
 
+    private static final Option OPTION_MANAGEMENT_MODE = OptionBuilder.withDescription("start broker in a management mode")
+            .withLongOpt("management-mode").create("mm");
+    private static final Option OPTION_RMI_PORT = OptionBuilder.withArgName("port").hasArg()
+            .withDescription("override jmx rmi port in management mode").withLongOpt("jmxregistryport").create("rmi");
+    private static final Option OPTION_CONNECTOR_PORT = OptionBuilder.withArgName("port").hasArg()
+            .withDescription("override jmx connector port in management mode").withLongOpt("jmxconnectorport").create("jmxrmi");
+    private static final Option OPTION_HTTP_PORT = OptionBuilder.withArgName("port").hasArg()
+            .withDescription("override web management port in management mode").withLongOpt("httpport").create("http");
+
     private static final Options OPTIONS = new Options();
 
     static
@@ -77,6 +86,10 @@ public class Main
         OPTIONS.addOption(OPTION_LOG_WATCH);
         OPTIONS.addOption(OPTION_INITIAL_CONFIGURATION_STORE_PATH);
         OPTIONS.addOption(OPTION_INITIAL_CONFIGURATION_STORE_TYPE);
+        OPTIONS.addOption(OPTION_MANAGEMENT_MODE);
+        OPTIONS.addOption(OPTION_RMI_PORT);
+        OPTIONS.addOption(OPTION_CONNECTOR_PORT);
+        OPTIONS.addOption(OPTION_HTTP_PORT);
     }
 
     protected CommandLine _commandLine;
@@ -192,6 +205,26 @@ public class Main
                 options.setInitialConfigurationStoreType(initailConfigurationStoreType);
             }
 
+            boolean managmentMode = _commandLine.hasOption(OPTION_MANAGEMENT_MODE.getOpt());
+            if (managmentMode)
+            {
+                options.setManagementMode(true);
+                String rmiPort = _commandLine.getOptionValue(OPTION_RMI_PORT.getOpt());
+                if (rmiPort != null)
+                {
+                    options.setManagementModeRmiPort(Integer.parseInt(rmiPort));
+                }
+                String connectorPort = _commandLine.getOptionValue(OPTION_CONNECTOR_PORT.getOpt());
+                if (connectorPort != null)
+                {
+                    options.setManagementModeConnectorPort(Integer.parseInt(connectorPort));
+                }
+                String httpPort = _commandLine.getOptionValue(OPTION_HTTP_PORT.getOpt());
+                if (httpPort != null)
+                {
+                    options.setManagementModeHttpPort(Integer.parseInt(httpPort));
+                }
+            }
             setExceptionHandler();
 
             startBroker(options);

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ConfigurationEntry.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ConfigurationEntry.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ConfigurationEntry.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ConfigurationEntry.java Fri Feb 22 00:14:53 2013
@@ -24,7 +24,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -197,17 +196,8 @@ public class ConfigurationEntry
     @Override
     public String toString()
     {
-        return "ConfigurationEntry [_id=" + _id + ", _type=" + _type + ", _attributes=" + _attributes + ", _childrenIds="
+        return "ConfigurationEntry [id=" + _id + ", type=" + _type + ", attributes=" + _attributes + ", childrenIds="
                 + _childrenIds + "]";
     }
 
-    public Object setAttribute(String name, Object value)
-    {
-        return _attributes.put(name, value);
-    }
-
-    public ConfigurationEntry clone()
-    {
-        return new ConfigurationEntry(_id, _type, new HashMap<String, Object>(_attributes), new HashSet<UUID>(_childrenIds), _store);
-    }
 }

Added: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java?rev=1448866&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java (added)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java Fri Feb 22 00:14:53 2013
@@ -0,0 +1,327 @@
+package org.apache.qpid.server.configuration.store;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.server.BrokerOptions;
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfigurationEntryStore;
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.util.MapValueConverter;
+
+public class ManagementModeStoreHandler implements ConfigurationEntryStore
+{
+    private static final Logger LOGGER = Logger.getLogger(ManagementModeStoreHandler.class);
+
+    private static final String MANAGEMENT_MODE_PORT_PREFIX = "MANAGEMENT-MODE-PORT-";
+    private static final String PORT_TYPE = Port.class.getSimpleName();
+    private static final String VIRTUAL_HOST_TYPE = VirtualHost.class.getSimpleName();
+    private static final String ATTRIBUTE_STATE = VirtualHost.STATE;
+
+    private final ConfigurationEntryStore _store;
+    private final Map<UUID, ConfigurationEntry> _cliEntries;
+    private final Map<UUID, Object> _quiescedEntries;
+    private final UUID _rootId;
+
+    public ManagementModeStoreHandler(ConfigurationEntryStore store, BrokerOptions options)
+    {
+        ConfigurationEntry storeRoot = store.getRootEntry();
+        _store = store;
+        _rootId = storeRoot.getId();
+        _cliEntries = createPortsFromCommadLineOptions(options);
+        _quiescedEntries = quiesceEntries(storeRoot, options);
+    }
+
+    @Override
+    public void open(String storeLocation)
+    {
+        throw new IllegalStateException("The store should be already opened");
+    }
+
+    @Override
+    public void open(String storeLocation, String initialStoreLocation)
+    {
+        throw new IllegalStateException("The store should be already opened");
+    }
+
+    @Override
+    public void open(String storeLocation, ConfigurationEntryStore initialStore)
+    {
+        throw new IllegalStateException("The store should be already opened");
+    }
+
+    @Override
+    public ConfigurationEntry getRootEntry()
+    {
+        return getEntry(_rootId);
+    }
+
+    @Override
+    public ConfigurationEntry getEntry(UUID id)
+    {
+        synchronized (_store)
+        {
+            if (_cliEntries.containsKey(id))
+            {
+                return _cliEntries.get(id);
+            }
+
+            ConfigurationEntry entry = _store.getEntry(id);
+            if (_quiescedEntries.containsKey(id))
+            {
+                entry = createEntryWithState(entry, State.QUIESCED);
+            }
+            else if (id == _rootId)
+            {
+                entry = createRootWithCLIEntries(entry);
+            }
+            return entry;
+        }
+    }
+
+    @Override
+    public void save(ConfigurationEntry... entries)
+    {
+        synchronized (_store)
+        {
+            ConfigurationEntry[] entriesToSave = new ConfigurationEntry[entries.length];
+
+            for (int i = 0; i < entries.length; i++)
+            {
+                ConfigurationEntry entry = entries[i];
+                UUID id = entry.getId();
+                if (_cliEntries.containsKey(id))
+                {
+                    throw new IllegalConfigurationException("Cannot save configuration provided as command line argument:"
+                            + entry);
+                }
+                else if (_quiescedEntries.containsKey(id))
+                {
+                    // save entry with the original state
+                    entry = createEntryWithState(entry, _quiescedEntries.get(ATTRIBUTE_STATE));
+                }
+                else if (_rootId.equals(id))
+                {
+                    // save root without command line entries
+                    Set<UUID> childrenIds = new HashSet<UUID>(entry.getChildrenIds());
+                    if (!_cliEntries.isEmpty())
+                    {
+                        childrenIds.removeAll(_cliEntries.entrySet());
+                    }
+                    HashMap<String, Object> attributes = new HashMap<String, Object>(entry.getAttributes());
+                    entry = new ConfigurationEntry(entry.getId(), entry.getType(), attributes, childrenIds, this);
+                }
+                entriesToSave[i] = entry;
+            }
+
+            _store.save(entriesToSave);
+        }
+    }
+
+    @Override
+    public UUID[] remove(UUID... entryIds)
+    {
+        synchronized (_store)
+        {
+            for (UUID id : entryIds)
+            {
+                if (_cliEntries.containsKey(id))
+                {
+                    throw new IllegalConfigurationException("Cannot change configuration for command line entry:"
+                            + _cliEntries.get(id));
+                }
+            }
+            UUID[] result = _store.remove(entryIds);
+            for (UUID id : entryIds)
+            {
+                if (_quiescedEntries.containsKey(id))
+                {
+                    _quiescedEntries.remove(id);
+                }
+            }
+            return result;
+        }
+    }
+
+    @Override
+    public void copyTo(String copyLocation)
+    {
+        synchronized (_store)
+        {
+            _store.copyTo(copyLocation);
+        }
+    }
+
+    private Map<UUID, ConfigurationEntry> createPortsFromCommadLineOptions(BrokerOptions options)
+    {
+        int managementModeRmiPort = options.getManagementModeRmiPort();
+        if (managementModeRmiPort < 0)
+        {
+            throw new IllegalConfigurationException("Invalid rmi port is specified: " + managementModeRmiPort);
+        }
+        int managementModeConnectorPort = options.getManagementModeConnectorPort();
+        if (managementModeConnectorPort < 0)
+        {
+            throw new IllegalConfigurationException("Invalid connector port is specified: " + managementModeConnectorPort);
+        }
+        int managementModeHttpPort = options.getManagementModeHttpPort();
+        if (managementModeHttpPort < 0)
+        {
+            throw new IllegalConfigurationException("Invalid http port is specified: " + managementModeHttpPort);
+        }
+        Map<UUID, ConfigurationEntry> cliEntries = new HashMap<UUID, ConfigurationEntry>();
+        if (managementModeRmiPort != 0)
+        {
+            ConfigurationEntry entry = createCLIPortEntry(managementModeRmiPort, Protocol.RMI);
+            cliEntries.put(entry.getId(), entry);
+            if (managementModeConnectorPort == 0)
+            {
+                ConfigurationEntry connectorEntry = createCLIPortEntry(managementModeRmiPort + 100, Protocol.JMX_RMI);
+                cliEntries.put(connectorEntry.getId(), connectorEntry);
+            }
+        }
+        if (managementModeConnectorPort != 0)
+        {
+            ConfigurationEntry entry = createCLIPortEntry(managementModeConnectorPort, Protocol.JMX_RMI);
+            cliEntries.put(entry.getId(), entry);
+        }
+        if (managementModeHttpPort != 0)
+        {
+            ConfigurationEntry entry = createCLIPortEntry(managementModeHttpPort, Protocol.HTTP);
+            cliEntries.put(entry.getId(), entry);
+        }
+        return cliEntries;
+    }
+
+    private ConfigurationEntry createCLIPortEntry(int port, Protocol protocol)
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.PORT, port);
+        attributes.put(Port.PROTOCOLS, Collections.singleton(protocol));
+        attributes.put(Port.NAME, MANAGEMENT_MODE_PORT_PREFIX + protocol.name());
+        ConfigurationEntry portEntry = new ConfigurationEntry(UUID.randomUUID(), PORT_TYPE, attributes,
+                Collections.<UUID> emptySet(), this);
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Add management mode port configuration " + portEntry + " for port " + port + " and protocol "
+                    + protocol);
+        }
+        return portEntry;
+    }
+
+    private ConfigurationEntry createRootWithCLIEntries(ConfigurationEntry storeRoot)
+    {
+        Set<UUID> childrenIds = new HashSet<UUID>(storeRoot.getChildrenIds());
+        if (!_cliEntries.isEmpty())
+        {
+            childrenIds.addAll(_cliEntries.keySet());
+        }
+        ConfigurationEntry root = new ConfigurationEntry(storeRoot.getId(), storeRoot.getType(), new HashMap<String, Object>(
+                storeRoot.getAttributes()), childrenIds, this);
+        return root;
+    }
+
+    private Map<UUID, Object> quiesceEntries(ConfigurationEntry storeRoot, BrokerOptions options)
+    {
+        Map<UUID, Object> quiescedEntries = new HashMap<UUID, Object>();
+        Set<UUID> childrenIds;
+        int managementModeRmiPort = options.getManagementModeRmiPort();
+        int managementModeConnectorPort = options.getManagementModeConnectorPort();
+        int managementModeHttpPort = options.getManagementModeHttpPort();
+        childrenIds = storeRoot.getChildrenIds();
+        for (UUID id : childrenIds)
+        {
+            ConfigurationEntry entry = _store.getEntry(id);
+            String entryType = entry.getType();
+            Map<String, Object> attributes = entry.getAttributes();
+            boolean quiesce = false;
+            if (VIRTUAL_HOST_TYPE.equals(entryType))
+            {
+                quiesce = true;
+            }
+            else if (PORT_TYPE.equalsIgnoreCase(entryType))
+            {
+                if (attributes == null)
+                {
+                    throw new IllegalConfigurationException("Port attributes are not set in " + entry);
+                }
+                Set<Protocol> protocols = getPortProtocolsAttribute(attributes);
+                if (protocols == null)
+                {
+                    quiesce = true;
+                }
+                else
+                {
+                    for (Protocol protocol : protocols)
+                    {
+                        switch (protocol)
+                        {
+                        case JMX_RMI:
+                            quiesce = managementModeConnectorPort > 0 || managementModeRmiPort > 0;
+                            break;
+                        case RMI:
+                            quiesce = managementModeRmiPort > 0;
+                            break;
+                        case HTTP:
+                        case HTTPS:
+                            quiesce = managementModeHttpPort > 0;
+                            break;
+                        default:
+                            quiesce = true;
+                        }
+                    }
+                }
+            }
+            if (quiesce)
+            {
+                if (LOGGER.isDebugEnabled())
+                {
+                    LOGGER.debug("Management mode quiescing entry " + entry);
+                }
+
+                // save original state
+                quiescedEntries.put(entry.getId(), attributes.get(ATTRIBUTE_STATE));
+            }
+        }
+        return quiescedEntries;
+    }
+
+    private Set<Protocol> getPortProtocolsAttribute(Map<String, Object> attributes)
+    {
+        Object object = attributes.get(Port.PROTOCOLS);
+        if (object == null)
+        {
+            return null;
+        }
+        return MapValueConverter.getEnumSetAttribute(Port.PROTOCOLS, attributes, Protocol.class);
+    }
+
+    private ConfigurationEntry createEntryWithState(ConfigurationEntry entry, Object state)
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>(entry.getAttributes());
+        if (state == null)
+        {
+            attributes.remove(ATTRIBUTE_STATE);
+        }
+        else
+        {
+            attributes.put(ATTRIBUTE_STATE, state);
+        }
+        Set<UUID> originalChildren = entry.getChildrenIds();
+        Set<UUID> children = null;
+        if (originalChildren != null)
+        {
+            children = new HashSet<UUID>(originalChildren);
+        }
+        return new ConfigurationEntry(entry.getId(), entry.getType(), attributes, children, entry.getStore());
+    }
+}

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java Fri Feb 22 00:14:53 2013
@@ -286,7 +286,7 @@ abstract class AbstractAdapter implement
     @Override
     public String toString()
     {
-        return getClass().getSimpleName() + " [id=" + _id + "]";
+        return getClass().getSimpleName() + " [id=" + _id + ", name=" + getName() + "]";
     }
 
     @SuppressWarnings("unchecked")

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Fri Feb 22 00:14:53 2013
@@ -694,6 +694,14 @@ public class BrokerAdapter extends Abstr
             Collection<? extends ConfiguredObject> adapters = configuredObjectMap.values();
             for (ConfiguredObject configuredObject : adapters)
             {
+                if (State.ACTIVE.equals(desiredState) && State.QUIESCED.equals(configuredObject.getActualState()))
+                {
+                    if (LOGGER.isDebugEnabled())
+                    {
+                        LOGGER.debug(configuredObject + " cannot be activated as it is " +State.QUIESCED);
+                    }
+                    continue;
+                }
                 try
                 {
                     configuredObject.setDesiredState(currentState, desiredState);

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java Fri Feb 22 00:14:53 2013
@@ -155,7 +155,12 @@ public class PortAdapter extends Abstrac
     @Override
     public State getActualState()
     {
-        return State.ACTIVE;
+        State state = (State)super.getAttribute(STATE);
+        if (state == null)
+        {
+            return State.ACTIVE;
+        }
+        return state;
     }
 
     @Override

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortFactory.java Fri Feb 22 00:14:53 2013
@@ -35,6 +35,7 @@ import org.apache.qpid.server.model.Brok
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.Protocol;
 import org.apache.qpid.server.model.Protocol.ProtocolType;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.Transport;
 import org.apache.qpid.server.util.MapValueConverter;
 
@@ -179,6 +180,12 @@ public class PortFactory
             String binding = MapValueConverter.getStringAttribute(Port.BINDING_ADDRESS, objectAttributes);
             attributes.put(Port.BINDING_ADDRESS, binding);
         }
+
+        if (objectAttributes.containsKey(Port.STATE))
+        {
+            State state = MapValueConverter.getEnumAttribute(State.class, Port.STATE, objectAttributes);
+            attributes.put(Port.STATE, state);
+        }
         return attributes;
     }
 

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java Fri Feb 22 00:14:53 2013
@@ -88,6 +88,7 @@ public final class VirtualHostAdapter ex
         put(STORE_PATH, String.class);
         put(STORE_TYPE, String.class);
         put(CONFIG_PATH, String.class);
+        put(STATE, State.class);
     }});
 
     private org.apache.qpid.server.virtualhost.VirtualHost _virtualHost;
@@ -404,11 +405,17 @@ public final class VirtualHostAdapter ex
         throw new IllegalStateException();
     }
 
+    @Override
     public State getActualState()
     {
         if (_virtualHost == null)
         {
-            return State.INITIALISING;
+            State state = (State)super.getAttribute(STATE);
+            if (state == null)
+            {
+                return State.INITIALISING;
+            }
+            return state;
         }
         else
         {
@@ -757,7 +764,7 @@ public final class VirtualHostAdapter ex
         }
         else if(STATE.equals(name))
         {
-            return State.ACTIVE;
+            return getActualState();
         }
         else if(DURABLE.equals(name))
         {

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java Fri Feb 22 00:14:53 2013
@@ -116,6 +116,24 @@ public class MapValueConverter
         return getEnumAttribute(clazz, name, attributes, null);
     }
 
+    @SuppressWarnings({ "unchecked" })
+    public static <T extends Enum<T>> T toEnum(String name, Object rawValue, Class<T> enumType)
+    {
+        if (enumType.isInstance(rawValue))
+        {
+            return (T) rawValue;
+        }
+        else if (rawValue instanceof String)
+        {
+            return (T) Enum.valueOf(enumType, (String) rawValue);
+        }
+        else
+        {
+            throw new IllegalArgumentException("Value for attribute " + name + " is not of required type "
+                    + enumType.getSimpleName());
+        }
+    }
+
     public static Boolean getBooleanAttribute(String name, Map<String,Object> attributes, Boolean defaultValue)
     {
         Object obj = attributes.get(name);
@@ -296,6 +314,7 @@ public class MapValueConverter
         return set;
     }
 
+    @SuppressWarnings("unchecked")
     public static Map<String, Object> convert(Map<String, Object> configurationAttributes, Map<String, Class<?>> attributeTypes)
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
@@ -323,6 +342,12 @@ public class MapValueConverter
                 {
                     value = toString(rawValue);
                 }
+                else if (Enum.class.isAssignableFrom(classObject))
+                {
+                    @SuppressWarnings("rawtypes")
+                    Class<Enum> enumType = (Class<Enum>)classObject;
+                    value = toEnum(attributeName, rawValue, enumType);
+                }
                 else
                 {
                     throw new IllegalArgumentException("Cannot convert '" + rawValue + "' into " + classObject);
@@ -332,4 +357,5 @@ public class MapValueConverter
         }
         return attributes;
     }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/BrokerOptionsTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/BrokerOptionsTest.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/BrokerOptionsTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/BrokerOptionsTest.java Fri Feb 22 00:14:53 2013
@@ -102,4 +102,49 @@ public class BrokerOptionsTest extends Q
         _options.setInitialConfigurationStoreLocation(testConfigFile);
         assertEquals(testConfigFile, _options.getInitialConfigurationStoreLocation());
     }
+
+    public void testDefaultManagementMode()
+    {
+        assertEquals(false, _options.isManagementMode());
+    }
+
+    public void testOverriddenDefaultManagementMode()
+    {
+        _options.setManagementMode(true);
+        assertEquals(true, _options.isManagementMode());
+    }
+
+    public void testDefaultManagementModeRmiPort()
+    {
+        assertEquals(0, _options.getManagementModeRmiPort());
+    }
+
+    public void testOverriddenDefaultManagementModeRmiPort()
+    {
+        _options.setManagementModeRmiPort(5555);
+        assertEquals(5555, _options.getManagementModeRmiPort());
+    }
+
+    public void testDefaultManagementModeConnectorPort()
+    {
+        assertEquals(0, _options.getManagementModeConnectorPort());
+    }
+
+    public void testOverriddenDefaultManagementModeConnectorPort()
+    {
+        _options.setManagementModeConnectorPort(5555);
+        assertEquals(5555, _options.getManagementModeConnectorPort());
+    }
+
+    public void testDefaultManagementModeHttpPort()
+    {
+        assertEquals(0, _options.getManagementModeHttpPort());
+    }
+
+    public void testOverriddenDefaultManagementModeHttpPort()
+    {
+        _options.setManagementModeHttpPort(5555);
+        assertEquals(5555, _options.getManagementModeHttpPort());
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java?rev=1448866&r1=1448865&r2=1448866&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/MainTest.java Fri Feb 22 00:14:53 2013
@@ -40,6 +40,11 @@ public class MainTest extends QpidTestCa
         assertEquals(0, options.getLogWatchFrequency());
         assertEquals("json", options.getInitialConfigurationStoreType());
         assertEquals(null, options.getInitialConfigurationStoreLocation());
+
+        assertFalse(options.isManagementMode());
+        assertEquals(0, options.getManagementModeConnectorPort());
+        assertEquals(0, options.getManagementModeRmiPort());
+        assertEquals(0, options.getManagementModeHttpPort());
     }
 
     public void testConfigurationStoreLocation()
@@ -109,6 +114,57 @@ public class MainTest extends QpidTestCa
 
     }
 
+    public void testManagementMode()
+    {
+        BrokerOptions options = startDummyMain("-mm");
+        assertTrue(options.isManagementMode());
+
+        options = startDummyMain("--management-mode");
+        assertTrue(options.isManagementMode());
+    }
+
+    public void testManagementModeRmiPort()
+    {
+        BrokerOptions options = startDummyMain("-mm -rmi 7777");
+        assertTrue(options.isManagementMode());
+        assertEquals(7777, options.getManagementModeRmiPort());
+
+        options = startDummyMain("-mm --jmxregistryport 7777");
+        assertTrue(options.isManagementMode());
+        assertEquals(7777, options.getManagementModeRmiPort());
+
+        options = startDummyMain("-rmi 7777");
+        assertEquals(0, options.getManagementModeRmiPort());
+    }
+
+    public void testManagementModeConnectorPort()
+    {
+        BrokerOptions options = startDummyMain("-mm -jmxrmi 8888");
+        assertTrue(options.isManagementMode());
+        assertEquals(8888, options.getManagementModeConnectorPort());
+
+        options = startDummyMain("-mm --jmxconnectorport 8888");
+        assertTrue(options.isManagementMode());
+        assertEquals(8888, options.getManagementModeConnectorPort());
+
+        options = startDummyMain("-jmxrmi 8888");
+        assertEquals(0, options.getManagementModeConnectorPort());
+    }
+
+    public void testManagementModeHttpPort()
+    {
+        BrokerOptions options = startDummyMain("-mm -http 9999");
+        assertTrue(options.isManagementMode());
+        assertEquals(9999, options.getManagementModeHttpPort());
+
+        options = startDummyMain("-mm --httpport 9999");
+        assertTrue(options.isManagementMode());
+        assertEquals(9999, options.getManagementModeHttpPort());
+
+        options = startDummyMain("-http 9999");
+        assertEquals(0, options.getManagementModeHttpPort());
+    }
+
     private BrokerOptions startDummyMain(String commandLine)
     {
         return (new TestMain(commandLine.split("\\s"))).getOptions();

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java?rev=1448866&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandlerTest.java Fri Feb 22 00:14:53 2013
@@ -0,0 +1,341 @@
+package org.apache.qpid.server.configuration.store;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.any;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.BrokerOptions;
+import org.apache.qpid.server.configuration.BrokerConfigurationStoreCreator;
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfigurationEntryStore;
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class ManagementModeStoreHandlerTest extends QpidTestCase
+{
+    private ManagementModeStoreHandler _handler;
+    private BrokerOptions _options;
+    private ConfigurationEntryStore _store;
+    private ConfigurationEntry _root;
+    private ConfigurationEntry _portEntry;
+    private UUID _rootId, _portEntryId;
+
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        _rootId = UUID.randomUUID();
+        _portEntryId = UUID.randomUUID();
+        _store = mock(ConfigurationEntryStore.class);
+        _root = mock(ConfigurationEntry.class);
+        _portEntry = mock(ConfigurationEntry.class);
+        when(_store.getRootEntry()).thenReturn(_root);
+        when(_root.getId()).thenReturn(_rootId);
+        when(_portEntry.getId()).thenReturn(_portEntryId);
+        when(_store.getEntry(_portEntryId)).thenReturn(_portEntry);
+        when(_store.getEntry(_rootId)).thenReturn(_root);
+        when(_root.getChildrenIds()).thenReturn(Collections.singleton(_portEntryId));
+        when(_portEntry.getType()).thenReturn(Port.class.getSimpleName());
+        _options = new BrokerOptions();
+        _handler = new ManagementModeStoreHandler(_store, _options);
+    }
+
+    public void testOpenString()
+    {
+        try
+        {
+            _handler.open(TMP_FOLDER + File.separator + getTestName());
+            fail("Exception should be thrown on attempt to call open method on a handler");
+        }
+        catch (IllegalStateException e)
+        {
+            // pass
+        }
+    }
+
+    public void testOpenStringString()
+    {
+        try
+        {
+            _handler.open(TMP_FOLDER + File.separator + getTestName(),
+                    BrokerConfigurationStoreCreator.DEFAULT_INITIAL_STORE_LOCATION);
+            fail("Exception should be thrown on attempt to call open method on a handler");
+        }
+        catch (IllegalStateException e)
+        {
+            // pass
+        }
+    }
+
+    public void testOpenStringConfigurationEntryStore()
+    {
+        try
+        {
+            _handler.open(TMP_FOLDER + File.separator + getTestName(), _store);
+            fail("Exception should be thrown on attempt to call open method on a handler");
+        }
+        catch (IllegalStateException e)
+        {
+            // pass
+        }
+    }
+
+    public void testGetRootEntryWithEmptyOptions()
+    {
+        ConfigurationEntry root = _handler.getRootEntry();
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        assertEquals("Unexpected children", Collections.singleton(_portEntryId), root.getChildrenIds());
+    }
+
+    public void testGetRootEntryWithHttpPortOverriden()
+    {
+        _options.setManagementModeHttpPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+        ConfigurationEntry root = _handler.getRootEntry();
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        Collection<UUID> childrenIds = root.getChildrenIds();
+        assertEquals("Unexpected children size", 2, childrenIds.size());
+        assertTrue("Store port entry id is not found", childrenIds.contains(_portEntryId));
+    }
+
+    public void testGetRootEntryWithRmiPortOverriden()
+    {
+        _options.setManagementModeRmiPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+        ConfigurationEntry root = _handler.getRootEntry();
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        Collection<UUID> childrenIds = root.getChildrenIds();
+        assertEquals("Unexpected children size", 3, childrenIds.size());
+        assertTrue("Store port entry id is not found", childrenIds.contains(_portEntryId));
+    }
+
+    public void testGetRootEntryWithConnectorPortOverriden()
+    {
+        _options.setManagementModeConnectorPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+        ConfigurationEntry root = _handler.getRootEntry();
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        Collection<UUID> childrenIds = root.getChildrenIds();
+        assertEquals("Unexpected children size", 2, childrenIds.size());
+        assertTrue("Store port entry id is not found", childrenIds.contains(_portEntryId));
+    }
+
+    public void testGetRootEntryWithManagementPortsOverriden()
+    {
+        _options.setManagementModeHttpPort(1000);
+        _options.setManagementModeRmiPort(2000);
+        _options.setManagementModeConnectorPort(3000);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+        ConfigurationEntry root = _handler.getRootEntry();
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        Collection<UUID> childrenIds = root.getChildrenIds();
+        assertEquals("Unexpected children size", 4, childrenIds.size());
+        assertTrue("Store port entry id is not found", childrenIds.contains(_portEntryId));
+    }
+
+    public void testGetEntryByRootId()
+    {
+        ConfigurationEntry root = _handler.getEntry(_rootId);
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        assertEquals("Unexpected children", Collections.singleton(_portEntryId), root.getChildrenIds());
+    }
+
+    public void testGetEntryByPortId()
+    {
+        ConfigurationEntry portEntry = _handler.getEntry(_portEntryId);
+        assertEquals("Unexpected entry id", _portEntryId, portEntry.getId());
+        assertTrue("Unexpected children", portEntry.getChildrenIds().isEmpty());
+        assertEquals("Unexpected state", State.QUIESCED, portEntry.getAttributes().get(Port.STATE));
+    }
+
+    public void testGetEntryByCLIConnectorPortId()
+    {
+        _options.setManagementModeConnectorPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        UUID optionsPort = getOptionsPortId();
+        ConfigurationEntry portEntry = _handler.getEntry(optionsPort);
+        assertCLIPortEntry(portEntry, optionsPort, Protocol.JMX_RMI);
+    }
+
+    public void testGetEntryByCLIHttpPortId()
+    {
+        _options.setManagementModeHttpPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        UUID optionsPort = getOptionsPortId();
+        ConfigurationEntry portEntry = _handler.getEntry(optionsPort);
+        assertCLIPortEntry(portEntry, optionsPort, Protocol.HTTP);
+    }
+
+    public void testHttpPortEntryIsQuiesced()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.PROTOCOLS, Collections.singleton(Protocol.HTTP));
+        when(_portEntry.getAttributes()).thenReturn(attributes);
+        _options.setManagementModeHttpPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        ConfigurationEntry portEntry = _handler.getEntry(_portEntryId);
+        assertEquals("Unexpected state", State.QUIESCED, portEntry.getAttributes().get(Port.STATE));
+    }
+
+    public void testRmiPortEntryIsQuiesced()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.PROTOCOLS, Collections.singleton(Protocol.RMI));
+        when(_portEntry.getAttributes()).thenReturn(attributes);
+        _options.setManagementModeRmiPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        ConfigurationEntry portEntry = _handler.getEntry(_portEntryId);
+        assertEquals("Unexpected state", State.QUIESCED, portEntry.getAttributes().get(Port.STATE));
+    }
+
+    public void testConnectorPortEntryIsQuiesced()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.PROTOCOLS, Collections.singleton(Protocol.JMX_RMI));
+        when(_portEntry.getAttributes()).thenReturn(attributes);
+        _options.setManagementModeRmiPort(9090);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        ConfigurationEntry portEntry = _handler.getEntry(_portEntryId);
+        assertEquals("Unexpected state", State.QUIESCED, portEntry.getAttributes().get(Port.STATE));
+    }
+
+    public void testVirtualHostEntryIsQuiesced()
+    {
+        UUID virtualHostId = UUID.randomUUID();
+        ConfigurationEntry virtualHost = mock(ConfigurationEntry.class);
+        when(virtualHost.getId()).thenReturn(virtualHostId);
+        when(virtualHost.getType()).thenReturn(VirtualHost.class.getSimpleName());
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(VirtualHost.CONFIG_PATH, "/path/to/host.xml");
+        when(virtualHost.getAttributes()).thenReturn(attributes);
+        when(_store.getEntry(virtualHostId)).thenReturn(virtualHost);
+        when(_root.getChildrenIds()).thenReturn(new HashSet<UUID>(Arrays.asList(_portEntryId, virtualHostId)));
+
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        ConfigurationEntry hostEntry = _handler.getEntry(virtualHostId);
+        Map<String, Object> hostAttributes = hostEntry.getAttributes();
+        assertEquals("Unexpected state", State.QUIESCED, hostAttributes.get(VirtualHost.STATE));
+        hostAttributes.remove(VirtualHost.STATE);
+        assertEquals("Unexpected attributes", attributes, hostAttributes);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void assertCLIPortEntry(ConfigurationEntry portEntry, UUID optionsPort, Protocol protocol)
+    {
+        assertEquals("Unexpected entry id", optionsPort, portEntry.getId());
+        assertTrue("Unexpected children", portEntry.getChildrenIds().isEmpty());
+        Map<String, Object> attributes = portEntry.getAttributes();
+        assertEquals("Unexpected name", "MANAGEMENT-MODE-PORT-" + protocol.name(), attributes.get(Port.NAME));
+        assertEquals("Unexpected protocol", Collections.singleton(protocol), new HashSet<Protocol>(
+                (Collection<Protocol>) attributes.get(Port.PROTOCOLS)));
+    }
+
+    public void testSavePort()
+    {
+        _options.setManagementModeHttpPort(1000);
+        _options.setManagementModeRmiPort(2000);
+        _options.setManagementModeConnectorPort(3000);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.NAME, "TEST");
+        ConfigurationEntry configurationEntry = new ConfigurationEntry(_portEntryId, Port.class.getSimpleName(), attributes,
+                Collections.<UUID> emptySet(), null);
+        _handler.save(configurationEntry);
+        verify(_store).save(any(ConfigurationEntry.class));
+    }
+
+    public void testSaveRoot()
+    {
+        _options.setManagementModeHttpPort(1000);
+        _options.setManagementModeRmiPort(2000);
+        _options.setManagementModeConnectorPort(3000);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        ConfigurationEntry root = _handler.getRootEntry();
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Broker.NAME, "TEST");
+        ConfigurationEntry configurationEntry = new ConfigurationEntry(_rootId, Broker.class.getSimpleName(), attributes,
+                root.getChildrenIds(), null);
+        _handler.save(configurationEntry);
+        verify(_store).save(any(ConfigurationEntry.class));
+    }
+
+    public void testSaveCLIHttpPort()
+    {
+        _options.setManagementModeHttpPort(1000);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        UUID portId = getOptionsPortId();
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.NAME, "TEST");
+        ConfigurationEntry configurationEntry = new ConfigurationEntry(portId, Port.class.getSimpleName(), attributes,
+                Collections.<UUID> emptySet(), null);
+        try
+        {
+            _handler.save(configurationEntry);
+            fail("Exception should be thrown on trying to save CLI port");
+        }
+        catch (IllegalConfigurationException e)
+        {
+            // pass
+        }
+    }
+
+    public void testRemove()
+    {
+        _options.setManagementModeHttpPort(1000);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+
+        _handler.remove(_portEntryId);
+        verify(_store).remove(_portEntryId);
+    }
+
+    public void testRemoveCLIPort()
+    {
+        _options.setManagementModeHttpPort(1000);
+        _handler = new ManagementModeStoreHandler(_store, _options);
+        UUID portId = getOptionsPortId();
+        try
+        {
+            _handler.remove(portId);
+            fail("Exception should be thrown on trying to remove CLI port");
+        }
+        catch (IllegalConfigurationException e)
+        {
+            // pass
+        }
+    }
+
+    private UUID getOptionsPortId()
+    {
+        ConfigurationEntry root = _handler.getRootEntry();
+        assertEquals("Unexpected root id", _rootId, root.getId());
+        Collection<UUID> childrenIds = root.getChildrenIds();
+
+        childrenIds.remove(_portEntryId);
+        UUID optionsPort = childrenIds.iterator().next();
+        return optionsPort;
+    }
+
+}



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