You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2015/03/24 10:17:46 UTC

svn commit: r1668828 - /qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java

Author: orudyy
Date: Tue Mar 24 09:17:46 2015
New Revision: 1668828

URL: http://svn.apache.org/r1668828
Log:
QPID-6438: Address review comments  from Keith Wall

Modified:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1668828&r1=1668827&r2=1668828&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Tue Mar 24 09:17:46 2015
@@ -420,212 +420,217 @@ public class RestServlet extends Abstrac
     {
         response.setContentType("application/json");
 
-        List<String> names = new ArrayList<String>();
-        String[] pathInfoElements = getPathInfoElements(request);
-
-        boolean parentRequest = false;
-        if (pathInfoElements != null)
-        {
-            parentRequest = _hierarchy.length > 0 && pathInfoElements.length == _hierarchy.length - 1;
-            if (pathInfoElements.length != _hierarchy.length && !parentRequest)
-            {
-                throw new IllegalArgumentException("Path to object to create must be fully specified. "
-                                                   + "Found "
-                                                   + names
-                                                   + " of size "
-                                                   + names.size()
-                                                   + " expecting "
-                                                   + _hierarchy.length);
-            }
-            names.addAll(Arrays.asList(pathInfoElements));
-        }
-        else
-        {
-            parentRequest = _hierarchy.length == 1;
-        }
-
-        Map<String, Object> providedObject;
-
-        ArrayList<String> headers = Collections.list(request.getHeaderNames());
-        ObjectMapper mapper = new ObjectMapper();
-
-        if(headers.contains("Content-Type") && request.getHeader("Content-Type").startsWith("multipart/form-data"))
+        List<String> names = getParentNamesFromServletPath(request);
+        Map<String, Object> providedObject = getRequestProvidedObject(request);
+        boolean isFullObjectURL = names.size() == _hierarchy.length;
+        boolean updateOnlyAllowed = isFullObjectURL && "POST".equalsIgnoreCase(request.getMethod());
+        try
         {
-            providedObject = new HashMap<>();
-            Map<String,String> fileUploads = new HashMap<>();
-            Collection<Part> parts = request.getParts();
-            for(Part part : parts)
+            if (names.isEmpty())
             {
-                if("data".equals(part.getName()) && "application/json".equals(part.getContentType()))
+                if (_hierarchy.length == 0)
                 {
-                    providedObject = mapper.readValue(part.getInputStream(), LinkedHashMap.class);
+                    getBroker().setAttributes(providedObject);
+                    response.setStatus(HttpServletResponse.SC_OK);
+                    return;
                 }
-                else
+                else if (isFullObjectURL)
                 {
-                    byte[] data = new byte[(int) part.getSize()];
-                    part.getInputStream().read(data);
-                    String inlineURL = DataUrlUtils.getDataUrlForBytes(data);
-                    fileUploads.put(part.getName(),inlineURL.toString());
+                    throw new ServletException("Cannot identify request target object");
                 }
             }
-            providedObject.putAll(fileUploads);
-        }
-        else
-        {
 
-            providedObject = mapper.readValue(request.getInputStream(), LinkedHashMap.class);
-        }
+            ConfiguredObject theParent = getBroker();
+            ConfiguredObject[] otherParents = null;
+            Class<? extends ConfiguredObject> objClass = getConfiguredClass();
+            if (_hierarchy.length > 1)
+            {
+                List<ConfiguredObject> parents = findAllObjectParents(names);
+                theParent = parents.remove(0);
+                otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
+            }
 
-        if (names.isEmpty())
-        {
-            if (_hierarchy.length == 0)
+            if (isFullObjectURL)
             {
-                try
+                providedObject.put("name", names.get(names.size() - 1));
+                ConfiguredObject<?> configuredObject = findObjectToUpdateInParent(objClass, providedObject, theParent, otherParents);
+
+                if (configuredObject != null)
                 {
-                    getBroker().setAttributes(providedObject);
+                    configuredObject.setAttributes(providedObject);
                     response.setStatus(HttpServletResponse.SC_OK);
+                    return;
                 }
-                catch (RuntimeException e)
+                else if (updateOnlyAllowed)
                 {
-                    setResponseStatus(request, response, e);
+                    sendErrorResponse(request, response, HttpServletResponse.SC_NOT_FOUND, "Object with "
+                            +  (providedObject.containsKey("id") ? " id '" + providedObject.get("id") : " name '" + providedObject.get("name"))
+                            + "' does not exist!");
+                    return;
                 }
-                return;
             }
-            else if (!parentRequest)
+
+            ConfiguredObject<?> configuredObject = theParent.createChild(objClass, providedObject, otherParents);
+            StringBuffer requestURL = request.getRequestURL();
+            if (!isFullObjectURL)
             {
-                throw new ServletException("Cannot identify request target object");
+                requestURL.append("/").append(configuredObject.getName());
             }
+            response.setHeader("Location", requestURL.toString());
+            response.setStatus(HttpServletResponse.SC_CREATED);
         }
-
-        if (!parentRequest)
+        catch (RuntimeException e)
         {
-            providedObject.put("name", names.get(names.size() - 1));
+            setResponseStatus(request, response, e);
         }
 
-        @SuppressWarnings("unchecked")
+    }
+
+    private List<ConfiguredObject> findAllObjectParents(List<String> names)
+    {
         Collection<ConfiguredObject>[] objects = new Collection[_hierarchy.length];
-        if (_hierarchy.length == 1)
+        for (int i = 0; i < _hierarchy.length - 1; i++)
         {
-            createOrUpdate(providedObject, _hierarchy[0], getBroker(), null, request, response, parentRequest);
-        }
-        else
-        {
-            for (int i = 0; i < _hierarchy.length - 1; i++)
+            objects[i] = new HashSet<>();
+            if (i == 0)
             {
-                objects[i] = new HashSet<ConfiguredObject>();
-                if (i == 0)
+                for (ConfiguredObject object : getBroker().getChildren(_hierarchy[0]))
                 {
-                    for (ConfiguredObject object : getBroker().getChildren(_hierarchy[0]))
+                    if (object.getName().equals(names.get(0)))
                     {
-                        if (object.getName().equals(names.get(0)))
-                        {
-                            objects[0].add(object);
-                            break;
-                        }
+                        objects[0].add(object);
+                        break;
                     }
                 }
-                else
+            }
+            else
+            {
+                for (int j = i - 1; j >= 0; j--)
                 {
-                    for (int j = i - 1; j >= 0; j--)
+                    if (getBroker().getModel().getChildTypes(_hierarchy[j]).contains(_hierarchy[i]))
                     {
-                        if (getBroker().getModel().getChildTypes(_hierarchy[j]).contains(_hierarchy[i]))
+                        for (ConfiguredObject<?> parent : objects[j])
                         {
-                            for (ConfiguredObject<?> parent : objects[j])
+                            for (ConfiguredObject<?> object : parent.getChildren(_hierarchy[i]))
                             {
-                                for (ConfiguredObject<?> object : parent.getChildren(_hierarchy[i]))
+                                if (object.getName().equals(names.get(i)))
                                 {
-                                    if (object.getName().equals(names.get(i)))
-                                    {
-                                        objects[i].add(object);
-                                    }
+                                    objects[i].add(object);
                                 }
                             }
-                            break;
                         }
+                        break;
                     }
                 }
-
             }
-            List<ConfiguredObject> parents = new ArrayList<ConfiguredObject>();
-            Class<? extends ConfiguredObject> objClass = getConfiguredClass();
-            Collection<Class<? extends ConfiguredObject>> parentClasses =
-                    getBroker().getModel().getParentTypes(objClass);
-            for (int i = _hierarchy.length - 2; i >= 0; i--)
+
+        }
+        List<ConfiguredObject> parents = new ArrayList<>();
+        Class<? extends ConfiguredObject> objClass = getConfiguredClass();
+        Collection<Class<? extends ConfiguredObject>> parentClasses =
+                getBroker().getModel().getParentTypes(objClass);
+        for (int i = _hierarchy.length - 2; i >= 0; i--)
+        {
+            if (parentClasses.contains(_hierarchy[i]))
             {
-                if (parentClasses.contains(_hierarchy[i]))
+                if (objects[i].size() == 1)
                 {
-                    if (objects[i].size() == 1)
-                    {
-                        parents.add(objects[i].iterator().next());
-                    }
-                    else
-                    {
-                        throw new IllegalArgumentException("Cannot deduce parent of class "
-                                                           + _hierarchy[i].getSimpleName());
-                    }
+                    parents.add(objects[i].iterator().next());
+                }
+                else
+                {
+                    throw new IllegalArgumentException("Cannot deduce parent of class "
+                                                       + _hierarchy[i].getSimpleName());
                 }
-
             }
-            ConfiguredObject theParent = parents.remove(0);
-            ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
 
-            createOrUpdate(providedObject, objClass, theParent, otherParents, request, response, parentRequest);
         }
+        return parents;
     }
 
