From 32c0aede71ee8213ceddd9bd7beb0e2e9d3672df Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Sat, 26 Apr 2014 22:55:16 +0000 Subject: QPID-5724 : Allow configured object default values to be overridden by subtypes git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1590321 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/model/AbstractConfiguredObject.java | 150 +++++++++------------ .../apache/qpid/server/model/ConfiguredObject.java | 2 + .../server/store/DurableConfigurationStore.java | 5 - .../qpid/server/virtualhost/VirtualHostImpl.java | 3 +- .../qpid/server/virtualhost/MockVirtualHost.java | 6 + 5 files changed, 70 insertions(+), 96 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java index c5127bae16..e0ccc940c3 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java @@ -27,12 +27,12 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.security.AccessControlException; -import java.security.AccessController; import java.security.PrivilegedAction; import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -40,6 +40,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -62,7 +64,6 @@ import org.apache.qpid.util.Strings; public abstract class AbstractConfiguredObject> implements ConfiguredObject { - private static final String ID = "id"; private static final Map, Collection>> _allAttributes = Collections.synchronizedMap(new HashMap, Collection>>()); @@ -75,6 +76,7 @@ public abstract class AbstractConfiguredObject> im private static final Map, Map> _allAutomatedFields = Collections.synchronizedMap(new HashMap, Map>()); + private static final Map SECURE_VALUES; public static final String SECURED_STRING_VALUE = "********"; @@ -386,6 +388,21 @@ public abstract class AbstractConfiguredObject> im { if(_open.compareAndSet(false,true)) { + final AuthenticatedPrincipal currentUser = SecurityManager.getCurrentUser(); + if(currentUser != null) + { + String currentUserName = currentUser.getName(); + _attributes.put(LAST_UPDATED_BY, currentUserName); + _attributes.put(CREATED_BY, currentUserName); + _lastUpdatedBy = currentUserName; + _createdBy = currentUserName; + } + final long currentTime = System.currentTimeMillis(); + _attributes.put(LAST_UPDATED_TIME, currentTime); + _attributes.put(CREATED_TIME, currentTime); + _lastUpdatedTime = currentTime; + _createdTime = currentTime; + doResolution(true); doValidation(true); doCreation(true); @@ -1082,21 +1099,6 @@ public abstract class AbstractConfiguredObject> im return _createdBy; } - protected String getCurrentUserName() - { - Subject currentSubject = Subject.getSubject(AccessController.getContext()); - Set principals = - currentSubject == null ? null : currentSubject.getPrincipals(AuthenticatedPrincipal.class); - if(principals == null || principals.isEmpty()) - { - return null; - } - else - { - return principals.iterator().next().getName(); - } - } - @Override public final long getCreatedTime() { @@ -1136,6 +1138,13 @@ public abstract class AbstractConfiguredObject> im return null; } + @Override + public final T getContextValue(Class clazz, String propertyName) + { + AttributeValueConverter converter = AttributeValueConverter.getConverter(clazz, clazz); + return converter.convert("${"+propertyName+"}", this); + } + //========================================================================================= static String interpolate(ConfiguredObject object, String value) @@ -1168,64 +1177,6 @@ public abstract class AbstractConfiguredObject> im } } - - private static void addToAttributesSet(final Class clazz, final ConfiguredObjectAttribute attribute) - { - synchronized (_allAttributes) - { - Collection> classAttributes = _allAttributes.get(clazz); - if(classAttributes == null) - { - classAttributes = new ArrayList>(); - for(Map.Entry, Collection>> entry : _allAttributes.entrySet()) - { - if(entry.getKey().isAssignableFrom(clazz)) - { - classAttributes.addAll(entry.getValue()); - } - } - _allAttributes.put(clazz, classAttributes); - - } - for(Map.Entry, Collection>> entry : _allAttributes.entrySet()) - { - if(clazz.isAssignableFrom(entry.getKey())) - { - entry.getValue().add(attribute); - } - } - - } - } - private static void addToStatisticsSet(final Class clazz, final ConfiguredObjectStatistic statistic) - { - synchronized (_allStatistics) - { - Collection> classAttributes = _allStatistics.get(clazz); - if(classAttributes == null) - { - classAttributes = new ArrayList>(); - for(Map.Entry, Collection>> entry : _allStatistics.entrySet()) - { - if(entry.getKey().isAssignableFrom(clazz)) - { - classAttributes.addAll(entry.getValue()); - } - } - _allStatistics.put(clazz, classAttributes); - - } - for(Map.Entry, Collection>> entry : _allStatistics.entrySet()) - { - if(clazz.isAssignableFrom(entry.getKey())) - { - entry.getValue().add(statistic); - } - } - - } - } - private static class AutomatedField { private final Field _field; @@ -1255,6 +1206,16 @@ public abstract class AbstractConfiguredObject> im } } + private static final Comparator> NAME_COMPARATOR = new Comparator>() + { + @Override + public int compare(final ConfiguredObjectAttributeOrStatistic left, + final ConfiguredObjectAttributeOrStatistic right) + { + return left.getName().compareTo(right.getName()); + } + }; + private static void processAttributes(final Class clazz) { synchronized (_allAttributes) @@ -1278,11 +1239,11 @@ public abstract class AbstractConfiguredObject> im processAttributes((Class) superclass); } - final ArrayList> attributeList = new ArrayList>(); - final ArrayList> statisticList = new ArrayList>(); + final SortedSet> attributeSet = new TreeSet<>(NAME_COMPARATOR); + final SortedSet> statisticSet = new TreeSet<>(NAME_COMPARATOR); - _allAttributes.put(clazz, attributeList); - _allStatistics.put(clazz, statisticList); + _allAttributes.put(clazz, attributeSet); + _allStatistics.put(clazz, statisticSet); for(Class parent : clazz.getInterfaces()) { @@ -1291,17 +1252,17 @@ public abstract class AbstractConfiguredObject> im Collection> attrs = _allAttributes.get(parent); for(ConfiguredObjectAttribute attr : attrs) { - if(!attributeList.contains(attr)) + if(!attributeSet.contains(attr)) { - attributeList.add(attr); + attributeSet.add(attr); } } Collection> stats = _allStatistics.get(parent); for(ConfiguredObjectStatistic stat : stats) { - if(!statisticList.contains(stat)) + if(!statisticSet.contains(stat)) { - statisticList.add(stat); + statisticSet.add(stat); } } } @@ -1312,16 +1273,16 @@ public abstract class AbstractConfiguredObject> im Collection> stats = _allStatistics.get(superclass); for(ConfiguredObjectAttribute attr : attrs) { - if(!attributeList.contains(attr)) + if(!attributeSet.contains(attr)) { - attributeList.add(attr); + attributeSet.add(attr); } } for(ConfiguredObjectStatistic stat : stats) { - if(!statisticList.contains(stat)) + if(!statisticSet.contains(stat)) { - statisticList.add(stat); + statisticSet.add(stat); } } } @@ -1340,7 +1301,13 @@ public abstract class AbstractConfiguredObject> im { throw new ServerScopedRuntimeException("Can only define ManagedAttributes on interfaces which extend " + ConfiguredObject.class.getSimpleName() + ". " + clazz.getSimpleName() + " does not meet these criteria."); } - addToAttributesSet(clazz, new ConfiguredObjectAttribute(clazz, m, annotation)); + + ConfiguredObjectAttribute attribute = new ConfiguredObjectAttribute(clazz, m, annotation); + if(attributeSet.contains(attribute)) + { + attributeSet.remove(attribute); + } + attributeSet.add(attribute); } else { @@ -1351,7 +1318,12 @@ public abstract class AbstractConfiguredObject> im { throw new ServerScopedRuntimeException("Can only define ManagedStatistics on interfaces which extend " + ConfiguredObject.class.getSimpleName() + ". " + clazz.getSimpleName() + " does not meet these criteria."); } - addToStatisticsSet(clazz, new ConfiguredObjectStatistic(clazz,m)); + ConfiguredObjectStatistic statistic = new ConfiguredObjectStatistic(clazz, m); + if(statisticSet.contains(statistic)) + { + statisticSet.remove(statistic); + } + statisticSet.add(statistic); } } } 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 f960dfa6f9..206196b99e 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 @@ -75,6 +75,8 @@ public interface ConfiguredObject> @ManagedAttribute(automate = true) Map getContext(); + T getContextValue(Class clazz, String propertyName); + @ManagedAttribute( derived = true ) String getLastUpdatedBy(); diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java index 7d1abb020e..fa109e8749 100755 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java @@ -31,11 +31,6 @@ public interface DurableConfigurationStore String STORE_TYPE = "storeType"; String STORE_PATH = "storePath"; - public static interface Source - { - DurableConfigurationStore getDurableConfigurationStore(); - } - /** * Called after instantiation in order to configure the message store. A particular implementation can define * whatever parameters it wants. diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java index a29534cff7..46351aa970 100755 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java @@ -43,8 +43,7 @@ import org.apache.qpid.server.store.MessageStore; import org.apache.qpid.server.txn.DtxRegistry; public interface VirtualHostImpl< X extends VirtualHostImpl, Q extends AMQQueue, E extends ExchangeImpl > - extends DurableConfigurationStore.Source, - Closeable, StatisticsGatherer, + extends Closeable, StatisticsGatherer, EventLoggerProvider, VirtualHost { diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java index 170b3535b9..33706d093c 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java @@ -118,6 +118,12 @@ public class MockVirtualHost implements VirtualHostImpl T getContextValue(final Class clazz, final String propertyName) + { + return null; + } + @Override public String getLastUpdatedBy() { -- cgit v1.2.1