Java dom4j解析RESTFull风格发布的WebService的xml文件

来源:互联网 发布:vb简单小游戏代码 编辑:程序博客网 时间:2024/06/07 04:43

公司项目要求解析出RESTFull风格发布的WebService接口的所有请求方法,参数,参数类型,已经方法是返回类型,想来想去都不知道该怎么办,思来想去然后又研究RESTFull风格WebService的xml文件,发现其实对于Java简单类型的 方法是能在xml文件中体现的,但是对于复杂类型,比如参数是一个对象,或者返回值是一个对象或者List,Map等。这些返回类型在xml文件中的 response下representation这个节点的属性type会是一个"application/json"。对于这些返回类型或者参数我没法 知道是什么类型,所以我就默认给这些Object类型。对于void类型的方法,会在response的status属性等于204,所以我就笨笨的用HttpClient抓去整个xml文件,然后用dome4j解析这个xml,幸好的是我在项目只需要解析简单类型的方法,所以想想也能达到要求.

复制代码
  1 package xxx.xxx.common;  2    3  import java.util.List;  4    5  import org.apache.commons.httpclient.HttpClient;  6  import org.apache.commons.httpclient.HttpStatus;  7  import org.apache.commons.httpclient.methods.GetMethod;  8  import org.dom4j.Document;  9  import org.dom4j.DocumentException; 10  import org.dom4j.DocumentHelper; 11  import org.dom4j.Element; 12   13  import com.google.common.collect.Lists; 14  import com.qya.vo.transform.TransformParamVO; 15  import com.qya.vo.transform.TransformVO; 16   17  import com.qya.utils.string.StringUtil; 18   19  public class TransformWsUrlUtil { 20   21      protected final String DEFAULT_URL = "http://localhost:8080/bpms/services?_wadl"; 22   23      public static List<TransformVO> transform(String url) { 24          String xml = getTransformXml(url); 25          Document doc = null; 26          try { 27              doc = DocumentHelper.parseText(xml); 28          } catch (DocumentException e) { 29              e.printStackTrace(); 30          } 31          List<TransformVO> lst = Lists.newArrayList(); 32          String rootPath = ""; 33          Element resourcesEl = doc.getRootElement().element("resources"); 34          if (resourcesEl.hasContent()) { 35              List<Element> els = resourcesEl.elements(); 36              for (Element resEl : els) { 37                  rootPath = resEl.attribute(0).getText(); 38                  if (resEl.hasContent()) { 39                      lst.addAll(getMethod(rootPath, resEl.elements())); 40                  } 41              } 42          } 43          return lst; 44      } 45   46      // 所有方法列表 47      public static List<TransformVO> getMethod(String rootPath, List<Element> els) { 48          List<TransformVO> lst = Lists.newArrayList(); 49          String wsPath = ""; 50          String returnType = ""; 51          for (Element el : els) { 52              returnType = transform2JavaType(getReturnType(el)); 53              wsPath = el.attribute("path").getText(); 54              if(!"java.lang.Object".equals(returnType)){  //此处我做了判断,只需要简单类型和void类型的方法 55                  TransformVO vo = new TransformVO(); 56                  vo.setUrl(transform2JavaType(rootPath + wsPath)); 57                  vo.setUrlMethodName(transform2JavaType(returnType + "   " + replaceSeparatorLine(wsPath) + getParamters(el))); 58                  vo.setMethodName(transform2JavaType(wsPath)); 59                  vo.setReturnType(returnType); 60                  List<TransformParamVO> paramLst = getParamterVO(el); 61                  vo.setTransformParamLst(paramLst); 62                  lst.add(vo); 63              } 64          } 65          return lst; 66      } 67   68      /** 69       * 获取方法的所有参数 70       *  71       * @param el 72       * @return 参数字符串 73       */ 74      public static String getParamters(Element el) { 75          StringBuffer buf = new StringBuffer("("); 76          Element requestEl = el.element("method").element("request"); 77          if (!StringUtil.isNullOrEmpty(requestEl)) { 78              if (requestEl.hasContent()) { 79                  for (Element paramEl : (List<Element>) requestEl.elements()) { 80                      if ("param".equals(paramEl.getName())) { 81                          buf.append(paramEl.attributeValue("type") + "  " + paramEl.attributeValue("name") + ",   "); 82                      } 83                      if ("representation".equals(paramEl.getName())) { 84                          if (paramEl.hasContent()) { 85                              for (Element pEl : (List<Element>) paramEl.elements()) { 86                                  buf.append(pEl.attributeValue("type") + "  " + pEl.attributeValue("name") + ",   "); 87                              } 88                          } 89                      } 90                  } 91              } 92          } 93          buf.append(")"); 94          return buf.toString(); 95      } 96   97      public static List<TransformParamVO> getParamterVO(Element el) { 98          List<TransformParamVO> lst = Lists.newArrayList(); 99          Element requestEl = el.element("method").element("request");100          if (!StringUtil.isNullOrEmpty(requestEl)) {101              if (requestEl.hasContent()) {102                  for (Element paramEl : (List<Element>) requestEl.elements()) {103                      if ("param".equals(paramEl.getName())) {104                          TransformParamVO vo = new TransformParamVO();105                          vo.setName(paramEl.attributeValue("name"));106                          vo.setType(transform2JavaType(paramEl.attributeValue("type")));107                          lst.add(vo);108                      }109                      if ("representation".equals(paramEl.getName())) {110                          if (paramEl.hasContent()) {111                              for (Element pEl : (List<Element>) paramEl.elements()) {112                                  TransformParamVO vo = new TransformParamVO();113                                  vo.setName(pEl.attributeValue("name"));114                                  vo.setType(transform2JavaType(pEl.attributeValue("type")));115                                  lst.add(vo);116                              }117                          }118                      }119                  }120              }121          }122          return lst;123      }124  125      /*126       * 获取返回类型127       */128      public static String getReturnType(Element el) {129          String returnType = "";130          List<Element> returnTypeEls = el.element("method").element("response").elements("representation");131          if (!StringUtil.isNullOrEmpty(returnTypeEls)) {132              if (returnTypeEls.isEmpty()) {133                  if (!StringUtil.isNullOrEmpty(el.element("method").element("response").attribute("status"))) {134                      if ("204".equals(el.element("method").element("response").attribute("status").getText())) {135                          returnType = "void";136                      }137                  }138              } else {139                  for (Element returnTypeEl : returnTypeEls) {140                      if (returnTypeEl.hasContent()) {141                          for (Element pEl : (List<Element>) returnTypeEl.elements()) {142                              returnType = pEl.attributeValue("type");143                          }144                      } else {145                          returnType = "java.lang.Object";146                      }147                  }148              }149          }150          return returnType;151      }152  153      private static String transform2JavaType(String str) {154          if (!StringUtil.isNullOrEmpty(str)) {155              if (str.contains("xs:int")) {156                  str = str.replaceAll("xs:int", "java.lang.Integer");157              }158              if (str.contains("xs:string")) {159                  str = str.replaceAll("xs:string", "java.lang.String");160              }161              if (str.contains("xs:boolean")) {162                  str = str.replaceAll("xs:boolean", "java.lang.Boolean");163              }164              if (str.contains("xs:double")) {165                  str = str.replaceAll("xs:double", "java.lang.Double");166              }167              if (str.contains("xs:dateTime")) {168                  str = str.replaceAll("xs:dateTime", "java.util.Date");169              }170              if (str.lastIndexOf(",") > 0) {171                  str = str.substring(0, str.lastIndexOf(",")) + ")";172              }173          }174          return str;175      }176      private static String replaceSeparatorLine(String str) {177          if (!StringUtil.isNullOrEmpty(str)) {178              if (str.contains("/")) {179                  str = str.replaceAll("\\/", "");180              }181          }182          return str;183      }184  185      /**186       * 后去需要转换的xml内容187       * 188       * @param url189       *            访问的webservice url190       * @return xml内容191       */192      private static String getTransformXml(String url) {193          String xml = "";194          HttpClient httpClient = new HttpClient();195          GetMethod getMethod = new GetMethod(url);196          try {197              int statusCode = httpClient.executeMethod(getMethod);198              if (statusCode != HttpStatus.SC_OK) {199                  System.err.println("Method failed: " + getMethod.getStatusLine());200              }201              // 读取内容202              byte[] responseBody = getMethod.getResponseBody();203              // 处理内容204              xml = new String(responseBody);205          } catch (Exception e) {206              System.err.println("页面无法访问");207          } finally {208              getMethod.releaseConnection();209          }210          return xml;211      }212  213  }
复制代码

TransformVO.java

复制代码
 1 package com.qya.vo.transform; 2   3  import java.io.Serializable; 4  import java.util.List; 5   6  import com.google.common.collect.Lists; 7   8  public class TransformVO implements Serializable { 9      10      private static final long serialVersionUID = -8192032660217273046L;11      private String url;12      private String urlMethodName;13      private String methodName;14      private String returnType;15      private List<TransformParamVO> transformParamLst = Lists.newArrayList();16      public String getUrl() {17          return url;18      }19      public void setUrl(String url) {20          this.url = url;21      }22      public String getUrlMethodName() {23          return urlMethodName;24      }25      public void setUrlMethodName(String urlMethodName) {26          this.urlMethodName = urlMethodName;27      }28      public String getMethodName() {29          return methodName;30      }31      public void setMethodName(String methodName) {32          this.methodName = methodName;33      }34      public String getReturnType() {35          return returnType;36      }37      public void setReturnType(String returnType) {38          this.returnType = returnType;39      }40      public List<TransformParamVO> getTransformParamLst() {41          return transformParamLst;42      }43      public void setTransformParamLst(List<TransformParamVO> transformParamLst) {44          this.transformParamLst = transformParamLst;45      }46  }
复制代码

 TransformParamVO.java

复制代码
 1 package com.qya.vo.transform; 2   3  import java.io.Serializable; 4   5  public class TransformParamVO implements Serializable { 6   7      private static final long serialVersionUID = 2728404017781534263L; 8      private String type; 9      private String name;10      public String getType() {11          return type;12      }13      public void setType(String type) {14          this.type = type;15      }16      public String getName() {17          return name;18      }19      public void setName(String name) {20          this.name = name;21      }22      23  }
复制代码
StringUtil.java
复制代码
 1 package com.qya.utils.string.StringUtil 2  3 public class StringUtil { 4  5     /** 6      * 判断是否为空后null 7      *  8      * @param obj 9      *            对象10      * @return boolean11      * @since 1.012      */13     public static boolean isNullOrEmpty(Object obj) {14         return obj == null || "".equals(obj.toString());15     }16 }
复制代码

 

0 0
原创粉丝点击