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