You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2014/04/09 16:13:17 UTC
svn commit: r1585979 [2/6] - in /qpid/trunk/qpid/java:
bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/
bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/
broker-core/src/main/java/org/apache/qpid/server/binding/ br...
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java Wed Apr 9 14:13:13 2014
@@ -20,6 +20,36 @@
*/
package org.apache.qpid.server.model;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.security.auth.Subject;
+
+import org.apache.log4j.Logger;
+
import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.configuration.updater.ChangeAttributesTask;
import org.apache.qpid.server.configuration.updater.ChangeStateTask;
@@ -29,20 +59,13 @@ import org.apache.qpid.server.configurat
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.util.Action;
import org.apache.qpid.server.util.ServerScopedRuntimeException;
-
-import javax.security.auth.Subject;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.security.AccessControlException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.*;
+import org.apache.qpid.util.Strings;
public abstract class AbstractConfiguredObject<X extends ConfiguredObject<X>> implements ConfiguredObject<X>
{
+ private static final Logger LOGGER = Logger.getLogger(AbstractConfiguredObject.class);
private static final String ID = "id";
private static final Map<Class<? extends ConfiguredObject>, Collection<Attribute<?,?>>> _allAttributes =
@@ -71,6 +94,7 @@ public abstract class AbstractConfigured
SECURE_VALUES = Collections.unmodifiableMap(secureValues);
}
+ private final AtomicBoolean _open = new AtomicBoolean();
private final Map<String,Object> _attributes = new HashMap<String, Object>();
private final Map<Class<? extends ConfiguredObject>, ConfiguredObject> _parents =
@@ -78,6 +102,9 @@ public abstract class AbstractConfigured
private final Collection<ConfigurationChangeListener> _changeListeners =
new ArrayList<ConfigurationChangeListener>();
+ private final Map<Class<? extends ConfiguredObject>, Collection<ConfiguredObject<?>>> _children =
+ new HashMap<Class<? extends ConfiguredObject>, Collection<ConfiguredObject<?>>>();
+
@ManagedAttributeField
private final UUID _id;
@@ -99,6 +126,9 @@ public abstract class AbstractConfigured
@ManagedAttributeField
private String _name;
+ @ManagedAttributeField
+ private Map<String,String> _context;
+
private final Map<String, Attribute<?,?>> _attributeTypes;
private final Map<String, Field> _automatedFields;
@@ -149,17 +179,43 @@ public abstract class AbstractConfigured
boolean filterAttributes)
{
_taskExecutor = taskExecutor;
- final UUID uuid = (UUID) attributes.get(ID);
- _id = uuid == null ? UUID.randomUUID() : uuid;
+ Object idObj = attributes.get(ID);
+
+ UUID uuid;
+ if(idObj == null)
+ {
+ uuid = UUID.randomUUID();
+ }
+ else
+ {
+ uuid = UUID_CONVERTER.convert(idObj, this);
+ }
+ _id = uuid;
+
+
_attributeTypes = getAttributeTypes(getClass());
_automatedFields = getAutomatedFields(getClass());
+ for (Class<? extends ConfiguredObject> childClass : Model.getInstance().getChildTypes(getCategoryClass()))
+ {
+ _children.put(childClass, new CopyOnWriteArrayList<ConfiguredObject<?>>());
+ }
+
+ for(ConfiguredObject<?> parent : parents.values())
+ {
+ if(parent instanceof AbstractConfiguredObject<?>)
+ {
+ ((AbstractConfiguredObject<?>)parent).registerChild(this);
+ }
+ }
for(Map.Entry<Class<? extends ConfiguredObject>, ConfiguredObject<?>> entry : parents.entrySet())
{
addParent((Class<ConfiguredObject>) entry.getKey(), entry.getValue());
}
+ _name = STRING_CONVERTER.convert(attributes.get(NAME),this);
+
Collection<String> names = getAttributeNames();
if(names!=null)
{
@@ -174,10 +230,6 @@ public abstract class AbstractConfigured
{
_attributes.put(name, value);
}
- if(_automatedFields.containsKey(name))
- {
- automatedSetValue(name, value);
- }
}
}
}
@@ -188,10 +240,6 @@ public abstract class AbstractConfigured
if(entry.getValue()!=null)
{
_attributes.put(entry.getKey(),entry.getValue());
- if(_automatedFields.containsKey(entry.getKey()))
- {
- automatedSetValue(entry.getKey(), entry.getValue());
- }
}
}
}
@@ -201,13 +249,6 @@ public abstract class AbstractConfigured
if (defaults != null)
{
_defaultAttributes.putAll(defaults);
- for(Map.Entry<String,Object> defaultedEntry : defaults.entrySet())
- {
- if(_automatedFields.containsKey(defaultedEntry.getKey()) && !attributes.containsKey(defaultedEntry.getKey()))
- {
- automatedSetValue(defaultedEntry.getKey(),defaultedEntry.getValue());
- }
- }
}
if(!_attributes.containsKey(CREATED_BY))
{
@@ -223,20 +264,14 @@ public abstract class AbstractConfigured
}
for(Attribute<?,?> attr : _attributeTypes.values())
{
- if(attr.getAnnotation().mandatory() && !(attributes.containsKey(attr.getName())|| defaults.containsKey(attr.getName())))
+ if(attr.getAnnotation().mandatory() && !(_attributes.containsKey(attr.getName())
+ || _defaultAttributes.containsKey(attr.getName())
+ || !"".equals(attr.getAnnotation().defaultValue())))
{
throw new IllegalArgumentException("Mandatory attribute " + attr.getName() + " not supplied for instance of " + getClass().getName());
}
}
- for(ConfiguredObject<?> parent : parents.values())
- {
- if(parent instanceof AbstractConfiguredObject<?>)
- {
- ((AbstractConfiguredObject<?>)parent).instantiateChild(this);
- }
- }
-
}
private void automatedSetValue(final String name, final Object value)
@@ -257,6 +292,145 @@ public abstract class AbstractConfigured
this(id, Collections.<String,Object>emptyMap(), Collections.<String,Object>emptyMap(), taskExecutor);
}
+ public void open()
+ {
+ if(_open.compareAndSet(false,true))
+ {
+ doResolution();
+ doValidation();
+ doOpening();
+ }
+ }
+
+
+ public void create()
+ {
+ if(_open.compareAndSet(false,true))
+ {
+ doResolution();
+ doValidation();
+ doCreation();
+ doOpening();
+ }
+ }
+
+ protected void doOpening()
+ {
+ onOpen();
+ applyToChildren(new Action<ConfiguredObject<?>>()
+ {
+ @Override
+ public void performAction(final ConfiguredObject<?> child)
+ {
+ if(child instanceof AbstractConfiguredObject)
+ {
+ ((AbstractConfiguredObject)child).doOpening();
+ }
+ }
+ });
+ }
+
+ protected void doValidation()
+ {
+ applyToChildren(new Action<ConfiguredObject<?>>()
+ {
+ @Override
+ public void performAction(final ConfiguredObject<?> child)
+ {
+ if(child instanceof AbstractConfiguredObject)
+ {
+ ((AbstractConfiguredObject)child).doValidation();
+ }
+ }
+ });
+ validate();
+ }
+
+ protected void doResolution()
+ {
+ resolve();
+ applyToChildren(new Action<ConfiguredObject<?>>()
+ {
+ @Override
+ public void performAction(final ConfiguredObject<?> child)
+ {
+ if(child instanceof AbstractConfiguredObject)
+ {
+ ((AbstractConfiguredObject)child).doResolution();
+ }
+ }
+ });
+ }
+
+ protected void doCreation()
+ {
+ onCreate();
+ applyToChildren(new Action<ConfiguredObject<?>>()
+ {
+ @Override
+ public void performAction(final ConfiguredObject<?> child)
+ {
+ if(child instanceof AbstractConfiguredObject)
+ {
+ ((AbstractConfiguredObject)child).doCreation();
+ }
+ }
+ });
+ }
+
+ private void applyToChildren(Action<ConfiguredObject<?>> action)
+ {
+ for (Class<? extends ConfiguredObject> childClass : Model.getInstance().getChildTypes(getCategoryClass()))
+ {
+ Collection<? extends ConfiguredObject> children = getChildren(childClass);
+ if (children != null)
+ {
+ for (ConfiguredObject<?> child : children)
+ {
+ action.performAction(child);
+ }
+ }
+ }
+ }
+
+ public void validate()
+ {
+ }
+
+ protected void resolve()
+ {
+ for (Attribute<?, ?> attr : _attributeTypes.values())
+ {
+ String attrName = attr.getName();
+ ManagedAttribute attrAnnotation = attr.getAnnotation();
+ if (attrAnnotation.automate())
+ {
+ if (_attributes.containsKey(attrName))
+ {
+ automatedSetValue(attrName, _attributes.get(attrName));
+ }
+ else if (_defaultAttributes.containsKey(attrName))
+ {
+ automatedSetValue(attrName, _defaultAttributes.get(attrName));
+ }
+ else if (!"".equals(attrAnnotation.defaultValue()))
+ {
+ automatedSetValue(attrName, attrAnnotation.defaultValue());
+ }
+
+ }
+ }
+ }
+
+ protected void onOpen()
+ {
+ }
+
+
+ protected void onCreate()
+ {
+ }
+
public final UUID getId()
{
return _id;
@@ -272,6 +446,11 @@ public abstract class AbstractConfigured
return getCategory(getClass());
}
+ public Map<String,String> getContext()
+ {
+ return _context == null ? null : Collections.unmodifiableMap(_context);
+ }
+
public State getDesiredState()
{
return null; //TODO
@@ -424,10 +603,6 @@ public abstract class AbstractConfigured
}
}
- protected void create()
- {
- }
-
protected <T extends ConfiguredObject<?>> Object getAttribute(String name, T parent, String parentAttributeName)
{
Object value = getActualAttribute(name);
@@ -666,39 +841,37 @@ public abstract class AbstractConfigured
throw new UnsupportedOperationException();
}
- protected <C extends ConfiguredObject> void instantiateChild(final C child)
+ private <C extends ConfiguredObject> void registerChild(final C child)
{
+ _children.get(child.getCategoryClass()).add(child);
+ }
- Class<? extends ConfiguredObject> childCategory = child.getCategoryClass();
- if(!Model.getInstance().getChildTypes(getCategoryClass()).contains(childCategory))
- {
- throw new IllegalArgumentException("Cannot instantiate a child of category " + childCategory.getSimpleName()
- + " to a parent of category " + getCategoryClass().getSimpleName());
- }
- try
- {
- final String methodName = "instantiate" + childCategory.getSimpleName();
- Method recoveryMethod = getClass().getMethod(methodName, childCategory);
- recoveryMethod.setAccessible(true);
- recoveryMethod.invoke(this, child);
- }
- catch (NoSuchMethodException e)
- {
- throw new IllegalArgumentException("Cannot instantiate a child of category " + childCategory.getSimpleName()
- + " to a parent of category " + getCategoryClass().getSimpleName()
- + ". No instatiation method defined. ");
- }
- catch (InvocationTargetException e)
- {
- throw new IllegalArgumentException("Error recovering child", e.getTargetException());
- }
- catch (IllegalAccessException e)
+ protected void deleted()
+ {
+ for(ConfiguredObject<?> parent : _parents.values())
{
- throw new ServerScopedRuntimeException("Error recovering child, method for recovery cannot be called", e);
+ if(parent instanceof AbstractConfiguredObject<?>)
+ {
+ ((AbstractConfiguredObject<?>)parent).unregisterChild(this);
+ }
}
}
+
+ protected <C extends ConfiguredObject> void unregisterChild(final C child)
+ {
+ _children.get(child.getCategoryClass()).remove(child);
+ }
+
+
+
+ @Override
+ public <C extends ConfiguredObject> Collection<C> getChildren(final Class<C> clazz)
+ {
+ return Collections.unmodifiableList((List<? extends C>) _children.get(clazz));
+ }
+
public TaskExecutor getTaskExecutor()
{
return _taskExecutor;
@@ -903,13 +1076,13 @@ public abstract class AbstractConfigured
protected final Converter<T> _converter;
protected final Method _getter;
- private AttributeOrStatistic(
- String name, final Method getter, Class<T> type)
+ private AttributeOrStatistic(final Method getter)
{
- _name = name;
+
_getter = getter;
- _type = type;
- _converter = getConverter(type);
+ _type = (Class<T>) getTypeFromMethod(getter);
+ _name = getNameFromMethod(getter, _type);
+ _converter = getConverter(_type, getter.getGenericReturnType());
}
@@ -950,9 +1123,18 @@ public abstract class AbstractConfigured
private static final class Statistic<C extends ConfiguredObject, T extends Number> extends AttributeOrStatistic<C,T>
{
- private Statistic(Class<C> clazz, String name, Class<T> type, final Method getter)
+ private Statistic(Class<C> clazz, final Method getter)
{
- super(name, getter, type);
+ super(getter);
+ if(getter.getParameterTypes().length != 0)
+ {
+ throw new IllegalArgumentException("ManagedStatistic annotation should only be added to no-arg getters");
+ }
+
+ if(!Number.class.isAssignableFrom(getType()))
+ {
+ throw new IllegalArgumentException("ManagedStatistic annotation should only be added to getters returning a Number type");
+ }
addToStatisticsSet(clazz, this);
}
}
@@ -963,12 +1145,14 @@ public abstract class AbstractConfigured
private final ManagedAttribute _annotation;
private Attribute(Class<C> clazz,
- String name,
- Class<T> type,
final Method getter,
final ManagedAttribute annotation)
{
- super(name, getter, type);
+ super(getter);
+ if(getter.getParameterTypes().length != 0)
+ {
+ throw new IllegalArgumentException("ManagedAttribute annotation should only be added to no-arg getters");
+ }
_annotation = annotation;
addToAttributesSet(clazz, this);
}
@@ -984,6 +1168,31 @@ public abstract class AbstractConfigured
}
}
+ private static String interpolate(ConfiguredObject<?> object, String value)
+ {
+ Map<String,String> inheritedContext = new HashMap<String, String>();
+ generateInheritedContext(object, inheritedContext);
+ return Strings.expand(value, false, Strings.ENV_VARS_RESOLVER, Strings.JAVA_SYS_PROPS_RESOLVER, new Strings.MapResolver(inheritedContext));
+ }
+
+ private static void generateInheritedContext(final ConfiguredObject<?> object,
+ final Map<String, String> inheritedContext)
+ {
+ Collection<Class<? extends ConfiguredObject>> parents =
+ Model.getInstance().getParentTypes(object.getCategoryClass());
+ if(parents != null && !parents.isEmpty())
+ {
+ ConfiguredObject parent = object.getParent(parents.iterator().next());
+ if(parent != null)
+ {
+ generateInheritedContext(parent, inheritedContext);
+ }
+ }
+ if(object.getContext() != null)
+ {
+ inheritedContext.putAll(object.getContext());
+ }
+ }
private static interface Converter<T>
{
@@ -995,7 +1204,7 @@ public abstract class AbstractConfigured
@Override
public String convert(final Object value, final ConfiguredObject object)
{
- return value == null ? null : value.toString();
+ return value == null ? null : interpolate(object, value.toString());
}
};
@@ -1010,7 +1219,7 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
- return UUID.fromString((String) value);
+ return UUID.fromString(interpolate(object, (String) value));
}
else if(value == null)
{
@@ -1039,7 +1248,7 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
- return Long.valueOf((String) value);
+ return Long.valueOf(interpolate(object, (String) value));
}
else if(value == null)
{
@@ -1068,7 +1277,17 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
- return Integer.valueOf((String) value);
+ try
+ {
+ return Integer.valueOf(interpolate(object, (String) value));
+ }
+ catch (NumberFormatException e)
+ {
+ Map<String,String> context = new HashMap<String, String>();
+ generateInheritedContext(object, context);
+ LOGGER.debug(context.toString());
+ throw e;
+ }
}
else if(value == null)
{
@@ -1098,7 +1317,7 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
- return Short.valueOf((String) value);
+ return Short.valueOf(interpolate(object, (String) value));
}
else if(value == null)
{
@@ -1123,7 +1342,7 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
- return Boolean.valueOf((String) value);
+ return Boolean.valueOf(interpolate(object, (String) value));
}
else if(value == null)
{
@@ -1143,7 +1362,96 @@ public abstract class AbstractConfigured
{
if(value instanceof List)
{
- return (List) value;
+ return Collections.unmodifiableList((List) value);
+ }
+ else if(value instanceof Object[])
+ {
+ return convert(Arrays.asList((Object[])value),object);
+ }
+ else if(value == null)
+ {
+ return null;
+ }
+ else
+ {
+ throw new IllegalArgumentException("Cannot convert type " + value.getClass() + " to a List");
+ }
+ }
+ };
+
+ public static class GenericListConverter implements Converter<List>
+ {
+
+ private final Converter<?> _memberConverter;
+
+ public GenericListConverter(final Type genericType)
+ {
+ _memberConverter = getConverter(getRawType(genericType),genericType);
+ }
+
+ private static Class getRawType(Type t)
+ {
+ if(t instanceof Class)
+ {
+ return (Class)t;
+ }
+ else if(t instanceof ParameterizedType)
+ {
+ return (Class)((ParameterizedType)t).getRawType();
+ }
+ else if(t instanceof TypeVariable)
+ {
+ Type[] bounds = ((TypeVariable)t).getBounds();
+ if(bounds.length == 1)
+ {
+ return getRawType(bounds[0]);
+ }
+ }
+ throw new ServerScopedRuntimeException("Unable to process type when constructing configuration model: " + t);
+ }
+
+ @Override
+ public List convert(final Object value, final ConfiguredObject object)
+ {
+ if(value instanceof Collection)
+ {
+ Collection original = (Collection)value;
+ List converted = new ArrayList(original.size());
+ for(Object member : original)
+ {
+ converted.add(_memberConverter.convert(member, object));
+ }
+ return Collections.unmodifiableList(converted);
+ }
+ else if(value instanceof Object[])
+ {
+ return convert(Arrays.asList((Object[])value),object);
+ }
+ else if(value == null)
+ {
+ return null;
+ }
+ else
+ {
+ return Collections.unmodifiableList(Collections.singletonList(_memberConverter.convert(value, object)));
+ }
+ }
+ }
+
+
+ private static final Converter<Set> SET_CONVERTER = new Converter<Set>()
+ {
+ @Override
+ public Set convert(final Object value, final ConfiguredObject object)
+ {
+ if(value instanceof Set)
+ {
+ return Collections.unmodifiableSet((Set) value);
+ }
+
+ else if(value instanceof Object[])
+ {
+ return convert(new HashSet(Arrays.asList((Object[])value)),object);
}
else if(value == null)
{
@@ -1156,6 +1464,66 @@ public abstract class AbstractConfigured
}
};
+ public static class GenericSetConverter implements Converter<Set>
+ {
+
+ private final Converter<?> _memberConverter;
+
+ public GenericSetConverter(final Type genericType)
+ {
+ _memberConverter = getConverter(getRawType(genericType),genericType);
+ }
+
+ private static Class getRawType(Type t)
+ {
+ if(t instanceof Class)
+ {
+ return (Class)t;
+ }
+ else if(t instanceof ParameterizedType)
+ {
+ return (Class)((ParameterizedType)t).getRawType();
+ }
+ else if(t instanceof TypeVariable)
+ {
+ Type[] bounds = ((TypeVariable)t).getBounds();
+ if(bounds.length == 1)
+ {
+ return getRawType(bounds[0]);
+ }
+ }
+ throw new ServerScopedRuntimeException("Unable to process type when constructing configuration model: " + t);
+ }
+
+ @Override
+ public Set convert(final Object value, final ConfiguredObject object)
+ {
+ if(value instanceof Collection)
+ {
+ Collection original = (Collection)value;
+ Set converted = new HashSet(original.size());
+ for(Object member : original)
+ {
+ converted.add(_memberConverter.convert(member, object));
+ }
+ return Collections.unmodifiableSet(converted);
+ }
+ else if(value instanceof Object[])
+ {
+ return convert(new HashSet(Arrays.asList((Object[])value)),object);
+ }
+ else if(value == null)
+ {
+ return null;
+ }
+ else
+ {
+ return Collections.unmodifiableSet(Collections.singleton(_memberConverter.convert(value, object)));
+ }
+ }
+ }
+
+
private static final Converter<Collection> COLLECTION_CONVERTER = new Converter<Collection>()
{
@Override
@@ -1163,7 +1531,11 @@ public abstract class AbstractConfigured
{
if(value instanceof Collection)
{
- return (Collection) value;
+ return Collections.unmodifiableCollection((Collection) value);
+ }
+ else if(value instanceof Object[])
+ {
+ return convert(Arrays.asList((Object[]) value), object);
}
else if(value == null)
{
@@ -1176,6 +1548,66 @@ public abstract class AbstractConfigured
}
};
+
+ public static class GenericCollectionConverter implements Converter<Collection>
+ {
+
+ private final Converter<?> _memberConverter;
+
+ public GenericCollectionConverter(final Type genericType)
+ {
+ _memberConverter = getConverter(getRawType(genericType),genericType);
+ }
+
+ private static Class getRawType(Type t)
+ {
+ if(t instanceof Class)
+ {
+ return (Class)t;
+ }
+ else if(t instanceof ParameterizedType)
+ {
+ return (Class)((ParameterizedType)t).getRawType();
+ }
+ else if(t instanceof TypeVariable)
+ {
+ Type[] bounds = ((TypeVariable)t).getBounds();
+ if(bounds.length == 1)
+ {
+ return getRawType(bounds[0]);
+ }
+ }
+ throw new ServerScopedRuntimeException("Unable to process type when constructing configuration model: " + t);
+ }
+
+ @Override
+ public Collection convert(final Object value, final ConfiguredObject object)
+ {
+ if(value instanceof Collection)
+ {
+ Collection original = (Collection)value;
+ Collection converted = new ArrayList(original.size());
+ for(Object member : original)
+ {
+ converted.add(_memberConverter.convert(member, object));
+ }
+ return Collections.unmodifiableCollection(converted);
+ }
+ else if(value instanceof Object[])
+ {
+ return convert(Arrays.asList((Object[])value),object);
+ }
+ else if(value == null)
+ {
+ return null;
+ }
+ else
+ {
+ return Collections.unmodifiableCollection(Collections.singletonList(_memberConverter.convert(value, object)));
+ }
+ }
+ }
+
private static final Converter<Map> MAP_CONVERTER = new Converter<Map>()
{
@Override
@@ -1183,7 +1615,16 @@ public abstract class AbstractConfigured
{
if(value instanceof Map)
{
- return (Map) value;
+ Map<Object,Object> originalMap = (Map) value;
+ Map resolvedMap = new LinkedHashMap(originalMap.size());
+ for(Map.Entry<Object,Object> entry : originalMap.entrySet())
+ {
+ Object key = entry.getKey();
+ Object val = entry.getValue();
+ resolvedMap.put(key instanceof String ? interpolate(object, (String)key) : key,
+ val instanceof String ? interpolate(object, (String)val) : val);
+ }
+ return Collections.unmodifiableMap(resolvedMap);
}
else if(value == null)
{
@@ -1218,7 +1659,7 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
- return Enum.valueOf(_klazz,(String) value);
+ return Enum.valueOf(_klazz, interpolate(object, (String) value));
}
else
{
@@ -1262,22 +1703,23 @@ public abstract class AbstractConfigured
}
else if(value instanceof String)
{
+ String valueStr = interpolate(object, (String) value);
Collection<X> reachable = getReachableObjects(object,_klazz);
for(X candidate : reachable)
{
- if(candidate.getName().equals(value))
+ if(candidate.getName().equals(valueStr))
{
return candidate;
}
}
try
{
- UUID id = UUID.fromString((String)value);
+ UUID id = UUID.fromString(valueStr);
return convert(id, object);
}
catch (IllegalArgumentException e)
{
- throw new IllegalArgumentException("Cannot find a " + _klazz.getSimpleName() + " with name '" + value + "'");
+ throw new IllegalArgumentException("Cannot find a " + _klazz.getSimpleName() + " with name '" + valueStr + "'");
}
}
else
@@ -1288,7 +1730,7 @@ public abstract class AbstractConfigured
}
- private static <X> Converter<X> getConverter(final Class<X> type)
+ private static <X> Converter<X> getConverter(final Class<X> type, final Type returnType)
{
if(type == String.class)
{
@@ -1320,7 +1762,27 @@ public abstract class AbstractConfigured
}
else if(List.class.isAssignableFrom(type))
{
- return (Converter<X>) LIST_CONVERTER;
+ if (returnType instanceof ParameterizedType)
+ {
+ Type parameterizedType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
+ return (Converter<X>) new GenericListConverter(parameterizedType);
+ }
+ else
+ {
+ return (Converter<X>) LIST_CONVERTER;
+ }
+ }
+ else if(Set.class.isAssignableFrom(type))
+ {
+ if (returnType instanceof ParameterizedType)
+ {
+ Type parameterizedType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
+ return (Converter<X>) new GenericSetConverter(parameterizedType);
+ }
+ else
+ {
+ return (Converter<X>) SET_CONVERTER;
+ }
}
else if(Map.class.isAssignableFrom(type))
{
@@ -1328,7 +1790,15 @@ public abstract class AbstractConfigured
}
else if(Collection.class.isAssignableFrom(type))
{
- return (Converter<X>) COLLECTION_CONVERTER;
+ if (returnType instanceof ParameterizedType)
+ {
+ Type parameterizedType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
+ return (Converter<X>) new GenericCollectionConverter(parameterizedType);
+ }
+ else
+ {
+ return (Converter<X>) COLLECTION_CONVERTER;
+ }
}
else if(ConfiguredObject.class.isAssignableFrom(type))
{
@@ -1472,31 +1942,14 @@ public abstract class AbstractConfigured
ManagedAttribute annotation = m.getAnnotation(ManagedAttribute.class);
if(annotation != null)
{
- 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<X,?> newAttr = new Attribute(clazz,name,type,m, annotation);
-
+ Attribute<X,?> newAttr = new Attribute(clazz, m, annotation);
}
else
{
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<X,?> newStat = new Statistic(clazz,name,type,m);
+ Statistic<X,?> newStat = new Statistic(clazz,m);
}
}
}
@@ -1542,7 +1995,7 @@ public abstract class AbstractConfigured
throw new ServerScopedRuntimeException("Unable to find field definition for automated field " + attr.getName() + " in class " + objClass.getName());
}
- private static String getName(final Method m, final Class<?> type)
+ private static String getNameFromMethod(final Method m, final Class<?> type)
{
String methodName = m.getName();
String baseName;
@@ -1579,7 +2032,7 @@ public abstract class AbstractConfigured
return name;
}
- private static Class<?> getType(final Method m)
+ private static Class<?> getTypeFromMethod(final Method m)
{
Class<?> type = m.getReturnType();
if(type.isPrimitive())
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractUnresolvedObject.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractUnresolvedObject.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractUnresolvedObject.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractUnresolvedObject.java Wed Apr 9 14:13:13 2014
@@ -20,6 +20,13 @@
*/
package org.apache.qpid.server.model;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.UUID;
+
import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.store.ConfiguredObjectDependency;
import org.apache.qpid.server.store.ConfiguredObjectIdDependency;
@@ -27,12 +34,6 @@ import org.apache.qpid.server.store.Conf
import org.apache.qpid.server.store.ConfiguredObjectRecord;
import org.apache.qpid.server.store.UnresolvedConfiguredObject;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.UUID;
-
public abstract class AbstractUnresolvedObject<C extends ConfiguredObject<C>> implements UnresolvedConfiguredObject<C>
{
private final Class<C> _clazz;
@@ -60,41 +61,74 @@ public abstract class AbstractUnresolved
else if(Collection.class.isAssignableFrom(attributeType))
{
Type returnType = attribute.getGetter().getGenericReturnType();
- if (returnType instanceof ParameterizedType)
+ Class<? extends ConfiguredObject> attrClass = getMemberType(returnType);
+ if(attrClass != null)
{
- Type type = ((ParameterizedType) returnType).getActualTypeArguments()[0];
- if(ConfiguredObject.class.isAssignableFrom((Class)type))
+ Object attrValue = _record.getAttributes().get(attribute.getName());
+ if(attrValue != null)
{
- Class<? extends ConfiguredObject> attrClass = (Class<? extends ConfiguredObject>) type;
- Object attrValue = _record.getAttributes().get(attribute.getName());
- if(attrValue != null)
+ if (attrValue instanceof Collection)
{
- if (attrValue instanceof Collection)
- {
- for (Object val : (Collection) attrValue)
- {
- addUnresolvedObject(attrClass, attribute.getName(), val);
- }
- }
- else if(attrValue instanceof Object[])
+ for (Object val : (Collection) attrValue)
{
- for (Object val : (Object[]) attrValue)
- {
- addUnresolvedObject(attrClass, attribute.getName(), val);
- }
+ addUnresolvedObject(attrClass, attribute.getName(), val);
}
- else
+ }
+ else if(attrValue instanceof Object[])
+ {
+ for (Object val : (Object[]) attrValue)
{
- addUnresolvedObject(attrClass, attribute.getName(), attrValue);
+ addUnresolvedObject(attrClass, attribute.getName(), val);
}
}
+ else
+ {
+ addUnresolvedObject(attrClass, attribute.getName(), attrValue);
+ }
}
}
+
+ }
+ }
+ }
+
+ private Class<? extends ConfiguredObject> getMemberType(Type returnType)
+ {
+ Class<? extends ConfiguredObject> categoryClass = null;
+
+ if (returnType instanceof ParameterizedType)
+ {
+ Type type = ((ParameterizedType) returnType).getActualTypeArguments()[0];
+ if (type instanceof Class && ConfiguredObject.class.isAssignableFrom((Class)type))
+ {
+ categoryClass = (Class<? extends ConfiguredObject>) type;
+ }
+ else if (type instanceof ParameterizedType)
+ {
+ Type rawType = ((ParameterizedType) type).getRawType();
+ if (rawType instanceof Class && ConfiguredObject.class.isAssignableFrom((Class)rawType))
+ {
+ categoryClass = (Class<? extends ConfiguredObject>) rawType;
+ }
+ }
+ else if (type instanceof TypeVariable)
+ {
+ Type[] bounds = ((TypeVariable) type).getBounds();
+ for(Type boundType : bounds)
+ {
+ categoryClass = getMemberType(boundType);
+ if(categoryClass != null)
+ {
+ break;
+ }
+ }
}
}
+ return categoryClass;
}
+
public ConfiguredObjectRecord getRecord()
{
return _record;
@@ -126,7 +160,7 @@ public abstract class AbstractUnresolved
{
if(attrValue instanceof UUID)
{
- _unresolvedObjects.add(new IdDependency(clazz, attributeName,(UUID)attrValue));
+ _unresolvedObjects.add(new IdDependency(clazz, attributeName, (UUID) attrValue));
}
else if(attrValue instanceof String)
{
@@ -154,6 +188,15 @@ public abstract class AbstractUnresolved
return _unresolvedObjects;
}
+ @Override
+ public String toString()
+ {
+ return getClass().getSimpleName() + "{" +
+ "class=" + _clazz.getSimpleName() +
+ ", unresolvedObjects=" + _unresolvedObjects +
+ '}';
+ }
+
private abstract class Dependency<X extends ConfiguredObject<X>> implements ConfiguredObjectDependency<X>
{
private final Class<X> _clazz;
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java Wed Apr 9 14:13:13 2014
@@ -20,13 +20,11 @@
*/
package org.apache.qpid.server.model;
-import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import org.apache.qpid.server.security.SubjectCreator;
-@ManagedObject
+@ManagedObject( creatable = false )
public interface AuthenticationProvider<X extends AuthenticationProvider<X>> extends ConfiguredObject<X>
{
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java Wed Apr 9 14:13:13 2014
@@ -75,31 +75,31 @@ public interface Broker<X extends Broker
String VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE = "virtualhost.storeTransactionOpenTimeoutClose";
String VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_WARN = "virtualhost.storeTransactionOpenTimeoutWarn";
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
String getBuildVersion();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
String getOperatingSystem();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
String getPlatform();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
String getProcessPid();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
String getProductVersion();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
Collection<String> getSupportedVirtualHostStoreTypes();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
Collection<String> getSupportedAuthenticationProviders();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
Collection<String> getSupportedPreferencesProviderTypes();
- @ManagedAttribute
+ @ManagedAttribute( automate = true )
String getDefaultVirtualHost();
@ManagedAttribute
@@ -147,7 +147,7 @@ public interface Broker<X extends Broker
@ManagedAttribute
boolean getStatisticsReportingResetEnabled();
- @ManagedAttribute
+ @ManagedAttribute( derived = true )
String getModelVersion();
@ManagedAttribute
@@ -233,4 +233,6 @@ public interface Broker<X extends Broker
EventLogger getEventLogger();
void setEventLogger(EventLogger eventLogger);
+
+ AuthenticationProvider<?> getManagementModeAuthenticationProvider();
}
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java Wed Apr 9 14:13:13 2014
@@ -20,13 +20,13 @@
*/
package org.apache.qpid.server.model;
-import org.apache.qpid.server.store.ConfiguredObjectRecord;
-
import java.security.AccessControlException;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+
@ManagedObject( creatable = false, category = false )
/**
* An object that can be "managed" (eg via the web interface) and usually read from configuration.
@@ -37,6 +37,7 @@ public interface ConfiguredObject<X exte
public static final String NAME = "name";
public static final String TYPE = "type";
public static final String DESCRIPTION = "description";
+ public static final String CONTEXT = "context";
public static final String LAST_UPDATED_BY = "lastUpdatedBy";
public static final String LAST_UPDATED_TIME = "lastUpdatedTime";
public static final String STATE = "state";
@@ -67,6 +68,9 @@ public interface ConfiguredObject<X exte
@ManagedAttribute
String getType();
+ @ManagedAttribute(automate = true)
+ Map<String, String> getContext();
+
@ManagedAttribute
String getLastUpdatedBy();
@@ -284,4 +288,7 @@ public interface ConfiguredObject<X exte
// TODO - remove this when objects become responsible for their own storage
ConfiguredObjectRecord asObjectRecord();
+ void open();
+
+ void validate();
}
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java Wed Apr 9 14:13:13 2014
@@ -20,18 +20,18 @@
*/
package org.apache.qpid.server.model;
-import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
-import org.apache.qpid.server.plugin.QpidServiceLoader;
-import org.apache.qpid.server.store.ConfiguredObjectRecord;
-import org.apache.qpid.server.store.UnresolvedConfiguredObject;
-import org.apache.qpid.server.util.ServerScopedRuntimeException;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.UnresolvedConfiguredObject;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
public class ConfiguredObjectFactory
{
private final Map<String, String> _defaultTypes = new HashMap<String, String>();
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java Wed Apr 9 14:13:13 2014
@@ -31,4 +31,5 @@ public @interface ManagedAttribute
boolean derived() default false;
boolean automate() default false;
boolean mandatory() default false;
+ String defaultValue() default "";
}
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java Wed Apr 9 14:13:13 2014
@@ -22,6 +22,7 @@ package org.apache.qpid.server.model;
import java.security.AccessControlException;
import java.util.Collection;
+import java.util.Set;
@ManagedObject
public interface Port<X extends Port<X>> extends ConfiguredObject<X>
@@ -43,37 +44,22 @@ public interface Port<X extends Port<X>>
// Attributes
- @ManagedAttribute
+ @ManagedAttribute(automate = true)
String getBindingAddress();
- @ManagedAttribute
+ @ManagedAttribute(mandatory = true, automate = true)
int getPort();
- @ManagedAttribute
- Collection<Protocol> getProtocols();
+ @ManagedAttribute( automate = true )
+ Set<Protocol> getProtocols();
- @ManagedAttribute
- Collection<Transport> getTransports();
+ @ManagedAttribute( automate = true )
+ Set<Transport> getTransports();
- @ManagedAttribute
- boolean isTcpNoDelay();
-
- @ManagedAttribute
- int getSendBufferSize();
-
- @ManagedAttribute
- int getReceiveBufferSize();
-
- @ManagedAttribute
- boolean getNeedClientAuth();
-
- @ManagedAttribute
- boolean getWantClientAuth();
-
- @ManagedAttribute
+ @ManagedAttribute( automate = true )
KeyStore getKeyStore();
- @ManagedAttribute
+ @ManagedAttribute( automate = true )
Collection<TrustStore> getTrustStores();
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java Wed Apr 9 14:13:13 2014
@@ -20,12 +20,22 @@
*/
package org.apache.qpid.server.model;
+import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
+
import org.apache.qpid.server.BrokerOptions;
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.configuration.updater.TaskExecutor;
import org.apache.qpid.server.logging.EventLogger;
import org.apache.qpid.server.logging.LogRecorder;
import org.apache.qpid.server.logging.messages.BrokerMessages;
-import org.apache.qpid.server.model.adapter.BrokerAdapter;
import org.apache.qpid.server.store.ConfiguredObjectDependency;
import org.apache.qpid.server.store.ConfiguredObjectIdDependency;
import org.apache.qpid.server.store.ConfiguredObjectNameDependency;
@@ -33,9 +43,6 @@ import org.apache.qpid.server.store.Conf
import org.apache.qpid.server.store.UnresolvedConfiguredObject;
import org.apache.qpid.server.util.ServerScopedRuntimeException;
-import java.security.AccessControlException;
-import java.util.*;
-
@ManagedObject (creatable = false)
public class SystemContext extends AbstractConfiguredObject<SystemContext>
{
@@ -50,7 +57,6 @@ public class SystemContext extends Abstr
@ManagedAttributeField
private String _storeType;
- private Broker _broker;
public SystemContext(final TaskExecutor taskExecutor,
final ConfiguredObjectFactory configuredObjectFactory,
@@ -64,6 +70,7 @@ public class SystemContext extends Abstr
_objectFactory = configuredObjectFactory;
_logRecorder = logRecorder;
_brokerOptions = brokerOptions;
+ open();
}
public static Map<String, Object> createAttributes(final BrokerOptions brokerOptions)
@@ -72,6 +79,7 @@ public class SystemContext extends Abstr
attributes.put(NAME, "System");
attributes.put("storePath", brokerOptions.getConfigurationStoreLocation());
attributes.put("storeTye", brokerOptions.getConfigurationStoreType());
+ attributes.put(ConfiguredObject.CONTEXT, brokerOptions.getConfigProperties());
return attributes;
}
@@ -237,17 +245,6 @@ public class SystemContext extends Abstr
throw new IllegalArgumentException("Cannot change the lifetime of the SystemContext object");
}
- @Override
- public <C extends ConfiguredObject> Collection<C> getChildren(final Class<C> clazz)
- {
- if(clazz == Broker.class)
- {
- return (Collection<C>) Collections.singleton(_broker);
- }
-
- return Collections.emptySet();
- }
-
public ConfiguredObjectFactory getObjectFactory()
{
return _objectFactory;
@@ -312,13 +309,17 @@ public class SystemContext extends Abstr
return getAttributeNames(getClass());
}
- public void instantiateBroker(final Broker broker)
- {
- _broker = broker;
- }
-
public Broker getBroker()
{
- return _broker;
+ Collection<Broker> children = getChildren(Broker.class);
+ if(children == null || children.isEmpty())
+ {
+ return null;
+ }
+ else if(children.size() != 1)
+ {
+ throw new IllegalConfigurationException("More than one broker has been registered in a single context");
+ }
+ return children.iterator().next();
}
}
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java Wed Apr 9 14:13:13 2014
@@ -113,10 +113,10 @@ public interface VirtualHost<X extends V
@ManagedAttribute
int getHouseKeepingThreadCount();
- @ManagedAttribute
+ @ManagedAttribute( automate = true )
Map<String, Object> getMessageStoreSettings();
- @ManagedAttribute
+ @ManagedAttribute( automate = true )
Map<String, Object> getConfigurationStoreSettings();
@ManagedStatistic
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Wed Apr 9 14:13:13 2014
@@ -52,8 +52,6 @@ import org.apache.qpid.server.model.port
import org.apache.qpid.server.model.port.PortWithAuthProvider;
import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
import org.apache.qpid.server.plugin.MessageStoreFactory;
-import org.apache.qpid.server.security.FileKeyStore;
-import org.apache.qpid.server.security.FileTrustStore;
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.SubjectCreator;
import org.apache.qpid.server.security.access.Operation;
@@ -61,6 +59,7 @@ import org.apache.qpid.server.security.a
import org.apache.qpid.server.stats.StatisticsCounter;
import org.apache.qpid.server.stats.StatisticsGatherer;
import org.apache.qpid.server.util.MapValueConverter;
+import org.apache.qpid.server.virtualhost.VirtualHostImpl;
import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
import org.apache.qpid.util.SystemUtils;
@@ -146,6 +145,7 @@ public class BrokerAdapter extends Abstr
put(Broker.VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE, DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE);
put(Broker.VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_WARN, DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_WARN);
}});
+ public static final String MANAGEMENT_MODE_AUTHENTICATION = "MANAGEMENT_MODE_AUTHENTICATION";
private final ConfiguredObjectFactory _objectFactory;
private String[] POSITIVE_NUMERIC_ATTRIBUTES = { QUEUE_ALERT_THRESHOLD_MESSAGE_AGE, QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES,
@@ -174,23 +174,24 @@ public class BrokerAdapter extends Abstr
private final Collection<String> _supportedVirtualHostStoreTypes;
- private AuthenticationProvider<?> _managementAuthenticationProvider;
+ private AuthenticationProvider<?> _managementModeAuthenticationProvider;
private BrokerOptions _brokerOptions;
private Timer _reportingTimer;
private StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
+ @ManagedAttributeField
+ private String _defaultVirtualHost;
+
public BrokerAdapter(UUID id,
Map<String, Object> attributes,
SystemContext parent)
{
super(Collections.<Class<? extends ConfiguredObject>, ConfiguredObject<?>>singletonMap(SystemContext.class, parent), DEFAULTS, combineIdWithAttributes(id,MapValueConverter.convert(attributes, ATTRIBUTE_TYPES)), parent.getTaskExecutor());
- validateModelVersion();
_objectFactory = parent.getObjectFactory();
_virtualHostRegistry = new VirtualHostRegistry(parent.getEventLogger());
- _virtualHostRegistry.setDefaultVirtualHostName((String)getAttribute(Broker.DEFAULT_VIRTUAL_HOST));
_logRecorder = parent.getLogRecorder();
_eventLogger = parent.getEventLogger();
@@ -204,13 +205,14 @@ public class BrokerAdapter extends Abstr
authManagerAttrs.put(ID, UUID.randomUUID());
SimpleAuthenticationManager authManager = new SimpleAuthenticationManager(this, Collections.<String,Object>emptyMap(), authManagerAttrs);
authManager.addUser(BrokerOptions.MANAGEMENT_MODE_USER_NAME, _brokerOptions.getManagementModePassword());
- _managementAuthenticationProvider = authManager;
+ _managementModeAuthenticationProvider = authManager;
}
initialiseStatistics();
}
- private void validateModelVersion()
+ public void validate()
{
+ super.validate();
String modelVersion = (String) getActualAttributes().get(Broker.MODEL_VERSION);
if (modelVersion == null)
{
@@ -236,6 +238,52 @@ public class BrokerAdapter extends Abstr
}
+ protected void onOpen()
+ {
+ super.onOpen();
+ if(_brokerOptions.isManagementMode())
+ {
+ _managementModeAuthenticationProvider.open();
+ }
+ _virtualHostRegistry.setDefaultVirtualHostName(getDefaultVirtualHost());
+
+ for(KeyStore<?> keyStore : getChildren(KeyStore.class))
+ {
+ addKeyStore(keyStore);
+ }
+ for(TrustStore<?> trustStore : getChildren(TrustStore.class))
+ {
+ addTrustStore(trustStore);
+ }
+ for(AuthenticationProvider<?> authenticationProvider : getChildren(AuthenticationProvider.class))
+ {
+ addAuthenticationProvider(authenticationProvider);
+ }
+ for(Port<?> port : getChildren(Port.class))
+ {
+ addPort(port);
+ }
+ for(Plugin<?> plugin : getChildren(Plugin.class))
+ {
+ addPlugin(plugin);
+ }
+ for(GroupProvider<?> groupProvider : getChildren(GroupProvider.class))
+ {
+ addGroupProvider(groupProvider);
+ }
+ for(AccessControlProvider<?> accessControlProvider : getChildren(AccessControlProvider.class))
+ {
+ addAccessControlProvider(accessControlProvider);
+ }
+ for(VirtualHost<?,?,?> virtualHost : getChildren(VirtualHost.class))
+ {
+ addVirtualHost(virtualHost);
+ }
+
+
+ initialiseStatistics();
+ }
+
private void initialiseStatisticsReporting()
{
long report = ((Number)getAttribute(Broker.STATISTICS_REPORTING_PERIOD)).intValue() * 1000; // convert to ms
@@ -303,7 +351,7 @@ public class BrokerAdapter extends Abstr
@Override
public String getDefaultVirtualHost()
{
- return (String) getAttribute(DEFAULT_VIRTUAL_HOST);
+ return _defaultVirtualHost;
}
@Override
@@ -454,7 +502,7 @@ public class BrokerAdapter extends Abstr
{
if (isManagementMode())
{
- return _managementAuthenticationProvider;
+ return _managementModeAuthenticationProvider;
}
Collection<AuthenticationProvider<?>> providers = getAuthenticationProviders();
for (AuthenticationProvider<?> authenticationProvider : providers)
@@ -593,45 +641,6 @@ public class BrokerAdapter extends Abstr
{
return getMessageDeliveryStatistics().getTotal();
}
- @SuppressWarnings("unchecked")
- @Override
- public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
- {
- if(clazz == VirtualHost.class)
- {
- return (Collection<C>) getVirtualHosts();
- }
- else if(clazz == Port.class)
- {
- return (Collection<C>) getPorts();
- }
- else if(clazz == AccessControlProvider.class)
- {
- return (Collection<C>) getAccessControlProviders();
- }
- else if(clazz == AuthenticationProvider.class)
- {
- return (Collection<C>) getAuthenticationProviders();
- }
- else if(clazz == GroupProvider.class)
- {
- return (Collection<C>) getGroupProviders();
- }
- else if(clazz == KeyStore.class)
- {
- return (Collection<C>) getKeyStores();
- }
- else if(clazz == TrustStore.class)
- {
- return (Collection<C>) getTrustStores();
- }
- else if(clazz == Plugin.class)
- {
- return (Collection<C>) getPlugins();
- }
-
- return Collections.emptySet();
- }
@SuppressWarnings("unchecked")
@Override
@@ -677,7 +686,7 @@ public class BrokerAdapter extends Abstr
private Port<?> createPort(Map<String, Object> attributes)
{
Port<?> port = createChild(Port.class, attributes);
-
+ addPort(port);
//1. AMQP ports are disabled during ManagementMode.
//2. The management plugins can currently only start ports at broker startup and
// not when they are newly created via the management interfaces.
@@ -727,6 +736,7 @@ public class BrokerAdapter extends Abstr
synchronized (_accessControlProviders)
{
accessControlProvider = (AccessControlProvider<?>) createChild(AccessControlProvider.class, attributes);
+ addAccessControlProvider(accessControlProvider);
}
boolean quiesce = isManagementMode() ;
@@ -741,7 +751,7 @@ public class BrokerAdapter extends Abstr
private void addAccessControlProvider(AccessControlProvider<?> accessControlProvider)
{
String name = accessControlProvider.getName();
- synchronized (_authenticationProviders)
+ synchronized (_accessControlProviders)
{
if (_accessControlProviders.containsKey(accessControlProvider.getId()))
{
@@ -781,6 +791,7 @@ public class BrokerAdapter extends Abstr
private AuthenticationProvider createAuthenticationProvider(Map<String, Object> attributes)
{
AuthenticationProvider<?> authenticationProvider = createChild(AuthenticationProvider.class, attributes);
+ addAuthenticationProvider(authenticationProvider);
authenticationProvider.setDesiredState(State.INITIALISING, State.ACTIVE);
return authenticationProvider;
}
@@ -826,6 +837,7 @@ public class BrokerAdapter extends Abstr
private GroupProvider<?> createGroupProvider(Map<String, Object> attributes)
{
GroupProvider<?> groupProvider = createChild(GroupProvider.class, attributes);
+ addGroupProvider(groupProvider);
groupProvider.setDesiredState(State.INITIALISING, State.ACTIVE);
return groupProvider;
}
@@ -862,13 +874,17 @@ public class BrokerAdapter extends Abstr
private KeyStore createKeyStore(Map<String, Object> attributes)
{
- KeyStore keyStore = new FileKeyStore(UUIDGenerator.generateRandomUUID(), this, attributes);
+
+ KeyStore<?> keyStore = createChild(KeyStore.class, attributes);
+
+ addKeyStore(keyStore);
return keyStore;
}
private TrustStore createTrustStore(Map<String, Object> attributes)
{
- TrustStore trustStore = new FileTrustStore(UUIDGenerator.generateRandomUUID(), this, attributes);
+ TrustStore trustStore = createChild(TrustStore.class, attributes);
+ addTrustStore(trustStore);
return trustStore;
}
@@ -1216,46 +1232,6 @@ public class BrokerAdapter extends Abstr
}
}
- public void instantiateAuthenticationProvider(AuthenticationProvider object)
- {
- addAuthenticationProvider(object);
- }
-
- public void instantiateAccessControlProvider(AccessControlProvider object)
- {
- addAccessControlProvider(object);
- }
-
- public void instantiatePort(Port object)
- {
- addPort(object);
- }
-
- public void instantiateVirtualHost(VirtualHost object)
- {
- addVirtualHost(object);
- }
-
- public void instantiateGroupProvider(GroupProvider object)
- {
- addGroupProvider(object);
- }
-
- public void instantiateKeyStore(KeyStore object)
- {
- addKeyStore(object);
- }
-
- public void instantiateTrustStore(TrustStore object)
- {
- addTrustStore(object);
- }
-
- public void instantiatePlugin(Plugin object)
- {
- addPlugin(object);
- }
-
@Override
public SecurityManager getSecurityManager()
{
@@ -1502,7 +1478,7 @@ public class BrokerAdapter extends Abstr
_messagesReceived.reset();
_dataReceived.reset();
- for (org.apache.qpid.server.virtualhost.VirtualHost vhost : _virtualHostRegistry.getVirtualHosts())
+ for (VirtualHostImpl vhost : _virtualHostRegistry.getVirtualHosts())
{
vhost.resetStatistics();
}
@@ -1555,11 +1531,11 @@ public class BrokerAdapter extends Abstr
_eventLogger.message(BrokerMessages.STATS_MSGS(RECEIVED,
_messagesReceived.getPeak(),
_messagesReceived.getTotal()));
- Collection<org.apache.qpid.server.virtualhost.VirtualHost> hosts = _virtualHostRegistry.getVirtualHosts();
+ Collection<VirtualHostImpl> hosts = _virtualHostRegistry.getVirtualHosts();
if (hosts.size() > 1)
{
- for (org.apache.qpid.server.virtualhost.VirtualHost vhost : hosts)
+ for (VirtualHostImpl vhost : hosts)
{
String name = vhost.getName();
StatisticsCounter dataDelivered = vhost.getDataDeliveryStatistics();
@@ -1589,5 +1565,8 @@ public class BrokerAdapter extends Abstr
}
}
-
+ public AuthenticationProvider<?> getManagementModeAuthenticationProvider()
+ {
+ return _managementModeAuthenticationProvider;
+ }
}
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java Wed Apr 9 14:13:13 2014
@@ -62,6 +62,7 @@ public final class ConnectionAdapter ext
{
super(Collections.<String,Object>emptyMap(), createAttributes(conn), taskExecutor);
_connection = conn;
+ open();
conn.addSessionListener(this);
}
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java Wed Apr 9 14:13:13 2014
@@ -42,7 +42,7 @@ public class FileBasedGroupProvider
{
private static Logger LOGGER = Logger.getLogger(FileBasedGroupProvider.class);
- private final GroupManager _groupManager;
+ private GroupManager _groupManager;
private final Broker<?> _broker;
private AtomicReference<State> _state;
@@ -56,15 +56,14 @@ public class FileBasedGroupProvider
super(Collections.<Class<? extends ConfiguredObject>,ConfiguredObject<?>>singletonMap(Broker.class, broker),
Collections.<String,Object>emptyMap(), combineIdWithAttributes(id, attributes), broker.getTaskExecutor());
- _groupManager = new FileGroupManager(getPath());
+
_broker = broker;
State state = MapValueConverter.getEnumAttribute(State.class, STATE, attributes, State.INITIALISING);
_state = new AtomicReference<State>(state);
- validateUniqueFile();
}
- private void validateUniqueFile()
+ public void validate()
{
Collection<GroupProvider<?>> groupProviders = _broker.getGroupProviders();
for(GroupProvider<?> provider : groupProviders)
@@ -86,12 +85,21 @@ public class FileBasedGroupProvider
}
}
+ protected void onOpen()
+ {
+ super.onOpen();
+ if(_groupManager == null)
+ {
+ _groupManager = new FileGroupManager(getPath());
+ }
+ }
@Override
- protected void create()
+ protected void onCreate()
{
+ super.onCreate();
+ _groupManager = new FileGroupManager(getPath());
_groupManager.onCreate();
- super.create();
}
@ManagedAttribute( automate = true, mandatory = true)
@@ -193,7 +201,7 @@ public class FileBasedGroupProvider
{
if (clazz == Group.class)
{
- Set<Principal> groups = _groupManager.getGroupPrincipals();
+ Set<Principal> groups = _groupManager == null ? Collections.<Principal>emptySet() : _groupManager.getGroupPrincipals();
Collection<Group> principals = new ArrayList<Group>(groups.size());
for (Principal group : groups)
{
@@ -273,6 +281,7 @@ public class FileBasedGroupProvider
{
_groupManager.close();
_groupManager.onDelete();
+ deleted();
return true;
}
else
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProvider.java Wed Apr 9 14:13:13 2014
@@ -21,16 +21,6 @@
package org.apache.qpid.server.model.adapter;
-import org.apache.log4j.Logger;
-import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.model.*;
-import org.apache.qpid.server.util.MapValueConverter;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.type.TypeReference;
-
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@@ -41,9 +31,36 @@ import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.security.AccessControlException;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
+import org.apache.log4j.Logger;
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.type.TypeReference;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.IllegalStateTransitionException;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.ManagedAttribute;
+import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.util.MapValueConverter;
+
@ManagedObject( category = false, type = "FileSystemPreferences" )
public class FileSystemPreferencesProvider extends AbstractConfiguredObject<FileSystemPreferencesProvider> implements PreferencesProvider<FileSystemPreferencesProvider>
{
@@ -177,6 +194,7 @@ public class FileSystemPreferencesProvid
finally
{
_store.delete();
+ deleted();
_authenticationProvider.setPreferencesProvider(null);
}
return true;
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java Wed Apr 9 14:13:13 2014
@@ -61,6 +61,7 @@ final class SessionAdapter extends Abstr
childRemoved(consumer);
}
});
+ open();
}
private static Map<String, Object> createAttributes(final AMQSessionModel session)
Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java?rev=1585979&r1=1585978&r2=1585979&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java Wed Apr 9 14:13:13 2014
@@ -65,6 +65,24 @@ abstract public class AbstractPort<X ext
private final Broker<?> _broker;
private AtomicReference<State> _state;
+ @ManagedAttributeField
+ private int _port;
+
+ @ManagedAttributeField
+ private String _bindingAddress;
+
+ @ManagedAttributeField
+ private KeyStore<?> _keyStore;
+
+ @ManagedAttributeField
+ private Collection<TrustStore> _trustStores;
+
+ @ManagedAttributeField
+ private Set<Transport> _transports;
+
+ @ManagedAttributeField
+ private Set<Protocol> _protocols;
+
public AbstractPort(UUID id,
Broker<?> broker,
Map<String, Object> attributes,
@@ -73,41 +91,27 @@ abstract public class AbstractPort<X ext
{
super(Collections.<Class<? extends ConfiguredObject>,ConfiguredObject<?>>singletonMap(Broker.class, broker),
updateDefaults(defaults, attributes),
- combineIdWithAttributes(id,MapValueConverter.convert(attributes, ATTRIBUTE_TYPES)),
+ combineIdWithAttributes(id,attributes),
taskExecutor);
_broker = broker;
- Object portValue = attributes.get(Port.PORT);
- if (portValue == null)
- {
- throw new IllegalConfigurationException("Port attribute is not specified for port: " + attributes);
- }
-
State state = MapValueConverter.getEnumAttribute(State.class, STATE, attributes, State.INITIALISING);
_state = new AtomicReference<State>(state);
+ }
-
- boolean useClientAuth = Boolean.TRUE.equals(getAttribute(Port.NEED_CLIENT_AUTH))
- || Boolean.TRUE.equals(getAttribute(Port.WANT_CLIENT_AUTH));
-
- if(useClientAuth && getTrustStores().isEmpty())
- {
- throw new IllegalConfigurationException("Can't create port which requests SSL client certificates but has no trust stores configured.");
- }
+ @Override
+ public void validate()
+ {
+ super.validate();
boolean useTLSTransport = getTransports().contains(Transport.SSL) || getTransports().contains(Transport.WSS);
- if(useClientAuth && !useTLSTransport)
- {
- throw new IllegalConfigurationException(
- "Can't create port which requests SSL client certificates but doesn't use SSL transport.");
- }
+
if(useTLSTransport && getKeyStore() == null)
{
throw new IllegalConfigurationException("Can't create a port which uses a secure transport but has no KeyStore");
}
}
-
private static Map<String, Object> updateDefaults(final Map<String, Object> defaults,
final Map<String, Object> attributes)
{
@@ -126,20 +130,19 @@ abstract public class AbstractPort<X ext
@Override
public String getBindingAddress()
{
- return (String)getAttribute(BINDING_ADDRESS);
+ return _bindingAddress;
}
@Override
public int getPort()
{
- return (Integer)getAttribute(PORT);
+ return _port;
}
- @SuppressWarnings("unchecked")
@Override
- public Collection<Transport> getTransports()
+ public Set<Transport> getTransports()
{
- return (Collection<Transport>)getAttribute(TRANSPORTS);
+ return _transports;
}
@Override
@@ -156,11 +159,10 @@ abstract public class AbstractPort<X ext
throw new IllegalStateException();
}
- @SuppressWarnings("unchecked")
@Override
- public Collection<Protocol> getProtocols()
+ public Set<Protocol> getProtocols()
{
- return (Collection<Protocol>)getAttribute(PROTOCOLS);
+ return _protocols;
}
@Override
@@ -290,6 +292,7 @@ abstract public class AbstractPort<X ext
if( _state.compareAndSet(state, State.DELETED))
{
onStop();
+ deleted();
return true;
}
}
@@ -363,14 +366,20 @@ abstract public class AbstractPort<X ext
throw new IllegalConfigurationException("Changing the port name is not allowed");
}
- Integer newPort = (Integer) merged.get(PORT);
- if(getPort() != newPort)
+ if(converted.containsKey(PORT))
{
- for(Port p : _broker.getPorts())
+ Integer newPort = (Integer) merged.get(PORT);
+ if (getPort() != newPort)
{
- if(p.getPort() == newPort)
+ for (Port p : _broker.getPorts())
{
- throw new IllegalConfigurationException("Port number " + newPort + " is already in use by port " + p.getName());
+ if (p.getPort() == newPort)
+ {
+ throw new IllegalConfigurationException("Port number "
+ + newPort
+ + " is already in use by port "
+ + p.getName());
+ }
}
}
}
@@ -393,7 +402,7 @@ abstract public class AbstractPort<X ext
}
}
- Set<String> trustStoreNames = (Set<String>) merged.get(TRUST_STORES);
+ Collection<String> trustStoreNames = (Collection<String>) merged.get(TRUST_STORES);
boolean hasTrustStore = trustStoreNames != null && !trustStoreNames.isEmpty();
if(hasTrustStore)
{
@@ -460,7 +469,7 @@ abstract public class AbstractPort<X ext
}
}
- super.changeAttributes(converted);
+ super.changeAttributes(attributes);
}
@Override
@@ -496,39 +505,13 @@ abstract public class AbstractPort<X ext
@Override
public KeyStore getKeyStore()
{
- String keyStoreName = (String)getAttribute(Port.KEY_STORE);
- KeyStore keyStore = _broker.findKeyStoreByName(keyStoreName);
-
- if (keyStoreName != null && keyStore == null)
- {
- throw new IllegalConfigurationException("Can't find key store with name '" + keyStoreName + "' for port " + getName());
- }
-
- return keyStore;
+ return _keyStore;
}
@Override
public Collection<TrustStore> getTrustStores()
{
- Set<String> trustStoreNames = (Set<String>) getAttribute(TRUST_STORES);
- boolean hasTrustStoreName = trustStoreNames != null && !trustStoreNames.isEmpty();
-
- final Collection<TrustStore> trustStores = new ArrayList<TrustStore>();
- if(hasTrustStoreName)
- {
- for (String name : trustStoreNames)
- {
- TrustStore trustStore = _broker.findTrustStoreByName(name);
- if (trustStore == null)
- {
- throw new IllegalConfigurationException("Can't find trust store with name '" + name + "' for port " + getName());
- }
-
- trustStores.add(trustStore);
- }
- }
-
- return trustStores;
+ return _trustStores;
}
@Override
@@ -537,38 +520,10 @@ abstract public class AbstractPort<X ext
return getClass().getSimpleName() + " [id=" + getId() + ", name=" + getName() + ", port=" + getPort() + "]";
}
- @Override
- public boolean isTcpNoDelay()
- {
- return (Boolean)getAttribute(TCP_NO_DELAY);
- }
-
- @Override
- public int getSendBufferSize()
- {
- return (Integer)getAttribute(SEND_BUFFER_SIZE);
- }
-
- @Override
- public int getReceiveBufferSize()
- {
- return (Integer)getAttribute(RECEIVE_BUFFER_SIZE);
- }
-
- @Override
- public boolean getNeedClientAuth()
- {
- return (Boolean)getAttribute(NEED_CLIENT_AUTH);
- }
-
- @Override
- public boolean getWantClientAuth()
- {
- return (Boolean)getAttribute(WANT_CLIENT_AUTH);
- }
- protected void validateOnlyOneInstance(final Broker<?> broker)
+ protected void validateOnlyOneInstance()
{
+ Broker<?> broker = getParent(Broker.class);
if(!broker.isManagementMode())
{
//ManagementMode needs this relaxed to allow its overriding management ports to be inserted.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org