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 2016/12/03 22:11:17 UTC

svn commit: r1772491 [2/2] - in /qpid/java/trunk: broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/main/java/org/apache/qpid/server/model/port/ broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin...

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1772491&r1=1772490&r2=1772491&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Sat Dec  3 22:11:17 2016
@@ -36,8 +36,9 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
-import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -54,13 +55,13 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.management.plugin.HttpManagement;
 import org.apache.qpid.server.management.plugin.HttpManagementUtil;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
-import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObjectFinder;
 import org.apache.qpid.server.model.ConfiguredObjectOperation;
 import org.apache.qpid.server.model.Content;
 import org.apache.qpid.server.model.IllegalStateTransitionException;
 import org.apache.qpid.server.model.IntegrityViolationException;
+import org.apache.qpid.server.model.Model;
 import org.apache.qpid.server.model.OperationTimeoutException;
 import org.apache.qpid.server.model.preferences.UserPreferences;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
@@ -72,10 +73,6 @@ public class RestServlet extends Abstrac
     private static final long serialVersionUID = 1L;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(RestServlet.class);
-    /**
-     * An initialization parameter to specify hierarchy
-     */
-    private static final String HIERARCHY_INIT_PARAMETER = "hierarchy";
 
     public static final String DEPTH_PARAM = "depth";
     public static final String OVERSIZE_PARAM = "oversize";
@@ -104,38 +101,20 @@ public class RestServlet extends Abstrac
     public static final int DEFAULT_DEPTH = 1;
     public static final int DEFAULT_OVERSIZE = 120;
 
-    private Class<? extends ConfiguredObject>[] _hierarchy;
-
-    private final ConfiguredObjectToMapConverter _objectConverter = new ConfiguredObjectToMapConverter();
-    private final boolean _hierarchyInitializationRequired;
-    private volatile RequestInfoParser _requestInfoParser;
-    private RestUserPreferenceHandler _userPreferenceHandler;
-    private ConfiguredObjectFinder _objectFinder;
+    private transient final ConfiguredObjectToMapConverter _objectConverter = new ConfiguredObjectToMapConverter();
+    private transient RestUserPreferenceHandler _userPreferenceHandler;
 
     @SuppressWarnings("unused")
     public RestServlet()
     {
         super();
-        _hierarchyInitializationRequired = true;
-    }
-
-    public RestServlet(Class<? extends ConfiguredObject>... hierarchy)
-    {
-        super();
-        _hierarchy = hierarchy;
-        _hierarchyInitializationRequired = false;
     }
 
     @Override
     public void init() throws ServletException
     {
         super.init();
-        if (_hierarchyInitializationRequired)
-        {
-            doInitialization();
-        }
-        _objectFinder = new ConfiguredObjectFinder(getBroker());
-        _requestInfoParser = new RequestInfoParser(_hierarchy);
+
         Handler.register();
         Long preferenceOperationTimeout = getManagementConfiguration().getContextValue(Long.class, PREFERENCE_OPERTAION_TIMEOUT_CONTEXT_NAME);
         _userPreferenceHandler = new RestUserPreferenceHandler(preferenceOperationTimeout == null
@@ -143,55 +122,15 @@ public class RestServlet extends Abstrac
                                                                        : preferenceOperationTimeout);
     }
 
-    @SuppressWarnings("unchecked")
-    private void doInitialization() throws ServletException
-    {
-        ServletConfig config = getServletConfig();
-        String hierarchy = config.getInitParameter(HIERARCHY_INIT_PARAMETER);
-        if (hierarchy != null && !"".equals(hierarchy))
-        {
-            List<Class<? extends ConfiguredObject>> classes = new ArrayList<Class<? extends ConfiguredObject>>();
-            String[] hierarchyItems = hierarchy.split(",");
-            for (String item : hierarchyItems)
-            {
-                Class<?> itemClass;
-                try
-                {
-                    itemClass = Class.forName(item);
-                }
-                catch (ClassNotFoundException e)
-                {
-                    try
-                    {
-                        itemClass = Class.forName("org.apache.qpid.server.model." + item);
-                    }
-                    catch (ClassNotFoundException e1)
-                    {
-                        throw new ServletException("Unknown configured object class '" + item
-                                + "' is specified in hierarchy for " + config.getServletName());
-                    }
-                }
-                Class<? extends ConfiguredObject> clazz = (Class<? extends ConfiguredObject>)itemClass;
-                classes.add(clazz);
-            }
-            Class<? extends ConfiguredObject>[] hierarchyClasses = (Class<? extends ConfiguredObject>[])new Class[classes.size()];
-            _hierarchy = classes.toArray(hierarchyClasses);
-        }
-        else
-        {
-            _hierarchy = (Class<? extends ConfiguredObject>[])new Class[0];
-        }
-    }
-
 
