diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2014-04-26 22:55:16 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2014-04-26 22:55:16 +0000 |
| commit | 32c0aede71ee8213ceddd9bd7beb0e2e9d3672df (patch) | |
| tree | 0b05cd614274873c11199920470c1b0eb4d7ec5f | |
| parent | ae1ccfdd01112311a9e9d0870928a0052578be8f (diff) | |
| download | qpid-python-32c0aede71ee8213ceddd9bd7beb0e2e9d3672df.tar.gz | |
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
5 files changed, 70 insertions, 96 deletions
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<X extends ConfiguredObject<X>> implements ConfiguredObject<X> { - private static final String ID = "id"; private static final Map<Class<? extends ConfiguredObject>, Collection<ConfiguredObjectAttribute<?,?>>> _allAttributes = Collections.synchronizedMap(new HashMap<Class<? extends ConfiguredObject>, Collection<ConfiguredObjectAttribute<?, ?>>>()); @@ -75,6 +76,7 @@ public abstract class AbstractConfiguredObject<X extends ConfiguredObject<X>> im private static final Map<Class<? extends ConfiguredObject>, Map<String, AutomatedField>> _allAutomatedFields = Collections.synchronizedMap(new HashMap<Class<? extends ConfiguredObject>, Map<String, AutomatedField>>()); + private static final Map<Class, Object> SECURE_VALUES; public static final String SECURED_STRING_VALUE = "********"; @@ -386,6 +388,21 @@ public abstract class AbstractConfiguredObject<X extends ConfiguredObject<X>> 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<X extends ConfiguredObject<X>> im return _createdBy; } - protected String getCurrentUserName() - { - Subject currentSubject = Subject.getSubject(AccessController.getContext()); - Set<AuthenticatedPrincipal> 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<X extends ConfiguredObject<X>> im return null; } + @Override + public final <T> T getContextValue(Class<T> clazz, String propertyName) + { + AttributeValueConverter<T> 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<X extends ConfiguredObject<X>> im } } - - private static void addToAttributesSet(final Class<? extends ConfiguredObject> clazz, final ConfiguredObjectAttribute<?, ?> attribute) - { - synchronized (_allAttributes) - { - Collection<ConfiguredObjectAttribute<?,?>> classAttributes = _allAttributes.get(clazz); - if(classAttributes == null) - { - classAttributes = new ArrayList<ConfiguredObjectAttribute<?, ?>>(); - for(Map.Entry<Class<? extends ConfiguredObject>, Collection<ConfiguredObjectAttribute<?,?>>> entry : _allAttributes.entrySet()) - { - if(entry.getKey().isAssignableFrom(clazz)) - { - classAttributes.addAll(entry.getValue()); - } - } - _allAttributes.put(clazz, classAttributes); - - } - for(Map.Entry<Class<? extends ConfiguredObject>, Collection<ConfiguredObjectAttribute<?,?>>> entry : _allAttributes.entrySet()) - { - if(clazz.isAssignableFrom(entry.getKey())) - { - entry.getValue().add(attribute); - } - } - - } - } - private static void addToStatisticsSet(final Class<? extends ConfiguredObject> clazz, final ConfiguredObjectStatistic<?, ?> statistic) - { - synchronized (_allStatistics) - { - Collection<ConfiguredObjectStatistic<?,?>> classAttributes = _allStatistics.get(clazz); - if(classAttributes == null) - { - classAttributes = new ArrayList<ConfiguredObjectStatistic<?, ?>>(); - for(Map.Entry<Class<? extends ConfiguredObject>, Collection<ConfiguredObjectStatistic<?,?>>> entry : _allStatistics.entrySet()) - { - if(entry.getKey().isAssignableFrom(clazz)) - { - classAttributes.addAll(entry.getValue()); - } - } - _allStatistics.put(clazz, classAttributes); - - } - for(Map.Entry<Class<? extends ConfiguredObject>, Collection<ConfiguredObjectStatistic<?,?>>> 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<X extends ConfiguredObject<X>> im } } + private static final Comparator<ConfiguredObjectAttributeOrStatistic<?,?>> NAME_COMPARATOR = new Comparator<ConfiguredObjectAttributeOrStatistic<?, ?>>() + { + @Override + public int compare(final ConfiguredObjectAttributeOrStatistic<?, ?> left, + final ConfiguredObjectAttributeOrStatistic<?, ?> right) + { + return left.getName().compareTo(right.getName()); + } + }; + private static <X extends ConfiguredObject> void processAttributes(final Class<X> clazz) { synchronized (_allAttributes) @@ -1278,11 +1239,11 @@ public abstract class AbstractConfiguredObject<X extends ConfiguredObject<X>> im processAttributes((Class<? extends ConfiguredObject>) superclass); } - final ArrayList<ConfiguredObjectAttribute<?, ?>> attributeList = new ArrayList<ConfiguredObjectAttribute<?, ?>>(); - final ArrayList<ConfiguredObjectStatistic<?, ?>> statisticList = new ArrayList<ConfiguredObjectStatistic<?, ?>>(); + final SortedSet<ConfiguredObjectAttribute<?, ?>> attributeSet = new TreeSet<>(NAME_COMPARATOR); + final SortedSet<ConfiguredObjectStatistic<?, ?>> 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<X extends ConfiguredObject<X>> im Collection<ConfiguredObjectAttribute<?, ?>> attrs = _allAttributes.get(parent); for(ConfiguredObjectAttribute<?,?> attr : attrs) { - if(!attributeList.contains(attr)) + if(!attributeSet.contains(attr)) { - attributeList.add(attr); + attributeSet.add(attr); } } Collection<ConfiguredObjectStatistic<?, ?>> 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<X extends ConfiguredObject<X>> im Collection<ConfiguredObjectStatistic<?, ?>> 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<X extends ConfiguredObject<X>> 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<X extends ConfiguredObject<X>> 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<X extends ConfiguredObject<X>> @ManagedAttribute(automate = true) Map<String, String> getContext(); + <T> T getContextValue(Class<T> 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<X,Q,E>, Q extends AMQQueue<?>, E extends ExchangeImpl<?> > - extends DurableConfigurationStore.Source, - Closeable, StatisticsGatherer, + extends Closeable, StatisticsGatherer, EventLoggerProvider, VirtualHost<X,Q,E> { 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 @@ -119,6 +119,12 @@ public class MockVirtualHost implements VirtualHostImpl<MockVirtualHost, AMQQueu } @Override + public <T> T getContextValue(final Class<T> clazz, final String propertyName) + { + return null; + } + + @Override public String getLastUpdatedBy() { return null; |
