summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-08-18 00:32:44 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-08-18 00:32:44 +0000
commitf3e1ac2fd1570ed71293fa68673e6e8161aad8de (patch)
tree64397986acb6ab5b2e2ad56a0b5fbf458469727a /qpid/java
parent01a5bda09ed63b7520959fc28bcd53ce6fb6eb9f (diff)
downloadqpid-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')
-rw-r--r--qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java104
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/BrokerOptions.java3
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryImpl.java4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java7
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/JDBCConnectionProviderFactory.java7
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/PluggableFactoryLoader.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/QpidServiceLoader.java27
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MessageConverterRegistry.java2
-rwxr-xr-xqpid/java/broker-core/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactory.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/MessageMetaDataTypeRegistry.java4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java2
-rw-r--r--qpid/java/broker-core/src/main/resources/system.properties0
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/PluginClassProviderAction.java5
-rw-r--r--qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java33
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();