-    private Collection<ConfiguredObject<?>> getTargetObjects(RequestInfo requestInfo,
+    private Collection<ConfiguredObject<?>> getTargetObjects(final Class<? extends ConfiguredObject> configuredClass,
+                                                             final ConfiguredObjectFinder finder,
+                                                             RequestInfo requestInfo,
                                                              List<Predicate<ConfiguredObject<?>>> filterPredicateList)
     {
         List<String> names = requestInfo.getModelParts();
-        ConfiguredObject<?> root = getBroker();
-        Class<? extends ConfiguredObject>[] hierarchy = _hierarchy;
 
-        Collection<ConfiguredObject<?>> parents = _objectFinder.findObjectsFromPath(names, hierarchy, true);
+        Collection<ConfiguredObject<?>> parents = finder.findObjectsFromPath(names, finder.getHierarchy(configuredClass), true);
 
         if (!(parents == null || filterPredicateList.isEmpty()))
         {
@@ -238,15 +177,33 @@ public class RestServlet extends Abstrac
     }
 
     @Override
-    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response)
+    protected void doGetWithSubjectAndActor(HttpServletRequest request,
+                                            HttpServletResponse response,
+                                            final ConfiguredObject<?> managedObject)
             throws ServletException, IOException
     {
-        RequestInfo requestInfo = _requestInfoParser.parse(request);
+        ConfiguredObjectFinder finder = getConfiguredObjectFinder(managedObject);
+        Class<? extends ConfiguredObject> configuredClass = getConfiguredClass(request, managedObject);
+        if(configuredClass == null)
+        {
+            sendError(response, HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        if(hierarchy == null)
+        {
+            sendError(response, HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+
+        RequestInfoParser requestInfoParser = new RequestInfoParser(hierarchy);
+
+        RequestInfo requestInfo = requestInfoParser.parse(request);
         switch (requestInfo.getType())
         {
             case OPERATION:
             {
-                doOperation(requestInfo, request, response);
+                doOperation(requestInfo, managedObject, configuredClass, finder, request, response);
                 break;
             }
             case MODEL_OBJECT:
@@ -260,9 +217,9 @@ public class RestServlet extends Abstrac
                 }
 
                 Collection<ConfiguredObject<?>> allObjects =
-                        getTargetObjects(requestInfo, buildFilterPredicates(request));
+                        getTargetObjects(configuredClass, finder, requestInfo, buildFilterPredicates(request));
 
-                if (allObjects == null || (allObjects.isEmpty() && isSingleObjectRequest(requestInfo)))
+                if (allObjects == null || (allObjects.isEmpty() && isSingleObjectRequest(requestInfo, finder.getHierarchy(configuredClass))))
                 {
                     sendJsonErrorResponse(request, response, HttpServletResponse.SC_NOT_FOUND, "Not Found");
                     return;
@@ -343,7 +300,7 @@ public class RestServlet extends Abstrac
                 for (ConfiguredObject configuredObject : allObjects)
                 {
 
-                    output.add(_objectConverter.convertObjectToMap(configuredObject, getConfiguredClass(),
+                    output.add(_objectConverter.convertObjectToMap(configuredObject, configuredClass,
                                                                    new ConfiguredObjectToMapConverter.ConverterOptions(
                                                                            depth,
                                                                            actuals,
@@ -363,7 +320,7 @@ public class RestServlet extends Abstrac
             case VISIBLE_PREFERENCES:
             case USER_PREFERENCES:
             {
-                doGetUserPreferences(requestInfo, request, response);
+                doGetUserPreferences(managedObject, configuredClass, finder, requestInfo, request, response);
                 break;
             }
 
@@ -377,12 +334,13 @@ public class RestServlet extends Abstrac
     }
 
 
-    private boolean isSingleObjectRequest(final RequestInfo requestInfo)
+    private boolean isSingleObjectRequest(final RequestInfo requestInfo,
+                                          final Class<? extends ConfiguredObject>[] hierarchy)
     {
-        if (_hierarchy.length > 0)
+        if (hierarchy.length > 0)
         {
             List<String> pathInfoElements = requestInfo.getModelParts();
-            return pathInfoElements.size() == _hierarchy.length;
+            return pathInfoElements.size() == hierarchy.length;
         }
 
         return false;
@@ -405,16 +363,28 @@ public class RestServlet extends Abstrac
         }
     }
 
-    private Class<? extends ConfiguredObject> getConfiguredClass()
+    private Class<? extends ConfiguredObject> getConfiguredClass(HttpServletRequest request, ConfiguredObject<?> managedObject)
     {
-        return _hierarchy.length == 0 ? Broker.class : _hierarchy[_hierarchy.length-1];
+        final String[] servletPathElements = request.getServletPath().split("/");
+        String categoryName = servletPathElements[servletPathElements.length-1];
+        Model model = managedObject.getModel();
+        for(Class<? extends ConfiguredObject> category : model.getSupportedCategories())
+        {
+            if(category.getSimpleName().toLowerCase().equals(categoryName))
+            {
+                return category;
+            }
+        }
+        return null;
     }
 
     @Override
-    protected void doPutWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response)
+    protected void doPutWithSubjectAndActor(HttpServletRequest request,
+                                            HttpServletResponse response,
+                                            final ConfiguredObject<?> managedObject)
             throws ServletException, IOException
     {
-        performCreateOrUpdate(request, response);
+        performCreateOrUpdate(request, response, managedObject);
     }
 
     @Override
@@ -433,34 +403,42 @@ public class RestServlet extends Abstrac
         }
     }
 
-    private void performCreateOrUpdate(HttpServletRequest request, HttpServletResponse response)
+    private void performCreateOrUpdate(HttpServletRequest request,
+                                       HttpServletResponse response,
+                                       final ConfiguredObject<?> managedObject)
             throws IOException, ServletException
     {
+
+        ConfiguredObjectFinder finder = getConfiguredObjectFinder(managedObject);
+        final Class<? extends ConfiguredObject> configuredClass = getConfiguredClass(request, managedObject);
+        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        RequestInfoParser requestInfoParser = new RequestInfoParser(hierarchy);
+
         response.setContentType("application/json");
 
-        RequestInfo requestInfo = _requestInfoParser.parse(request);
+        RequestInfo requestInfo = requestInfoParser.parse(request);
         switch (requestInfo.getType())
         {
             case MODEL_OBJECT:
             {
                 List<String> names = requestInfo.getModelParts();
-                boolean isFullObjectURL = names.size() == _hierarchy.length;
+                boolean isFullObjectURL = names.size() == hierarchy.length;
                 Map<String, Object> providedObject = getRequestProvidedObject(request, requestInfo);
-                if (names.isEmpty() && _hierarchy.length == 0)
+                if (names.isEmpty() && hierarchy.length == 0)
                 {
-                    getBroker().setAttributes(providedObject);
+                    managedObject.setAttributes(providedObject);
                     response.setStatus(HttpServletResponse.SC_OK);
                     return;
                 }
 
-                ConfiguredObject theParent = getBroker();
+                ConfiguredObject theParent = managedObject;
                 ConfiguredObject[] otherParents = null;
-                Class<? extends ConfiguredObject> objClass = getConfiguredClass();
-                if (_hierarchy.length > 1)
+                Class<? extends ConfiguredObject> objClass = configuredClass;
+                if (hierarchy.length > 1)
                 {
 
                     List<ConfiguredObject> parents =
-                            _objectFinder.findObjectParentsFromPath(names, _hierarchy, getConfiguredClass());
+                            finder.findObjectParentsFromPath(names, hierarchy, configuredClass);
                     theParent = parents.remove(0);
                     otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
                 }
@@ -499,12 +477,12 @@ public class RestServlet extends Abstrac
             }
             case OPERATION:
             {
-                doOperation(requestInfo, request, response);
+                doOperation(requestInfo, managedObject, configuredClass, finder, request, response);
                 break;
             }
             case USER_PREFERENCES:
             {
-                doPostOrPutUserPreference(requestInfo, request, response);
+                doPostOrPutUserPreference(requestInfo, managedObject, configuredClass, finder, request, response);
                 break;
             }
             default:
@@ -516,14 +494,19 @@ public class RestServlet extends Abstrac
         }
     }
 
-    private void doGetUserPreferences(final RequestInfo requestInfo,
+    private void doGetUserPreferences(final ConfiguredObject<?> managedObject,
+                                      final Class<? extends ConfiguredObject> configuredClass,
+                                      final ConfiguredObjectFinder finder, final RequestInfo requestInfo,
                                       final HttpServletRequest request,
                                       final HttpServletResponse response) throws IOException, ServletException
     {
-        Collection<ConfiguredObject<?>> allObjects = getTargetObjects(requestInfo,
+        Collection<ConfiguredObject<?>> allObjects = getTargetObjects(
+                configuredClass,
+                                                                      finder,
+                                                                      requestInfo,
                                                                       Collections.<Predicate<ConfiguredObject<?>>>emptyList());
 
-        if (allObjects == null || (allObjects.isEmpty() && isSingleObjectRequest(requestInfo)))
+        if (allObjects == null || (allObjects.isEmpty() && isSingleObjectRequest(requestInfo, finder.getHierarchy(configuredClass))))
         {
             sendJsonErrorResponse(request, response, HttpServletResponse.SC_NOT_FOUND, "Not Found");
             return;
@@ -565,10 +548,13 @@ public class RestServlet extends Abstrac
     }
 
     private void doPostOrPutUserPreference(final RequestInfo requestInfo,
+                                           final ConfiguredObject<?> managedObject,
+                                           final Class<? extends ConfiguredObject> configuredClass,
+                                           final ConfiguredObjectFinder finder,
                                            final HttpServletRequest request,
                                            final HttpServletResponse response) throws IOException, ServletException
     {
-        ConfiguredObject<?> target = getTarget(requestInfo);
+        ConfiguredObject<?> target = getTarget(requestInfo, managedObject, configuredClass, finder);
 
         final Object providedObject = getRequestProvidedObject(request, requestInfo, Object.class);
         if ("POST".equals(request.getMethod()))
@@ -588,17 +574,21 @@ public class RestServlet extends Abstrac
         }
     }
 
-    private void doOperation(final RequestInfo requestInfo, final HttpServletRequest request,
+    private void doOperation(final RequestInfo requestInfo,
+                             final ConfiguredObject<?> managedObject,
+                             final Class<? extends ConfiguredObject> configuredClass,
+                             final ConfiguredObjectFinder finder,
+                             final HttpServletRequest request,
                              final HttpServletResponse response) throws IOException, ServletException
     {
-        ConfiguredObject<?> target = getTarget(requestInfo);
+        ConfiguredObject<?> target = getTarget(requestInfo, managedObject, configuredClass, finder);
         if (target == null)
         {
             return;
         }
         String operationName = requestInfo.getOperationName();
         final Map<String, ConfiguredObjectOperation<?>> availableOperations =
-                getBroker().getModel().getTypeRegistry().getOperations(target.getClass());
+                managedObject.getModel().getTypeRegistry().getOperations(target.getClass());
         ConfiguredObjectOperation operation = availableOperations.get(operationName);
         Map<String, Object> operationArguments;
 
@@ -713,28 +703,31 @@ public class RestServlet extends Abstrac
         }
     }
 
-    private ConfiguredObject<?> getTarget(final RequestInfo requestInfo) throws IOException
+    private ConfiguredObject<?> getTarget(final RequestInfo requestInfo,
+                                          final ConfiguredObject<?> managedObject,
+                                          final Class<? extends ConfiguredObject> configuredClass,
+                                          final ConfiguredObjectFinder finder) throws IOException
     {
         final ConfiguredObject<?> target;
         final List<String> names = requestInfo.getModelParts();
-
-        if (names.isEmpty() && _hierarchy.length == 0)
+        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        if (names.isEmpty() && hierarchy.length == 0)
         {
-            target = getBroker();
+            target = managedObject;
         }
         else
         {
-            ConfiguredObject theParent = getBroker();
+            ConfiguredObject theParent = managedObject;
             ConfiguredObject[] otherParents = null;
-            if (_hierarchy.length > 1)
+            if (hierarchy.length > 1)
             {
 
                 List<ConfiguredObject> parents =
-                        _objectFinder.findObjectParentsFromPath(names, _hierarchy, getConfiguredClass());
+                        finder.findObjectParentsFromPath(names, hierarchy, configuredClass);
                 theParent = parents.remove(0);
                 otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
             }
-            Class<? extends ConfiguredObject> objClass = getConfiguredClass();
+            Class<? extends ConfiguredObject> objClass = configuredClass;
             Map<String, Object> objectName =
                     Collections.<String, Object>singletonMap("name", names.get(names.size() - 1));
             target = findObjectToUpdateInParent(objClass, objectName, theParent, otherParents);
@@ -742,7 +735,7 @@ public class RestServlet extends Abstrac
             {
 
                 final String errorMessage = String.format("%s '%s' not found",
-                                                          getConfiguredClass().getSimpleName(),
+                                                          configuredClass.getSimpleName(),
                                                           Joiner.on("/").join(names));
                 throw new NotFoundException(errorMessage);
             }
@@ -1010,10 +1003,18 @@ public class RestServlet extends Abstrac
     }
 
     @Override
-    protected void doDeleteWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        RequestInfo requestInfo = _requestInfoParser.parse(request);
-        Collection<ConfiguredObject<?>> allObjects = getTargetObjects(requestInfo, buildFilterPredicates(request));
+    protected void doDeleteWithSubjectAndActor(HttpServletRequest request,
+                                               HttpServletResponse response,
+                                               final ConfiguredObject<?> managedObject) throws ServletException, IOException
+    {
+        ConfiguredObjectFinder finder = getConfiguredObjectFinder(managedObject);
+        Class<? extends ConfiguredObject> configuredClass = getConfiguredClass(request, managedObject);
+        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        RequestInfoParser requestInfoParser = new RequestInfoParser(hierarchy);
+
+        RequestInfo requestInfo = requestInfoParser.parse(request);
+
+        Collection<ConfiguredObject<?>> allObjects = getTargetObjects(configuredClass, finder, requestInfo, buildFilterPredicates(request));
         if (allObjects == null)
         {
             throw new NotFoundException("Not Found");
@@ -1058,9 +1059,11 @@ public class RestServlet extends Abstrac
     }
 
     @Override
-    protected void doPostWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    protected void doPostWithSubjectAndActor(HttpServletRequest request,
+                                             HttpServletResponse response,
+                                             final ConfiguredObject<?> managedObject) throws ServletException, IOException
     {
-        performCreateOrUpdate(request, response);
+        performCreateOrUpdate(request, response, managedObject);
     }
 
 

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java?rev=1772491&r1=1772490&r2=1772491&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java Sat Dec  3 22:11:17 2016
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.qpid.server.management.plugin.HttpManagementConfiguration;
 import org.apache.qpid.server.management.plugin.HttpManagementUtil;
 import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.security.SubjectCreator;
 import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
 import org.apache.qpid.server.security.auth.AuthenticationResult;
@@ -68,7 +69,9 @@ public class SaslServlet extends Abstrac
         super();
     }
 
-    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws
+    protected void doGetWithSubjectAndActor(HttpServletRequest request,
+                                            HttpServletResponse response,
+                                            final ConfiguredObject<?> managedObject) throws
                                                                                    ServletException,
                                                                                    IOException
     {
@@ -114,7 +117,9 @@ public class SaslServlet extends Abstrac
 
 
     @Override
-    protected void doPostWithSubjectAndActor(final HttpServletRequest request, final HttpServletResponse response) throws IOException
+    protected void doPostWithSubjectAndActor(final HttpServletRequest request,
+                                             final HttpServletResponse response,
+                                             final ConfiguredObject<?> managedObject) throws IOException
     {
         checkSaslAuthEnabled(request);
 

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java?rev=1772491&r1=1772490&r2=1772491&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java Sat Dec  3 22:11:17 2016
@@ -27,8 +27,8 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ConfiguredObjectFinder;
 
 public class StructureServlet extends AbstractServlet
 {
@@ -40,23 +40,26 @@ public class StructureServlet extends Ab
     }
 
     @Override
-    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+    protected void doGetWithSubjectAndActor(HttpServletRequest request,
+                                            HttpServletResponse response,
+                                            final ConfiguredObject<?> managedObject) throws IOException, ServletException
     {
 
         // TODO filtering??? request.getParameter("filter"); // filter=1,2,3   /groups/*/*
 
-        Map<String,Object> structure = generateStructure(getBroker(), Broker.class);
+        Map<String,Object> structure = generateStructure(managedObject, managedObject.getCategoryClass(), true);
 
         sendJsonResponse(structure, request, response);
 
     }
 
-    private Map<String, Object> generateStructure(ConfiguredObject object, Class<? extends ConfiguredObject> clazz)
+    private Map<String, Object> generateStructure(ConfiguredObject object,
+                                                  Class<? extends ConfiguredObject> clazz,
+                                                  final boolean includeAssociated)
     {
         Map<String, Object> structure = new LinkedHashMap<String, Object>();
         structure.put("id", object.getId());
         structure.put("name", object.getName());
-
         for(Class<? extends ConfiguredObject> childClass : object.getModel().getChildTypes(clazz))
         {
             Collection<? extends ConfiguredObject> children = object.getChildren(childClass);
@@ -66,7 +69,7 @@ public class StructureServlet extends Ab
 
                 for(ConfiguredObject child : children)
                 {
-                    childObjects.add(generateStructure(child, childClass));
+                    childObjects.add(generateStructure(child, childClass, false));
                 }
 
                 if(!childObjects.isEmpty())
@@ -75,6 +78,29 @@ public class StructureServlet extends Ab
                 }
             }
         }
+        if(includeAssociated)
+        {
+
+            ConfiguredObjectFinder finder = getConfiguredObjectFinder(object);
+            for(Class<? extends ConfiguredObject> childClass : finder.getAssociatedChildCategories())
+            {
+                Collection<? extends ConfiguredObject> children = finder.getAssociatedChildren(childClass);
+                if(children != null)
+                {
+                    List<Map<String, Object>> childObjects = new ArrayList<Map<String, Object>>();
+
+                    for(ConfiguredObject child : children)
+                    {
+                        childObjects.add(generateStructure(child, childClass, false));
+                    }
+
+                    if(!childObjects.isEmpty())
+                    {
+                        structure.put(pluralize(childClass),childObjects);
+                    }
+                }
+            }
+        }
 
         return structure;
     }

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/TimeZoneServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/TimeZoneServlet.java?rev=1772491&r1=1772490&r2=1772491&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/TimeZoneServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/TimeZoneServlet.java Sat Dec  3 22:11:17 2016
@@ -30,6 +30,8 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.qpid.server.model.ConfiguredObject;
+
 public class TimeZoneServlet extends AbstractServlet
 {
     private static final long serialVersionUID = 1L;
@@ -43,8 +45,10 @@ public class TimeZoneServlet extends Abs
     }
 
     @Override
-    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException,
-            IOException
+    protected void doGetWithSubjectAndActor(HttpServletRequest request,
+                                            HttpServletResponse response,
+                                            final ConfiguredObject<?> managedObject) throws ServletException,
+                                                                                            IOException
     {
         sendJsonResponse(getTimeZones(), request, response);
     }

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostQueryServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostQueryServlet.java?rev=1772491&r1=1772490&r2=1772491&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostQueryServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostQueryServlet.java Sat Dec  3 22:11:17 2016
@@ -41,17 +41,27 @@ public class VirtualHostQueryServlet ext
     private static final long serialVersionUID = 1L;
 
     @Override
-    protected VirtualHost<?> getParent(final HttpServletRequest request)
+    protected VirtualHost<?> getParent(final HttpServletRequest request, final ConfiguredObject<?> managedObject)
     {
         final List<String>
                 path = HttpManagementUtil.getPathInfoElements(request.getServletPath(), request.getPathInfo());
-        final Broker<?> broker = HttpManagementUtil.getBroker(request.getServletContext());
-        if (path.size() == 3)
+        if(managedObject instanceof Broker)
         {
-            VirtualHostNode<?> vhn = broker.getChildByName(VirtualHostNode.class, path.get(0));
-            if (vhn != null)
+            final Broker<?> broker = HttpManagementUtil.getBroker(request.getServletContext());
+            if (path.size() == 3)
             {
-                return vhn.getChildByName(VirtualHost.class, path.get(1));
+                VirtualHostNode<?> vhn = broker.getChildByName(VirtualHostNode.class, path.get(0));
+                if (vhn != null)
+                {
+                    return vhn.getChildByName(VirtualHost.class, path.get(1));
+                }
+            }
+        }
+        else if(managedObject instanceof VirtualHost)
+        {
+            if(path.size() == 1)
+            {
+                return (VirtualHost<?>)managedObject;
             }
         }
         return null;
@@ -84,14 +94,18 @@ public class VirtualHostQueryServlet ext
         }
     }
 
-    protected String getRequestedCategory(final HttpServletRequest request)
+    protected String getRequestedCategory(final HttpServletRequest request, final ConfiguredObject<?> managedObject)
     {
         List<String> pathInfoElements =
                 HttpManagementUtil.getPathInfoElements(request.getServletPath(), request.getPathInfo());
-        if (pathInfoElements.size() == 3)
+        if (managedObject instanceof Broker && pathInfoElements.size() == 3)
         {
             return pathInfoElements.get(2);
         }
+        else if(managedObject instanceof VirtualHost && pathInfoElements.size() == 1)
+        {
+            return pathInfoElements.get(0);
+        }
         return null;
     }
 

Modified: qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/RestUserPreferenceHandlerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/RestUserPreferenceHandlerTest.java?rev=1772491&r1=1772490&r2=1772491&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/RestUserPreferenceHandlerTest.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/RestUserPreferenceHandlerTest.java Sat Dec  3 22:11:17 2016
@@ -38,21 +38,17 @@ import java.util.UUID;
 import javax.security.auth.Subject;
 
 import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.model.preferences.GenericPrincipal;
 import org.apache.qpid.server.model.preferences.Preference;
 import org.apache.qpid.server.model.preferences.PreferenceFactory;
 import org.apache.qpid.server.model.preferences.UserPreferences;
 import org.apache.qpid.server.model.preferences.UserPreferencesImpl;
 import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
-import org.apache.qpid.server.security.auth.AuthenticationResult;
 import org.apache.qpid.server.security.auth.TestPrincipalUtils;
-import org.apache.qpid.server.security.auth.UsernamePrincipal;
 import org.apache.qpid.server.security.group.GroupPrincipal;
 import org.apache.qpid.server.store.preferences.PreferenceStore;
 import org.apache.qpid.test.utils.QpidTestCase;
@@ -104,7 +100,8 @@ public class RestUserPreferenceHandlerTe
 
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
                                                                                  Arrays.asList("X-testtype",
-                                                                                               "myprefname"));
+                                                                                               "myprefname")
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -135,7 +132,8 @@ public class RestUserPreferenceHandlerTe
 
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
                                                                                  Arrays.asList("X-testtype",
-                                                                                               "myprefname"));
+                                                                                               "myprefname")
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -165,8 +163,8 @@ public class RestUserPreferenceHandlerTe
     {
         final String prefName = "myprefname";
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Arrays.asList("X-testtype",
-                                                                                               prefName));
+                                                                                 Arrays.asList("X-testtype", prefName)
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -192,8 +190,8 @@ public class RestUserPreferenceHandlerTe
     {
         final String prefName = "myprefname";
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Arrays.asList("X-testtype",
-                                                                                               prefName));
+                                                                                 Arrays.asList("X-testtype", prefName)
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -266,7 +264,8 @@ public class RestUserPreferenceHandlerTe
     {
         final String prefName = "myprefname";
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Arrays.asList("X-testtype"));
+                                                                                 Arrays.asList("X-testtype")
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.NAME_ATTRIBUTE, prefName);
@@ -329,7 +328,8 @@ public class RestUserPreferenceHandlerTe
         final String pref2Type = "X-testtype2";
 
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Collections.<String>emptyList());
+                                                                                 Collections.<String>emptyList()
+                                                                                );
 
         final Map<String, Object> pref1 = new HashMap<>();
         pref1.put(Preference.NAME_ATTRIBUTE, pref1Name);
@@ -390,7 +390,8 @@ public class RestUserPreferenceHandlerTe
     public void testPostToTypeWithVisibilityList_ValidGroup() throws Exception
     {
         final RequestInfo typeRequestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                     Arrays.asList("X-testtype"));
+                                                                                     Arrays.asList("X-testtype")
+                                                                                    );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.NAME_ATTRIBUTE, "testPref");
@@ -420,7 +421,8 @@ public class RestUserPreferenceHandlerTe
     public void testPostToRootWithVisibilityList_ValidGroup() throws Exception
     {
         final RequestInfo rootRequestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                     Collections.<String>emptyList());
+                                                                                     Collections.<String>emptyList()
+                                                                                    );
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.NAME_ATTRIBUTE, "testPref");
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -452,7 +454,8 @@ public class RestUserPreferenceHandlerTe
     public void testPostToTypeWithVisibilityList_InvalidGroup() throws Exception
     {
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Arrays.asList("X-testtype"));
+                                                                                 Arrays.asList("X-testtype")
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.NAME_ATTRIBUTE, "testPref");
@@ -483,7 +486,8 @@ public class RestUserPreferenceHandlerTe
     public void testPostToRootWithVisibilityList_InvalidGroup() throws Exception
     {
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Collections.<String>emptyList());
+                                                                                 Collections.<String>emptyList()
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.NAME_ATTRIBUTE, "testPref");
@@ -515,7 +519,8 @@ public class RestUserPreferenceHandlerTe
     public void testGetHasCorrectVisibilityList() throws Exception
     {
         final RequestInfo rootRequestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                     Collections.<String>emptyList());
