From 13f6187748872d19e9cc288c9ec87e1d1fc53a11 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Sun, 2 Mar 2014 18:24:27 +0000 Subject: QPID-5578 : [Java Broker] allow the base class AbstractConfiguredObject to take responsibility for the management of managed attributes git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1573336 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/qpid/server/binding/BindingImpl.java | 5 - .../qpid/server/exchange/AbstractExchange.java | 10 +- .../apache/qpid/server/filter/FilterManager.java | 4 + .../qpid/server/filter/SimpleFilterManager.java | 7 + .../qpid/server/model/AuthenticationProvider.java | 2 - .../apache/qpid/server/model/ConfiguredObject.java | 4 +- .../org/apache/qpid/server/model/Connection.java | 14 +- .../org/apache/qpid/server/model/Consumer.java | 10 +- .../org/apache/qpid/server/model/KeyStore.java | 10 +- .../apache/qpid/server/model/ManagedAttribute.java | 2 + .../java/org/apache/qpid/server/model/Session.java | 2 +- .../org/apache/qpid/server/model/TrustStore.java | 10 +- .../model/adapter/AbstractConfiguredObject.java | 344 ++++++++++++++++----- .../model/adapter/AbstractKeyStoreAdapter.java | 35 +-- .../adapter/AccessControlProviderAdapter.java | 8 +- .../adapter/AuthenticationProviderAdapter.java | 31 +- .../qpid/server/model/adapter/BrokerAdapter.java | 5 - .../server/model/adapter/ConnectionAdapter.java | 101 +++--- .../adapter/FileSystemPreferencesProvider.java | 6 - .../server/model/adapter/GroupProviderAdapter.java | 92 ++---- .../qpid/server/model/adapter/KeyStoreAdapter.java | 56 ++-- .../qpid/server/model/adapter/PortAdapter.java | 6 - .../qpid/server/model/adapter/SessionAdapter.java | 35 +-- .../server/model/adapter/TrustStoreAdapter.java | 50 ++- .../server/model/adapter/VirtualHostAdapter.java | 8 +- .../model/adapter/VirtualHostAliasAdapter.java | 17 +- .../apache/qpid/server/queue/AbstractQueue.java | 27 +- .../qpid/server/queue/QueueConsumerImpl.java | 97 +++--- .../startup/KeyStoreRecovererTest.java | 1 + .../startup/VirtualHostRecovererTest.java | 4 + .../adapter/FileSystemPreferencesProviderTest.java | 2 + .../server/management/plugin/HttpManagement.java | 7 - .../org/apache/qpid/server/jmx/JMXManagement.java | 6 - 33 files changed, 525 insertions(+), 493 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java index 18e78eff88..f344d415f0 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java @@ -234,11 +234,6 @@ public class BindingImpl } } - public String getName() - { - return _bindingKey; - } - @Override public String setName(final String currentName, final String desiredName) throws IllegalStateException, AccessControlException diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java index f7f0d8d26c..7ffcbc635f 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java @@ -72,7 +72,6 @@ public abstract class AbstractExchange> { private static final Logger _logger = Logger.getLogger(AbstractExchange.class); private final LifetimePolicy _lifetimePolicy; - private String _name; private final AtomicBoolean _closed = new AtomicBoolean(); private NonDefaultExchange _alternateExchange; @@ -113,7 +112,6 @@ public abstract class AbstractExchange> Collections.emptyMap(), attributes, vhost.getTaskExecutor()); _virtualHost = vhost; - _name = MapValueConverter.getStringAttribute(org.apache.qpid.server.model.Exchange.NAME, attributes); _durable = MapValueConverter.getBooleanAttribute(org.apache.qpid.server.model.Exchange.DURABLE, attributes); _lifetimePolicy = MapValueConverter.getEnumAttribute(LifetimePolicy.class, org.apache.qpid.server.model.Exchange.LIFETIME_POLICY, @@ -170,7 +168,7 @@ public abstract class AbstractExchange> } }; // Log Exchange creation - CurrentActor.get().message(ExchangeMessages.CREATED(getExchangeType().getType(), _name, _durable)); + CurrentActor.get().message(ExchangeMessages.CREATED(getExchangeType().getType(), getName(), _durable)); } public abstract ExchangeType getExchangeType(); @@ -415,12 +413,6 @@ public abstract class AbstractExchange> protected abstract void onUnbind(final BindingImpl binding); - - public String getName() - { - return _name.toString(); - } - public Map getArguments() { return Collections.emptyMap(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/FilterManager.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/FilterManager.java index 4992b960c4..69fc520a8f 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/FilterManager.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/FilterManager.java @@ -23,6 +23,8 @@ package org.apache.qpid.server.filter; // Based on like named file from r450141 of the Apache ActiveMQ project // +import java.util.Iterator; + public interface FilterManager { void add(MessageFilter filter); @@ -31,5 +33,7 @@ public interface FilterManager boolean allAllow(Filterable msg); + Iterator filters(); + boolean hasFilters(); } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java index ddbee299a1..111fb6a333 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java @@ -22,6 +22,7 @@ package org.apache.qpid.server.filter; import org.apache.log4j.Logger; +import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; public class SimpleFilterManager implements FilterManager @@ -67,6 +68,12 @@ public class SimpleFilterManager implements FilterManager return true; } + @Override + public Iterator filters() + { + return _filters.iterator(); + } + public boolean hasFilters() { return !_filters.isEmpty(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java index b806ce4328..e1642f8a2b 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java @@ -36,8 +36,6 @@ public interface AuthenticationProvider> ext //children Collection getVirtualHostPortBindings(); - String getName(); - /** * A temporary method to create SubjectCreator. * diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java index 44df5f70ee..b674f1e7db 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java @@ -49,7 +49,7 @@ public interface ConfiguredObject> * * @return the objects id */ - @ManagedAttribute + @ManagedAttribute( automate = true, mandatory = true ) UUID getId(); /** @@ -57,7 +57,7 @@ public interface ConfiguredObject> * * @return the name of the object */ - @ManagedAttribute + @ManagedAttribute( automate = true, mandatory = true) String getName(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java index f2c0fdb5c0..0c535ba34d 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java @@ -46,28 +46,28 @@ public interface Connection> extends ConfiguredObject /** Name of port associated with the connection */ public static final String PORT = "port"; - @ManagedAttribute + @ManagedAttribute( automate = true ) String getClientId(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getClientVersion(); - @ManagedAttribute + @ManagedAttribute( automate = true ) boolean isIncoming(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getLocalAddress(); @ManagedAttribute String getPrincipal(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getRemoteAddress(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getRemoteProcessName(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getRemoteProcessPid(); @ManagedAttribute diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java index 1911eff78b..05a0a0bf64 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java @@ -35,19 +35,19 @@ public interface Consumer> extends ConfiguredObject public String LIFETIME_POLICY = "lifetimePolicy"; public String STATE = "state"; - @ManagedAttribute + @ManagedAttribute( automate = true ) String getDistributionMode(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getSettlementMode(); - @ManagedAttribute + @ManagedAttribute( automate = true ) boolean isExclusive(); - @ManagedAttribute + @ManagedAttribute( automate = true ) boolean isNoLocal(); - @ManagedAttribute + @ManagedAttribute( automate = true ) String getSelector(); @ManagedStatistic diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/KeyStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/KeyStore.java index 9fee4f4df7..302bea8344 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/KeyStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/KeyStore.java @@ -39,19 +39,19 @@ public interface KeyStore> extends ConfiguredObject String CERTIFICATE_ALIAS = "certificateAlias"; String KEY_MANAGER_FACTORY_ALGORITHM = "keyManagerFactoryAlgorithm"; - @ManagedAttribute( secure = true ) + @ManagedAttribute( secure = true, automate = true, mandatory = true ) public String getPassword(); - @ManagedAttribute + @ManagedAttribute( automate = true, mandatory = true) public String getPath(); - @ManagedAttribute + @ManagedAttribute( automate = true ) public String getCertificateAlias(); - @ManagedAttribute + @ManagedAttribute( automate = true ) public String getKeyManagerFactoryAlgorithm(); - @ManagedAttribute + @ManagedAttribute( automate = true ) public String getKeyStoreType(); public void setPassword(String password); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java index 534ff63b86..036453fcbb 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java @@ -29,4 +29,6 @@ public @interface ManagedAttribute { boolean secure() default false; boolean derived() default false; + boolean automate() default false; + boolean mandatory() default false; } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Session.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Session.java index 8e462883eb..519f96eb1b 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Session.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Session.java @@ -35,7 +35,7 @@ public interface Session> extends ConfiguredObject // available credit of both producer and consumer sides. public static final String PRODUCER_FLOW_BLOCKED = "producerFlowBlocked"; - @ManagedAttribute + @ManagedAttribute( automate = true ) int getChannelId(); @ManagedAttribute diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/TrustStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/TrustStore.java index a5abd7b34e..2685a50776 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/TrustStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/TrustStore.java @@ -39,19 +39,19 @@ public interface TrustStore> extends ConfiguredObject String PEERS_ONLY = "peersOnly"; String TRUST_MANAGER_FACTORY_ALGORITHM = "trustManagerFactoryAlgorithm"; - @ManagedAttribute( secure = true ) + @ManagedAttribute( secure = true, automate = true, mandatory = true) public String getPassword(); - @ManagedAttribute + @ManagedAttribute( automate = true, mandatory = true ) public String getPath(); - @ManagedAttribute + @ManagedAttribute( automate = true ) public String getTrustManagerFactoryAlgorithm(); - @ManagedAttribute + @ManagedAttribute( automate = true ) public String getTrustStoreType(); - @ManagedAttribute + @ManagedAttribute( automate = true ) public boolean isPeersOnly(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractConfiguredObject.java index e61250b455..b82ab55330 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractConfiguredObject.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractConfiguredObject.java @@ -20,6 +20,7 @@ */ package org.apache.qpid.server.model.adapter; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.AccessControlException; @@ -38,14 +39,17 @@ import org.apache.qpid.server.configuration.updater.ChangeStateTask; import org.apache.qpid.server.configuration.updater.CreateChildTask; import org.apache.qpid.server.configuration.updater.SetAttributeTask; import org.apache.qpid.server.configuration.updater.TaskExecutor; +import org.apache.qpid.server.security.*; +import org.apache.qpid.server.security.SecurityManager; import org.apache.qpid.server.security.auth.AuthenticatedPrincipal; import org.apache.qpid.server.util.MapValueConverter; +import org.apache.qpid.server.util.ServerScopedRuntimeException; import javax.security.auth.Subject; public abstract class AbstractConfiguredObject> implements ConfiguredObject { - private static final Object ID = "id"; + private static final String ID = "id"; private static final Map, Collection>> _allAttributes = Collections.synchronizedMap(new HashMap, Collection>>()); @@ -53,6 +57,27 @@ public abstract class AbstractConfiguredObject> im private static final Map, Collection>> _allStatistics = Collections.synchronizedMap(new HashMap, Collection>>()); + private static final Map, Map>> _allAttributeTypes = + Collections.synchronizedMap(new HashMap, Map>>()); + + private static final Map, Map> _allAutomatedFields = + Collections.synchronizedMap(new HashMap, Map>()); + private static final Map SECURE_VALUES; + static + { + Map secureValues = new HashMap(); + secureValues.put(String.class, "********"); + secureValues.put(Integer.class, 0); + secureValues.put(Long.class, 0l); + secureValues.put(Byte.class, (byte)0); + secureValues.put(Short.class, (short)0); + secureValues.put(Double.class, (double)0); + secureValues.put(Float.class, (float)0); + + SECURE_VALUES = Collections.unmodifiableMap(secureValues); + } + + private final Map _attributes = new HashMap(); private final Map, ConfiguredObject> _parents = new HashMap, ConfiguredObject>(); @@ -65,20 +90,50 @@ public abstract class AbstractConfiguredObject> im private final long _createdTime; private final String _createdBy; + private String _name; + + private final Map> _attributeTypes; + private final Map _automatedFields; + protected AbstractConfiguredObject(UUID id, Map defaults, Map attributes, TaskExecutor taskExecutor) { - this(id, defaults, attributes, taskExecutor, true); + this(defaults, combineIdWithAttributes(id,attributes), taskExecutor); } + public static Map combineIdWithAttributes(UUID id, Map attributes) + { + Map combined = new HashMap(attributes); + combined.put(ID, id); + return combined; + } + + protected AbstractConfiguredObject(UUID id, Map defaults, Map attributes, TaskExecutor taskExecutor, boolean filterAttributes) + { + this(defaults, combineIdWithAttributes(id, attributes), taskExecutor, filterAttributes); + } + + protected AbstractConfiguredObject(Map defaults, + Map attributes, + TaskExecutor taskExecutor) + { + this(defaults, attributes, taskExecutor, true); + } + + protected AbstractConfiguredObject(Map defaults, + Map attributes, + TaskExecutor taskExecutor, + boolean filterAttributes) { _taskExecutor = taskExecutor; - _id = id; + _id = (UUID)attributes.get(ID); + _attributeTypes = getAttributeTypes(getClass()); + _automatedFields = getAutomatedFields(getClass()); if (attributes != null) { Collection names = getAttributeNames(); @@ -95,6 +150,10 @@ public abstract class AbstractConfiguredObject> im { _attributes.put(name, value); } + if(_automatedFields.containsKey(name)) + { + automatedSetValue(name, value); + } } } } @@ -105,6 +164,10 @@ public abstract class AbstractConfiguredObject> im if(entry.getValue()!=null) { _attributes.put(entry.getKey(),entry.getValue()); + if(_automatedFields.containsKey(entry.getKey())) + { + automatedSetValue(entry.getKey(), entry.getValue()); + } } } } @@ -113,10 +176,35 @@ public abstract class AbstractConfiguredObject> im if (defaults != null) { _defaultAttributes.putAll(defaults); + for(Map.Entry defaultedEntry : defaults.entrySet()) + { + if(_automatedFields.containsKey(defaultedEntry.getKey()) && !attributes.containsKey(defaultedEntry.getKey())) + { + automatedSetValue(defaultedEntry.getKey(),defaultedEntry.getValue()); + } + } } _createdTime = MapValueConverter.getLongAttribute(CREATED_TIME, attributes, System.currentTimeMillis()); _createdBy = MapValueConverter.getStringAttribute(CREATED_BY, attributes, getCurrentUserName()); + for(Attribute attr : _attributeTypes.values()) + { + if(attr.getAnnotation().mandatory() && !(attributes.containsKey(attr.getName())|| defaults.containsKey(attr.getName()))) + { + throw new IllegalArgumentException("Mandatory attribute " + attr.getName() + " not supplied for instance of " + getClass().getName()); + } + } + } + private void automatedSetValue(final String name, final Object value) + { + try + { + _automatedFields.get(name).set(this,_attributeTypes.get(name).convert(value)); + } + catch (IllegalAccessException e) + { + throw new ServerScopedRuntimeException("Unable to set the automated attribute " + name + " on the configure object type " + getClass().getName(),e); + } } protected AbstractConfiguredObject(UUID id, TaskExecutor taskExecutor) @@ -129,6 +217,11 @@ public abstract class AbstractConfiguredObject> im return _id; } + public final String getName() + { + return _name; + } + public State getDesiredState() { return null; //TODO @@ -245,12 +338,29 @@ public abstract class AbstractConfiguredObject> im @Override public Object getAttribute(String name) { - Object value = getActualAttribute(name); - if (value == null) + Attribute attr = _attributeTypes.get(name); + if(attr != null && attr.getAnnotation().automate()) { - value = getDefaultAttribute(name); + Object value = attr.get(this); + if(value != null && attr.getAnnotation().secure() && + !SecurityManager.SYSTEM.equals(Subject.getSubject(AccessController.getContext()))) + { + return SECURE_VALUES.get(value.getClass()); + } + else + { + return value; + } + } + else + { + Object value = getActualAttribute(name); + if (value == null) + { + value = getDefaultAttribute(name); + } + return value; } - return value; } @Override @@ -325,6 +435,18 @@ public abstract class AbstractConfiguredObject> im { //TODO: don't put nulls _attributes.put(name, desired); + Attribute attr = _attributeTypes.get(name); + if(attr != null && attr.getAnnotation().automate()) + { + if(desired == null && _defaultAttributes.containsKey(name)) + { + automatedSetValue(name, _defaultAttributes.get(name)); + } + else + { + automatedSetValue(name, desired); + } + } return true; } else @@ -441,7 +563,7 @@ public abstract class AbstractConfiguredObject> im { UUID id = getId(); Object idAttributeValue = attributes.get(ID); - if (idAttributeValue != null && !idAttributeValue.equals(id.toString())) + if (idAttributeValue != null && !(idAttributeValue.equals(id) || idAttributeValue.equals(id.toString()))) { throw new IllegalConfigurationException("Cannot change existing configured object id"); } @@ -632,6 +754,22 @@ public abstract class AbstractConfiguredObject> im Object o = attributeMap.get(_name); return _converter.convert(o); } + + public T get(final AbstractConfiguredObject object) + { + try + { + return (T) _getter.invoke(object); + } + catch (IllegalAccessException e) + { + throw new ServerScopedRuntimeException("Unable to access attribute " + getName() + " on configuredObject type " + object.getClass().getName(), e); + } + catch (InvocationTargetException e) + { + throw new ServerScopedRuntimeException("Unable to access attribute " + getName() + " on configuredObject type " + object.getClass().getName(), e); + } + } } private static final class Statistic extends AttributeOrStatistic @@ -646,14 +784,28 @@ public abstract class AbstractConfiguredObject> im public static final class Attribute extends AttributeOrStatistic { - private Attribute(Class clazz, String name, Class type, final Method getter) + private final ManagedAttribute _annotation; + + private Attribute(Class clazz, + String name, + Class type, + final Method getter, + final ManagedAttribute annotation) { super(name, getter, type); + _annotation = annotation; addToAttributesSet(clazz, this); } + public ManagedAttribute getAnnotation() + { + return _annotation; + } - + public T convert(final Object value) + { + return _converter.convert(value); + } } @@ -1002,36 +1154,59 @@ public abstract class AbstractConfiguredObject> im private static void processAttributes(final Class clazz) { - if(_allAttributes.containsKey(clazz)) + synchronized (_allAttributes) { - return; - } + if(_allAttributes.containsKey(clazz)) + { + return; + } - for(Class parent : clazz.getInterfaces()) - { - if(ConfiguredObject.class.isAssignableFrom(parent)) + for(Class parent : clazz.getInterfaces()) { - processAttributes((Class)parent); + if(ConfiguredObject.class.isAssignableFrom(parent)) + { + processAttributes((Class)parent); + } + } + final Class superclass = clazz.getSuperclass(); + if(superclass != null && ConfiguredObject.class.isAssignableFrom(superclass)) + { + processAttributes((Class) superclass); } - } - final Class superclass = clazz.getSuperclass(); - if(superclass != null && ConfiguredObject.class.isAssignableFrom(superclass)) - { - processAttributes((Class) superclass); - } - final ArrayList> attributeList = new ArrayList>(); - final ArrayList> statisticList = new ArrayList>(); + final ArrayList> attributeList = new ArrayList>(); + final ArrayList> statisticList = new ArrayList>(); - _allAttributes.put(clazz, attributeList); - _allStatistics.put(clazz, statisticList); + _allAttributes.put(clazz, attributeList); + _allStatistics.put(clazz, statisticList); - for(Class parent : clazz.getInterfaces()) - { - if(ConfiguredObject.class.isAssignableFrom(parent)) + for(Class parent : clazz.getInterfaces()) { - Collection> attrs = _allAttributes.get(parent); + if(ConfiguredObject.class.isAssignableFrom(parent)) + { + Collection> attrs = _allAttributes.get(parent); + for(Attribute attr : attrs) + { + if(!attributeList.contains(attr)) + { + attributeList.add(attr); + } + } + Collection> stats = _allStatistics.get(parent); + for(Statistic stat : stats) + { + if(!statisticList.contains(stat)) + { + statisticList.add(stat); + } + } + } + } + if(superclass != null && ConfiguredObject.class.isAssignableFrom(superclass)) + { + Collection> attrs = _allAttributes.get(superclass); + Collection> stats = _allStatistics.get(superclass); for(Attribute attr : attrs) { if(!attributeList.contains(attr)) @@ -1039,7 +1214,6 @@ public abstract class AbstractConfiguredObject> im attributeList.add(attr); } } - Collection> stats = _allStatistics.get(parent); for(Statistic stat : stats) { if(!statisticList.contains(stat)) @@ -1048,61 +1222,76 @@ public abstract class AbstractConfiguredObject> im } } } - } - if(superclass != null && ConfiguredObject.class.isAssignableFrom(superclass)) - { - Collection> attrs = _allAttributes.get(superclass); - Collection> stats = _allStatistics.get(superclass); - for(Attribute attr : attrs) + + + for(Method m : clazz.getDeclaredMethods()) { - if(!attributeList.contains(attr)) + ManagedAttribute annotation = m.getAnnotation(ManagedAttribute.class); + if(annotation != null) { - attributeList.add(attr); + if(m.getParameterTypes().length != 0) + { + throw new IllegalArgumentException("ManagedAttribute annotation should only be added to no-arg getters"); + } + Class type = getType(m); + String name = getName(m, type); + Attribute newAttr = new Attribute(clazz,name,type,m, annotation); + } - } - for(Statistic stat : stats) - { - if(!statisticList.contains(stat)) + else { - statisticList.add(stat); + ManagedStatistic statAnnotation = m.getAnnotation(ManagedStatistic.class); + if(statAnnotation != null) + { + if(m.getParameterTypes().length != 0) + { + throw new IllegalArgumentException("ManagedStatistic annotation should only be added to no-arg getters"); + } + Class type = getType(m); + if(!Number.class.isAssignableFrom(type)) + { + throw new IllegalArgumentException("ManagedStatistic annotation should only be added to getters returning a Number type"); + } + String name = getName(m, type); + Statistic newStat = new Statistic(clazz,name,type,m); + } } } - } + Map> attrMap = new HashMap>(); + Map fieldMap = new HashMap(); - for(Method m : clazz.getDeclaredMethods()) - { - ManagedAttribute annotation = m.getAnnotation(ManagedAttribute.class); - if(annotation != null) + + Collection> attrCol = _allAttributes.get(clazz); + for(Attribute attr : attrCol) { - if(m.getParameterTypes().length != 0) + attrMap.put(attr.getName(), attr); + if(attr.getAnnotation().automate()) { - throw new IllegalArgumentException("ManagedAttribute annotation should only be added to no-arg getters"); + fieldMap.put(attr.getName(), findField(attr, clazz)); } - Class type = getType(m); - String name = getName(m, type); - Attribute newAttr = new Attribute(clazz,name,type,m); } - else + _allAttributeTypes.put(clazz, attrMap); + _allAutomatedFields.put(clazz, fieldMap); + } + } + + private static Field findField(final Attribute attr, Class clazz) + { + while(clazz != null) + { + for(Field field : clazz.getDeclaredFields()) { - ManagedStatistic statAnnotation = m.getAnnotation(ManagedStatistic.class); - if(statAnnotation != null) + if(field.getName().equals("_" + attr.getName())) { - if(m.getParameterTypes().length != 0) - { - throw new IllegalArgumentException("ManagedStatistic annotation should only be added to no-arg getters"); - } - Class type = getType(m); - if(!Number.class.isAssignableFrom(type)) - { - throw new IllegalArgumentException("ManagedStatistic annotation should only be added to getters returning a Number type"); - } - String name = getName(m, type); - Statistic newStat = new Statistic(clazz,name,type,m); + field.setAccessible(true); + return field; } } + clazz = clazz.getSuperclass(); } + return null; } private static String getName(final Method m, final Class type) @@ -1246,6 +1435,21 @@ public abstract class AbstractConfiguredObject> im } + private static Map> getAttributeTypes(final Class clazz) + { + if(!_allAttributeTypes.containsKey(clazz)) + { + processAttributes(clazz); + } + return _allAttributeTypes.get(clazz); + } - + private static Map getAutomatedFields(Class clazz) + { + if(!_allAutomatedFields.containsKey(clazz)) + { + processAttributes(clazz); + } + return _allAutomatedFields.get(clazz); + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java index 1cf5ddf02a..794687b9c7 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.Map; import java.util.UUID; +import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.model.Broker; import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.KeyStore; @@ -43,25 +44,19 @@ public abstract class AbstractKeyStoreAdapter> ext public static final String DUMMY_PASSWORD_MASK = "********"; public static final String DEFAULT_KEYSTORE_TYPE = java.security.KeyStore.getDefaultType(); - private String _name; private String _password; + protected AbstractKeyStoreAdapter(UUID id, Broker broker, Map defaults, Map attributes) { super(id, defaults, attributes, broker.getTaskExecutor()); + addParent(Broker.class, broker); - _name = MapValueConverter.getStringAttribute(TrustStore.NAME, attributes); - _password = MapValueConverter.getStringAttribute(TrustStore.PASSWORD, attributes); MapValueConverter.assertMandatoryAttribute(KeyStore.PATH, attributes); } - @Override - public String getName() - { - return _name; - } @Override public String setName(String currentName, String desiredName) throws IllegalStateException, AccessControlException @@ -115,15 +110,7 @@ public abstract class AbstractKeyStoreAdapter> ext @Override public Object getAttribute(String name) { - if(KeyStore.ID.equals(name)) - { - return getId(); - } - else if(KeyStore.NAME.equals(name)) - { - return getName(); - } - else if(KeyStore.STATE.equals(name)) + if(KeyStore.STATE.equals(name)) { return getState(); } @@ -135,25 +122,13 @@ public abstract class AbstractKeyStoreAdapter> ext { return getLifetimePolicy(); } - else if(KeyStore.PASSWORD.equals(name)) - { - return getPassword(); - } return super.getAttribute(name); } public String getPassword() { - // For security reasons we don't expose the password unless running as the system user - if(SecurityManager.SYSTEM.equals(Subject.getSubject(AccessController.getContext()))) - { - return _password; - } - else - { - return DUMMY_PASSWORD_MASK; - } + return _password; } public void setPassword(String password) diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java index f3c8d52286..ee6a5b5607 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java @@ -49,7 +49,7 @@ public class AccessControlProviderAdapter extends AbstractConfiguredObject attributes, Collection attributeNames) { - super(id, Collections.emptyMap(), Collections.emptyMap(), broker.getTaskExecutor()); + super(id, Collections.emptyMap(), Collections.singletonMap(NAME,attributes.get(NAME)), broker.getTaskExecutor()); if (accessControl == null) { @@ -88,12 +88,6 @@ public class AccessControlProviderAdapter extends AbstractConfiguredObject attributes, Collection attributeNames) { - super(id, Collections.emptyMap(), Collections.emptyMap(), broker.getTaskExecutor()); + super(createAttributes(id, attributes), Collections.emptyMap(), broker.getTaskExecutor()); _authManager = authManager; _broker = broker; _supportedAttributes = createSupportedAttributes(attributeNames); @@ -89,6 +89,14 @@ public abstract class AuthenticationProviderAdapter createAttributes(final UUID id, final Map attributes) + { + Map initialAttributes = new HashMap(); + initialAttributes.put(ID, id); + initialAttributes.put(NAME, attributes.get(NAME)); + return initialAttributes; + } + T getAuthManager() { return _authManager; @@ -100,12 +108,6 @@ public abstract class AuthenticationProviderAdapteremptyMap(), createPrincipalAttributes(PrincipalDatabaseAuthenticationManagerAdapter.this, user), PrincipalDatabaseAuthenticationManagerAdapter.this.getTaskExecutor()); _user = user; @@ -581,11 +583,6 @@ public abstract class AuthenticationProviderAdapter createPrincipalAttributes(PrincipalDatabaseAuthenticationManagerAdapter manager, final Principal user) + { + final Map attributes = new HashMap(); + attributes.put(ID, UUIDGenerator.generateUserUUID(manager.getName(), user.getName())); + attributes.put(NAME, user.getName()); + return attributes; + } + } } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java index e12191e9ba..d1f083deed 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java @@ -499,11 +499,6 @@ public class BrokerAdapter> extends AbstractConfiguredObject return true; } - public String getName() - { - return (String)getAttribute(NAME); - } - public String setName(final String currentName, final String desiredName) throws IllegalStateException, AccessControlException { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java index f51fb30584..16b1d0092b 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java @@ -22,14 +22,7 @@ package org.apache.qpid.server.model.adapter; import java.security.AccessControlException; import java.security.Principal; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import org.apache.qpid.protocol.AMQConstant; import org.apache.qpid.server.model.*; @@ -45,34 +38,58 @@ final class ConnectionAdapter extends AbstractConfiguredObject _sessionAdapters = new HashMap(); + private String _remoteAddress; + private String _localAddress; + private String _clientId; + private String _clientVersion; + private boolean _incoming; + private Transport _transport; + private Port _port; + private String _remoteProcessName; + private String _remoteProcessPid; + public ConnectionAdapter(final AMQConnectionModel conn, TaskExecutor taskExecutor) { - super(UUIDGenerator.generateRandomUUID(), taskExecutor); + super(Collections.emptyMap(), createAttributes(conn), taskExecutor); _connection = conn; } + private static Map createAttributes(final AMQConnectionModel conn) + { + Map attributes = new HashMap(); + attributes.put(ID, UUID.randomUUID()); + attributes.put(NAME, conn.getRemoteAddressString().replaceAll("/", "")); + attributes.put(CLIENT_ID, conn.getClientId() ); + attributes.put(CLIENT_VERSION, conn.getClientVersion()); + attributes.put(TRANSPORT, conn.getTransport()); + attributes.put(PORT, conn.getPort()); + attributes.put(INCOMING, true); + attributes.put(REMOTE_ADDRESS, conn.getRemoteAddressString()); + return attributes; + } + @Override public String getClientId() { - return (String) getAttribute(CLIENT_ID); + return _clientId; } @Override public String getClientVersion() { - return (String) getAttribute(CLIENT_VERSION); + return _clientVersion; } @Override public boolean isIncoming() { - return true; + return _incoming; } @Override public String getLocalAddress() { - return (String)getAttribute(LOCAL_ADDRESS); + return _localAddress; } @Override @@ -85,19 +102,19 @@ final class ConnectionAdapter extends AbstractConfiguredObject getSessions() @@ -170,12 +187,6 @@ final class ConnectionAdapter extends AbstractConfiguredObject getAttributeNames() { - final HashSet attrNames = new HashSet(getAttributeNames(Connection.class)); - - return Collections.unmodifiableCollection(attrNames); + return getAttributeNames(Connection.class); } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java index f1ba45dd09..5e3a3061d0 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java @@ -95,12 +95,6 @@ public class FileSystemPreferencesProvider extends AbstractConfiguredObject attributes, Collection attributeNames) { - super(id, Collections.emptyMap(), Collections.emptyMap(), broker.getTaskExecutor()); + super(id, Collections.singletonMap(NAME, attributes.get(NAME)), Collections.emptyMap(), broker.getTaskExecutor()); if (groupManager == null) { @@ -86,12 +80,6 @@ public class GroupProviderAdapter extends AbstractConfiguredObject attrMap = new HashMap(); + UUID id = UUIDGenerator.generateGroupUUID(getName(),groupName); + attrMap.put(Group.ID, id); + attrMap.put(Group.NAME, groupName); + return (C) new GroupAdapter(attrMap, getTaskExecutor()); } @@ -189,7 +181,11 @@ public class GroupProviderAdapter extends AbstractConfiguredObject principals = new ArrayList(groups.size()); for (Principal group : groups) { - principals.add(new GroupAdapter(group.getName(), getTaskExecutor())); + Map attrMap = new HashMap(); + UUID id = UUIDGenerator.generateGroupUUID(getName(),group.getName()); + attrMap.put(Group.ID, id); + attrMap.put(Group.NAME, group.getName()); + principals.add(new GroupAdapter(attrMap, getTaskExecutor())); } return (Collection) Collections .unmodifiableCollection(principals); @@ -331,22 +327,15 @@ public class GroupProviderAdapter extends AbstractConfiguredObject implements Group { - private final String _group; - public GroupAdapter(String group, TaskExecutor taskExecutor) + public GroupAdapter(Map attributes, TaskExecutor taskExecutor) { - super(UUIDGenerator.generateGroupUUID(GroupProviderAdapter.this.getName(), group), taskExecutor); - _group = group; - + super(Collections.emptyMap(),attributes, taskExecutor); } - @Override - public String getName() - { - return _group; - } @Override public String setName(String currentName, String desiredName) @@ -395,11 +384,15 @@ public class GroupProviderAdapter extends AbstractConfiguredObject usersInGroup = _groupManager - .getUserPrincipalsForGroup(_group); + .getUserPrincipalsForGroup(getName()); Collection members = new ArrayList(); for (Principal principal : usersInGroup) { - members.add(new GroupMemberAdapter(principal.getName(), getTaskExecutor())); + UUID id = UUIDGenerator.generateGroupMemberUUID(GroupProviderAdapter.this.getName(), getName(), principal.getName()); + Map attrMap = new HashMap(); + attrMap.put(GroupMember.ID,id); + attrMap.put(GroupMember.NAME, principal.getName()); + members.add(new GroupMemberAdapter(attrMap, getTaskExecutor())); } return (Collection) Collections .unmodifiableCollection(members); @@ -420,10 +413,14 @@ public class GroupProviderAdapter extends AbstractConfiguredObject attrMap = new HashMap(); + attrMap.put(GroupMember.ID,id); + attrMap.put(GroupMember.NAME, memberName); + return (C) new GroupMemberAdapter(attrMap, getTaskExecutor()); } @@ -458,8 +455,8 @@ public class GroupProviderAdapter extends AbstractConfiguredObject implements GroupMember { - private String _memberName; - public GroupMemberAdapter(String memberName, TaskExecutor taskExecutor) + public GroupMemberAdapter(Map attrMap, TaskExecutor taskExecutor) { - super(UUIDGenerator.generateGroupMemberUUID(GroupProviderAdapter.this.getName(), _group, memberName), taskExecutor); - _memberName = memberName; + super(Collections.emptyMap(), attrMap, taskExecutor); } @Override @@ -497,25 +492,6 @@ public class GroupProviderAdapter extends AbstractConfiguredObject im put(KEY_MANAGER_FACTORY_ALGORITHM, String.class); }}); + private String _keyStoreType; + private String _certificateAlias; + private String _keyManagerFactoryAlgorithm; + private String _path; + @SuppressWarnings("serial") public static final Map DEFAULTS = Collections.unmodifiableMap(new HashMap(){{ put(KeyStore.KEY_STORE_TYPE, DEFAULT_KEYSTORE_TYPE); @@ -74,24 +79,11 @@ public class KeyStoreAdapter extends AbstractKeyStoreAdapter im public KeyStoreAdapter(UUID id, Broker broker, Map attributes) { - super(id, broker, DEFAULTS, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES)); + super(id, broker, DEFAULTS, attributes); _broker = broker; - String keyStorePath = (String)getAttribute(KeyStore.PATH); - String keyStorePassword = Subject.doAs(SecurityManager.SYSTEM, new PrivilegedAction() - { - @Override - public String run() - { - return getPassword(); - } - }); - String keyStoreType = (String)getAttribute(KeyStore.KEY_STORE_TYPE); - String keyManagerFactoryAlgorithm = (String)getAttribute(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM); - String certAlias = (String)getAttribute(KeyStore.CERTIFICATE_ALIAS); - - validateKeyStoreAttributes(keyStoreType, keyStorePath, keyStorePassword, - certAlias, keyManagerFactoryAlgorithm); + validateKeyStoreAttributes(_keyStoreType, _path, getPassword(), + _certificateAlias, _keyManagerFactoryAlgorithm); } @Override @@ -235,59 +227,47 @@ public class KeyStoreAdapter extends AbstractKeyStoreAdapter im @Override public String getPath() { - return (String) getAttribute(PATH); + return _path; } @Override public String getCertificateAlias() { - return (String) getAttribute(CERTIFICATE_ALIAS); + return _certificateAlias; } @Override public String getKeyManagerFactoryAlgorithm() { - return (String) getAttribute(KEY_MANAGER_FACTORY_ALGORITHM); + return _keyManagerFactoryAlgorithm; } @Override public String getKeyStoreType() { - return (String) getAttribute(KEY_STORE_TYPE); + return _keyStoreType; } public KeyManager[] getKeyManagers() throws GeneralSecurityException { - String keyStorePath = (String)getAttribute(KeyStore.PATH); - String keyStorePassword = Subject.doAs(SecurityManager.SYSTEM, new PrivilegedAction() - { - @Override - public String run() - { - return getPassword(); - } - }); - String keyStoreType = (String)getAttribute(KeyStore.KEY_STORE_TYPE); - String keyManagerFactoryAlgorithm = (String)getAttribute(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM); - String certAlias = (String)getAttribute(KeyStore.CERTIFICATE_ALIAS); try { - if (certAlias != null) + if (_certificateAlias != null) { return new KeyManager[] { - new QpidClientX509KeyManager( certAlias, keyStorePath, keyStoreType, keyStorePassword, - keyManagerFactoryAlgorithm) + new QpidClientX509KeyManager( _certificateAlias, _path, _keyStoreType, getPassword(), + _keyManagerFactoryAlgorithm) }; } else { - final java.security.KeyStore ks = SSLUtil.getInitializedKeyStore(keyStorePath, keyStorePassword, keyStoreType); + final java.security.KeyStore ks = SSLUtil.getInitializedKeyStore(_path, getPassword(), _keyStoreType); - char[] keyStoreCharPassword = keyStorePassword == null ? null : keyStorePassword.toCharArray(); + char[] keyStoreCharPassword = getPassword() == null ? null : getPassword().toCharArray(); - final KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyManagerFactoryAlgorithm); + final KeyManagerFactory kmf = KeyManagerFactory.getInstance(_keyManagerFactoryAlgorithm); kmf.init(ks, keyStoreCharPassword); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java index 54a9a44bf3..aa7550b510 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java @@ -168,12 +168,6 @@ abstract public class PortAdapter> extends AbstractConf return null; } - @Override - public String getName() - { - return (String)getAttribute(NAME); - } - @Override public String setName(String currentName, String desiredName) throws IllegalStateException, AccessControlException { diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java index 92e409e103..669bf19874 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import org.apache.qpid.server.model.*; import org.apache.qpid.server.consumer.Consumer; @@ -42,16 +43,27 @@ final class SessionAdapter extends AbstractConfiguredObject impl private AMQSessionModel _session; private Map _consumerAdapters = new HashMap(); + private int _channelId; + public SessionAdapter(final AMQSessionModel session, TaskExecutor taskExecutor) { - super(UUIDGenerator.generateRandomUUID(), taskExecutor); + super(Collections.emptyMap(),createAttributes(session), taskExecutor); _session = session; } + private static Map createAttributes(final AMQSessionModel session) + { + Map attributes = new HashMap(); + attributes.put(ID, UUID.randomUUID()); + attributes.put(NAME, String.valueOf(session.getChannelId())); + attributes.put(CHANNEL_ID, session.getChannelId()); + return attributes; + } + @Override public int getChannelId() { - return _session.getChannelId(); + return _channelId; } @Override @@ -73,11 +85,6 @@ final class SessionAdapter extends AbstractConfiguredObject impl return null; //TODO } - public String getName() - { - return String.valueOf(_session.getChannelId()); - } - public String setName(final String currentName, final String desiredName) throws IllegalStateException, AccessControlException { @@ -121,19 +128,7 @@ final class SessionAdapter extends AbstractConfiguredObject impl @Override public Object getAttribute(String name) { - if(name.equals(ID)) - { - return getId(); - } - else if (name.equals(NAME)) - { - return getName(); - } - else if(name.equals(CHANNEL_ID)) - { - return _session.getChannelId(); - } - else if(name.equals(PRODUCER_FLOW_BLOCKED)) + if(name.equals(PRODUCER_FLOW_BLOCKED)) { return _session.getBlocking(); } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java index c1e9c1de0e..03fac7d54d 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java @@ -74,27 +74,21 @@ public class TrustStoreAdapter extends AbstractKeyStoreAdapter _broker; public TrustStoreAdapter(UUID id, Broker broker, Map attributes) { - super(id, broker, DEFAULTS, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES)); + super(id, broker, DEFAULTS, attributes); _broker = broker; - String trustStorePath = (String) getAttribute(TrustStore.PATH); - String trustStorePassword = Subject.doAs(SecurityManager.SYSTEM, new PrivilegedAction() - { - @Override - public String run() - { - return getPassword(); - } - }); - String trustStoreType = (String) getAttribute(TrustStore.TRUST_STORE_TYPE); - String trustManagerFactoryAlgorithm = (String) getAttribute(TrustStore.TRUST_MANAGER_FACTORY_ALGORITHM); - - validateTrustStoreAttributes(trustStoreType, trustStorePath, - trustStorePassword, trustManagerFactoryAlgorithm); + validateTrustStoreAttributes(_trustStoreType, _path, getPassword(), _trustManagerFactoryAlgorithm); } @Override @@ -224,41 +218,33 @@ public class TrustStoreAdapter extends AbstractKeyStoreAdapter() - { - @Override - public String run() - { - return getPassword(); - } - }); - String trustStoreType = (String)getAttribute(TrustStore.TRUST_STORE_TYPE); - String trustManagerFactoryAlgorithm = (String)getAttribute(TrustStore.TRUST_MANAGER_FACTORY_ALGORITHM); + String trustStorePath = _path; + String trustStorePassword = getPassword(); + String trustStoreType = _trustStoreType; + String trustManagerFactoryAlgorithm = _trustManagerFactoryAlgorithm; try { @@ -273,7 +259,7 @@ public class TrustStoreAdapter extends AbstractKeyStoreAdapter attributes, Broker broker, StatisticsGatherer brokerStatisticsGatherer, TaskExecutor taskExecutor) { - super(id, null, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES, false), taskExecutor, false); + super(id, Collections.emptyMap(), MapValueConverter.convert(attributes, ATTRIBUTE_TYPES, false), taskExecutor, false); _broker = broker; _brokerStatisticsGatherer = brokerStatisticsGatherer; validateAttributes(); @@ -361,12 +361,6 @@ public final class VirtualHostAdapter extends AbstractConfiguredObjectemptyMap(), createAttributes(virtualHostAdapter, port), virtualHostAdapter.getTaskExecutor()); _vhost = virtualHostAdapter; _port = port; } + private static Map createAttributes(final VirtualHostAdapter virtualHostAdapter, final Port port) + { + final Map attributes = new HashMap(); + attributes.put(ID, UUIDGenerator.generateVhostAliasUUID(virtualHostAdapter.getName(), port.getName())); + attributes.put(NAME, virtualHostAdapter.getName()); + return attributes; + } + @Override public Port getPort() { @@ -65,12 +74,6 @@ public class VirtualHostAliasAdapter extends AbstractConfiguredObject _bindings = new CopyOnWriteArrayList(); - private UUID _id; private final Map _arguments; //TODO : persist creation time @@ -216,10 +213,7 @@ public abstract class AbstractQueue throw new IllegalArgumentException("Virtual Host must not be null"); } - UUID id = MapValueConverter.getUUIDAttribute(Queue.ID, attributes); - String name = MapValueConverter.getStringAttribute(Queue.NAME, attributes); - - if (name == null) + if (getName() == null) { throw new IllegalArgumentException("Queue name must not be null"); } @@ -236,8 +230,6 @@ public abstract class AbstractQueue attributes, LifetimePolicy.PERMANENT); - - _name = name; _durable = durable; _virtualHost = virtualHost; _entries = entryListFactory.createQueueEntryList(this); @@ -251,8 +243,6 @@ public abstract class AbstractQueue _noLocal = MapValueConverter.getBooleanAttribute(Queue.NO_LOCAL, attributes, false); - - _id = id; _asyncDelivery = ReferenceCountingExecutorService.getInstance().acquireExecutorService(); _logSubject = new QueueLogSubject(this); @@ -562,10 +552,6 @@ public abstract class AbstractQueue { return getOwner(); } - else if(NAME.equals(name)) - { - return getName(); - } if(ALERT_REPEAT_GAP.equals(name)) { return getAlertRepeatGap(); @@ -641,10 +627,6 @@ public abstract class AbstractQueue { return isDurable(); } - else if(ID.equals(name)) - { - return getId(); - } else if(LIFETIME_POLICY.equals(name)) { return getLifetimePolicy(); @@ -694,11 +676,6 @@ public abstract class AbstractQueue return _virtualHost; } - public String getName() - { - return _name; - } - // ------ Manage Consumers @@ -1408,7 +1385,7 @@ public abstract class AbstractQueue public int compareTo(final AMQQueue o) { - return _name.compareTo(o.getName()); + return getName().compareTo(o.getName()); } public AtomicInteger getAtomicQueueCount() diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java index f0a8f239a8..57e4eff230 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java @@ -22,6 +22,8 @@ package org.apache.qpid.server.queue; import org.apache.log4j.Logger; import org.apache.qpid.server.filter.FilterManager; +import org.apache.qpid.server.filter.JMSSelectorFilter; +import org.apache.qpid.server.filter.MessageFilter; import org.apache.qpid.server.logging.LogActor; import org.apache.qpid.server.logging.LogSubject; import org.apache.qpid.server.logging.actors.CurrentActor; @@ -43,11 +45,7 @@ import org.apache.qpid.server.util.StateChangeListener; import java.security.AccessControlException; import java.text.MessageFormat; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Lock; @@ -70,7 +68,6 @@ class QueueConsumerImpl private final MessageInstance.ConsumerAcquiredState _owningState = new MessageInstance.ConsumerAcquiredState(this); private final boolean _acquires; private final boolean _seesRequeues; - private final String _consumerName; private final boolean _isTransient; private final AtomicLong _deliveredCount = new AtomicLong(0); private final AtomicLong _deliveredBytes = new AtomicLong(0); @@ -78,7 +75,6 @@ class QueueConsumerImpl private final Class _messageClass; private final Object _sessionReference; private final AbstractQueue _queue; - private final boolean _exclusive; private GenericActor _logActor = new GenericActor("[" + MessageFormat.format(SUBSCRIPTION_FORMAT, getConsumerNumber()) + "(UNKNOWN)" + "] "); @@ -103,7 +99,12 @@ class QueueConsumerImpl CurrentActor.get().message(SubscriptionMessages.STATE(newState.toString())); } }; - private final boolean _noLocal; + private boolean _durable; + private boolean _exclusive; + private boolean _noLocal; + private String _distributionMode; + private String _settlementMode; + private String _selector; QueueConsumerImpl(final AbstractQueue queue, ConsumerTarget target, final String consumerName, @@ -111,8 +112,8 @@ class QueueConsumerImpl final Class messageClass, EnumSet