Author: rgodfrey
Date: Tue Jul 7 00:43:55 2015
New Revision: 1689537
URL: http://svn.apache.org/r1689537
Log:
QPID-6627 : Return 404 - Not Found for REST queries which have a path where the
parent object does not exist
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
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=1689537&r1=1689536&r2=1689537&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
Tue Jul 7 00:43:55 2015
@@ -45,6 +45,7 @@ import org.apache.qpid.server.model.Conf
import org.apache.qpid.server.model.IllegalStateTransitionException;
import org.apache.qpid.server.model.IntegrityViolationException;
import org.apache.qpid.server.model.Content;
+import org.apache.qpid.server.model.Model;
import org.apache.qpid.server.util.ServerScopedRuntimeException;
import org.apache.qpid.server.virtualhost.ExchangeExistsException;
import org.apache.qpid.server.virtualhost.QueueExistsException;
@@ -133,7 +134,7 @@ public class RestServlet extends Abstrac
String[] hierarchyItems = hierarchy.split(",");
for (String item : hierarchyItems)
{
- Class<?> itemClass = null;
+ Class<?> itemClass;
try
{
itemClass = Class.forName(item);
@@ -165,7 +166,7 @@ public class RestServlet extends Abstrac
protected Collection<ConfiguredObject<?>> getObjects(HttpServletRequest
request)
{
String[] pathInfoElements = getPathInfoElements(request);
- List<String> names = new ArrayList<String>();
+ List<String> names = new ArrayList<>();
if(pathInfoElements != null)
{
if(pathInfoElements.length > _hierarchy.length)
@@ -178,16 +179,18 @@ public class RestServlet extends Abstrac
names.addAll(Arrays.asList(pathInfoElements));
}
- Collection<ConfiguredObject<?>> parents = new
ArrayList<ConfiguredObject<?>>();
+ Collection<ConfiguredObject<?>> parents = new ArrayList<>();
parents.add(getBroker());
- Collection<ConfiguredObject<?>> children = new
ArrayList<ConfiguredObject<?>>();
+ Collection<ConfiguredObject<?>> children = new ArrayList<>();
Map<Class<? extends ConfiguredObject>, String> filters =
- new HashMap<Class<? extends ConfiguredObject>, String>();
+ new HashMap<>();
+ final Model model = getBroker().getModel();
+ boolean wildcard = false;
for(int i = 0; i < _hierarchy.length; i++)
{
- if(i == 0 || getBroker().getModel().getChildTypes(_hierarchy[i -
1]).contains(_hierarchy[i]))
+ if(i == 0 || model.getChildTypes(_hierarchy[i -
1]).contains(_hierarchy[i]))
{
for(ConfiguredObject<?> parent : parents)
@@ -204,9 +207,14 @@ public class RestServlet extends Abstrac
children.add(child);
}
}
+ if(children.isEmpty())
+ {
+ return null;
+ }
}
else
{
+ wildcard = true;
children.addAll((Collection<? extends
ConfiguredObject<?>>) parent.getChildren(_hierarchy[i]));
}
}
@@ -221,16 +229,20 @@ public class RestServlet extends Abstrac
{
filters.put(_hierarchy[i], names.get(i));
}
+ else
+ {
+ wildcard = true;
+ }
}
parents = children;
- children = new ArrayList<ConfiguredObject<?>>();
+ children = new ArrayList<>();
}
- if(!filters.isEmpty())
+ if(!filters.isEmpty() && !parents.isEmpty())
{
Collection<ConfiguredObject<?>> potentials = parents;
- parents = new ArrayList<ConfiguredObject<?>>();
+ parents = new ArrayList<>();
for(ConfiguredObject o : potentials)
{
@@ -263,16 +275,16 @@ public class RestServlet extends Abstrac
}
}
- return filter(parents, request);
+ return parents.isEmpty() && !wildcard ? null : filter(parents,
request);
}
private Collection<ConfiguredObject<?>>
filter(Collection<ConfiguredObject<?>> objects, HttpServletRequest request)
{
- Map<String, Collection<String>> filters = new HashMap<String,
Collection<String>>();
+ Map<String, Collection<String>> filters = new HashMap<>();
- for(String param : (Collection<String>)
Collections.list(request.getParameterNames()))
+ for(String param : Collections.list(request.getParameterNames()))
{
if(!RESERVED_PARAMS.contains(param))
{
@@ -285,7 +297,7 @@ public class RestServlet extends Abstrac
return objects;
}
- Collection<ConfiguredObject<?>> filteredObj = new
ArrayList<ConfiguredObject<?>>(objects);
+ Collection<ConfiguredObject<?>> filteredObj = new ArrayList<>(objects);
Iterator<ConfiguredObject<?>> iter = filteredObj.iterator();
@@ -310,7 +322,7 @@ public class RestServlet extends Abstrac
Class<?
extends ConfiguredObject> ancestorType,
ConfiguredObject child)
{
- Collection<ConfiguredObject> ancestors = new
HashSet<ConfiguredObject>();
+ Collection<ConfiguredObject> ancestors = new HashSet<>();
Collection<Class<? extends ConfiguredObject>> parentTypes =
child.getModel().getParentTypes(childType);
for(Class<? extends ConfiguredObject> parentClazz : parentTypes)
@@ -359,7 +371,7 @@ public class RestServlet extends Abstrac
Collection<ConfiguredObject<?>> allObjects =
getObjects(request);
- if (allObjects.isEmpty() && isSingleObjectRequest(request))
+ if (allObjects == null || allObjects.isEmpty() &&
isSingleObjectRequest(request))
{
sendJsonErrorResponse(request, response,
HttpServletResponse.SC_NOT_FOUND, "Not Found");
return;
@@ -434,7 +446,7 @@ public class RestServlet extends Abstrac
}
else
{
- response.setHeader(CONTENT_DISPOSITION,
String.format("attachment")); // Agent will allow user to choose a name
+ response.setHeader(CONTENT_DISPOSITION, "attachment"); //
Agent will allow user to choose a name
}
}
}
@@ -580,35 +592,40 @@ public class RestServlet extends Abstrac
}
else
{
- if (requestMethod.equals("GET"))
+ switch (requestMethod)
{
- if (operation.isNonModifying())
- {
- operationArguments = getOperationArgumentsAsMap(request);
- }
- else
- {
- response.addHeader("Allow", "POST");
+ case "GET":
+ if (operation.isNonModifying())
+ {
+ operationArguments =
getOperationArgumentsAsMap(request);
+ }
+ else
+ {
+ response.addHeader("Allow", "POST");
+ sendJsonErrorResponse(request,
+ response,
+
HttpServletResponse.SC_METHOD_NOT_ALLOWED,
+ "Operation "
+ + operationName
+ + " modifies the object so you
must use POST.");
+ return;
+ }
+
+ break;
+ case "POST":
+ operationArguments = getRequestProvidedObject(request);
+ break;
+ default:
+ response.addHeader("Allow", (operation.isNonModifying() ?
"POST, GET" : "POST"));
sendJsonErrorResponse(request,
response,
HttpServletResponse.SC_METHOD_NOT_ALLOWED,
- "Operation " + operationName + "
modifies the object so you must use POST.");
+ "Operation "
+ + operationName
+ + " does not support the "
+ + requestMethod
+ + " requestMethod.");
return;
- }
-
- }
- else if (requestMethod.equals("POST"))
- {
- operationArguments = getRequestProvidedObject(request);
- }
- else
- {
- response.addHeader("Allow", (operation.isNonModifying() ?
"POST, GET" : "POST"));
- sendJsonErrorResponse(request,
- response,
-
HttpServletResponse.SC_METHOD_NOT_ALLOWED,
- "Operation " + operationName + " does
not support the " + requestMethod + " requestMethod.");
- return;
}
}
Object returnVal = operation.perform(subject, operationArguments);
@@ -932,13 +949,20 @@ public class RestServlet extends Abstrac
try
{
Collection<ConfiguredObject<?>> allObjects = getObjects(request);
- for(ConfiguredObject o : allObjects)
+ if(allObjects != null)
{
- o.delete();
- }
+ for (ConfiguredObject o : allObjects)
+ {
+ o.delete();
+ }
- sendCachingHeadersOnResponse(response);
- response.setStatus(HttpServletResponse.SC_OK);
+ sendCachingHeadersOnResponse(response);
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+ else
+ {
+ sendJsonErrorResponse(request, response,
HttpServletResponse.SC_NOT_FOUND, "Not Found");
+ }
}
catch(RuntimeException e)
{
@@ -980,8 +1004,7 @@ public class RestServlet extends Abstrac
private String ensureFilenameIsRfc2183(final String requestedFilename)
{
- String fileNameRfc2183 =
requestedFilename.replaceAll("[\\P{InBasic_Latin}\\\\:/]", "");
- return fileNameRfc2183;
+ return requestedFilename.replaceAll("[\\P{InBasic_Latin}\\\\:/]", "");
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]