QPID-6948: [Broker-J] Fix handling of requests for unsupported category

(cherry picked from commit 92d5fa590817a2aa69840d10bcb967b31a19e2ed)
diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java
index 18b457a..7a32153 100644
--- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java
+++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java
@@ -92,6 +92,7 @@
 
     private static final int DEFAULT_DEPTH = 0;
     private static final int DEFAULT_OVERSIZE = 120;
+    private static final Class<? extends ConfiguredObject>[] EMPTY_HIERARCHY = new Class[0];
 
 
     private final ConcurrentMap<ConfiguredObject<?>, ConfiguredObjectFinder> _configuredObjectFinders =
@@ -172,7 +173,7 @@
         final ConfiguredObjectFinder finder = getConfiguredObjectFinder(root);
         final String category = request.getCategory();
         final Class<? extends ConfiguredObject> configuredClass = getRequestCategoryClass(category, root.getModel());
-        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        final Class<? extends ConfiguredObject>[] hierarchy = getHierarchy(finder, configuredClass);
         return getManagementRequestType(request.getMethod(), category, request.getPath(), hierarchy);
     }
 
@@ -239,7 +240,7 @@
             if (hierarchy.size() > 1)
             {
                 final ConfiguredObjectFinder finder = getConfiguredObjectFinder(root);
-                theParent = finder.findObjectParentsFromPath(path, finder.getHierarchy(categoryClass), categoryClass);
+                theParent = finder.findObjectParentsFromPath(path, getHierarchy(finder, categoryClass), categoryClass);
             }
 
             final boolean isFullObjectURL = path.size() == hierarchy.size();
@@ -628,7 +629,7 @@
         final ConfiguredObjectFinder finder = getConfiguredObjectFinder(root);
         final Class<? extends ConfiguredObject> configuredClass = getRequestCategoryClass(category, root.getModel());
         Collection<ConfiguredObject<?>> targetObjects =
-                finder.findObjectsFromPath(path, finder.getHierarchy(configuredClass), true);
+                finder.findObjectsFromPath(path, getHierarchy(finder, configuredClass), true);
 
         if (targetObjects == null)
         {
@@ -641,6 +642,17 @@
         return targetObjects;
     }
 
+    private Class<? extends ConfiguredObject>[] getHierarchy(final ConfiguredObjectFinder finder,
+                                                             final Class<? extends ConfiguredObject> configuredClass)
+    {
+        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        if (hierarchy == null)
+        {
+            return EMPTY_HIERARCHY;
+        }
+        return hierarchy;
+    }
+
     private RequestType getManagementRequestType(final String method,
                                                  final String categoryName,
                                                  final List<String> parts,
@@ -829,7 +841,7 @@
         final Class<? extends ConfiguredObject> configuredClass = getRequestCategoryClass(category, root.getModel());
         final ConfiguredObject<?> target;
         final ConfiguredObjectFinder finder = getConfiguredObjectFinder(root);
-        final Class<? extends ConfiguredObject>[] hierarchy = finder.getHierarchy(configuredClass);
+        final Class<? extends ConfiguredObject>[] hierarchy = getHierarchy(finder, configuredClass);
         if (names.isEmpty() && hierarchy.length == 0)
         {
             target = root;
diff --git a/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java b/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java
index ade744a..6a06855 100644
--- a/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java
+++ b/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java
@@ -106,4 +106,25 @@
                                                     SC_OK);
         assertThat(response, is(nullValue()));
     }
+
+    @Test
+    public void invokeOperationForUnknownCategory() throws Exception
+    {
+
+        try
+        {
+            getHelper().postJson("broker/performGC",
+                                 Collections.emptyMap(),
+                                 new TypeReference<Void>()
+                                 {
+                                 },
+                                 SC_NOT_FOUND);
+            fail("The request is executed against root object VirtualHost. Thus, any broker request should fail.");
+        }
+        catch (FileNotFoundException e)
+        {
+            //pass
+        }
+
+    }
 }