Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
 Sun Nov 20 16:42:57 2016
@@ -260,16 +260,56 @@ public abstract class AbstractSystemConf
         _configurationStore.upgradeStoreStructure();
     }
 
-    @StateTransition(currentState = State.UNINITIALIZED, desiredState = 
State.ACTIVE)
+
+    @StateTransition(currentState = State.ACTIVE, desiredState = State.STOPPED)
+    protected ListenableFuture<Void> doStop()
+    {
+        return doAfter(getContainer().closeAsync(), new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                _configurationStore.closeConfigurationStore();
+                _configurationStore = createStoreObject();
+
+                if (isManagementMode())
+                {
+                    _configurationStore = new 
ManagementModeStoreHandler(_configurationStore, AbstractSystemConfig.this);
+                }
+
+                _configurationStore.init(AbstractSystemConfig.this);
+                _configurationStore.upgradeStoreStructure();
+                AbstractSystemConfig.super.setState(State.STOPPED);
+            }
+        });
+
+    }
+
+
+    @StateTransition(currentState = { State.UNINITIALIZED, State.STOPPED }, 
desiredState = State.ACTIVE)
     protected ListenableFuture<Void> activate()
     {
+        return doAfter(makeActive(), new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                AbstractSystemConfig.super.setState(State.ACTIVE);
+            }
+        });
+    }
+
+
+    protected ListenableFuture<Void> makeActive()
+    {
+
         final EventLogger eventLogger = _eventLogger;
         final EventLogger startupLogger = initiateStartupLogging();
 
 
         try
         {
-            final Container<?> container = initateStoreAndRecovery();
+            final Container<?> container = initiateStoreAndRecovery();
 
             container.setEventLogger(startupLogger);
             final SettableFuture<Void> returnVal = SettableFuture.create();
@@ -309,7 +349,8 @@ public abstract class AbstractSystemConf
 
     }
 
-    private Container<?> initateStoreAndRecovery() throws IOException
+
+    private Container<?> initiateStoreAndRecovery() throws IOException
     {
         ConfiguredObjectRecord[] initialRecords = 
convertToConfigurationRecords(getInitialConfigurationLocation());
         final DurableConfigurationStore store = getConfigurationStore();
@@ -338,7 +379,10 @@ public abstract class AbstractSystemConf
 
         if(containerType != null)
         {
-            updateModel(containerType.getModel());
+            if(containerType.getModel() != getModel())
+            {
+                updateModel(containerType.getModel());
+            }
             containerType.getRecoverer(this).upgradeAndRecover(records);
 
         }
@@ -359,7 +403,7 @@ public abstract class AbstractSystemConf
 
         try
         {
-            final Container<?> container = initateStoreAndRecovery();
+            final Container<?> container = initiateStoreAndRecovery();
 
             container.setEventLogger(startupLogger);
             return Futures.immediateFuture(null);
@@ -539,6 +583,12 @@ public abstract class AbstractSystemConf
         _onContainerCloseTask = onContainerCloseTask;
     }
 
+    @Override
+    protected void logOperation(final String operation)
+    {
+        getEventLogger().message(BrokerMessages.OPERATION(operation));
+    }
+
     public static String getDefaultValue(String attrName)
     {
         Model model = SystemConfigBootstrapModel.getInstance();

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
 Sun Nov 20 16:42:57 2016
@@ -29,7 +29,7 @@ import javax.security.sasl.SaslServer;
 import org.apache.qpid.server.security.SubjectCreator;
 import org.apache.qpid.server.security.auth.AuthenticationResult;
 
-@ManagedObject( creatable = false )
+@ManagedObject
 public interface AuthenticationProvider<X extends AuthenticationProvider<X>> 
extends ConfiguredObject<X>
 {
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
 Sun Nov 20 16:42:57 2016
@@ -22,7 +22,7 @@ package org.apache.qpid.server.model;
 
 import java.util.Map;
 
-@ManagedObject
+@ManagedObject( amqpName = "org.apache.qpid.Binding")
 public interface Binding<X extends Binding<X>> extends ConfiguredObject<X>
 {
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 Sun Nov 20 16:42:57 2016
@@ -250,6 +250,12 @@ public interface Broker<X extends Broker
     int getNumberOfObjectsPendingFinalization();
 
     @ManagedOperation(nonModifying = true,
+            description = "Restart the broker within the same JVM",
+            changesConfiguredObjectState = false,
+            log = true)
+    void restart();
+
+    @ManagedOperation(nonModifying = true,
             description = "Initiates garbage collection",
             changesConfiguredObjectState = false)
     void performGC();

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
 Sun Nov 20 16:42:57 2016
@@ -36,6 +36,7 @@ import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.UUID;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
@@ -807,6 +808,12 @@ public class BrokerImpl extends Abstract
         _eventLogger.message(BrokerMessages.FATAL_ERROR(e.getMessage()));
     }
 
+    @Override
+    protected void logOperation(final String operation)
+    {
+        getEventLogger().message(BrokerMessages.OPERATION(operation));
+    }
+
     public void registerMessageDelivered(long messageSize)
     {
         _messagesDelivered.registerEvent(1L);
@@ -964,6 +971,33 @@ public class BrokerImpl extends Abstract
     }
 
     @Override
+    public void restart()
+    {
+        Subject.doAs(getSystemTaskSubject("Broker"), new 
PrivilegedAction<Void>()
+        {
+            @Override
+            public Void run()
+            {
+                final SystemConfig<?> systemConfig = 
getParent(SystemConfig.class);
+                // This is deliberately asynchronous as the HTTP thread will 
be interrupted by restarting
+                
doAfter(systemConfig.setAttributesAsync(Collections.<String,Object>singletonMap(ConfiguredObject.DESIRED_STATE,
+                                                                               
                 State.STOPPED)),
+                        new Callable<ListenableFuture<Void>>()
+                        {
+                            @Override
+                            public ListenableFuture<Void> call() throws 
Exception
+                            {
+                                return 
systemConfig.setAttributesAsync(Collections.<String,Object>singletonMap(ConfiguredObject.DESIRED_STATE,
 State.ACTIVE));
+                            }
+                        });
+
+                return null;
+            }
+        });
+
+    }
+
+    @Override
     public Principal getUser()
     {
         return AuthenticatedPrincipal.getCurrentUser();

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
 Sun Nov 20 16:42:57 2016
@@ -113,10 +113,8 @@ public final class BrokerModel extends M
         addRelationship(Queue.class, Consumer.class);
 
         addRelationship(Exchange.class, Binding.class);
-        addRelationship(Exchange.class, Publisher.class);
 
         addRelationship(Session.class, Consumer.class);
-        addRelationship(Session.class, Publisher.class);
 
         _objectFactory = new ConfiguredObjectFactoryImpl(this);
         _typeRegistry = new ConfiguredObjectTypeRegistry((new 
QpidServiceLoader()).instancesOf(ConfiguredObjectRegistration.class),

Added: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectCustomSerialization.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectCustomSerialization.java?rev=1770576&view=auto
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectCustomSerialization.java
 (added)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectCustomSerialization.java
 Sun Nov 20 16:42:57 2016
@@ -0,0 +1,177 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.Principal;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.qpid.server.model.preferences.GenericPrincipal;
+import org.apache.qpid.server.security.QpidPrincipal;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
+public class ConfiguredObjectCustomSerialization
+{
+
+    private static final Set<String> OBJECT_METHOD_NAMES = 
Collections.synchronizedSet(new HashSet<String>());
+
+    static
+    {
+        for(Method method : Object.class.getMethods())
+        {
+            OBJECT_METHOD_NAMES.add(method.getName());
+        }
+    }
+
+    public interface Converter<T>
+    {
+        Class<T> getConversionClass();
+
+        Object convert(T value);
+    }
+
+    private static final Map<Class<?>, Converter<?>> REGISTERED_CONVERTERS = 
new ConcurrentHashMap<>();
+
+    private abstract static class AbstractConverter<T> implements Converter<T>
+    {
+        private final Class<T> _conversionClass;
+
+        public AbstractConverter(Class<T> conversionClass)
+        {
+            REGISTERED_CONVERTERS.put(conversionClass, this);
+            _conversionClass = conversionClass;
+        }
+
+        @Override
+        public final Class<T> getConversionClass()
+        {
+            return _conversionClass;
+        }
+    }
+
+    public static Collection<Converter<?>> getConverters()
+    {
+        return REGISTERED_CONVERTERS.values();
+    }
+
+    @SuppressWarnings("unused")
+    private static final Converter<Principal> PRINCIPAL_CONVERTER =
+            new AbstractConverter<Principal>(Principal.class)
+            {
+                @Override
+                public Object convert(final Principal value)
+                {
+                    if (value instanceof QpidPrincipal)
+                    {
+                        return new GenericPrincipal((QpidPrincipal) 
value).toExternalForm();
+                    }
+                    else if (value instanceof GenericPrincipal)
+                    {
+                        return ((GenericPrincipal) value).toExternalForm();
+                    }
+                    else
+                    {
+                        return value.getName();
+                    }
+                }
+            };
+
+
+    @SuppressWarnings("unused")
+    private static final Converter<Certificate> CERTIFICATE_CONVERTER =
+            new AbstractConverter<Certificate>(Certificate.class)
+            {
+                @Override
+                public Object convert(final Certificate value)
+                {
+                    try
+                    {
+                        return value.getEncoded();
+                    }
+                    catch (CertificateEncodingException e)
+                    {
+                        throw new IllegalArgumentException(e);
+                    }
+                }
+            };
+
+
+    @SuppressWarnings("unused")
+    private static final Converter<ConfiguredObject> 
CONFIGURED_OBJECT_CONVERTER =
+            new AbstractConverter<ConfiguredObject>(ConfiguredObject.class)
+            {
+                @Override
+                public Object convert(final ConfiguredObject value)
+                {
+                    return value.getId().toString();
+                }
+            };
+
+
+    @SuppressWarnings("unused")
+    private static final Converter<ManagedAttributeValue> 
MANAGED_ATTRIBUTE_VALUE_CONVERTER =
+            new 
AbstractConverter<ManagedAttributeValue>(ManagedAttributeValue.class)
+            {
+                @Override
+                public Object convert(final ManagedAttributeValue value)
+                {
+
+                    Map<String, Object> valueAsMap = new LinkedHashMap<>();
+                    for (Method method : value.getClass().getMethods())
+                    {
+                        final String methodName = method.getName();
+                        if (method.getParameterTypes().length == 0
+                            && !OBJECT_METHOD_NAMES.contains(methodName)
+                            && (methodName.startsWith("is")
+                                || methodName.startsWith("has")
+                                || methodName.startsWith("get")))
+                        {
+                            String propertyName =
+                                    methodName.startsWith("is") ? 
methodName.substring(2) : methodName.substring(3);
+                            propertyName = 
Character.toLowerCase(propertyName.charAt(0)) + propertyName.substring(1);
+                            try
+                            {
+                                final Object attrValue = method.invoke(value);
+                                if (attrValue != null)
+                                {
+                                    valueAsMap.put(propertyName, attrValue);
+                                }
+                            }
+                            catch (IllegalAccessException | 
InvocationTargetException e)
+                            {
+                                throw new ServerScopedRuntimeException(e);
+                            }
+                        }
+                    }
+                    return valueAsMap;
+                }
+            };
+
+}

Propchange: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectCustomSerialization.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFinder.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFinder.java?rev=1770576&view=auto
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFinder.java
 (added)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFinder.java
 Sun Nov 20 16:42:57 2016
@@ -0,0 +1,461 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+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.List;
+import java.util.Map;
+
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+import org.apache.qpid.util.Strings;
+
+public class ConfiguredObjectFinder
+{
+    private final ConfiguredObject<?> _root;
+    private final Map<Class<? extends ConfiguredObject>, List<Class<? extends 
ConfiguredObject>>> _hierarchies =
+            new HashMap<>();
+    private final Model _model;
+    private final Map<Class<? extends ConfiguredObject>, 
ConfiguredObjectOperation<ConfiguredObject<?>>>
+            _associatedChildrenOperations = new HashMap<>();
+
+
+    public ConfiguredObjectFinder(final ConfiguredObject<?> root)
+    {
+        _root = root;
+        _model = root.getModel();
+        final Class<? extends ConfiguredObject> managedCategory = 
root.getCategoryClass();
+        addManagedHierarchies(managedCategory, managedCategory);
+
+        for (ConfiguredObjectOperation operation : 
_model.getTypeRegistry().getOperations(managedCategory).values())
+        {
+            if (operation.isAssociateAsIfChildren() && 
returnsCollectionOfConfiguredObjects(operation))
+            {
+                Class<? extends ConfiguredObject> associatedChildCategory =
+                        (getCollectionMemberType((ParameterizedType) 
operation.getGenericReturnType()));
+                _associatedChildrenOperations.put(associatedChildCategory, 
operation);
+                addManagedHierarchies(associatedChildCategory, 
associatedChildCategory);
+            }
+        }
+    }
+
+    private void addManagedHierarchies(Class<? extends ConfiguredObject> 
category,
+                                       final Class<? extends ConfiguredObject> 
rootCategory)
+    {
+        if (!_hierarchies.containsKey(category))
+        {
+            _hierarchies.put(category, calculateHierarchy(category, 
rootCategory));
+
+            for (Class<? extends ConfiguredObject> childClass : 
_model.getChildTypes(category))
+            {
+                addManagedHierarchies(childClass, rootCategory);
+            }
+        }
+    }
+
+    public ConfiguredObject<?> findObjectFromPath(String path, Class<? extends 
ConfiguredObject> category)
+    {
+        return findObjectFromPath(Arrays.asList(path.split("/")), category);
+    }
+
+    public ConfiguredObject<?> findObjectFromPath(List<String> path, Class<? 
extends ConfiguredObject> category)
+    {
+        Collection<ConfiguredObject<?>> candidates = findObjectsFromPath(path, 
getHierarchy(category), false);
+        if(candidates == null || candidates.isEmpty())
+        {
+            return null;
+        }
+        else if(candidates.size() == 1)
+        {
+            return candidates.iterator().next();
+        }
+        else
+        {
+            throw new IllegalArgumentException("More than one object matching 
path was found");
+        }
+    }
+
+    public Class<? extends ConfiguredObject>[] getHierarchy(final Class<? 
extends ConfiguredObject> category)
+    {
+        List<Class<? extends ConfiguredObject>> hierarchy = 
_hierarchies.get(_model.getTypeRegistry().getCategory(category));
+        return hierarchy.toArray(new Class[hierarchy.size()]);
+    }
+
+    public Collection<ConfiguredObject<?>> findObjectsFromPath(List<String> 
path,
+                                                               Class<? extends 
ConfiguredObject>[] hierarchy,
+                                                               boolean 
allowWildcards)
+    {
+        Collection<ConfiguredObject<?>> parents = new ArrayList<>();
+        if (hierarchy.length == 0)
+        {
+            return Collections.<ConfiguredObject<?>>singletonList(_root);
+        }
+
+        Collection<Class<? extends ConfiguredObject>> ancestorCategories =
+                _model.getAncestorCategories(hierarchy[hierarchy.length - 1]);
+        Map<Class<? extends ConfiguredObject>, String> filters = new 
HashMap<>();
+        Collection<ConfiguredObject<?>> children = new ArrayList<>();
+        boolean wildcard = false;
+
+        Class<? extends ConfiguredObject> parentType = 
_root.getCategoryClass();
+
+        parents.add(_root);
+
+        for (int i = 0; i < hierarchy.length; i++)
+        {
+            if (_model.getChildTypes(parentType).contains(hierarchy[i]))
+            {
+                parentType = hierarchy[i];
+                for (ConfiguredObject<?> parent : parents)
+                {
+                    if (path.size() > i
+                        && path.get(i) != null
+                        && !path.get(i).equals("*")
+                        && path.get(i).trim().length() != 0)
+                    {
+                        for (ConfiguredObject<?> child : 
parent.getChildren(hierarchy[i]))
+                        {
+                            if (child.getName().equals(path.get(i)))
+                            {
+                                children.add(child);
+                            }
+                        }
+                        if (children.isEmpty())
+                        {
+                            return null;
+                        }
+                    }
+                    else
+                    {
+                        if (allowWildcards)
+                        {
+                            wildcard = true;
+                            children.addAll((Collection<? extends 
ConfiguredObject<?>>) parent.getChildren(hierarchy[i]));
+                        }
+                        else
+                        {
+                            return null;
+                        }
+                    }
+                }
+            }
+            else if (i == 0)
+            {
+                final ConfiguredObjectOperation<ConfiguredObject<?>> op =
+                        _associatedChildrenOperations.get(hierarchy[0]);
+                if (op != null)
+                {
+                    parentType = hierarchy[i];
+
+                    final Collection<? extends ConfiguredObject<?>> associated 
=
+                            (Collection<? extends ConfiguredObject<?>>) 
op.perform(_root,
+                                                                               
    Collections.<String, Object>emptyMap());
+
+                    if (path.size() > i
+                        && path.get(i) != null
+                        && !path.get(i).equals("*")
+                        && path.get(i).trim().length() != 0)
+                    {
+                        for (ConfiguredObject<?> child : associated)
+                        {
+                            if (child.getName().equals(path.get(i)))
+                            {
+                                children.add(child);
+                            }
+                        }
+                        if (children.isEmpty())
+                        {
+                            return null;
+                        }
+                    }
+                    else
+                    {
+                        if (allowWildcards)
+                        {
+                            wildcard = true;
+                            children.addAll(associated);
+                        }
+                        else
+                        {
+                            return null;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                children = parents;
+                if (path.size() > i
+                    && path.get(i) != null
+                    && !path.get(i).equals("*")
+                    && path.get(i).trim().length() != 0)
+                {
+                    filters.put(hierarchy[i], path.get(i));
+                }
+                else
+                {
+                    if (allowWildcards)
+                    {
+                        wildcard = true;
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+            }
+
+            parents = children;
+            children = new ArrayList<>();
+        }
+
+        if (!filters.isEmpty() && !parents.isEmpty())
+        {
+            Collection<ConfiguredObject<?>> potentials = parents;
+            parents = new ArrayList<>();
+
+            for (ConfiguredObject o : potentials)
+            {
+
+                boolean match = true;
+
+                for (Map.Entry<Class<? extends ConfiguredObject>, String> 
entry : filters.entrySet())
+                {
+                    final ConfiguredObject<?> ancestor = 
o.getModel().getAncestor(entry.getKey(), o);
+                    match = ancestor != null && 
ancestor.getName().equals(entry.getValue());
+                    if (!match)
+                    {
+                        break;
+                    }
+                }
+                if (match)
+                {
+                    parents.add(o);
+                }
+            }
+        }
+
+        if (parents.isEmpty() && !wildcard)
+        {
+            parents = null;
+        }
+        return parents;
+    }
+
+    public List<ConfiguredObject> findObjectParentsFromPath(final List<String> 
names,
+                                                            final Class<? 
extends ConfiguredObject>[] hierarchy,
+                                                            final Class<? 
extends ConfiguredObject> objClass)
+    {
+        Model model = _root.getModel();
+        Collection<ConfiguredObject<?>>[] objects = new 
Collection[hierarchy.length];
+        for (int i = 0; i < hierarchy.length - 1; i++)
+        {
+            objects[i] = new HashSet<>();
+            if (i == 0)
+            {
+                for (ConfiguredObject object : _root.getChildren(hierarchy[0]))
+                {
+                    if (object.getName().equals(names.get(0)))
+                    {
+                        objects[0].add(object);
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                boolean foundAncestor = false;
+                for (int j = i - 1; j >= 0; j--)
+                {
+                    if 
(model.getChildTypes(hierarchy[j]).contains(hierarchy[i]))
+                    {
+                        for (ConfiguredObject<?> parent : objects[j])
+                        {
+                            for (ConfiguredObject<?> object : 
parent.getChildren(hierarchy[i]))
+                            {
+                                if (object.getName().equals(names.get(i)))
+                                {
+                                    objects[i].add(object);
+                                }
+                            }
+                        }
+                        foundAncestor = true;
+                        break;
+                    }
+                }
+                if(!foundAncestor)
+                {
+                    
if(model.getChildTypes(_root.getCategoryClass()).contains(hierarchy[i]))
+                    {
+                        for (ConfiguredObject<?> object : 
_root.getChildren(hierarchy[i]))
+                        {
+                            if (object.getName().equals(names.get(i)))
+                            {
+                                objects[i].add(object);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        List<ConfiguredObject> parents = new ArrayList<>();
+        Collection<Class<? extends ConfiguredObject>> parentClasses =
+                model.getParentTypes(objClass);
+        for (int i = hierarchy.length - 2; i >= 0; i--)
+        {
+            if (parentClasses.contains(hierarchy[i]))
+            {
+                if (objects[i].size() == 1)
+                {
+                    parents.add(objects[i].iterator().next());
+                }
+                else
+                {
+                    throw new IllegalArgumentException("Cannot deduce parent 
of class "
+                                                       + 
hierarchy[i].getSimpleName());
+                }
+            }
+        }
+        return parents;
+    }
+
+    public String getPath(final ConfiguredObject<?> object)
+    {
+        return Strings.join("/", getPathAsList(object));
+    }
+
+    public List<String> getPathAsList(final ConfiguredObject<?> object)
+    {
+        final List<Class<? extends ConfiguredObject>> hierarchy = 
_hierarchies.get(object.getCategoryClass());
+        List<String> pathElements = new ArrayList<>();
+        for (Class<? extends ConfiguredObject> ancestorClass : hierarchy)
+        {
+            pathElements.add(_model.getAncestor(ancestorClass, 
object).getName());
+        }
+        return pathElements;
+    }
+
+
+    private List<Class<? extends ConfiguredObject>> calculateHierarchy(Class<? 
extends ConfiguredObject> category,
+                                                                       Class<? 
extends ConfiguredObject> rootClass)
+    {
+        Class<? extends ConfiguredObject> managedCategoryClass = 
_root.getCategoryClass();
+
+        return calculateHierarchy(category, rootClass, managedCategoryClass, 
_model);
+    }
+
+    private static List<Class<? extends ConfiguredObject>> 
calculateHierarchy(Class<? extends ConfiguredObject> category,
+                                                                              
final Class<? extends ConfiguredObject> rootClass,
+                                                                              
final Class<? extends ConfiguredObject> managedCategoryClass,
+                                                                              
final Model model)
+    {
+        List<Class<? extends ConfiguredObject>> hierarchyList = new 
ArrayList<>();
+
+        if (category != rootClass)
+        {
+            Collection<Class<? extends ConfiguredObject>> parentCategories;
+
+            hierarchyList.add(category);
+
+            while (!(parentCategories = 
model.getParentTypes(category)).contains(rootClass))
+            {
+                hierarchyList.addAll(parentCategories);
+                if (!parentCategories.isEmpty())
+                {
+                    Iterator<Class<? extends ConfiguredObject>> iterator = 
parentCategories.iterator();
+                    category = iterator.next();
+                    if 
(!model.getAncestorCategories(category).contains(rootClass))
+                    {
+                        if (iterator.hasNext())
+                        {
+                            category = iterator.next();
+                        }
+                        else
+                        {
+                            break;
+                        }
+                    }
+                }
+                else
+                {
+                    break;
+                }
+            }
+        }
+        if (rootClass != managedCategoryClass)
+        {
+            hierarchyList.add(rootClass);
+        }
+        Collections.reverse(hierarchyList);
+
+        return hierarchyList;
+    }
+
+    private boolean 
returnsCollectionOfConfiguredObjects(ConfiguredObjectOperation operation)
+    {
+        return Collection.class.isAssignableFrom(operation.getReturnType())
+               && operation.getGenericReturnType() instanceof ParameterizedType
+               && 
ConfiguredObject.class.isAssignableFrom(getCollectionMemberType((ParameterizedType)
 operation.getGenericReturnType()));
+    }
+
+    private Class getCollectionMemberType(ParameterizedType collectionType)
+    {
+        return getRawType((collectionType).getActualTypeArguments()[0]);
+    }
+
+    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]);
+            }
+        }
+        else if (t instanceof WildcardType)
+        {
+            Type[] upperBounds = ((WildcardType) t).getUpperBounds();
+            if (upperBounds.length == 1)
+            {
+                return getRawType(upperBounds[0]);
+            }
+        }
+        throw new ServerScopedRuntimeException("Unable to process type when 
constructing configuration model: " + t);
+    }
+}

Propchange: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFinder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java
 Sun Nov 20 16:42:57 2016
@@ -34,7 +34,7 @@ import java.util.Set;
 
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
-public class ConfiguredObjectInjectedOperation<C extends ConfiguredObject> 
implements ConfiguredObjectOperation<C>, 
InjectedAttributeStatisticOrOperation<C>
+public class ConfiguredObjectInjectedOperation<C extends ConfiguredObject<?>> 
implements ConfiguredObjectOperation<C>, 
InjectedAttributeStatisticOrOperation<C>
 {
     private final Method _operation;
     private final List<OperationParameter> _params;
@@ -258,6 +258,12 @@ public class ConfiguredObjectInjectedOpe
     }
 
     @Override
+    public boolean isAssociateAsIfChildren()
+    {
+        return false;
+    }
+
+    @Override
     public boolean isSecure(final C subject, final Map<String, Object> 
arguments)
     {
         return _secure || requiresSecure(subject, arguments);

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectJacksonModule.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectJacksonModule.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectJacksonModule.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectJacksonModule.java
 Sun Nov 20 16:42:57 2016
@@ -21,29 +21,19 @@
 package org.apache.qpid.server.model;
 
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.security.Principal;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateEncodingException;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
 import java.util.Set;
 
-import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.Version;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 
-import org.apache.qpid.server.model.preferences.GenericPrincipal;
-import org.apache.qpid.server.security.QpidPrincipal;
-import org.apache.qpid.server.util.ServerScopedRuntimeException;
-
 public class ConfiguredObjectJacksonModule extends SimpleModule
 {
     private static final long serialVersionUID = 1L;
@@ -63,121 +53,19 @@ public class ConfiguredObjectJacksonModu
     private  ConfiguredObjectJacksonModule()
     {
         super("ConfiguredObjectSerializer", new Version(1,0,0,null, 
"org.apache.qpid", "broker-core"));
-        addConfiguredObjectSerializer();
-        addManageableAttributeTypeSerializer();
-        addCertificateSerializer();
-        addPrincipalSerializer();
-    }
-
-    private void addPrincipalSerializer()
-    {
-        final JsonSerializer<Principal> serializer = new 
JsonSerializer<Principal>()
+        for(final ConfiguredObjectCustomSerialization.Converter converter : 
ConfiguredObjectCustomSerialization.getConverters())
         {
-            @Override
-            public void serialize(final Principal value, final JsonGenerator 
jgen, final SerializerProvider provider)
-                    throws IOException, JsonGenerationException
+            addSerializer(converter.getConversionClass(), new JsonSerializer()
             {
-                if (value == null)
-                {
-                    jgen.writeNull();
-                }
-                else if (value instanceof QpidPrincipal)
-                {
-                    jgen.writeString(new GenericPrincipal((QpidPrincipal) 
value).toExternalForm());
-                }
-                else if (value instanceof GenericPrincipal)
+                @Override
+                public void serialize(final Object value, final JsonGenerator 
gen, final SerializerProvider serializers)
+                        throws IOException, JsonProcessingException
                 {
-                    jgen.writeString(((GenericPrincipal) 
value).toExternalForm());
+                    gen.writeObject(converter.convert(value));
                 }
-                else
-                {
-                    jgen.writeString(value.getName());
-                }
-            }
-        };
-        addSerializer(Principal.class, serializer);
-    }
-
-    private void addCertificateSerializer()
-    {
-        final JsonSerializer<Certificate> serializer = new 
JsonSerializer<Certificate>()
-        {
-            @Override
-            public void serialize(final Certificate value,
-                                  final JsonGenerator jgen,
-                                  final SerializerProvider provider)
-                    throws IOException
-            {
-                try
-                {
-                    jgen.writeBinary(value.getEncoded());
-                }
-                catch (CertificateEncodingException e)
-                {
-                    throw new IllegalArgumentException(e);
-                }
-            }
-        };
-        addSerializer(Certificate.class, serializer);
-    }
-
-    private void addManageableAttributeTypeSerializer()
-    {
-        final JsonSerializer<ManagedAttributeValue> serializer = new 
JsonSerializer<ManagedAttributeValue>()
-        {
-            @Override
-            public void serialize(final ManagedAttributeValue value,
-                                  final JsonGenerator jgen,
-                                  final SerializerProvider provider)
-                    throws IOException
-            {
-                Map<String,Object> valueAsMap = new LinkedHashMap<>();
-                for(Method method : value.getClass().getMethods())
-                {
-                    final String methodName = method.getName();
-                    if(method.getParameterTypes().length == 0
-                       && !OBJECT_METHOD_NAMES.contains(methodName)
-                       && (methodName.startsWith("is")
-                            || methodName.startsWith("has")
-                            || methodName.startsWith("get")))
-                    {
-                        String propertyName =
-                                methodName.startsWith("is") ? 
methodName.substring(2) : methodName.substring(3);
-                        propertyName = 
Character.toLowerCase(propertyName.charAt(0)) + propertyName.substring(1);
-                        try
-                        {
-                            final Object attrValue = method.invoke(value);
-                            if(attrValue != null)
-                            {
-                                valueAsMap.put(propertyName, attrValue);
-                            }
-                        }
-                        catch (IllegalAccessException | 
InvocationTargetException e)
-                        {
-                            throw new ServerScopedRuntimeException(e);
-                        }
-                    }
-                }
-                jgen.writeObject(valueAsMap);
-            }
-        };
-        addSerializer(ManagedAttributeValue.class, serializer);
-    }
+            });
+        }
 
-    private void addConfiguredObjectSerializer()
-    {
-        final JsonSerializer<ConfiguredObject> serializer = new 
JsonSerializer<ConfiguredObject>()
-        {
-            @Override
-            public void serialize(final ConfiguredObject value,
-                                  final JsonGenerator jgen,
-                                  final SerializerProvider provider)
-                    throws IOException
-            {
-                jgen.writeString(value.getId().toString());
-            }
-        };
-        addSerializer(ConfiguredObject.class, serializer);
     }
 
     public static ObjectMapper newObjectMapper()

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java
 Sun Nov 20 16:42:57 2016
@@ -35,7 +35,7 @@ import java.util.Set;
 import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
-public class ConfiguredObjectMethodOperation<C extends ConfiguredObject> 
implements ConfiguredObjectOperation<C>
+public class ConfiguredObjectMethodOperation<C extends ConfiguredObject<?>> 
implements ConfiguredObjectOperation<C>
 {
     private final Method _operation;
     private final OperationParameterFromAnnotation[] _params;
@@ -229,6 +229,12 @@ public class ConfiguredObjectMethodOpera
     }
 
     @Override
+    public boolean isAssociateAsIfChildren()
+    {
+        return 
_operation.getAnnotation(ManagedOperation.class).associateAsIfChildren();
+    }
+
+    @Override
     public boolean isSecure(final C subject, final Map<String, Object> 
arguments)
     {
         return _operation.getAnnotation(ManagedOperation.class).secure() || 
requiresSecure(subject, arguments);

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java
 Sun Nov 20 16:42:57 2016
@@ -24,7 +24,7 @@ import java.lang.reflect.Type;
 import java.util.List;
 import java.util.Map;
 
-public interface ConfiguredObjectOperation<C extends ConfiguredObject>
+public interface ConfiguredObjectOperation<C extends ConfiguredObject<?>>
 {
     String getName();
 
@@ -43,4 +43,6 @@ public interface ConfiguredObjectOperati
     Type getGenericReturnType();
 
     boolean isSecure(final C subject, final Map<String, Object> arguments);
+
+    boolean isAssociateAsIfChildren();
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Connection.java
 Sun Nov 20 16:42:57 2016
@@ -23,7 +23,7 @@ package org.apache.qpid.server.model;
 import java.util.Collection;
 import java.util.Date;
 
-@ManagedObject( creatable = false )
+@ManagedObject( creatable = false, amqpName = "org.apache.qpid.Connection")
 public interface Connection<X extends Connection<X>> extends 
ConfiguredObject<X>
 {
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
 Sun Nov 20 16:42:57 2016
@@ -22,7 +22,7 @@ package org.apache.qpid.server.model;
 
 import org.apache.qpid.server.consumer.ConsumerImpl;
 
-@ManagedObject
+@ManagedObject(creatable = false, amqpName = "org.apache.qpid.Consumer")
 public interface Consumer<X extends Consumer<X>> extends ConfiguredObject<X>, 
ConsumerImpl
 {
     String DISTRIBUTION_MODE = "distributionMode";
@@ -38,19 +38,22 @@ public interface Consumer<X extends Cons
     @ManagedContextDefault( name = SUSPEND_NOTIFICATION_PERIOD)
     long SUSPEND_NOTIFICATION_PERIOD_DEFAULT = 10000;
 
-    @ManagedAttribute
+    @DerivedAttribute
+    String getLinkName();
+
+    @ManagedAttribute(immutable = true)
     String getDistributionMode();
 
-    @ManagedAttribute
+    @ManagedAttribute(immutable = true)
     String getSettlementMode();
 
-    @ManagedAttribute
+    @ManagedAttribute(immutable = true)
     boolean isExclusive();
 
-    @ManagedAttribute
+    @ManagedAttribute(immutable = true)
     boolean isNoLocal();
 
-    @ManagedAttribute
+    @ManagedAttribute(immutable = true)
     String getSelector();
 
     @ManagedAttribute(defaultValue = "2147483647",

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Exchange.java
 Sun Nov 20 16:42:57 2016
@@ -29,7 +29,9 @@ import org.apache.qpid.server.exchange.E
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.message.MessageDestination;
 
-@ManagedObject( description = Exchange.CLASS_DESCRIPTION )
+@ManagedObject( description = Exchange.CLASS_DESCRIPTION,
+        amqpName = "org.apache.qpid.Exchange"
+        )
 public interface Exchange<X extends Exchange<X>> extends ConfiguredObject<X>, 
MessageDestination,
                                                          ExchangeReferrer
 {
@@ -54,8 +56,8 @@ public interface Exchange<X extends Exch
     UnroutableMessageBehaviour getUnroutableMessageBehaviour();
 
     //children
-    Collection<? extends Binding> getBindings();
-    Collection<Publisher> getPublishers();
+    @ManagedOperation(nonModifying = true, changesConfiguredObjectState = 
false)
+    Collection<Binding<?>> getBindings();
 
     // Statistics
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.COUNT, label = "Bindings")
@@ -74,11 +76,10 @@ public interface Exchange<X extends Exch
     long getMessagesIn();
 
 
-    //operations
-    Binding createBinding(String bindingKey,
-                          Queue queue,
-                          Map<String,Object> bindingArguments,
-                          Map<String, Object> attributes);
+    @ManagedOperation(changesConfiguredObjectState = true)
+    void bind(@Param(name="queue") Queue<?> queue,
+              @Param(name="bindingKey") String bindingKey,
+              @Param(name="arguments", defaultValue = "{}") Map<String,Object> 
arguments);
 
     /**
      * @return true if the exchange will be deleted after all queues have been 
detached

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedObject.java
 Sun Nov 20 16:42:57 2016
@@ -39,4 +39,5 @@ public @interface ManagedObject
     boolean register() default true;
     String description() default "";
     boolean deprecated() default false;
+    String amqpName() default "";
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
 Sun Nov 20 16:42:57 2016
@@ -34,4 +34,6 @@ public @interface ManagedOperation
     boolean secure() default false;
     String paramRequiringSecure() default "";
     boolean changesConfiguredObjectState();
+    boolean associateAsIfChildren() default false;
+    boolean log() default false;
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java
 Sun Nov 20 16:42:57 2016
@@ -76,15 +76,14 @@ public abstract class Model
         return descendants;
     }
 
-    public <C> C getAncestor(final Class<C> ancestorClass,
-                                                             final 
ConfiguredObject<?> object)
+    public <C> C getAncestor(final Class<C> ancestorClass, final 
ConfiguredObject<?> object)
     {
         return getAncestor(ancestorClass, object.getCategoryClass(), object);
     }
 
     public  <C> C getAncestor(final Class<C> ancestorClass,
-                                               final Class<? extends 
ConfiguredObject> category,
-                                               final ConfiguredObject<?> 
object)
+                              final Class<? extends ConfiguredObject> category,
+                              final ConfiguredObject<?> object)
     {
         if(ancestorClass.isInstance(object))
         {

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
 Sun Nov 20 16:42:57 2016
@@ -29,7 +29,7 @@ import com.google.common.util.concurrent
 import org.apache.qpid.configuration.CommonProperties;
 
 
@ManagedContextDependency({CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST,
 CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST})
-@ManagedObject( description = Port.CLASS_DESCRIPTION )
+@ManagedObject( description = Port.CLASS_DESCRIPTION, amqpName = 
"org.apache.qpid.Port")
 public interface Port<X extends Port<X>> extends ConfiguredObject<X>
 {
     String CLASS_DESCRIPTION = "<p>The Broker supports configuration of Ports 
to specify the particular AMQP messaging "

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
 Sun Nov 20 16:42:57 2016
@@ -36,13 +36,16 @@ import org.apache.qpid.server.message.Se
 import org.apache.qpid.server.protocol.CapacityChecker;
 import org.apache.qpid.server.queue.BaseQueue;
 import org.apache.qpid.server.queue.NotificationCheck;
+import org.apache.qpid.server.queue.QueueConsumer;
 import org.apache.qpid.server.queue.QueueEntry;
 import org.apache.qpid.server.queue.QueueEntryVisitor;
 import org.apache.qpid.server.store.MessageDurability;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.util.Deletable;
 
-@ManagedObject( defaultType = "standard", description = 
Queue.CLASS_DESCRIPTION )
+@ManagedObject( defaultType = "standard",
+        amqpName = "org.apache.qpid.Queue",
+        description = Queue.CLASS_DESCRIPTION )
 public interface Queue<X extends Queue<X>> extends ConfiguredObject<X>,
                                                    Comparable<X>, 
ExchangeReferrer,
                                                    BaseQueue,
@@ -256,10 +259,12 @@ public interface Queue<X extends Queue<X
     boolean isHoldOnPublishEnabled();
 
     //children
-    Collection<? extends Binding<?>> getBindings();
+    @ManagedOperation(nonModifying = true, changesConfiguredObjectState = 
false)
+    Collection<Binding<?>> getBindings();
 
 
-    Collection<? extends Consumer<?>> getConsumers();
+    @ManagedOperation(nonModifying = true, changesConfiguredObjectState = 
false)
+    Collection<QueueConsumer<?>> getConsumers();
 
     //operations
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Session.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Session.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Session.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Session.java
 Sun Nov 20 16:42:57 2016
@@ -23,7 +23,7 @@ package org.apache.qpid.server.model;
 import java.util.Collection;
 import java.util.Date;
 
-@ManagedObject
+@ManagedObject( creatable = false, amqpName = "org.apache.qpid.Session")
 public interface Session<X extends Session<X>> extends ConfiguredObject<X>
 {
     String CHANNEL_ID = "channelId";
@@ -57,7 +57,6 @@ public interface Session<X extends Sessi
 
 
     Collection<Consumer> getConsumers();
-    Collection<Publisher> getPublishers();
 
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = 
StatisticUnit.COUNT, label = "Consumers")
     long getConsumerCount();

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
 Sun Nov 20 16:42:57 2016
@@ -20,7 +20,9 @@
  */
 package org.apache.qpid.server.model;
 
-@ManagedObject( defaultType = "ProvidedStore", description = 
VirtualHost.CLASS_DESCRIPTION)
+import java.util.Collection;
+
+@ManagedObject( defaultType = "ProvidedStore", description = 
VirtualHost.CLASS_DESCRIPTION, amqpName = "org.apache.qpid.VirtualHost")
 public interface VirtualHost<X extends VirtualHost<X>> extends 
ConfiguredObject<X>,
                                                                
NamedAddressSpace
 {
@@ -42,4 +44,8 @@ public interface VirtualHost<X extends V
     @DerivedAttribute( persist = true )
     String getModelVersion();
 
+    @Override
+    @ManagedOperation(nonModifying = true, changesConfiguredObjectState = 
false, associateAsIfChildren = true)
+    Collection<? extends Connection<?>> getConnections();
+
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAccessControlProvider.java
 Sun Nov 20 16:42:57 2016
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.model;
 
-@ManagedObject( creatable = false )
+@ManagedObject( amqpName = "org.apache.qpid.VirtualHostAccessControlProvider")
 public interface VirtualHostAccessControlProvider<X extends 
VirtualHostAccessControlProvider<X>>  extends ConfiguredObject<X>, 
CommonAccessControlProvider<VirtualHostAccessControlProvider<?>>
 {
     @ManagedAttribute(defaultValue = "10", description = "The priority of this 
access control provider - the lower the number the higher the priority")

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAlias.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAlias.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAlias.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostAlias.java
 Sun Nov 20 16:42:57 2016
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.model;
 
-@ManagedObject( creatable = false )
+@ManagedObject
 public interface VirtualHostAlias<X extends VirtualHostAlias<X>> extends 
ConfiguredObject<X>
 {
     String PRIORITY = "priority";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogInclusionRule.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogInclusionRule.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogInclusionRule.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogInclusionRule.java
 Sun Nov 20 16:42:57 2016
@@ -22,7 +22,7 @@ package org.apache.qpid.server.model;
 
 import org.apache.qpid.server.logging.LogInclusionRule;
 
-@ManagedObject
+@ManagedObject( amqpName = "org.apache.qpid.VirtualHostLogInclusionRule")
 public interface VirtualHostLogInclusionRule<X extends 
VirtualHostLogInclusionRule<X>> extends ConfiguredObject<X>, LogInclusionRule
 {
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
 Sun Nov 20 16:42:57 2016
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.model;
 
-@ManagedObject
+@ManagedObject(amqpName = "org.apache.qpid.VirtualHostLogger")
 public interface VirtualHostLogger <X extends VirtualHostLogger<X>> extends 
ConfiguredObject<X>
 {
     void stopLogging();

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java
 Sun Nov 20 16:42:57 2016
@@ -26,7 +26,7 @@ import org.apache.qpid.server.store.Dura
 import org.apache.qpid.server.store.preferences.PreferenceStoreAttributes;
 import org.apache.qpid.server.store.preferences.PreferencesRoot;
 
-@ManagedObject(category=true, managesChildren=true)
+@ManagedObject(category=true, managesChildren=true, amqpName = 
"org.apache.qpid.VirtualHostNode")
 public interface VirtualHostNode<X extends VirtualHostNode<X>> extends 
ConfiguredObject<X>, PreferencesRoot
 {
     String QPID_INITIAL_CONFIG_VIRTUALHOST_CONFIG_VAR = 
"qpid.initial_config_virtualhost_config";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/AbstractPluginAdapter.java
 Sun Nov 20 16:42:57 2016
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
+import org.apache.qpid.server.logging.OperationLogMessage;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
@@ -60,4 +61,11 @@ public abstract class AbstractPluginAdap
     {
         return _broker;
     }
+
+
+    @Override
+    protected void logOperation(final String operation)
+    {
+        _broker.getEventLogger().message(new OperationLogMessage(this, 
operation));
+    }
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
 Sun Nov 20 16:42:57 2016
@@ -37,6 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.logging.OperationLogMessage;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
@@ -223,6 +224,12 @@ public class FileBasedGroupProviderImpl
                         + childClass);
     }
 
+    @Override
+    protected void logOperation(final String operation)
+    {
+        getAncestor(Container.class).getEventLogger().message(new 
OperationLogMessage(this, operation));
+    }
+
     private Set<Principal> getGroupPrincipals()
     {
 
@@ -383,6 +390,12 @@ public class FileBasedGroupProviderImpl
                             + childClass);
         }
 
+        @Override
+        protected void logOperation(final String operation)
+        {
+            getAncestor(Container.class).getEventLogger().message(new 
OperationLogMessage(this, operation));
+        }
+
         @StateTransition( currentState = State.ACTIVE, desiredState = 
State.DELETED )
         private ListenableFuture<Void> doDelete()
         {
@@ -418,6 +431,12 @@ public class FileBasedGroupProviderImpl
                 return Collections.emptySet();
             }
 
+            @Override
+            protected void logOperation(final String operation)
+            {
+                getAncestor(Container.class).getEventLogger().message(new 
OperationLogMessage(this, operation));
+            }
+
             @StateTransition(currentState = State.UNINITIALIZED, desiredState 
= State.ACTIVE)
             private ListenableFuture<Void> activate()
             {

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/SessionAdapter.java
 Sun Nov 20 16:42:57 2016
@@ -40,7 +40,6 @@ import org.apache.qpid.server.model.Conf
 import org.apache.qpid.server.model.Consumer;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.NamedAddressSpace;
-import org.apache.qpid.server.model.Publisher;
 import org.apache.qpid.server.model.Session;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.StateTransition;
@@ -132,11 +131,6 @@ public final class SessionAdapter extend
         return (Collection<Consumer>) _session.getConsumers();
     }
 
-    public Collection<Publisher> getPublishers()
-    {
-        return Collections.emptySet();  //TODO
-    }
-
     @Override
     public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> 
clazz)
     {
@@ -144,10 +138,6 @@ public final class SessionAdapter extend
         {
             return (Collection<C>) getConsumers();
         }
-        else if (clazz == Publisher.class)
-        {
-            return (Collection<C>) getPublishers();
-        }
         else
         {
             return Collections.emptySet();
@@ -317,4 +307,11 @@ public final class SessionAdapter extend
             session.addDeleteTask(deleteTickerTask);
         }
     }
+
+
+    @Override
+    protected void logOperation(final String operation)
+    {
+        
_amqpConnection.getEventLogger().message(ChannelMessages.OPERATION(operation));
+    }
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
 Sun Nov 20 16:42:57 2016
@@ -28,18 +28,18 @@ import java.util.Set;
 
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-
-import org.apache.qpid.configuration.CommonProperties;
-import org.apache.qpid.server.logging.EventLogger;
-import org.apache.qpid.server.logging.messages.PortMessages;
-import org.apache.qpid.server.model.Container;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.logging.messages.BrokerMessages;
+import org.apache.qpid.server.logging.messages.PortMessages;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Connection;
+import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.KeyStore;
 import org.apache.qpid.server.model.ManagedAttributeField;
 import org.apache.qpid.server.model.Port;
@@ -317,6 +317,12 @@ public abstract class AbstractPort<X ext
     }
 
     @Override
+    protected void logOperation(final String operation)
+    {
+        _eventLogger.message(PortMessages.OPERATION(operation));
+    }
+
+    @Override
     public String toString()
     {
         return getCategoryClass().getSimpleName() + "[id=" + getId() + ", 
name=" + getName() + ", type=" + getType() +  ", port=" + getPort() + "]";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPort.java
 Sun Nov 20 16:42:57 2016
@@ -38,7 +38,7 @@ import org.apache.qpid.server.model.Stat
 import org.apache.qpid.server.model.Transport;
 import org.apache.qpid.server.model.TrustStore;
 
-@ManagedObject( category = false, type = "AMQP")
+@ManagedObject( category = false, type = "AMQP", amqpName = 
"org.apache.qpid.AmqpPort")
 public interface AmqpPort<X extends AmqpPort<X>> extends 
ClientAuthCapablePort<X>
 {
     String DEFAULT_AMQP_TCP_NO_DELAY = "true";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
 Sun Nov 20 16:42:57 2016
@@ -53,7 +53,21 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.logging.messages.BrokerMessages;
 import org.apache.qpid.server.logging.messages.PortMessages;
 import org.apache.qpid.server.logging.subjects.PortLogSubject;
-import org.apache.qpid.server.model.*;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Container;
+import org.apache.qpid.server.model.DefaultVirtualHostAlias;
+import org.apache.qpid.server.model.HostNameAlias;
+import org.apache.qpid.server.model.KeyStore;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.NamedAddressSpace;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.SystemConfig;
+import org.apache.qpid.server.model.Transport;
+import org.apache.qpid.server.model.TrustStore;
+import org.apache.qpid.server.model.VirtualHostAlias;
+import org.apache.qpid.server.model.VirtualHostNameAlias;
 import org.apache.qpid.server.plugin.ProtocolEngineCreator;
 import org.apache.qpid.server.plugin.QpidServiceLoader;
 import org.apache.qpid.server.plugin.TransportProviderFactory;

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/HttpPort.java
 Sun Nov 20 16:42:57 2016
@@ -30,7 +30,9 @@ import org.apache.qpid.server.model.Prot
 import org.apache.qpid.server.model.Transport;
 import org.apache.qpid.server.model.TrustStore;
 
-@ManagedObject( category = false, type = "HTTP", validChildTypes = 
"org.apache.qpid.server.model.port.HttpPortImpl#getSupportedChildTypes()")
+@ManagedObject( category = false, type = "HTTP",
+        validChildTypes = 
"org.apache.qpid.server.model.port.HttpPortImpl#getSupportedChildTypes()",
+        amqpName = "org.apache.qpid.HttpPort")
 public interface HttpPort<X extends HttpPort<X>> extends 
ClientAuthCapablePort<X>
 {
     String DEFAULT_HTTP_NEED_CLIENT_AUTH = "false";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
 Sun Nov 20 16:42:57 2016
@@ -1002,6 +1002,11 @@ public abstract class AbstractQueue<X ex
     @Override
     public Collection<QueueConsumer<?>> getConsumers()
     {
+        return getConsumersImpl();
+    }
+
+    private Collection<QueueConsumer<?>> getConsumersImpl()
+    {
         return Lists.newArrayList(_queueConsumerManager.getAllIterator());
     }
 
@@ -1032,6 +1037,11 @@ public abstract class AbstractQueue<X ex
 
     public Collection<Binding<?>> getBindings()
     {
+        return getBindingsImpl();
+    }
+
+    private Collection<Binding<?>> getBindingsImpl()
+    {
         return Collections.unmodifiableList(_bindings);
     }
 
@@ -2984,7 +2994,7 @@ public abstract class AbstractQueue<X ex
     {
         if(clazz == Binding.class)
         {
-            return (Collection<C>) getBindings();
+            return (Collection<C>) getBindingsImpl();
         }
         else if(clazz == org.apache.qpid.server.model.Consumer.class)
         {
@@ -3099,6 +3109,12 @@ public abstract class AbstractQueue<X ex
         authorise(token, PUBLISH_ACTION, arguments);
     }
 
+    @Override
+    protected void logOperation(final String operation)
+    {
+        getEventLogger().message(QueueMessages.OPERATION(operation));
+    }
+
     private class DeletedChildListener extends 
AbstractConfigurationChangeListener
     {
         @Override

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueue.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueue.java
 Sun Nov 20 16:42:57 2016
@@ -25,7 +25,8 @@ import org.apache.qpid.server.model.Mana
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.Queue;
 
-@ManagedObject( category = false, type= LastValueQueue.LAST_VALUE_QUEUE_TYPE)
+@ManagedObject( category = false, type= LastValueQueue.LAST_VALUE_QUEUE_TYPE,
+        amqpName = "org.apache.qpid.LastValueQueue")
 public interface LastValueQueue<X extends LastValueQueue<X>> extends Queue<X>
 {
     String LVQ_KEY = "lvqKey";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/PriorityQueue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/PriorityQueue.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/PriorityQueue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/PriorityQueue.java
 Sun Nov 20 16:42:57 2016
@@ -25,7 +25,8 @@ import org.apache.qpid.server.model.Mana
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.Queue;
 
-@ManagedObject( category = false, type="priority" )
+@ManagedObject( category = false, type="priority",
+        amqpName = "org.apache.qpid.PriorityQueue" )
 public interface PriorityQueue<X extends PriorityQueue<X>> extends Queue<X>
 {
     String PRIORITIES = "priorities";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
 Sun Nov 20 16:42:57 2016
@@ -84,6 +84,7 @@ class QueueConsumerImpl
     private final ConsumerTarget _target;
     private volatile QueueContext _queueContext;
 
+
     @ManagedAttributeField
     private boolean _exclusive;
     @ManagedAttributeField
@@ -97,6 +98,8 @@ class QueueConsumerImpl
     @ManagedAttributeField
     private int _priority;
 
+    private final String _linkName;
+
     private QueueConsumerNode _queueConsumerNode;
 
     QueueConsumerImpl(final AbstractQueue<?> queue,
@@ -108,7 +111,7 @@ class QueueConsumerImpl
                       final Integer priority)
     {
         super(parentsMap(queue, target.getSessionModel().getModelObject()),
-              createAttributeMap(consumerName, filters, optionSet, priority));
+              createAttributeMap(target.getSessionModel(), consumerName, 
filters, optionSet, priority));
         _messageClass = messageClass;
         _sessionReference = target.getSessionModel().getConnectionReference();
         _consumerNumber = CONSUMER_NUMBER_GENERATOR.getAndIncrement();
@@ -118,6 +121,7 @@ class QueueConsumerImpl
         _isTransient = optionSet.contains(Option.TRANSIENT);
         _target = target;
         _queue = queue;
+        _linkName = consumerName;
 
         // Access control
         authorise(Operation.CREATE);
@@ -127,13 +131,19 @@ class QueueConsumerImpl
         setupLogging();
     }
 
-    private static Map<String, Object> createAttributeMap(String name,
+    private static Map<String, Object> createAttributeMap(final 
AMQSessionModel sessionModel,
+                                                          String linkName,
                                                           FilterManager 
filters,
                                                           EnumSet<Option> 
optionSet,
                                                           Integer priority)
     {
         Map<String,Object> attributes = new HashMap<String, Object>();
         attributes.put(ID, UUID.randomUUID());
+        String name = sessionModel.getAMQPConnection().getConnectionId()
+                      + "|"
+                      + sessionModel.getChannelId()
+                      + "|"
+                      + linkName;
         attributes.put(NAME, name);
         attributes.put(EXCLUSIVE, optionSet.contains(Option.EXCLUSIVE));
         attributes.put(NO_LOCAL, optionSet.contains(Option.NO_LOCAL));
@@ -168,6 +178,12 @@ class QueueConsumerImpl
     }
 
     @Override
+    public String getLinkName()
+    {
+        return _linkName;
+    }
+
+    @Override
     public void awaitCredit(final QueueEntry node)
     {
         _waitingOnCreditMessageListener.update(node);
@@ -292,6 +308,12 @@ class QueueConsumerImpl
     }
 
     @Override
+    protected void logOperation(final String operation)
+    {
+        getEventLogger().message(SubscriptionMessages.OPERATION(operation));
+    }
+
+    @Override
     public final Queue<?> getQueue()
     {
         return _queue;

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueue.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
 Sun Nov 20 16:42:57 2016
@@ -24,7 +24,8 @@ import org.apache.qpid.server.model.Mana
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.Queue;
 
-@ManagedObject( category = false, type= SortedQueue.SORTED_QUEUE_TYPE)
+@ManagedObject( category = false, type= SortedQueue.SORTED_QUEUE_TYPE,
+        amqpName = "org.apache.qpid.SortedQueue")
 public interface SortedQueue<X extends SortedQueue<X>> extends Queue<X>
 {
     String SORT_KEY = "sortKey";

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/StandardQueue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/StandardQueue.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/StandardQueue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/StandardQueue.java
 Sun Nov 20 16:42:57 2016
@@ -23,7 +23,7 @@ package org.apache.qpid.server.queue;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.Queue;
 
-@ManagedObject( category = false, type="standard" )
+@ManagedObject( category = false, type="standard", amqpName = 
"org.apache.qpid.StandardQueue" )
 public interface StandardQueue<X extends StandardQueue<X>> extends Queue<X>
 {
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java?rev=1770576&r1=1770575&r2=1770576&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java
 Sun Nov 20 16:42:57 2016
@@ -89,6 +89,12 @@ public abstract class AbstractKeyStore<X
         return Futures.immediateFuture(null);
     }
 
+    @Override
+    protected void logOperation(final String operation)
+    {
+        
_broker.getEventLogger().message(KeyStoreMessages.OPERATION(operation));
+    }
+
     protected void initializeExpiryChecking()
     {
         int checkFrequency;




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to