diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2014-08-18 00:32:44 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2014-08-18 00:32:44 +0000 |
| commit | f3e1ac2fd1570ed71293fa68673e6e8161aad8de (patch) | |
| tree | 64397986acb6ab5b2e2ad56a0b5fbf458469727a /qpid/java | |
| parent | 01a5bda09ed63b7520959fc28bcd53ce6fb6eb9f (diff) | |
| download | qpid-python-f3e1ac2fd1570ed71293fa68673e6e8161aad8de.tar.gz | |
QPID-6011 : [Java Broker] provide a mechanism for disabling plugins and implementation types
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1618531 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
16 files changed, 175 insertions, 31 deletions
diff --git a/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java b/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java index 67ae9fbce5..3c6cb4270e 100644 --- a/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java +++ b/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java @@ -26,16 +26,21 @@ import java.io.PrintWriter; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; import javax.tools.Diagnostic; import javax.tools.JavaFileObject; @@ -49,6 +54,9 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor private Map<String, Set<String>> _managedObjectClasses = new HashMap<>(); + private Map<String, String> _typeMap = new HashMap<>(); + private Map<String, String> _categoryMap = new HashMap<>(); + @Override public SourceVersion getSupportedSourceVersion() { @@ -78,14 +86,31 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor { PackageElement packageElement = elementUtils.getPackageOf(e); String packageName = packageElement.getQualifiedName().toString(); - + String className = e.getSimpleName().toString(); + for(AnnotationMirror a : e.getAnnotationMirrors()) + { + if(a.getAnnotationType().asElement().equals(annotationElement)) + { + for(Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : a.getElementValues().entrySet()) + { + if(entry.getKey().getSimpleName().toString().equals("type")) + { + _typeMap.put(packageName + "." + className, (String) entry.getValue().getValue()); + processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "looking for " + packageName + "." + className); + _categoryMap.put(packageName + "." + className, getCategory((TypeElement)e)); + break; + } + } + break; + } + } Set<String> classNames = _managedObjectClasses.get(packageName); if (classNames == null) { classNames = new HashSet<>(); _managedObjectClasses.put(packageName, classNames); } - classNames.add(e.getSimpleName().toString()); + classNames.add(className); } } for (Map.Entry<String, Set<String>> entry : _managedObjectClasses.entrySet()) @@ -93,6 +118,8 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor generateRegistrationFile(entry.getKey(), entry.getValue()); } _managedObjectClasses.clear(); + _typeMap.clear(); + _categoryMap.clear(); } catch (Exception e) { @@ -102,6 +129,63 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor return false; } + private String getCategory(final TypeElement e) + { + Elements elementUtils = processingEnv.getElementUtils(); + TypeElement annotationElement = elementUtils.getTypeElement(MANAGED_OBJECT_CANONICAL_NAME); + String category = null; + List<? extends AnnotationMirror> annotationMirrors = e.getAnnotationMirrors(); + if(annotationMirrors != null) + { + for (AnnotationMirror a : annotationMirrors) + { + if (a.getAnnotationType().asElement().equals(annotationElement)) + { + category = e.getSimpleName().toString().toLowerCase(); + + for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : a.getElementValues() + .entrySet()) + { + if (entry.getKey().getSimpleName().toString().equals("category")) + { + if (!Boolean.TRUE.equals(entry.getValue().getValue())) + { + category = null; + } + + break; + } + } + break; + } + } + } + + if (category == null) + { + for (TypeMirror interfaceMirror : e.getInterfaces()) + { + category = getCategory((TypeElement) processingEnv.getTypeUtils().asElement(interfaceMirror)); + if (category != null) + { + break; + } + } + } + + if (category == null && e.getSuperclass() != null) + { + TypeElement parent = (TypeElement) processingEnv.getTypeUtils().asElement(e.getSuperclass()); + if(parent != null) + { + category = getCategory(parent); + } + } + + return category; + + } + private void generateRegistrationFile(final String packageName, final Set<String> classNames) { final String className = "ConfiguredObjectRegistrationImpl"; @@ -144,7 +228,21 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor pw.println(" Set<Class<? extends ConfiguredObject>> implementations = new HashSet<>();"); for(String implementationName : classNames) { - pw.println(" implementations.add("+implementationName+".class);"); + String qualifiedImplementationName = packageName + "." + implementationName; + if(_typeMap.get(qualifiedImplementationName) != null && _categoryMap.get(qualifiedImplementationName) != null) + { + pw.println(" if(!Boolean.getBoolean(\"qpid.type.disabled:" + +_categoryMap.get(qualifiedImplementationName) + +"."+_typeMap.get(qualifiedImplementationName)+"\"))"); + pw.println(" {"); + pw.println(" implementations.add("+implementationName+".class);"); + pw.println(" }"); + + } + else + { + pw.println(" implementations.add(" + implementationName + ".class);"); + } } pw.println(" _implementations = Collections.unmodifiableSet(implementations);"); pw.println(" }"); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java index fc3ec82041..418e5c2657 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java @@ -54,6 +54,7 @@ public class BrokerOptions public static final String DEFAULT_LOG_CONFIG_FILE = "etc/log4j.xml"; public static final String DEFAULT_INITIAL_CONFIG_LOCATION = BrokerOptions.class.getClassLoader().getResource(DEFAULT_INITIAL_CONFIG_NAME).toExternalForm(); + public static final String MANAGEMENT_MODE_USER_NAME = "mm_admin"; private static final int MANAGEMENT_MODE_PASSWORD_LENGTH = 10; @@ -76,6 +77,7 @@ public class BrokerOptions private boolean _skipLoggingConfiguration; private boolean _overwriteConfigurationStore; private Map<String, String> _configProperties = new HashMap<String,String>(); + private String _initialSystemProperties; public Map<String, Object> convertToSystemAttributes() { @@ -369,4 +371,5 @@ public class BrokerOptions return _configProperties.get(QPID_HOME_DIR); } + } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java index 2cffea5d73..02c9ccf8e1 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java @@ -105,7 +105,7 @@ public final class BrokerModel extends Model addRelationship(Session.class, Publisher.class); _objectFactory = new ConfiguredObjectFactoryImpl(this); - _typeRegistry = new ConfiguredObjectTypeRegistry((new QpidServiceLoader<ConfiguredObjectRegistration>()).instancesOf(ConfiguredObjectRegistration.class), getSupportedCategories()); + _typeRegistry = new ConfiguredObjectTypeRegistry((new QpidServiceLoader()).instancesOf(ConfiguredObjectRegistration.class), getSupportedCategories()); } public final ConfiguredObjectTypeRegistry getTypeRegistry() diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java index 440a790fc8..350e4fcd44 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java @@ -44,8 +44,8 @@ public class ConfiguredObjectFactoryImpl implements ConfiguredObjectFactory public ConfiguredObjectFactoryImpl(Model model) { _model = model; - QpidServiceLoader<ConfiguredObjectTypeFactory> serviceLoader = - new QpidServiceLoader<ConfiguredObjectTypeFactory>(); + QpidServiceLoader serviceLoader = + new QpidServiceLoader(); Iterable<ConfiguredObjectTypeFactory> allFactories = serviceLoader.instancesOf(ConfiguredObjectTypeFactory.class); for (ConfiguredObjectTypeFactory factory : allFactories) diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java index 6f6d04c335..1fbc0c8bc1 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java @@ -151,8 +151,7 @@ public class AmqpPortImpl extends AbstractPortWithAuthProvider<AmqpPortImpl> imp TransportProvider transportProvider = null; final HashSet<Transport> transportSet = new HashSet<Transport>(transports); - for (TransportProviderFactory tpf : (new QpidServiceLoader<TransportProviderFactory>()).instancesOf( - TransportProviderFactory.class)) + for (TransportProviderFactory tpf : (new QpidServiceLoader()).instancesOf(TransportProviderFactory.class)) { if (tpf.getSupportedTransports().contains(transports)) { @@ -284,7 +283,7 @@ public class AmqpPortImpl extends AbstractPortWithAuthProvider<AmqpPortImpl> imp public static Set<Protocol> getInstalledProtocols() { Set<Protocol> protocols = new HashSet<>(); - for(ProtocolEngineCreator installedEngine : (new QpidServiceLoader<ProtocolEngineCreator>()).instancesOf(ProtocolEngineCreator.class)) + for(ProtocolEngineCreator installedEngine : (new QpidServiceLoader()).instancesOf(ProtocolEngineCreator.class)) { protocols.add(installedEngine.getVersion()); } @@ -343,7 +342,7 @@ public class AmqpPortImpl extends AbstractPortWithAuthProvider<AmqpPortImpl> imp { Set<Set<Transport>> combinations = new HashSet<>(); - for(TransportProviderFactory providerFactory : (new QpidServiceLoader<TransportProviderFactory>()).instancesOf(TransportProviderFactory.class)) + for(TransportProviderFactory providerFactory : (new QpidServiceLoader()).instancesOf(TransportProviderFactory.class)) { combinations.addAll(providerFactory.getSupportedTransports()); } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/JDBCConnectionProviderFactory.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/JDBCConnectionProviderFactory.java index 14acd59928..6375a03cdf 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/JDBCConnectionProviderFactory.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/JDBCConnectionProviderFactory.java @@ -21,14 +21,9 @@ package org.apache.qpid.server.plugin; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.store.jdbc.ConnectionProvider; public interface JDBCConnectionProviderFactory extends Pluggable @@ -48,7 +43,7 @@ public interface JDBCConnectionProviderFactory extends Pluggable public static JDBCConnectionProviderFactory get(String type) { - QpidServiceLoader<JDBCConnectionProviderFactory> qpidServiceLoader = new QpidServiceLoader<JDBCConnectionProviderFactory>(); + QpidServiceLoader qpidServiceLoader = new QpidServiceLoader(); Iterable<JDBCConnectionProviderFactory> factories = qpidServiceLoader.atLeastOneInstanceOf(JDBCConnectionProviderFactory.class); for(JDBCConnectionProviderFactory factory : factories) { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/PluggableFactoryLoader.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/PluggableFactoryLoader.java index 40db520ff1..462f32e636 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/PluggableFactoryLoader.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/PluggableFactoryLoader.java @@ -33,7 +33,7 @@ public class PluggableFactoryLoader<T extends Pluggable> public PluggableFactoryLoader(Class<T> factoryClass) { Map<String, T> fm = new HashMap<String, T>(); - QpidServiceLoader<T> qpidServiceLoader = new QpidServiceLoader<T>(); + QpidServiceLoader qpidServiceLoader = new QpidServiceLoader(); Iterable<T> factories = qpidServiceLoader.atLeastOneInstanceOf(factoryClass); for (T factory : factories) { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/QpidServiceLoader.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/QpidServiceLoader.java index 6920d5a879..51f2940913 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/QpidServiceLoader.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/QpidServiceLoader.java @@ -24,16 +24,17 @@ import java.util.List; import java.util.ServiceLoader; import org.apache.log4j.Logger; + import org.apache.qpid.server.util.ServerScopedRuntimeException; /** * Simple facade over a {@link ServiceLoader} to instantiate all configured implementations of an interface. */ -public class QpidServiceLoader<C extends Pluggable> +public class QpidServiceLoader { private static final Logger _logger = Logger.getLogger(QpidServiceLoader.class); - public Iterable<C> instancesOf(Class<C> clazz) + public <C extends Pluggable> Iterable<C> instancesOf(Class<C> clazz) { return instancesOf(clazz, false); } @@ -41,12 +42,12 @@ public class QpidServiceLoader<C extends Pluggable> /** * @throws RuntimeException if at least one implementation is not found. */ - public Iterable<C> atLeastOneInstanceOf(Class<C> clazz) + public <C extends Pluggable> Iterable<C> atLeastOneInstanceOf(Class<C> clazz) { return instancesOf(clazz, true); } - private Iterable<C> instancesOf(Class<C> clazz, boolean atLeastOne) + private <C extends Pluggable> Iterable<C> instancesOf(Class<C> clazz, boolean atLeastOne) { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Iterator<C> serviceLoaderIterator = ServiceLoader.load(clazz, classLoader).iterator(); @@ -55,7 +56,11 @@ public class QpidServiceLoader<C extends Pluggable> List<C> serviceImplementations = new ArrayList<C>(); while(serviceLoaderIterator.hasNext()) { - serviceImplementations.add(serviceLoaderIterator.next()); + C next = serviceLoaderIterator.next(); + if(!isDisabled(next)) + { + serviceImplementations.add(next); + } } if(atLeastOne && serviceImplementations.isEmpty()) @@ -70,4 +75,16 @@ public class QpidServiceLoader<C extends Pluggable> return serviceImplementations; } + + private <C extends Pluggable> boolean isDisabled(final C next) + { + return Boolean.getBoolean("qpid.plugin.disabled:"+next.getClass().getName()) + || (next instanceof ConfiguredObjectTypeFactory && isDisabledConfiguredType((ConfiguredObjectTypeFactory<?>) next)); + } + + private boolean isDisabledConfiguredType(final ConfiguredObjectTypeFactory<?> typeFactory) + { + return Boolean.getBoolean("qpid.type.disabled:" + typeFactory.getCategoryClass().getSimpleName().toLowerCase() + + "." + typeFactory.getType()); + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MessageConverterRegistry.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MessageConverterRegistry.java index 81e5af179d..7959c7f6b4 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MessageConverterRegistry.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MessageConverterRegistry.java @@ -35,7 +35,7 @@ public class MessageConverterRegistry static { - for(MessageConverter<? extends ServerMessage, ? extends ServerMessage> converter : (new QpidServiceLoader<MessageConverter>()).instancesOf(MessageConverter.class)) + for(MessageConverter<? extends ServerMessage, ? extends ServerMessage> converter : (new QpidServiceLoader()).instancesOf(MessageConverter.class)) { Map<Class<? extends ServerMessage>, MessageConverter> map = _converters.get(converter.getInputClass()); if(map == null) diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactory.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactory.java index b1c49c6fe5..ac8bdc3fa4 100755 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactory.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactory.java @@ -72,7 +72,7 @@ public class MultiVersionProtocolEngineFactory implements ProtocolEngineFactory _supported = supportedVersions; _defaultSupportedReply = defaultSupportedReply; final List<ProtocolEngineCreator> creators = new ArrayList<ProtocolEngineCreator>(); - for(ProtocolEngineCreator c : new QpidServiceLoader<ProtocolEngineCreator>().instancesOf(ProtocolEngineCreator.class)) + for(ProtocolEngineCreator c : new QpidServiceLoader().instancesOf(ProtocolEngineCreator.class)) { creators.add(c); } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/MessageMetaDataTypeRegistry.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/MessageMetaDataTypeRegistry.java index 64f3ab15ee..940abf42f4 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/MessageMetaDataTypeRegistry.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/MessageMetaDataTypeRegistry.java @@ -32,7 +32,7 @@ public class MessageMetaDataTypeRegistry int maxOrdinal = -1; Iterable<MessageMetaDataType> messageMetaDataTypes = - new QpidServiceLoader<MessageMetaDataType>().atLeastOneInstanceOf(MessageMetaDataType.class); + new QpidServiceLoader().atLeastOneInstanceOf(MessageMetaDataType.class); for(MessageMetaDataType type : messageMetaDataTypes) { @@ -42,7 +42,7 @@ public class MessageMetaDataTypeRegistry } } values = new MessageMetaDataType[maxOrdinal+1]; - for(MessageMetaDataType type : new QpidServiceLoader<MessageMetaDataType>().instancesOf(MessageMetaDataType.class)) + for(MessageMetaDataType type : new QpidServiceLoader().instancesOf(MessageMetaDataType.class)) { if(values[type.ordinal()] != null) { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java index b72d44debf..450fc30bf2 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java @@ -272,7 +272,7 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte private void registerSystemNodes() { - QpidServiceLoader<SystemNodeCreator> qpidServiceLoader = new QpidServiceLoader<SystemNodeCreator>(); + QpidServiceLoader qpidServiceLoader = new QpidServiceLoader(); Iterable<SystemNodeCreator> factories = qpidServiceLoader.instancesOf(SystemNodeCreator.class); for(SystemNodeCreator creator : factories) { diff --git a/qpid/java/broker-core/src/main/resources/system.properties b/qpid/java/broker-core/src/main/resources/system.properties new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/qpid/java/broker-core/src/main/resources/system.properties diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/PluginClassProviderAction.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/PluginClassProviderAction.java index 1f6e26106f..cd14abc582 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/PluginClassProviderAction.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/PluginClassProviderAction.java @@ -19,12 +19,11 @@ package org.apache.qpid.server.management.plugin.servlet.rest;/* * */ -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; + import org.apache.qpid.server.model.Broker; import org.apache.qpid.server.plugin.Pluggable; import org.apache.qpid.server.plugin.QpidServiceLoader; @@ -43,7 +42,7 @@ public class PluginClassProviderAction implements Action try { String className = (String) request.get("plugin"); - QpidServiceLoader<Pluggable> serviceLoader = new QpidServiceLoader<Pluggable>(); + QpidServiceLoader serviceLoader = new QpidServiceLoader(); final Class<Pluggable> clazz = (Class<Pluggable>) Class.forName("org.apache.qpid.server.plugin."+className); List<String> values = new ArrayList<String>(); for(Pluggable instance : serviceLoader.instancesOf(clazz)) diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java index 61061e6209..ead6ba6865 100644 --- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java +++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java @@ -90,7 +90,7 @@ public class JMXManagementPluginImpl _changeListener = new ChangeListener(); _pluginMBeanProvider = new PluginMBeansProvider(); _mBeanProviders = new HashSet<MBeanProvider>(); - QpidServiceLoader<MBeanProvider> qpidServiceLoader = new QpidServiceLoader<MBeanProvider>(); + QpidServiceLoader qpidServiceLoader = new QpidServiceLoader(); for (MBeanProvider provider : qpidServiceLoader.instancesOf(MBeanProvider.class)) { _mBeanProviders.add(provider); diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java index 72550128b7..43b0f9da67 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java @@ -25,6 +25,9 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.HelpFormatter; @@ -94,6 +97,9 @@ public class Main private static final Option OPTION_MM_PASSWORD = OptionBuilder.withArgName("password").hasArg() .withDescription("Set the password for the management mode user " + BrokerOptions.MANAGEMENT_MODE_USER_NAME).withLongOpt("management-mode-password").create("mmpass"); + private static final Option OPTION_INITIAL_SYSTEM_PROPERTIES = OptionBuilder.withArgName("path").hasArg() + .withDescription("set the location of initial properties file to set otherwise unset system properties").withLongOpt("system-properties-file").create("props"); + private static final Options OPTIONS = new Options(); static @@ -114,6 +120,7 @@ public class Main OPTIONS.addOption(OPTION_MM_HTTP_PORT); OPTIONS.addOption(OPTION_MM_PASSWORD); OPTIONS.addOption(OPTION_CONFIGURATION_PROPERTY); + OPTIONS.addOption(OPTION_INITIAL_SYSTEM_PROPERTIES); } protected CommandLine _commandLine; @@ -168,7 +175,11 @@ public class Main protected void execute() throws Exception { + String initialProperties = _commandLine.getOptionValue(OPTION_INITIAL_SYSTEM_PROPERTIES.getOpt()); + populateSystemPropertiesFromDefaults(initialProperties); + BrokerOptions options = new BrokerOptions(); + String initialConfigLocation = _commandLine.getOptionValue(OPTION_INITIAL_CONFIGURATION_PATH.getOpt()); if (initialConfigLocation != null) { @@ -304,6 +315,28 @@ public class Main } } + private void populateSystemPropertiesFromDefaults(final String initialProperties) throws IOException + { + URL initialPropertiesLocation; + if(initialProperties == null) + { + initialPropertiesLocation = getClass().getClassLoader().getResource("system.properties"); + } + else + { + initialPropertiesLocation = (new File(initialProperties)).toURI().toURL(); + } + + Properties props = new Properties(); + props.load(initialPropertiesLocation.openStream()); + Set<String> propertyNames = new HashSet<>(props.stringPropertyNames()); + propertyNames.removeAll(System.getProperties().stringPropertyNames()); + for(String propName : propertyNames) + { + System.setProperty(propName, props.getProperty(propName)); + } + } + private void copyInitialConfigFile(final BrokerOptions options, final File destinationFile) { String initialConfigLocation = options.getInitialConfigurationLocation(); |
