summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-04-26 22:55:16 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-04-26 22:55:16 +0000
commit32c0aede71ee8213ceddd9bd7beb0e2e9d3672df (patch)
tree0b05cd614274873c11199920470c1b0eb4d7ec5f
parentae1ccfdd01112311a9e9d0870928a0052578be8f (diff)
downloadqpid-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
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java150
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java2
-rwxr-xr-xqpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java5
-rwxr-xr-xqpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java3
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java6
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;