+                                                                                     Collections.<String>emptyList()
+                                                                                    );
         final String type = "X-testtype";
 
         Subject.doAs(_subject, new PrivilegedAction<Void>()
@@ -587,7 +592,8 @@ public class RestUserPreferenceHandlerTe
                                      RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
                                                                               Collections.<String>emptyList(),
                                                                               Collections.singletonMap("id",
-                                                                                                       Collections.singletonList(id.toString())));
+                                                                                                       Collections.singletonList(id.toString()))
+                                                                             );
 
                              Map<String, List<Map<String, Object>>> typeToPreferenceListMap =
                                      (Map<String, List<Map<String, Object>>>) _handler.handleGET(_userPreferences, rootRequestInfo);
@@ -639,7 +645,8 @@ public class RestUserPreferenceHandlerTe
                                      RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
                                                                               Collections.<String>emptyList(),
                                                                               Collections.singletonMap("id",
-                                                                                                       Collections.singletonList(id.toString())));
+                                                                                                       Collections.singletonList(id.toString()))
+                                                                             );
 
                              _handler.handleDELETE(_userPreferences, rootRequestInfo);
 
@@ -658,7 +665,8 @@ public class RestUserPreferenceHandlerTe
         final String preferenceName = "myprefname";
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
                                                                                  Arrays.asList(preferenceType,
-                                                                                               preferenceName));
+                                                                                               preferenceName)
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -671,7 +679,8 @@ public class RestUserPreferenceHandlerTe
         final String preferenceType = "X-testtype";
         final String preferenceName = "myprefname";
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Arrays.asList(preferenceType));
+                                                                                 Arrays.asList(preferenceType)
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -684,7 +693,8 @@ public class RestUserPreferenceHandlerTe
         final String preferenceType = "X-testtype";
         final String preferenceName = "myprefname";
         final RequestInfo requestInfo = RequestInfo.createPreferencesRequestInfo(Collections.<String>emptyList(),
-                                                                                 Collections.<String>emptyList());
+                                                                                 Collections.<String>emptyList()
+                                                                                );
 
         final Map<String, Object> pref = new HashMap<>();
         pref.put(Preference.VALUE_ATTRIBUTE, Collections.emptyMap());
