From 0822ad8d51667ded7246a95b68662eb007d28519 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Mon, 16 Mar 2015 21:51:35 +0000 Subject: QPID-6454 : Add page summarizing all api paths git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1667137 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/management/plugin/HttpManagement.java | 22 +++- .../plugin/servlet/rest/ApiDocsServlet.java | 146 +++++++++++++++------ .../src/main/java/resources/css/apidocs.css | 31 ++++- 3 files changed, 158 insertions(+), 41 deletions(-) (limited to 'qpid/java/broker-plugins') diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java index 17e306f5bd..e30571615c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java @@ -25,9 +25,12 @@ import java.io.Writer; import java.net.SocketAddress; import java.security.GeneralSecurityException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -308,6 +311,11 @@ public class HttpManagement extends AbstractPluginAdapter implem addRestServlet(root, "binding", VirtualHostNode.class, VirtualHost.class, Exchange.class, Queue.class, Binding.class); addRestServlet(root, "session", VirtualHostNode.class, VirtualHost.class, Connection.class, Session.class); + ServletHolder apiDocsServlet = new ServletHolder(new ApiDocsServlet(getModel(), Collections.emptyList())); + root.addServlet(apiDocsServlet, "/apidocs"); + root.addServlet(apiDocsServlet, "/apidocs/"); + root.addServlet(apiDocsServlet, "/apidocs/latest"); + root.addServlet(apiDocsServlet, "/apidocs/latest/"); root.addServlet(new ServletHolder(new UserPreferencesServlet()), "/service/userpreferences/*"); root.addServlet(new ServletHolder(new LoggedOnUserPreferencesServlet()), "/service/preferences"); root.addServlet(new ServletHolder(new StructureServlet()), "/service/structure"); @@ -454,9 +462,17 @@ public class HttpManagement extends AbstractPluginAdapter implem getContextValue(Long.class, MAX_HTTP_FILE_UPLOAD_SIZE_CONTEXT_NAME), -1l, getContextValue(Integer.class, MAX_HTTP_FILE_UPLOAD_SIZE_CONTEXT_NAME))); - root.addServlet(servletHolder, "/api/latest/" + name + "/*"); - root.addServlet(servletHolder, "/api/v" + BrokerModel.MODEL_MAJOR_VERSION + "/" + name + "/*"); - ServletHolder docServletHolder = new ServletHolder(name+"docs", new ApiDocsServlet(getModel(),hierarchy)); + + List paths = Arrays.asList("/api/latest/" + name , + "/api/v" + BrokerModel.MODEL_MAJOR_VERSION + "/" + name ); + + for(String path : paths) + { + root.addServlet(servletHolder, path + "/*"); + } + ServletHolder docServletHolder = new ServletHolder(name+"docs", new ApiDocsServlet(getModel(), + paths, + hierarchy)); root.addServlet(docServletHolder, "/apidocs/latest/" + name + "/"); root.addServlet(docServletHolder, "/apidocs/v" + BrokerModel.MODEL_MAJOR_VERSION + "/" + name +"/"); root.addServlet(docServletHolder, "/apidocs/latest/" + name ); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java index 5ef7a80660..5c30378fc6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java +++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java @@ -20,19 +20,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.security.AccessControlException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -64,19 +52,47 @@ public class ApiDocsServlet extends AbstractServlet { private static final Logger LOGGER = LoggerFactory.getLogger(ApiDocsServlet.class); private final Model _model; - private final Collection> _types; + private final List> _types; private Class[] _hierarchy; private static final Set VOWELS = new HashSet<>(Arrays.asList('a','e','i','o','u')); + public static final Comparator> CLASS_COMPARATOR = + new Comparator>() + { + @Override + public int compare(final Class o1, + final Class o2) + { + return o1.getSimpleName().compareTo(o2.getSimpleName()); + } + + }; + private static final Map, List> REGISTERED_CLASSES = new TreeMap<>(CLASS_COMPARATOR); - public ApiDocsServlet(final Model model, Class... hierarchy) + + public ApiDocsServlet(final Model model, final List registeredPaths, Class... hierarchy) { super(); _model = model; _hierarchy = hierarchy; - _types = _model.getTypeRegistry().getTypeSpecialisations(getConfiguredClass()); + _types = hierarchy.length == 0 ? null : new ArrayList<>(_model.getTypeRegistry().getTypeSpecialisations(getConfiguredClass())); + if(_types != null) + { + Collections.sort(_types, CLASS_COMPARATOR); + } + if(_hierarchy.length != 0) + { + List paths = REGISTERED_CLASSES.get(getConfiguredClass()); + if(paths == null) + { + paths = new ArrayList<>(); + REGISTERED_CLASSES.put(getConfiguredClass(), paths); + } + paths.addAll(registeredPaths); + + } } @@ -88,11 +104,51 @@ public class ApiDocsServlet extends AbstractServlet PrintWriter writer = response.getWriter(); + writePreamble(writer); writeHead(writer); - writeUsage(writer, request); - writeTypes(writer); - writeAttributes(writer); + + if(_hierarchy.length == 0) + { + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + for(Map.Entry, List> entry : REGISTERED_CLASSES.entrySet()) + { + List paths = entry.getValue(); + Class objClass = entry.getKey(); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + writer.println(""); + for(int i = 1; i < paths.size(); i++) + { + writer.println(""); + writer.println(""); + writer.println(""); + } + + } + writer.println(""); + writer.println("
TypePathDescription
"+objClass.getSimpleName()+"" + paths.get(0) + ""+ + objClass.getAnnotation(ManagedObject.class).description()+"
" + paths.get(i) + "
"); + + } + else + { + writeCategoryDescription(writer); + writeUsage(writer, request); + writeTypes(writer); + writeAttributes(writer); + } + writeFoot(writer); } @@ -101,7 +157,7 @@ public class ApiDocsServlet extends AbstractServlet writer.println(""); writer.println(""); - writer.println(""); + } @@ -109,16 +165,35 @@ public class ApiDocsServlet extends AbstractServlet { writer.println(""); writer.println(""); + writeTitle(writer); + + writer.println(""); + writer.println(""); + } + + private void writeTitle(final PrintWriter writer) + { writer.print(""); - writer.print("Qpid API : " + getConfiguredClass().getSimpleName()); + if(_hierarchy.length == 0) + { + writer.print("Qpid API"); + } + else + { + writer.print("Qpid API: " + getConfiguredClass().getSimpleName()); + } writer.println(""); + } - writer.println(""); + private void writeCategoryDescription(PrintWriter writer) + { + writer.println("

"+getConfiguredClass().getSimpleName()+"

"); + writer.println(getConfiguredClass().getAnnotation(ManagedObject.class).description()); } private void writeUsage(final PrintWriter writer, final HttpServletRequest request) { - writer.println("

Usage

"); + writer.println("

Usage

"); writer.println(""); writer.println(""); writer.print(""); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/css/apidocs.css b/qpid/java/broker-plugins/management-http/src/main/java/resources/css/apidocs.css index f79eaaaa50..5baecf7c02 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/css/apidocs.css +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/css/apidocs.css @@ -46,11 +46,40 @@ table.attributes td.name { width: 20em; } - table.attributes td.type { width: 7em; } +table.api td,th { + vertical-align: top; +} + + +table.api td.type { + width: 12em; +} + + +table.api td.path { + width: 20em; +} + + +table.api td.description { + width: 25em; +} + +table.api a:link { + color: #333; + text-decoration: none; +} + +table.api a:visited { + color: #666; + text-decoration: none; +} + + div.restriction { border-bottom: 1px dotted #666; display: inline; -- cgit v1.2.1
ReadGET" + request.getServletPath() @@ -141,22 +216,19 @@ public class ApiDocsServlet extends AbstractServlet writer.print("/<" + category.getSimpleName().toLowerCase() + " name or id>"); } - if(_hierarchy.length>1) + writer.print( + "
CreatePUT or POST" + + request.getServletPath().replace("apidocs", "api")); + for (int i = 0; i < _hierarchy.length - 1; i++) { - writer.print( - "
CreatePUT or POST" - + request.getServletPath().replace("apidocs", "api")); - for (int i = 0; i < _hierarchy.length - 1; i++) - { - writer.print("/<" + _hierarchy[i].getSimpleName().toLowerCase() + " name or id>"); - } + writer.print("/<" + _hierarchy[i].getSimpleName().toLowerCase() + " name or id>"); + } - writer.print("
DeleteDELETE" - + request.getServletPath().replace("apidocs", "api")); - for (final Class category : _hierarchy) - { - writer.print("/<" + category.getSimpleName().toLowerCase() + " name or id>"); - } + writer.print("
DeleteDELETE" + + request.getServletPath().replace("apidocs", "api")); + for (final Class category : _hierarchy) + { + writer.print("/<" + category.getSimpleName().toLowerCase() + " name or id>"); } writer.println("