-    private void createOrUpdate(Map<String, Object> providedObject, Class<? extends ConfiguredObject> objClass,
-            ConfiguredObject theParent, ConfiguredObject[] otherParents, HttpServletRequest request,
-            HttpServletResponse response, boolean parentRequest) throws IOException
+    private List<String> getParentNamesFromServletPath(HttpServletRequest request)
     {
-        try
+        List<String> names = new ArrayList<>();
+        String[] pathInfoElements = getPathInfoElements(request);
+        if (pathInfoElements != null)
         {
-            Collection<? extends ConfiguredObject> existingChildren = theParent.getChildren(objClass);
+            if (!(pathInfoElements.length == _hierarchy.length ||
+                    (_hierarchy.length > 0 && pathInfoElements.length == _hierarchy.length - 1)))
+            {
+                throw new IllegalArgumentException("Either parent path or full object path must be specified on object creation."
+                                                   + " Full object path must be specified on object update. "
+                                                   + "Found "
+                                                   + names
+                                                   + " of size "
+                                                   + names.size()
+                                                   + " expecting "
+                                                   + _hierarchy.length);
+            }
+            names.addAll(Arrays.asList(pathInfoElements));
+        }
+        return names;
+    }
+
+    private Map<String, Object> getRequestProvidedObject(HttpServletRequest request) throws IOException, ServletException
+    {
+        Map<String, Object> providedObject;
+
+        ArrayList<String> headers = Collections.list(request.getHeaderNames());
+        ObjectMapper mapper = new ObjectMapper();
 
-            if (!parentRequest)
+        if(headers.contains("Content-Type") && request.getHeader("Content-Type").startsWith("multipart/form-data"))
+        {
+            providedObject = new HashMap<>();
+            Map<String,String> fileUploads = new HashMap<>();
+            Collection<Part> parts = request.getParts();
+            for(Part part : parts)
             {
-                for (ConfiguredObject obj : existingChildren)
+                if("data".equals(part.getName()) && "application/json".equals(part.getContentType()))
                 {
-                    if ((providedObject.containsKey("id") && String.valueOf(providedObject.get("id")).equals(obj.getId().toString()))
-                            || (obj.getName().equals(providedObject.get("name")) && equalParents(obj, otherParents, objClass)))
-                    {
-                        obj.setAttributes(providedObject);
-                        response.setStatus(HttpServletResponse.SC_OK);
-                        return;
-                    }
+                    providedObject = mapper.readValue(part.getInputStream(), LinkedHashMap.class);
                 }
-
-                if ("POST".equalsIgnoreCase(request.getMethod()))
+                else
                 {
-                    sendErrorResponse(request, response, HttpServletResponse.SC_NOT_FOUND, "Object with "
-                            +  (providedObject.containsKey("id") ? " id '" + providedObject.get("id") : " name '" + providedObject.get("name"))
-                            + "' does not exist!" );
-                    return;
+                    byte[] data = new byte[(int) part.getSize()];
+                    part.getInputStream().read(data);
+                    String inlineURL = DataUrlUtils.getDataUrlForBytes(data);
+                    fileUploads.put(part.getName(),inlineURL.toString());
                 }
             }
+            providedObject.putAll(fileUploads);
+        }
+        else
+        {
 
-            ConfiguredObject<?> co = theParent.createChild(objClass, providedObject, otherParents);
-            StringBuffer requestURL = request.getRequestURL();
-            if (parentRequest)
-            {
-                requestURL.append("/").append(co.getName());
-            }
-            response.setHeader("Location", requestURL.toString());
-            response.setStatus(HttpServletResponse.SC_CREATED);
+            providedObject = mapper.readValue(request.getInputStream(), LinkedHashMap.class);
         }
-        catch (RuntimeException e)
+        return providedObject;
+    }
+
+    private ConfiguredObject<?> findObjectToUpdateInParent(Class<? extends ConfiguredObject> objClass, Map<String, Object> providedObject, ConfiguredObject theParent, ConfiguredObject[] otherParents)
+    {
+        Collection<? extends ConfiguredObject> existingChildren = theParent.getChildren(objClass);
+
+        for (ConfiguredObject obj : existingChildren)
         {
-            setResponseStatus(request, response, e);
+            if ((providedObject.containsKey("id") && String.valueOf(providedObject.get("id")).equals(obj.getId().toString()))
+                    || (obj.getName().equals(providedObject.get("name")) && sameOtherParents(obj, otherParents, objClass)))
+            {
+                return obj;
+            }
         }
+        return null;
     }
 
-    private boolean equalParents(ConfiguredObject obj, ConfiguredObject[] otherParents, Class<? extends ConfiguredObject> objClass)
+    private boolean sameOtherParents(ConfiguredObject obj, ConfiguredObject[] otherParents, Class<? extends ConfiguredObject> objClass)
     {
+        Collection<Class<? extends ConfiguredObject>> parentClasses = obj.getModel().getParentTypes(objClass);
+
         if(otherParents == null || otherParents.length == 0)
         {
-            return true;
+            return parentClasses.size() == 1;
         }
 
-        Collection<Class<? extends ConfiguredObject>> parentClasses = obj.getModel().getParentTypes(objClass);
 
         for (ConfiguredObject parent : otherParents)
         {



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