@@ -699,7 +709,8 @@ public class RestUserPreferenceHandlerTe
         final RequestInfo rootRequestInfo =
                 RequestInfo.createVisiblePreferencesRequestInfo(Collections.<String>emptyList(),
                                                                 Collections.<String>emptyList(),
-                                                                Collections.<String, List<String>>emptyMap());
+                                                                Collections.<String, List<String>>emptyMap()
+                                                               );
 
         Subject.doAs(_subject, new PrivilegedAction<Void>()
                      {
@@ -772,7 +783,8 @@ public class RestUserPreferenceHandlerTe
         final RequestInfo rootRequestInfo =
                 RequestInfo.createVisiblePreferencesRequestInfo(Collections.<String>emptyList(),
                                                                 Arrays.asList(prefType),
-                                                                Collections.<String, List<String>>emptyMap());
+                                                                Collections.<String, List<String>>emptyMap()
+                                                               );
 
         Subject.doAs(_subject, new PrivilegedAction<Void>()
                      {
@@ -842,7 +854,8 @@ public class RestUserPreferenceHandlerTe
         final RequestInfo rootRequestInfo =
                 RequestInfo.createVisiblePreferencesRequestInfo(Collections.<String>emptyList(),
                                                                 Arrays.asList(prefType, prefName),
-                                                                Collections.<String, List<String>>emptyMap());
+                                                                Collections.<String, List<String>>emptyMap()
+                                                               );
 
         Subject.doAs(_subject, new PrivilegedAction<Void>()
                      {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org