From 02761632159ea75911384e83f277ffaf463d9fb8 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Fri, 18 Jan 2013 17:55:53 +0000 Subject: QPID-4390: Introduce defaults in jmx management plugin git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/java-broker-config-qpid-4390@1435277 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/management/plugin/HttpManagement.java | 60 ++++++++++++++----- .../management/plugin/HttpManagementFactory.java | 18 +----- .../plugin/HttpManagementFactoryTest.java | 12 ++-- .../apache/qpid/server/jmx/JMXConfiguration.java | 59 ------------------ .../qpid/server/jmx/JMXManagedObjectRegistry.java | 46 +++++--------- .../org/apache/qpid/server/jmx/JMXManagement.java | 70 ++++++++++++---------- .../qpid/server/jmx/JMXManagementFactory.java | 28 +-------- .../server/jmx/MBeanInvocationHandlerImpl.java | 9 +-- .../qpid/server/jmx/JMXManagementFactoryTest.java | 5 +- .../server/configuration/BrokerProperties.java | 3 + .../server/configuration/ServerConfiguration.java | 2 +- .../startup/GroupProviderRecoverer.java | 4 +- .../model/adapter/AbstractPluginAdapter.java | 8 +-- .../server/model/adapter/GroupProviderAdapter.java | 4 +- .../qpid/server/virtualhost/VirtualHostImpl.java | 29 +++++---- qpid/java/broker/src/main/resources/default.json | 4 +- .../server/virtualhost/VirtualHostImplTest.java | 34 +++++++++++ .../management/jmx/ManagementLoggingTest.java | 3 +- .../apache/qpid/test/utils/QpidBrokerTestCase.java | 3 +- 19 files changed, 184 insertions(+), 217 deletions(-) delete mode 100644 qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXConfiguration.java diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java index 7860c6ee05..9c7ac10892 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java @@ -23,6 +23,7 @@ package org.apache.qpid.server.management.plugin; import java.io.File; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.UUID; @@ -58,6 +59,7 @@ import org.apache.qpid.server.model.State; import org.apache.qpid.server.model.User; import org.apache.qpid.server.model.VirtualHost; import org.apache.qpid.server.model.adapter.AbstractPluginAdapter; +import org.apache.qpid.server.plugin.PluginFactory; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.SessionManager; @@ -71,31 +73,57 @@ public class HttpManagement extends AbstractPluginAdapter { private final Logger _logger = Logger.getLogger(HttpManagement.class); + // 10 minutes by default + public static final int DEFAULT_TIMEOUT_IN_SECONDS = 60 * 10; + + public static final String TIME_OUT = "sessionTimeout"; + public static final String KEY_STORE_PATH = "keyStorePath"; + public static final String KEY_STORE_PASSWORD = "keyStorePassword"; + public static final String HTTP_BASIC_AUTHENTICATION_ENABLED = "httpBasicAuthenticationEnabled"; + public static final String HTTPS_BASIC_AUTHENTICATION_ENABLED = "httpsBasicAuthenticationEnabled"; + public static final String HTTP_SASL_AUTHENTICATION_ENABLED = "httpSaslAuthenticationEnabled"; + public static final String HTTPS_SASL_AUTHENTICATION_ENABLED = "httpsSaslAuthenticationEnabled"; + + public static final String PLUGIN_NAME = "MANAGEMENT-HTTP"; + private static final Collection AVAILABLE_ATTRIBUTES = new HashSet(Plugin.AVAILABLE_ATTRIBUTES); static { - AVAILABLE_ATTRIBUTES.add(HttpManagementFactory.HTTP_BASIC_AUTHENTICATION_ENABLED); - AVAILABLE_ATTRIBUTES.add(HttpManagementFactory.HTTPS_BASIC_AUTHENTICATION_ENABLED); - AVAILABLE_ATTRIBUTES.add(HttpManagementFactory.HTTP_SASL_AUTHENTICATION_ENABLED); - AVAILABLE_ATTRIBUTES.add(HttpManagementFactory.HTTPS_SASL_AUTHENTICATION_ENABLED); - AVAILABLE_ATTRIBUTES.add(HttpManagementFactory.TIME_OUT); - AVAILABLE_ATTRIBUTES.add(HttpManagementFactory.PLUGIN_TYPE); + AVAILABLE_ATTRIBUTES.add(HTTP_BASIC_AUTHENTICATION_ENABLED); + AVAILABLE_ATTRIBUTES.add(HTTPS_BASIC_AUTHENTICATION_ENABLED); + AVAILABLE_ATTRIBUTES.add(HTTP_SASL_AUTHENTICATION_ENABLED); + AVAILABLE_ATTRIBUTES.add(HTTPS_SASL_AUTHENTICATION_ENABLED); + AVAILABLE_ATTRIBUTES.add(TIME_OUT); + AVAILABLE_ATTRIBUTES.add(PluginFactory.PLUGIN_TYPE); } - public static final String ENTRY_POINT_PATH = "/management"; private static final String OPERATIONAL_LOGGING_NAME = "Web"; + protected static final boolean DEFAULT_HTTP_BASIC_AUTHENTICATION_ENABLED = false; + protected static final boolean DEFAULT_HTTPS_BASIC_AUTHENTICATION_ENABLED = true; + protected static final boolean DEFAULT_HTTP_SASL_AUTHENTICATION_ENABLED = true; + protected static final boolean DEFAULT_HTTPS_SASL_AUTHENTICATION_ENABLED = true; + + @SuppressWarnings("serial") + public static final Map DEFAULTS = new HashMap() + {{ + put(HTTP_BASIC_AUTHENTICATION_ENABLED, DEFAULT_HTTP_BASIC_AUTHENTICATION_ENABLED); + put(HTTPS_BASIC_AUTHENTICATION_ENABLED, DEFAULT_HTTPS_BASIC_AUTHENTICATION_ENABLED); + put(HTTP_SASL_AUTHENTICATION_ENABLED, DEFAULT_HTTP_SASL_AUTHENTICATION_ENABLED); + put(HTTPS_SASL_AUTHENTICATION_ENABLED, DEFAULT_HTTPS_SASL_AUTHENTICATION_ENABLED); + }}; + private final Broker _broker; private Server _server; private final HttpConfiguration _configuration; - public HttpManagement(UUID id, Broker broker, HttpConfiguration configuration, Map defaults) + public HttpManagement(UUID id, Broker broker, HttpConfiguration configuration) { - super(id, defaults); + super(id, DEFAULTS, null); _broker = broker; _configuration = configuration; addParent(Broker.class, broker); @@ -357,29 +385,29 @@ public class HttpManagement extends AbstractPluginAdapter @Override public Object getAttribute(String name) { - if(HttpManagementFactory.HTTP_BASIC_AUTHENTICATION_ENABLED.equals(name)) + if(HTTP_BASIC_AUTHENTICATION_ENABLED.equals(name)) { return _configuration.isHttpBasicAuthenticationEnabled(); } - else if(HttpManagementFactory.HTTPS_BASIC_AUTHENTICATION_ENABLED.equals(name)) + else if(HTTPS_BASIC_AUTHENTICATION_ENABLED.equals(name)) { return _configuration.isHttpsBasicAuthenticationEnabled(); } - else if(HttpManagementFactory.HTTP_SASL_AUTHENTICATION_ENABLED.equals(name)) + else if(HTTP_SASL_AUTHENTICATION_ENABLED.equals(name)) { return _configuration.isHttpSaslAuthenticationEnabled(); } - else if(HttpManagementFactory.HTTPS_SASL_AUTHENTICATION_ENABLED.equals(name)) + else if(HTTPS_SASL_AUTHENTICATION_ENABLED.equals(name)) { return _configuration.isHttpSaslAuthenticationEnabled(); } - else if(HttpManagementFactory.TIME_OUT.equals(name)) + else if(TIME_OUT.equals(name)) { return _configuration.getSessionTimeout(); } - else if(HttpManagementFactory.PLUGIN_TYPE.equals(name)) + else if(PluginFactory.PLUGIN_TYPE.equals(name)) { - return HttpManagementFactory.PLUGIN_NAME; + return PLUGIN_NAME; } return super.getAttribute(name); } diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementFactory.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementFactory.java index ceae949ae2..3b4e5cf6c6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementFactory.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementFactory.java @@ -18,6 +18,7 @@ */ package org.apache.qpid.server.management.plugin; +import static org.apache.qpid.server.management.plugin.HttpManagement.*; import static org.apache.qpid.server.util.MapValueConverter.getBooleanAttribute; import static org.apache.qpid.server.util.MapValueConverter.getIntegerAttribute; import static org.apache.qpid.server.util.MapValueConverter.getStringAttribute; @@ -31,18 +32,6 @@ import org.apache.qpid.server.plugin.PluginFactory; public class HttpManagementFactory implements PluginFactory { - // 10 minutes by default - private static final int DEFAULT_TIMEOUT_IN_SECONDS = 60 * 10; - - public static final String TIME_OUT = "sessionTimeout"; - public static final String KEY_STORE_PATH = "keyStorePath"; - public static final String KEY_STORE_PASSWORD = "keyStorePassword"; - public static final String HTTP_BASIC_AUTHENTICATION_ENABLED = "httpBasicAuthenticationEnabled"; - public static final String HTTPS_BASIC_AUTHENTICATION_ENABLED = "httpsBasicAuthenticationEnabled"; - public static final String HTTP_SASL_AUTHENTICATION_ENABLED = "httpSaslAuthenticationEnabled"; - public static final String HTTPS_SASL_AUTHENTICATION_ENABLED = "httpsSaslAuthenticationEnabled"; - - public static final String PLUGIN_NAME = "MANAGEMENT-HTTP"; @Override public Plugin createInstance(UUID id, Map attributes, Broker broker) @@ -61,8 +50,7 @@ public class HttpManagementFactory implements PluginFactory getStringAttribute(KEY_STORE_PATH, attributes, null), getStringAttribute(KEY_STORE_PASSWORD, attributes, null) ); - //TODO: create defaults - Map defaults = null; - return new HttpManagement( id, broker, configuration, defaults); + + return new HttpManagement( id, broker, configuration); } } diff --git a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/HttpManagementFactoryTest.java b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/HttpManagementFactoryTest.java index 7951944fae..9984ddf544 100644 --- a/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/HttpManagementFactoryTest.java +++ b/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/HttpManagementFactoryTest.java @@ -51,8 +51,8 @@ public class HttpManagementFactoryTest extends QpidTestCase public void testCreateInstanceWithoutKeystore() throws Exception { - _attributes.put(PluginFactory.PLUGIN_TYPE, HttpManagementFactory.PLUGIN_NAME); - _attributes.put(HttpManagementFactory.TIME_OUT, SESSION_TIMEOUT); + _attributes.put(PluginFactory.PLUGIN_TYPE, HttpManagement.PLUGIN_NAME); + _attributes.put(HttpManagement.TIME_OUT, SESSION_TIMEOUT); HttpManagement management = (HttpManagement) _pluginFactory.createInstance(_id, _attributes, _broker); @@ -64,10 +64,10 @@ public class HttpManagementFactoryTest extends QpidTestCase public void testCreateInstanceWithKeystore() throws Exception { - _attributes.put(PluginFactory.PLUGIN_TYPE, HttpManagementFactory.PLUGIN_NAME); - _attributes.put(HttpManagementFactory.KEY_STORE_PASSWORD, KEY_STORE_PASSWORD); - _attributes.put(HttpManagementFactory.KEY_STORE_PATH, KEY_STORE_PATH); - _attributes.put(HttpManagementFactory.TIME_OUT, SESSION_TIMEOUT); + _attributes.put(PluginFactory.PLUGIN_TYPE, HttpManagement.PLUGIN_NAME); + _attributes.put(HttpManagement.KEY_STORE_PASSWORD, KEY_STORE_PASSWORD); + _attributes.put(HttpManagement.KEY_STORE_PATH, KEY_STORE_PATH); + _attributes.put(HttpManagement.TIME_OUT, SESSION_TIMEOUT); HttpManagement management = (HttpManagement) _pluginFactory.createInstance(_id, _attributes, _broker); diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXConfiguration.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXConfiguration.java deleted file mode 100644 index 989708cd88..0000000000 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.qpid.server.jmx; - -public class JMXConfiguration -{ - private final boolean _platformMBeanServer; - private final String _managementKeyStorePath; - private final String _managementKeyStorePassword; - private final boolean _managementRightsInferAllAccess; - - public JMXConfiguration( boolean platformMBeanServer, String managementKeyStorePath, - String managementKeyStorePassword, boolean managementRightsInferAllAccess) - { - _platformMBeanServer = platformMBeanServer; - _managementKeyStorePath = managementKeyStorePath; - _managementKeyStorePassword = managementKeyStorePassword; - _managementRightsInferAllAccess = managementRightsInferAllAccess; - } - - public boolean isPlatformMBeanServer() - { - return _platformMBeanServer; - } - - public String getManagementKeyStorePath() - { - return _managementKeyStorePath; - } - - public String getManagementKeyStorePassword() - { - return _managementKeyStorePassword; - } - - public boolean isManagementRightsInferAllAccess() - { - return _managementRightsInferAllAccess; - } - -} diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java index 9e31d8e003..9eb03dd280 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java @@ -21,6 +21,7 @@ package org.apache.qpid.server.jmx; import org.apache.log4j.Logger; +import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.logging.actors.CurrentActor; import org.apache.qpid.server.logging.messages.ManagementConsoleMessages; @@ -64,8 +65,6 @@ import java.util.HashMap; */ public class JMXManagedObjectRegistry implements ManagedObjectRegistry { - public static final String USE_CUSTOM_RMI_SOCKET_FACTORY = "qpid.use_custom_rmi_socket_factory"; - private static final Logger _log = Logger.getLogger(JMXManagedObjectRegistry.class); private static final String OPERATIONAL_LOGGING_NAME = "JMX"; @@ -79,24 +78,21 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry private final Port _registryPort; private final Port _connectorPort; - private final JMXConfiguration _jmxConfiguration; - - public JMXManagedObjectRegistry( + public JMXManagedObjectRegistry( Broker broker, Port connectorPort, Port registryPort, - JMXConfiguration jmxConfiguration) + JMXManagement jmxManagement) { _broker = broker; _registryPort = registryPort; _connectorPort = connectorPort; - boolean platformServer = jmxConfiguration.isPlatformMBeanServer(); + boolean usePlatformServer = (Boolean)jmxManagement.getAttribute(JMXManagement.USE_PLATFORM_MBEAN_SERVER); _mbeanServer = - platformServer ? ManagementFactory.getPlatformMBeanServer() + usePlatformServer ? ManagementFactory.getPlatformMBeanServer() : MBeanServerFactory.createMBeanServer(ManagedObject.DOMAIN); - _jmxConfiguration = jmxConfiguration; - } + } @Override public void start() throws IOException @@ -126,24 +122,15 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry if (connectorSslEnabled) { - String managementKeyStorePath = _jmxConfiguration.getManagementKeyStorePath(); - String managementKeyStorePassword = _jmxConfiguration.getManagementKeyStorePath(); - - //set the SSL related system properties used by the SSL RMI socket factories to the values - //given in the configuration file - checkKeyStorePathExistsAndIsReadable(managementKeyStorePath ); + checkKeyStorePathExistsAndIsReadable(); - CurrentActor.get().message(ManagementConsoleMessages.SSL_KEYSTORE(managementKeyStorePath)); + CurrentActor.get().message(ManagementConsoleMessages.SSL_KEYSTORE(System.getProperty("javax.net.ssl.keyStore"))); - if (managementKeyStorePassword == null) + if (System.getProperty("javax.net.ssl.keyStorePassword") == null) { throw new IllegalConfigurationException( "JMX management SSL keystore password not defined, unable to start requested SSL protected JMX server"); } - else - { - System.setProperty("javax.net.ssl.keyStorePassword", managementKeyStorePassword); - } //create the SSL RMI socket factories csf = new SslRMIClientSocketFactory(); @@ -165,7 +152,7 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry connectorEnv.put(JMXConnectorServer.AUTHENTICATOR, rmipa); System.setProperty("java.rmi.server.randomIDs", "true"); - boolean useCustomSocketFactory = Boolean.parseBoolean(System.getProperty(USE_CUSTOM_RMI_SOCKET_FACTORY, Boolean.TRUE.toString())); + boolean useCustomSocketFactory = Boolean.parseBoolean(System.getProperty(BrokerProperties.PROPERTY_USE_CUSTOM_RMI_SOCKET_FACTORY, Boolean.TRUE.toString())); /* * Start a RMI registry on the management port, to hold the JMX RMI ConnectorServer stub. @@ -242,7 +229,7 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry }; //Add the custom invoker as an MBeanServerForwarder, and start the RMIConnectorServer. - MBeanServerForwarder mbsf = MBeanInvocationHandlerImpl.newProxyInstance(_broker, _jmxConfiguration); + MBeanServerForwarder mbsf = MBeanInvocationHandlerImpl.newProxyInstance(_broker); _cs.setMBeanServerForwarder(mbsf); // Install a ManagementLogonLogoffReporter so we can report as users logon/logoff @@ -278,20 +265,17 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry return rmiRegistry; } - private void checkKeyStorePathExistsAndIsReadable(String keyStorePath) throws FileNotFoundException + private void checkKeyStorePathExistsAndIsReadable() throws FileNotFoundException { - //check the keystore path value is valid + String keyStorePath = System.getProperty("javax.net.ssl.keyStore"); + if (keyStorePath == null) { throw new IllegalConfigurationException( - "JMX management SSL keystore path not defined, unable to start SSL protected JMX ConnectorServer"); + "JVM system proprty 'javax.net.ssl.keyStore' is not set, unable to start SSL protected JMX ConnectorServer"); } else { - //ensure the system property is set (for use by SslRMIClientSocketFactory and SslRMIServerSocketFactory) - System.setProperty("javax.net.ssl.keyStore", keyStorePath); - - //check the file is usable File ksf = new File(keyStorePath); if (!ksf.exists()) diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java index 293af28d6b..25a56f7a00 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagement.java @@ -49,32 +49,55 @@ 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.model.adapter.AbstractPluginAdapter; +import org.apache.qpid.server.plugin.PluginFactory; import org.apache.qpid.server.plugin.QpidServiceLoader; +import org.apache.qpid.server.util.MapValueConverter; public class JMXManagement extends AbstractPluginAdapter implements ConfigurationChangeListener { private static final Logger LOGGER = Logger.getLogger(JMXManagement.class); - private static final Collection AVAILABLE_ATTRIBUTES = new HashSet(Plugin.AVAILABLE_ATTRIBUTES); - static - { - AVAILABLE_ATTRIBUTES.add(JMXManagementFactory.MANAGEMENT_RIGHTS_INFER_ALL_ACCESS); - AVAILABLE_ATTRIBUTES.add(JMXManagementFactory.PLUGIN_TYPE); - AVAILABLE_ATTRIBUTES.add(JMXManagementFactory.USE_PLATFORM_MBEAN_SERVER); - } + public static final String PLUGIN_TYPE = "MANAGEMENT-JMX"; + + // attributes + public static final String USE_PLATFORM_MBEAN_SERVER = "usePlatformMBeanServer"; + public static final String NAME = "name"; + + // default values + public static final String DEFAULT_NAME = "JMXManagement"; + public static final boolean DEFAULT_USE_PLATFORM_MBEAN_SERVER = true; + + @SuppressWarnings("serial") + private static final Collection AVAILABLE_ATTRIBUTES = Collections.unmodifiableCollection(new HashSet(Plugin.AVAILABLE_ATTRIBUTES){{ + add(NAME); + add(USE_PLATFORM_MBEAN_SERVER); + add(PluginFactory.PLUGIN_TYPE); + }}); + + @SuppressWarnings("serial") + private static final Map DEFAULTS = new HashMap(){{ + put(USE_PLATFORM_MBEAN_SERVER, DEFAULT_USE_PLATFORM_MBEAN_SERVER); + put(NAME, DEFAULT_NAME); + put(PluginFactory.PLUGIN_TYPE, PLUGIN_TYPE); + }}; + + @SuppressWarnings("serial") + private static final Map> ATTRIBUTE_TYPES = new HashMap>(){{ + put(USE_PLATFORM_MBEAN_SERVER, Boolean.class); + put(NAME, String.class); + put(PluginFactory.PLUGIN_TYPE, String.class); + }}; private final Broker _broker; private JMXManagedObjectRegistry _objectRegistry; private final Map _children = new HashMap(); - private final JMXConfiguration _jmxConfiguration; - - public JMXManagement(UUID id, Broker broker, JMXConfiguration jmxConfiguration, Map defaults) + public JMXManagement(UUID id, Broker broker, Map attributes) { - super(id, defaults); + super(id, DEFAULTS, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES)); _broker = broker; - _jmxConfiguration = jmxConfiguration; + addParent(Broker.class, broker); } @Override @@ -129,7 +152,7 @@ public class JMXManagement extends AbstractPluginAdapter implements Configuratio throw new IllegalStateException("No JMX RMI port found supporting protocol " + Protocol.RMI); } - _objectRegistry = new JMXManagedObjectRegistry(_broker, connectorPort, registryPort, _jmxConfiguration); + _objectRegistry = new JMXManagedObjectRegistry(_broker, connectorPort, registryPort, this); _broker.addChangeListener(this); @@ -294,30 +317,13 @@ public class JMXManagement extends AbstractPluginAdapter implements Configuratio @Override public String getName() { - return "JMXManagement"; + return (String)getAttribute(NAME); } @Override public Collection getAttributeNames() { - return Collections.unmodifiableCollection(AVAILABLE_ATTRIBUTES); + return AVAILABLE_ATTRIBUTES; } - @Override - public Object getAttribute(String name) - { - if(JMXManagementFactory.MANAGEMENT_RIGHTS_INFER_ALL_ACCESS.equals(name)) - { - return _jmxConfiguration.isManagementRightsInferAllAccess(); - } - else if(JMXManagementFactory.USE_PLATFORM_MBEAN_SERVER.equals(name)) - { - return _jmxConfiguration.isPlatformMBeanServer(); - } - else if(JMXManagementFactory.PLUGIN_TYPE.equals(name)) - { - return JMXManagementFactory.PLUGIN_NAME; - } - return super.getAttribute(name); - } } diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementFactory.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementFactory.java index 50d87d2172..c2186c372b 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementFactory.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementFactory.java @@ -18,9 +18,6 @@ */ package org.apache.qpid.server.jmx; -import static org.apache.qpid.server.util.MapValueConverter.getBooleanAttribute; -import static org.apache.qpid.server.util.MapValueConverter.getStringAttribute; - import java.util.Map; import java.util.UUID; @@ -33,35 +30,16 @@ public class JMXManagementFactory implements PluginFactory { private static final Logger LOGGER = Logger.getLogger(JMXManagementFactory.class); - public static final String USE_PLATFORM_MBEAN_SERVER = "usePlatformMBeanServer"; - - //TODO: re-factor key store settings - public static final String KEY_STORE_PATH = "keyStorePath"; - public static final String KEY_STORE_PASSWORD = "keyStorePassword"; - - //TODO: make it set via system property - public static final String MANAGEMENT_RIGHTS_INFER_ALL_ACCESS = "managementRightsInferAllAccess"; - - public static final String PLUGIN_NAME = "MANAGEMENT-JMX"; - @Override public Plugin createInstance(UUID id, Map attributes, Broker broker) { - if (PLUGIN_NAME.equals(attributes.get(PLUGIN_TYPE))) + if (JMXManagement.PLUGIN_TYPE.equals(attributes.get(PLUGIN_TYPE))) { - JMXConfiguration jmxConfiguration = new JMXConfiguration( - getBooleanAttribute(USE_PLATFORM_MBEAN_SERVER, attributes, true), - getStringAttribute(KEY_STORE_PATH, attributes, null), - getStringAttribute(KEY_STORE_PASSWORD, attributes, null), - getBooleanAttribute(MANAGEMENT_RIGHTS_INFER_ALL_ACCESS, attributes, true)); - - //TODO: create defaults - Map defaults = null; - return new JMXManagement(id, broker, jmxConfiguration, defaults); + return new JMXManagement(id, broker, attributes); } else { - if(LOGGER.isDebugEnabled()) + if (LOGGER.isDebugEnabled()) { LOGGER.debug("Skipping registration of JMX plugin as JMX Management disabled in config."); } diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java index dbd9d0d240..8bc2afb176 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java @@ -22,6 +22,7 @@ package org.apache.qpid.server.jmx; import org.apache.log4j.Logger; +import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.logging.actors.CurrentActor; import org.apache.qpid.server.logging.actors.ManagementActor; import org.apache.qpid.server.model.Broker; @@ -62,16 +63,16 @@ public class MBeanInvocationHandlerImpl implements InvocationHandler private final boolean _managementRightsInferAllAccess; private final Broker _broker; - MBeanInvocationHandlerImpl(Broker broker, boolean managementRightsInferAllAccess) + MBeanInvocationHandlerImpl(Broker broker) { - _managementRightsInferAllAccess = managementRightsInferAllAccess; + _managementRightsInferAllAccess = Boolean.valueOf(System.getProperty(BrokerProperties.PROPERTY_MANAGEMENT_RIGHTS_INFER_ALL_ACCESS, "true")); _broker = broker; _logActor = new ManagementActor(broker.getRootMessageLogger()); } - public static MBeanServerForwarder newProxyInstance(Broker broker, JMXConfiguration configuration) + public static MBeanServerForwarder newProxyInstance(Broker broker) { - final InvocationHandler handler = new MBeanInvocationHandlerImpl(broker, configuration.isManagementRightsInferAllAccess()); + final InvocationHandler handler = new MBeanInvocationHandlerImpl(broker); final Class[] interfaces = new Class[] { MBeanServerForwarder.class }; Object proxy = Proxy.newProxyInstance(MBeanServerForwarder.class.getClassLoader(), interfaces, handler); diff --git a/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/JMXManagementFactoryTest.java b/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/JMXManagementFactoryTest.java index e26ef743ff..5af1369239 100644 --- a/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/JMXManagementFactoryTest.java +++ b/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/JMXManagementFactoryTest.java @@ -37,11 +37,14 @@ public class JMXManagementFactoryTest extends QpidTestCase public void testJMXConfigured() throws Exception { - _attributes.put(PluginFactory.PLUGIN_TYPE, JMXManagementFactory.PLUGIN_NAME); + _attributes.put(PluginFactory.PLUGIN_TYPE, JMXManagement.PLUGIN_TYPE); JMXManagement jmxManagement = (JMXManagement) _jmxManagementFactory.createInstance(_id, _attributes, _broker); assertNotNull(jmxManagement); + assertEquals("Unexpected plugin type", JMXManagement.PLUGIN_TYPE, jmxManagement.getAttribute(JMXManagementFactory.PLUGIN_TYPE)); + assertEquals("Unexpected default mbean platform", JMXManagement.DEFAULT_USE_PLATFORM_MBEAN_SERVER, jmxManagement.getAttribute(JMXManagement.USE_PLATFORM_MBEAN_SERVER)); + assertEquals("Unexpected default name", JMXManagement.DEFAULT_NAME, jmxManagement.getAttribute(JMXManagement.NAME)); } public void testCreateInstanceReturnsNullWhenPluginTypeMissing() diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java index 414aacbdad..58d7604ee2 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/BrokerProperties.java @@ -23,6 +23,9 @@ public class BrokerProperties public static final String PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_EXCLUDES = "qpid.broker_default_amqp_protocol_excludes"; public static final String PROPERTY_BROKER_DEFAULT_AMQP_PROTOCOL_INCLUDES = "qpid.broker_default_amqp_protocol_includes"; + public static final String PROPERTY_MANAGEMENT_RIGHTS_INFER_ALL_ACCESS = "qpid.broker_management_rights_infer_all_access"; + public static final String PROPERTY_USE_CUSTOM_RMI_SOCKET_FACTORY = "qpid.broker_use_custom_rmi_socket_factory"; + private BrokerProperties() { } diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java index 4cf2e5796c..7ecb1954a8 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java @@ -55,7 +55,7 @@ public class ServerConfiguration extends AbstractConfiguration public static final int DEFAULT_HTTPS_MANAGEMENT_PORT = 8443; public static final long DEFAULT_MINIMUM_ALERT_REPEAT_GAP = 30000l; - public static final String USE_CUSTOM_RMI_SOCKET_FACTORY = "qpid.use_custom_rmi_socket_factory"; + public static final String USE_CUSTOM_RMI_SOCKET_FACTORY = BrokerProperties.PROPERTY_USE_CUSTOM_RMI_SOCKET_FACTORY; public static final String QPID_HOME = "QPID_HOME"; public static final String QPID_WORK = "QPID_WORK"; diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java index dbec0f27aa..275a0c736c 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java @@ -54,9 +54,7 @@ public class GroupProviderRecoverer implements ConfiguredObjectRecoverer defaults = null; - GroupProviderAdapter groupProviderAdapter = new GroupProviderAdapter(configurationEntry.getId(), groupManager, broker, defaults); + GroupProviderAdapter groupProviderAdapter = new GroupProviderAdapter(configurationEntry.getId(), groupManager, broker); return groupProviderAdapter; } diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java index 2b0d75e90b..4ebe45e1ee 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java @@ -35,9 +35,9 @@ import org.apache.qpid.server.model.Statistics; public abstract class AbstractPluginAdapter extends AbstractAdapter implements Plugin { - protected AbstractPluginAdapter(UUID id, Map defaults) + protected AbstractPluginAdapter(UUID id, Map defaults, Map attributes) { - super(id, defaults); + super(id, defaults, attributes); } @Override @@ -122,10 +122,6 @@ public abstract class AbstractPluginAdapter extends AbstractAdapter implements P { return getId(); } - else if (NAME.equals(name)) - { - return getName(); - } else if (STATE.equals(name)) { return getActualState(); diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java index c73de436cc..ecb10202e9 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java @@ -47,9 +47,9 @@ public class GroupProviderAdapter extends AbstractAdapter implements { private final GroupManager _groupManager; private final Broker _broker; - public GroupProviderAdapter(UUID id, GroupManager groupManager, Broker broker, Map defaults) + public GroupProviderAdapter(UUID id, GroupManager groupManager, Broker broker) { - super(id, defaults); + super(id); if (groupManager == null) { diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java index 880dfedce4..dd3610373f 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java @@ -146,15 +146,7 @@ public class VirtualHostImpl implements VirtualHost, IConnectionRegistry.Registr _bindingFactory = new BindingFactory(this); - String storeType = hostConfig.getConfig().getString("store.type"); - if (storeType == null) - { - _messageStore = initialiseMessageStore(hostConfig.getMessageStoreClass()); - } - else - { - _messageStore = new MessageStoreCreator().createMessageStore(storeType); - } + _messageStore = initialiseMessageStore(hostConfig); configureMessageStore(hostConfig); @@ -283,14 +275,29 @@ public class VirtualHostImpl implements VirtualHost, IConnectionRegistry.Registr } final MessageStore messageStore = (MessageStore) o; - final MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, clazz.getSimpleName()); + return messageStore; + } + + private MessageStore initialiseMessageStore(VirtualHostConfiguration hostConfig) throws Exception + { + String storeType = hostConfig.getConfig().getString("store.type"); + MessageStore messageStore = null; + if (storeType == null) + { + messageStore = initialiseMessageStore(hostConfig.getMessageStoreClass()); + } + else + { + messageStore = new MessageStoreCreator().createMessageStore(storeType); + } + + final MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, messageStore.getClass().getSimpleName()); OperationalLoggingListener.listen(messageStore, storeLogSubject); messageStore.addEventListener(new BeforeActivationListener(), Event.BEFORE_ACTIVATE); messageStore.addEventListener(new AfterActivationListener(), Event.AFTER_ACTIVATE); messageStore.addEventListener(new BeforeCloseListener(), Event.BEFORE_CLOSE); messageStore.addEventListener(new BeforePassivationListener(), Event.BEFORE_PASSIVATE); - return messageStore; } diff --git a/qpid/java/broker/src/main/resources/default.json b/qpid/java/broker/src/main/resources/default.json index 44c6744377..a81a3924e3 100644 --- a/qpid/java/broker/src/main/resources/default.json +++ b/qpid/java/broker/src/main/resources/default.json @@ -66,8 +66,6 @@ }, { "type" : "Plugin", "pluginType" : "MANAGEMENT-JMX", - "name" : "jmxManagement", - "usePlatformMBeanServer" : true, - "managementRightsInferAllAccess" : true + "name" : "jmxManagement" } ] } \ No newline at end of file diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java index bac2a1e1b4..559a7f8aaf 100644 --- a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java +++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java @@ -22,7 +22,9 @@ package org.apache.qpid.server.virtualhost; import static org.mockito.Mockito.mock; +import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.qpid.server.configuration.VirtualHostConfiguration; @@ -122,6 +124,14 @@ public class VirtualHostImplTest extends QpidTestCase assertEquals(State.ACTIVE, vhost.getState()); } + public void testVirtualHostHavingStoreSetAsTypeBecomesActive() throws Exception + { + String virtualHostName = getName(); + VirtualHost host = createVirtualHostUsingStoreType(virtualHostName); + assertNotNull(host); + assertEquals(State.ACTIVE, host.getState()); + } + public void testVirtualHostBecomesStoppedOnClose() throws Exception { File config = writeConfigFile(getName(), getName(), getName() +".direct", false, new String[0]); @@ -133,6 +143,17 @@ public class VirtualHostImplTest extends QpidTestCase assertEquals(0, vhost.getHouseKeepingActiveCount()); } + public void testVirtualHostHavingStoreSetAsTypeBecomesStoppedOnClose() throws Exception + { + String virtualHostName = getName(); + VirtualHost host = createVirtualHostUsingStoreType(virtualHostName); + assertNotNull(host); + assertEquals(State.ACTIVE, host.getState()); + host.close(); + assertEquals(State.STOPPED, host.getState()); + assertEquals(0, host.getHouseKeepingActiveCount()); + } + /** * Tests that specifying an unknown exchange to bind the queue to results in failure to create the vhost */ @@ -265,4 +286,17 @@ public class VirtualHostImplTest extends QpidTestCase return tmpFile; } + + private VirtualHost createVirtualHostUsingStoreType(String virtualHostName) throws ConfigurationException, Exception + { + Broker broker = BrokerTestHelper.createBrokerMock(); + _virtualHostRegistry = broker.getVirtualHostRegistry(); + + Configuration config = new PropertiesConfiguration(); + config.setProperty("store.type", MemoryMessageStore.TYPE); + VirtualHostConfiguration configuration = new VirtualHostConfiguration(virtualHostName, config, broker); + VirtualHost host = new VirtualHostImpl(_virtualHostRegistry, mock(StatisticsGatherer.class), new SecurityManager(null), configuration); + _virtualHostRegistry.registerVirtualHost(host); + return host; + } } diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java index c6bc9a8d5b..84e38586ff 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/ManagementLoggingTest.java @@ -21,6 +21,7 @@ package org.apache.qpid.systest.management.jmx; +import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.configuration.ServerConfiguration; import org.apache.qpid.server.logging.AbstractTestLogging; import org.apache.qpid.test.utils.JMXTestUtils; @@ -266,7 +267,7 @@ public class ManagementLoggingTest extends AbstractTestLogging { if (isJavaBroker()) { - setSystemProperty("qpid.use_custom_rmi_socket_factory", "false"); + setSystemProperty(BrokerProperties.PROPERTY_USE_CUSTOM_RMI_SOCKET_FACTORY, "false"); startBrokerAndCreateMonitor(true, false); final JMXTestUtils jmxUtils = new JMXTestUtils(this); diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java index ab2a3738bb..43707e0550 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java @@ -61,6 +61,7 @@ import org.apache.qpid.server.BrokerLauncher; import org.apache.qpid.server.BrokerOptions; import org.apache.qpid.server.ProtocolExclusion; import org.apache.qpid.server.ProtocolInclusion; +import org.apache.qpid.server.configuration.BrokerProperties; import org.apache.qpid.server.configuration.ServerConfiguration; import org.apache.qpid.server.protocol.AmqpProtocolVersion; import org.apache.qpid.server.store.MessageStoreConstants; @@ -394,7 +395,7 @@ public class QpidBrokerTestCase extends QpidTestCase if (_brokerType.equals(BrokerType.INTERNAL) && !existingInternalBroker()) { - setSystemProperty("qpid.use_custom_rmi_socket_factory", "false"); + setSystemProperty(BrokerProperties.PROPERTY_USE_CUSTOM_RMI_SOCKET_FACTORY, "false"); testConfig = saveTestConfiguration(port, testConfiguration); _logger.info("Set test.config property to: " + testConfig); _logger.info("Set test.virtualhosts property to: " + virtualHostsConfig); -- cgit v1.2.1