diff --git a/src/org/redkale/boot/RestDocs.java b/src/org/redkale/boot/RestDocs.java index 572f4cd53..090d1f0b1 100644 --- a/src/org/redkale/boot/RestDocs.java +++ b/src/org/redkale/boot/RestDocs.java @@ -5,11 +5,18 @@ */ package org.redkale.boot; +import java.io.*; +import java.lang.reflect.Method; +import java.util.*; +import org.redkale.convert.json.JsonConvert; +import org.redkale.net.http.*; + /** + * 继承 HttpBaseServlet 是为了获取 WebAction 信息 * * @author zhangjx */ -public class RestDocs { +public class RestDocs extends HttpBaseServlet { private final Application app; @@ -18,6 +25,61 @@ public class RestDocs { } public void run() throws Exception { + List serverList = new ArrayList<>(); + for (NodeServer node : app.servers) { + if (!(node instanceof NodeHttpServer)) continue; + final Map map = new LinkedHashMap<>(); + serverList.add(map); + HttpServer server = node.getServer(); + map.put("address", server.getSocketAddress()); + List servletsList = new ArrayList<>(); + map.put("servlets", servletsList); + for (HttpServlet servlet : server.getPrepareServlet().getServlets()) { + if (!(servlet instanceof RestHttpServlet)) continue; + WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class); + if (ws == null) { + System.err.println(servlet + " not found @WebServlet"); + continue; + } + final Map servletmap = new LinkedHashMap<>(); + servletmap.put("mappings", ws.value()); + servletmap.put("moduleid", ws.moduleid()); + servletmap.put("name", ws.name()); + servletmap.put("comment", ws.comment()); + List actionsList = new ArrayList<>(); + servletmap.put("actions", actionsList); + for (Method method : servlet.getClass().getMethods()) { + if (method.getParameterCount() != 2) continue; + WebAction action = method.getAnnotation(WebAction.class); + if (action == null) continue; + final Map actionmap = new LinkedHashMap<>(); + actionmap.put("url", action.url()); + actionmap.put("auth", method.getAnnotation(AuthIgnore.class) == null); + actionmap.put("actionid", action.actionid()); + actionmap.put("comment", action.comment()); + List paramsList = new ArrayList<>(); + actionmap.put("params", paramsList); + for (WebParam param : action.params()) { + final Map parammap = new LinkedHashMap<>(); + parammap.put("name", param.value()); + parammap.put("radix", param.radix()); + parammap.put("type", param.type().getName()); + parammap.put("src", param.src()); + paramsList.add(parammap); + } + actionsList.add(actionmap); + } + servletsList.add(servletmap); + } + } + final FileOutputStream out = new FileOutputStream(new File(app.getHome(), "restdoc.json")); + out.write(JsonConvert.root().convertTo(serverList).getBytes("UTF-8")); + out.close(); + } + + @Override + public boolean authenticate(int module, int actionid, HttpRequest request, HttpResponse response) throws IOException { + return true; } } diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index b61a35eb4..33eff5a97 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -91,4 +91,8 @@ public abstract class PrepareServlet getServlets() { + return new LinkedHashSet<>(servlets); + } } diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 17c753812..046cbdde1 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -158,10 +158,6 @@ public final class HttpPrepareServlet extends PrepareServlet getServlets() { - return this.servlets; - } - @Override public void destroy(HttpContext context, AnyValue config) { this.resourceHttpServlet.destroy(context, config);