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 2012/04/24 10:57:57 UTC
svn commit: r1329597 - in
/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin:
./ servlet/ servlet/rest/
Author: rgodfrey
Date: Tue Apr 24 08:57:57 2012
New Revision: 1329597
URL: http://svn.apache.org/viewvc?rev=1329597&view=rev
Log:
NO-JIRA : [Java Config] tidy up REST servlets
Added:
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
Removed:
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConnectionServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ConsumerServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ExchangeServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/PortServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueueServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SessionServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostServlet.java
Modified:
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java?rev=1329597&r1=1329596&r2=1329597&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java Tue Apr 24 08:57:57 2012
@@ -25,15 +25,17 @@ import org.apache.qpid.server.management
import org.apache.qpid.server.management.plugin.servlet.FileServlet;
import org.apache.qpid.server.management.plugin.servlet.api.ExchangesServlet;
import org.apache.qpid.server.management.plugin.servlet.api.VhostsServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.BindingServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.ConnectionServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.ExchangeServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.PortServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.QueueServlet;
+import org.apache.qpid.server.management.plugin.servlet.rest.RestServlet;
import org.apache.qpid.server.management.plugin.servlet.rest.SaslServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.SessionServlet;
-import org.apache.qpid.server.management.plugin.servlet.rest.VirtualHostServlet;
+import org.apache.qpid.server.model.Binding;
import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Connection;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.Session;
+import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.SessionManager;
@@ -48,6 +50,7 @@ public class Management
private Broker _broker;
private Server _server;
+ private Context _root;
public Management()
{
@@ -57,42 +60,47 @@ public class Management
_server = new Server(8080);
- Context root = new Context(_server,"/", Context.SESSIONS);
- root.addServlet(new ServletHolder(new VhostsServlet(_broker)), "/api/vhosts/*");
- root.addServlet(new ServletHolder(new ExchangesServlet(_broker)), "/api/exchanges/*");
-
- root.addServlet(new ServletHolder(new VirtualHostServlet(_broker)), "/rest/virtualhost/*");
- root.addServlet(new ServletHolder(new ExchangeServlet(_broker)), "/rest/exchange/*");
- root.addServlet(new ServletHolder(new QueueServlet(_broker)), "/rest/queue/*");
- root.addServlet(new ServletHolder(new ConnectionServlet(_broker)), "/rest/connection/*");
- root.addServlet(new ServletHolder(new BindingServlet(_broker)), "/rest/binding/*");
- root.addServlet(new ServletHolder(new PortServlet(_broker)), "/rest/port/*");
- root.addServlet(new ServletHolder(new SessionServlet(_broker)), "/rest/session/*");
-
- root.addServlet(new ServletHolder(new SaslServlet(_broker)), "/rest/sasl");
-
- root.addServlet(new ServletHolder(new DefinedFileServlet("queue.html")),"/queue");
- root.addServlet(new ServletHolder(new DefinedFileServlet("exchange.html")),"/exchange");
- root.addServlet(new ServletHolder(new DefinedFileServlet("vhost.html")),"/vhost");
- root.addServlet(new ServletHolder(new DefinedFileServlet("broker.html")),"/broker");
- root.addServlet(new ServletHolder(new DefinedFileServlet("connection.html")),"/connection");
-
-
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.js");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.css");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.html");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.png");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.gif");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.jpg");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.jpeg");
- root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.json");
+ _root = new Context(_server,"/", Context.SESSIONS);
+ _root.addServlet(new ServletHolder(new VhostsServlet(_broker)), "/api/vhosts/*");
+ _root.addServlet(new ServletHolder(new ExchangesServlet(_broker)), "/api/exchanges/*");
+
+ addRestServlet("virtualhost", VirtualHost.class);
+ addRestServlet("exchange", VirtualHost.class, Exchange.class);
+ addRestServlet("queue", VirtualHost.class, Queue.class);
+ addRestServlet("connection", VirtualHost.class, Connection.class);
+ addRestServlet("binding", VirtualHost.class, Exchange.class, Queue.class, Binding.class);
+ addRestServlet("port", Port.class);
+ addRestServlet("session", VirtualHost.class, Connection.class, Session.class);
+
+ _root.addServlet(new ServletHolder(new SaslServlet(_broker)), "/rest/sasl");
+
+ _root.addServlet(new ServletHolder(new DefinedFileServlet("queue.html")),"/queue");
+ _root.addServlet(new ServletHolder(new DefinedFileServlet("exchange.html")),"/exchange");
+ _root.addServlet(new ServletHolder(new DefinedFileServlet("vhost.html")),"/vhost");
+ _root.addServlet(new ServletHolder(new DefinedFileServlet("broker.html")),"/broker");
+ _root.addServlet(new ServletHolder(new DefinedFileServlet("connection.html")),"/connection");
+
+
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.js");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.css");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.html");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.png");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.gif");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.jpg");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.jpeg");
+ _root.addServlet(new ServletHolder(FileServlet.INSTANCE), "*.json");
- final SessionManager sessionManager = root.getSessionHandler().getSessionManager();
+ final SessionManager sessionManager = _root.getSessionHandler().getSessionManager();
sessionManager.setMaxCookieAge(60 * 30);
sessionManager.setMaxInactiveInterval(60 * 15);
}
+ private void addRestServlet(String name, Class<? extends ConfiguredObject>... hierarchy)
+ {
+ _root.addServlet(new ServletHolder(new RestServlet(_broker, hierarchy)), "/rest/"+name+"/*");
+ }
+
public void start() throws Exception
{
_server.start();
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java?rev=1329597&r1=1329596&r2=1329597&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java Tue Apr 24 08:57:57 2012
@@ -22,6 +22,9 @@ package org.apache.qpid.server.managemen
import java.io.IOException;
import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
@@ -31,6 +34,22 @@ import javax.servlet.http.HttpServletRes
public class FileServlet extends HttpServlet
{
public static final FileServlet INSTANCE = new FileServlet();
+
+ private static final Map<String, String> CONTENT_TYPES;
+
+ static
+ {
+
+ Map<String, String> contentTypes = new HashMap<String, String>();
+ contentTypes.put("js", "application/javascript");
+ contentTypes.put("html", "text/html");
+ contentTypes.put("css", "text/css");
+ contentTypes.put("json", "application/json");
+ contentTypes.put("jpg", "image/jpg");
+ contentTypes.put("png", "image/png");
+ contentTypes.put("gif", "image/gif");
+ CONTENT_TYPES = Collections.unmodifiableMap(contentTypes);
+ }
public FileServlet()
@@ -41,21 +60,14 @@ public class FileServlet extends HttpSer
{
String filename = request.getServletPath();
- if(filename.endsWith(".js"))
+ if(filename.contains("."))
{
- response.setContentType("application/javascript");
- }
- else if(filename.endsWith(".html"))
- {
- response.setContentType("text/html");
- }
- else if(filename.endsWith(".css"))
- {
- response.setContentType("text/css");
- }
- else if(filename.endsWith(".json"))
- {
- response.setContentType("application/json");
+ String suffix = filename.substring(filename.lastIndexOf('.')+1);
+ String contentType = CONTENT_TYPES.get(suffix);
+ if(contentType != null)
+ {
+ response.setContentType(contentType);
+ }
}
final ServletOutputStream output = response.getOutputStream();
Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java?rev=1329597&r1=1329596&r2=1329597&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java Tue Apr 24 08:57:57 2012
@@ -21,46 +21,29 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.Model;
-import org.apache.qpid.server.model.Statistics;
-import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.security.auth.AuthenticationResult;
-import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Collections;
import javax.security.auth.Subject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.security.Principal;
-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.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.security.auth.AuthenticationResult;
+import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
public abstract class AbstractServlet extends HttpServlet
{
private Subject _subject;
private final Broker _broker;
- private Class<? extends ConfiguredObject>[] _hierarchy;
- protected AbstractServlet(Broker broker, Class<? extends ConfiguredObject>... hierarchy)
+ protected AbstractServlet(Broker broker)
{
_broker = broker;
- _hierarchy = hierarchy;
}
@Override
@@ -77,6 +60,11 @@ public abstract class AbstractServlet ex
}
}
+ protected void onGet(HttpServletRequest request, HttpServletResponse resp) throws IOException, ServletException
+ {
+ super.doGet(request, resp);
+ }
+
private void clearAuthorizedSubject()
{
_subject = null;
@@ -167,6 +155,11 @@ public abstract class AbstractServlet ex
}
}
+ protected void onPut(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
+ {
+ super.doPut(req,resp);
+ }
+
@Override
protected final void doDelete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
@@ -193,332 +186,5 @@ public abstract class AbstractServlet ex
return _broker;
}
- protected Collection<ConfiguredObject> getObjects(HttpServletRequest request)
- {
- List<String> names = new ArrayList<String>();
- if(request.getPathInfo() != null && request.getPathInfo().length()>0)
- {
- String path = request.getPathInfo().substring(1);
- names.addAll(Arrays.asList(path.split("/")));
-
- if(names.size() > _hierarchy.length)
- {
- throw new IllegalArgumentException("Too many entries in path");
- }
- }
-
- Collection<ConfiguredObject> parents = Collections.singleton((ConfiguredObject) _broker);
- Collection<ConfiguredObject> children = new ArrayList<ConfiguredObject>();
-
- Map<Class<? extends ConfiguredObject>, String> filters =
- new HashMap<Class<? extends ConfiguredObject>, String>();
-
- for(int i = 0; i < _hierarchy.length; i++)
- {
- if(i == 0 || Model.getChildTypes(_hierarchy[i-1]).contains(_hierarchy[i]))
- {
-
- for(ConfiguredObject parent : parents)
- {
- if(names.size() > i
- && names.get(i) != null
- && !names.get(i).equals("*")
- && names.get(i).trim().length() != 0)
- {
- for(ConfiguredObject child : parent.getChildren(_hierarchy[i]))
- {
- if(child.getName().equals(names.get(i)))
- {
- children.add(child);
- }
- }
- }
- else
- {
- children.addAll(parent.getChildren(_hierarchy[i]));
- }
- }
- }
- else
- {
- children = parents;
- if(names.size() > i
- && names.get(i) != null
- && !names.get(i).equals("*")
- && names.get(i).trim().length() != 0)
- {
- filters.put(_hierarchy[i], names.get(i));
- }
- }
-
- parents = children;
- children = new ArrayList<ConfiguredObject>();
- }
-
- if(!filters.isEmpty())
- {
- Collection<ConfiguredObject> potentials = parents;
- parents = new ArrayList<ConfiguredObject>();
-
- for(ConfiguredObject o : potentials)
- {
-
- boolean match = true;
-
- for(Map.Entry<Class<? extends ConfiguredObject>, String> entry : filters.entrySet())
- {
- Collection<? extends ConfiguredObject> ancestors =
- getAncestors(_hierarchy[_hierarchy.length-1],entry.getKey(), o);
- match = false;
- for(ConfiguredObject ancestor : ancestors)
- {
- if(ancestor.getName().equals(entry.getValue()))
- {
- match = true;
- break;
- }
- }
- if(!match)
- {
- break;
- }
- }
- if(match)
- {
- parents.add(o);
- }
-
- }
- }
-
- return parents;
- }
-
- private Collection<? extends ConfiguredObject> getAncestors(Class<? extends ConfiguredObject> childType,
- Class<? extends ConfiguredObject> ancestorType,
- ConfiguredObject child)
- {
- Collection<ConfiguredObject> ancestors = new HashSet<ConfiguredObject>();
- Collection<Class<? extends ConfiguredObject>> parentTypes = Model.getParentTypes(childType);
-
- for(Class<? extends ConfiguredObject> parentClazz : parentTypes)
- {
- if(parentClazz == ancestorType)
- {
- ConfiguredObject parent = child.getParent(parentClazz);
- if(parent != null)
- {
- ancestors.add(parent);
- }
- }
- else
- {
- ConfiguredObject parent = child.getParent(parentClazz);
- if(parent != null)
- {
- ancestors.addAll(getAncestors(parentClazz, ancestorType, parent));
- }
- }
- }
-
- return ancestors;
- }
-
-
- protected Map<String, Object> convertObjectToMap(final ConfiguredObject confObject,
- Class<? extends ConfiguredObject> clazz,
- int depth)
- {
- Map<String, Object> object = new LinkedHashMap<String, Object>();
-
- for(String name : confObject.getAttributeNames())
- {
- Object value = confObject.getAttribute(name);
- if(value != null)
- {
- object.put(name, value);
- }
- }
-
- Statistics statistics = confObject.getStatistics();
- Map<String, Object> statMap = new HashMap<String, Object>();
- for(String name : statistics.getStatisticNames())
- {
- Object value = statistics.getStatistic(name);
- if(value != null)
- {
- statMap.put(name, value);
- }
- }
-
- if(!statMap.isEmpty())
- {
- object.put("statistics", statMap);
- }
-
- if(depth > 0)
- {
- for(Class<? extends ConfiguredObject> childClass : Model.getChildTypes(clazz))
- {
- Collection<? extends ConfiguredObject> children = confObject.getChildren(childClass);
- if(children != null)
- {
- List<Map<String, Object>> childObjects = new ArrayList<Map<String, Object>>();
-
- for(ConfiguredObject child : children)
- {
- childObjects.add(convertObjectToMap(child, childClass, depth-1));
- }
-
- if(!childObjects.isEmpty())
- {
- object.put(childClass.getSimpleName().toLowerCase()+"s",childObjects);
- }
- }
- }
- }
- return object;
- }
-
- protected void onGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- response.setContentType("application/json");
- response.setStatus(HttpServletResponse.SC_OK);
-
- response.setHeader("Cache-Control","no-cache");
- response.setHeader("Pragma","no-cache");
- response.setDateHeader ("Expires", 0);
-
- Collection<ConfiguredObject> allObjects = getObjects(request);
-
- @SuppressWarnings("unchecked")
- Map params = new HashMap(request.getParameterMap());
-
- int depth = 1;
- try
- {
- depth = Integer.parseInt(String.valueOf(params.remove("depth")));
- }
- catch (NumberFormatException e)
- {
- // Ignore
- }
-
- List<Map<String, Object>> output = new ArrayList<Map<String, Object>>();
-
- if(!params.isEmpty())
- {
- // TODO - depth and sort special params, everything else should act as a filter
- }
-
- for(ConfiguredObject configuredObject : allObjects)
- {
- output.add(convertObjectToMap(configuredObject, _hierarchy[_hierarchy.length-1],depth));
- }
-
- final PrintWriter writer = response.getWriter();
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
- mapper.writeValue(writer, output);
-
- response.setContentType("application/json");
- response.setStatus(HttpServletResponse.SC_OK);
-
- }
-
- protected void onPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- response.setContentType("application/json");
-
- ObjectMapper mapper = new ObjectMapper();
-
- @SuppressWarnings("unchecked")
- Map<String,Object> providedObject = mapper.readValue(request.getInputStream(), LinkedHashMap.class);
-
-
- List<String> names = new ArrayList<String>();
- if(request.getPathInfo() != null && request.getPathInfo().length()>0)
- {
- String path = request.getPathInfo().substring(1);
- names.addAll(Arrays.asList(path.split("/")));
-
- if(names.size() != _hierarchy.length)
- {
- throw new IllegalArgumentException("Path to object to create must be fully specified");
- }
- }
-
-
- providedObject.put("name", names.get(names.size()-1));
-
- @SuppressWarnings("unchecked")
- Collection<ConfiguredObject>[] objects = new Collection[_hierarchy.length];
- if(_hierarchy.length == 1)
- {
- _broker.createChild(_hierarchy[0], providedObject);
- }
- else
- {
- for(int i = 0; i < _hierarchy.length-1; i++)
- {
- objects[i] = new HashSet<ConfiguredObject>();
- if(i == 0)
- {
- for(ConfiguredObject object : _broker.getChildren(_hierarchy[0]))
- {
- if(object.getName().equals(names.get(0)))
- {
- objects[0].add(object);
- break;
- }
- }
- }
- else
- {
- 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);
- }
- }
- }
- break;
- }
- }
- }
-
- }
- List<ConfiguredObject> parents = new ArrayList<ConfiguredObject>();
- Class<? extends ConfiguredObject> objClass = _hierarchy[_hierarchy.length - 1];
- 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());
- }
- }
-
- }
- ConfiguredObject theParent = parents.remove(0);
- ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
-
- theParent.createChild(objClass, providedObject, otherParents);
- }
- }
}
Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1329597&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Tue Apr 24 08:57:57 2012
@@ -0,0 +1,380 @@
+package org.apache.qpid.server.management.plugin.servlet.rest;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+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.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+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.Model;
+import org.apache.qpid.server.model.Statistics;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ */
+public class RestServlet extends AbstractServlet
+{
+ private Class<? extends ConfiguredObject>[] _hierarchy;
+
+ public RestServlet(Broker broker, Class<? extends ConfiguredObject>... hierarchy)
+ {
+ super(broker);
+ _hierarchy = hierarchy;
+ }
+
+ protected Collection<ConfiguredObject> getObjects(HttpServletRequest request)
+ {
+ List<String> names = new ArrayList<String>();
+ if(request.getPathInfo() != null && request.getPathInfo().length()>0)
+ {
+ String path = request.getPathInfo().substring(1);
+ names.addAll(Arrays.asList(path.split("/")));
+
+ if(names.size() > _hierarchy.length)
+ {
+ throw new IllegalArgumentException("Too many entries in path");
+ }
+ }
+
+ Collection<ConfiguredObject> parents = Collections.singleton((ConfiguredObject) getBroker());
+ Collection<ConfiguredObject> children = new ArrayList<ConfiguredObject>();
+
+ Map<Class<? extends ConfiguredObject>, String> filters =
+ new HashMap<Class<? extends ConfiguredObject>, String>();
+
+ for(int i = 0; i < _hierarchy.length; i++)
+ {
+ if(i == 0 || Model.getChildTypes(_hierarchy[i - 1]).contains(_hierarchy[i]))
+ {
+
+ for(ConfiguredObject parent : parents)
+ {
+ if(names.size() > i
+ && names.get(i) != null
+ && !names.get(i).equals("*")
+ && names.get(i).trim().length() != 0)
+ {
+ for(ConfiguredObject child : parent.getChildren(_hierarchy[i]))
+ {
+ if(child.getName().equals(names.get(i)))
+ {
+ children.add(child);
+ }
+ }
+ }
+ else
+ {
+ children.addAll(parent.getChildren(_hierarchy[i]));
+ }
+ }
+ }
+ else
+ {
+ children = parents;
+ if(names.size() > i
+ && names.get(i) != null
+ && !names.get(i).equals("*")
+ && names.get(i).trim().length() != 0)
+ {
+ filters.put(_hierarchy[i], names.get(i));
+ }
+ }
+
+ parents = children;
+ children = new ArrayList<ConfiguredObject>();
+ }
+
+ if(!filters.isEmpty())
+ {
+ Collection<ConfiguredObject> potentials = parents;
+ parents = new ArrayList<ConfiguredObject>();
+
+ for(ConfiguredObject o : potentials)
+ {
+
+ boolean match = true;
+
+ for(Map.Entry<Class<? extends ConfiguredObject>, String> entry : filters.entrySet())
+ {
+ Collection<? extends ConfiguredObject> ancestors =
+ getAncestors(_hierarchy[_hierarchy.length-1],entry.getKey(), o);
+ match = false;
+ for(ConfiguredObject ancestor : ancestors)
+ {
+ if(ancestor.getName().equals(entry.getValue()))
+ {
+ match = true;
+ break;
+ }
+ }
+ if(!match)
+ {
+ break;
+ }
+ }
+ if(match)
+ {
+ parents.add(o);
+ }
+
+ }
+ }
+
+ return parents;
+ }
+
+ private Collection<? extends ConfiguredObject> getAncestors(Class<? extends ConfiguredObject> childType,
+ Class<? extends ConfiguredObject> ancestorType,
+ ConfiguredObject child)
+ {
+ Collection<ConfiguredObject> ancestors = new HashSet<ConfiguredObject>();
+ Collection<Class<? extends ConfiguredObject>> parentTypes = Model.getParentTypes(childType);
+
+ for(Class<? extends ConfiguredObject> parentClazz : parentTypes)
+ {
+ if(parentClazz == ancestorType)
+ {
+ ConfiguredObject parent = child.getParent(parentClazz);
+ if(parent != null)
+ {
+ ancestors.add(parent);
+ }
+ }
+ else
+ {
+ ConfiguredObject parent = child.getParent(parentClazz);
+ if(parent != null)
+ {
+ ancestors.addAll(getAncestors(parentClazz, ancestorType, parent));
+ }
+ }
+ }
+
+ return ancestors;
+ }
+
+
+ protected Map<String, Object> convertObjectToMap(final ConfiguredObject confObject,
+ Class<? extends ConfiguredObject> clazz,
+ int depth)
+ {
+ Map<String, Object> object = new LinkedHashMap<String, Object>();
+
+ for(String name : confObject.getAttributeNames())
+ {
+ Object value = confObject.getAttribute(name);
+ if(value != null)
+ {
+ object.put(name, value);
+ }
+ }
+
+ Statistics statistics = confObject.getStatistics();
+ Map<String, Object> statMap = new HashMap<String, Object>();
+ for(String name : statistics.getStatisticNames())
+ {
+ Object value = statistics.getStatistic(name);
+ if(value != null)
+ {
+ statMap.put(name, value);
+ }
+ }
+
+ if(!statMap.isEmpty())
+ {
+ object.put("statistics", statMap);
+ }
+
+ if(depth > 0)
+ {
+ for(Class<? extends ConfiguredObject> childClass : Model.getChildTypes(clazz))
+ {
+ Collection<? extends ConfiguredObject> children = confObject.getChildren(childClass);
+ if(children != null)
+ {
+ List<Map<String, Object>> childObjects = new ArrayList<Map<String, Object>>();
+
+ for(ConfiguredObject child : children)
+ {
+ childObjects.add(convertObjectToMap(child, childClass, depth-1));
+ }
+
+ if(!childObjects.isEmpty())
+ {
+ object.put(childClass.getSimpleName().toLowerCase()+"s",childObjects);
+ }
+ }
+ }
+ }
+ return object;
+ }
+
+ @Override
+ protected void onGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ response.setContentType("application/json");
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ response.setHeader("Cache-Control","no-cache");
+ response.setHeader("Pragma","no-cache");
+ response.setDateHeader ("Expires", 0);
+
+ Collection<ConfiguredObject> allObjects = getObjects(request);
+
+ @SuppressWarnings("unchecked")
+ Map params = new HashMap(request.getParameterMap());
+
+ int depth = 1;
+ try
+ {
+ depth = Integer.parseInt(String.valueOf(params.remove("depth")));
+ }
+ catch (NumberFormatException e)
+ {
+ // Ignore
+ }
+
+ List<Map<String, Object>> output = new ArrayList<Map<String, Object>>();
+
+ if(!params.isEmpty())
+ {
+ // TODO - depth and sort special params, everything else should act as a filter
+ }
+
+ for(ConfiguredObject configuredObject : allObjects)
+ {
+ output.add(convertObjectToMap(configuredObject, _hierarchy[_hierarchy.length-1],depth));
+ }
+
+ final PrintWriter writer = response.getWriter();
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
+ mapper.writeValue(writer, output);
+
+ response.setContentType("application/json");
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ }
+
+ @Override
+ protected void onPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ response.setContentType("application/json");
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ @SuppressWarnings("unchecked")
+ Map<String,Object> providedObject = mapper.readValue(request.getInputStream(), LinkedHashMap.class);
+
+
+ List<String> names = new ArrayList<String>();
+ if(request.getPathInfo() != null && request.getPathInfo().length()>0)
+ {
+ String path = request.getPathInfo().substring(1);
+ names.addAll(Arrays.asList(path.split("/")));
+
+ if(names.size() != _hierarchy.length)
+ {
+ throw new IllegalArgumentException("Path to object to create must be fully specified");
+ }
+ }
+
+
+ providedObject.put("name", names.get(names.size()-1));
+
+ @SuppressWarnings("unchecked")
+ Collection<ConfiguredObject>[] objects = new Collection[_hierarchy.length];
+ if(_hierarchy.length == 1)
+ {
+ getBroker().createChild(_hierarchy[0], providedObject);
+ }
+ else
+ {
+ for(int i = 0; i < _hierarchy.length-1; i++)
+ {
+ objects[i] = new HashSet<ConfiguredObject>();
+ if(i == 0)
+ {
+ for(ConfiguredObject object : getBroker().getChildren(_hierarchy[0]))
+ {
+ if(object.getName().equals(names.get(0)))
+ {
+ objects[0].add(object);
+ break;
+ }
+ }
+ }
+ else
+ {
+ 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);
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ }
+ List<ConfiguredObject> parents = new ArrayList<ConfiguredObject>();
+ Class<? extends ConfiguredObject> objClass = _hierarchy[_hierarchy.length - 1];
+ 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());
+ }
+ }
+
+ }
+ ConfiguredObject theParent = parents.remove(0);
+ ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
+
+ theParent.createChild(objClass, providedObject, otherParents);
+ }
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org