package reptile.apidoc; import entity.RequestInfo; import entity.RequestParam; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import utils.FileUtils; import utils.StringUtils; import java.io.File; import java.util.ArrayList; public class ApiDocMain { public static void main(String[] args) { String path = "temp" + File.separator + "apidoc" + File.separator + "apidoc.txt"; ArrayList<RequestInfo> infos = parseApiDoc(path); genCode(infos); } private static void genCode(ArrayList<RequestInfo> infos) { StringBuilder sbUrls = new StringBuilder(); StringBuilder sb = new StringBuilder(); for (RequestInfo info : infos) { String urlName = info.getName(); String url = info.getUrl(); sbUrls.append(StringUtils.formatSingleLine(1, "/**")); sbUrls.append(StringUtils.formatSingleLine(1, " * " + info.getDes())); sbUrls.append(StringUtils.formatSingleLine(1, " */")); sbUrls.append(StringUtils.formatSingleLine(1, "public static final String " + urlName + " = \"" + url + "\";")); sbUrls.append("\n"); // 方式注释里参数 StringBuilder sbAnotation = new StringBuilder(); // 方法参数里参数 StringBuilder sbParam = new StringBuilder(); // 方法内容里参数 StringBuilder sbBody = new StringBuilder(); ArrayList<RequestParam> params = info.getParams(); if (params != null && params.size() > 0) { sbAnotation.append(StringUtils.formatSingleLine(1, " *")); for (RequestParam param : params) { // 方式注释里参数 // * @param name 姓名 sbAnotation.append(StringUtils.formatSingleLine( 1, " * @param " + param.getName() + " " + param.getDes())); // 方法参数里参数 String phone, HttpListener<Object> listener sbParam.append(param.getType() + " " + param.getName() + ", "); // 方法内容里参数 params.put("phone", phone); sbBody.append(StringUtils.formatSingleLine( 2, "params.put(\"" + param.getName() + "\", " + param.getName() + ");")); } } sbParam.append("HttpListener<Object> listener"); sb.append(StringUtils.formatSingleLine(1, "/**")); sb.append(StringUtils.formatSingleLine(1, " * " + info.getDes())); sb.append(sbAnotation.toString()); sb.append(StringUtils.formatSingleLine(1, " */")); StringBuilder methodNameSb = new StringBuilder(); String[] nameItems = url.substring(1).split("[/_]"); for (int i = 0; i < nameItems.length; i++) { String nameItem = nameItems[i]; if (i > 0 && nameItem.length() > 0) { nameItem = nameItem.substring(0, 1).toUpperCase() + nameItem.substring(1); } methodNameSb.append(nameItem); } sb.append(StringUtils.formatSingleLine(1, "public static void " + methodNameSb.toString() + "(" + sbParam.toString() + ") {")); sb.append(StringUtils.formatSingleLine(2, "HashMap<String, Object> params = new HashMap<String, Object>();")); sb.append(sbBody.toString()); sb.append(StringUtils.formatSingleLine(2, "doHttp(URLs.getUrl(URLs." + urlName + ")" + ", \"" + info.getMethod() + "\", params, Object.class, listener);")); sb.append(StringUtils.formatSingleLine(1, "}")); sb.append("\n"); } System.out.println(sbUrls.toString()); System.out.println("--------------"); System.out.println(sb.toString()); } public static ArrayList<RequestInfo> parseApiDoc(String path) { File file = new File(path); String response = FileUtils.readToString(file, "UTF-8"); Document parse = Jsoup.parse(response); ArrayList<RequestInfo> requestInfos = new ArrayList<RequestInfo>(); // 接口类型总称 api-Search Elements rootElements = parse.getElementsByTag("section"); for(Element rootElement : rootElements) { // 全部类型接口 Elements docElements = rootElement.getElementsByTag("article"); for (Element e : docElements) { RequestInfo requestInfo = new RequestInfo(); // method post/get String method = "post"; // System.out.println("-----> method = " + method); requestInfo.setMethod(method); String host = "http://short-server.cloudchat.stone-chat.com"; // url String url = e.getElementsByAttributeValue("class", "pln").get(0) .text().replace(host, ""); // System.out.println("-----> url = " + url); requestInfo.setUrl(url); // System.out.println("---> name = " + attrId); String name = url.substring(1).replace("/", "_").toUpperCase(); requestInfo.setName(name); // des String des = e.getElementsByAttributeValue("class", "pull-left") .get(0).text(); // System.out.println("-----> des = " + des); requestInfo.setDes(des); // post params Elements paramsElements = e.getElementsByTag("table"); ArrayList<RequestParam> params = new ArrayList<RequestParam>(); if (paramsElements.size() > 0) { Element ePostParams = paramsElements.get(0); for (Element ePostParam : ePostParams.getElementsByTag("tr")) { // param 字段 Elements eColumn = ePostParam.getElementsByTag("td"); if (eColumn.size() == 0) { continue; } // 第一个字段为参数名 String paramName = eColumn.get(0).text(); paramName = paramName.replace(" ", ""); paramName = paramName.replace("選項", ""); paramName = paramName.trim(); // 第二个字段为参数类型 // 可能类型为 String Number Float String paramType = eColumn.get(1).text(); // 第三个字段为参数描述 String paramDes = eColumn.get(2).text(); // System.out.println("-----> param = " + paramName + // " ... " // + paramType + " ... " + paramDes); RequestParam param = new RequestParam(paramName, paramType, paramDes, null); params.add(param); } } requestInfo.setParams(params); requestInfos.add(requestInfo); // System.out.println(); } } return requestInfos; } }