RequestExecutor.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package org.ssssssss.executor;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.apache.commons.lang3.math.NumberUtils;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import org.ssssssss.context.RequestContext;
  9. import org.ssssssss.exception.S8Exception;
  10. import org.ssssssss.expression.ExpressionEngine;
  11. import org.ssssssss.interceptor.RequestInterceptor;
  12. import org.ssssssss.model.JsonBean;
  13. import org.ssssssss.session.Configuration;
  14. import org.ssssssss.session.Statement;
  15. import org.ssssssss.session.ValidateStatement;
  16. import org.ssssssss.session.XMLStatement;
  17. import org.ssssssss.utils.Assert;
  18. import org.ssssssss.utils.DomUtils;
  19. import org.ssssssss.validator.IValidator;
  20. import org.w3c.dom.Node;
  21. import org.w3c.dom.NodeList;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.xml.xpath.XPathConstants;
  24. import java.util.ArrayList;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. public class RequestExecutor {
  29. private Configuration configuration;
  30. private StatementExecutor statementExecutor;
  31. private ExpressionEngine expressionEngine;
  32. private static Logger logger = LoggerFactory.getLogger(RequestExecutor.class);
  33. private Map<String, IValidator> validators = new HashMap<>();
  34. private List<RequestInterceptor> requestInterceptors = new ArrayList<>();
  35. public void addRequestInterceptor(RequestInterceptor requestInterceptor){
  36. this.requestInterceptors.add(requestInterceptor);
  37. }
  38. public void addValidator(IValidator validator) {
  39. this.validators.put(validator.support(), validator);
  40. }
  41. public void setConfiguration(Configuration configuration) {
  42. this.configuration = configuration;
  43. }
  44. public void setStatementExecutor(StatementExecutor statementExecutor) {
  45. this.statementExecutor = statementExecutor;
  46. }
  47. public void setExpressionEngine(ExpressionEngine expressionEngine) {
  48. this.expressionEngine = expressionEngine;
  49. }
  50. /**
  51. * http请求入口
  52. *
  53. * @param request
  54. * @return
  55. */
  56. @ResponseBody
  57. public Object invoke(HttpServletRequest request) {
  58. return invoke(request, null);
  59. }
  60. /**
  61. * http请求入口(带RequestBody)
  62. */
  63. @ResponseBody
  64. public Object invoke(HttpServletRequest request, @RequestBody(required = false) Object requestBody) {
  65. try {
  66. // 创建RequestContex对象,供后续使用
  67. RequestContext requestContext = new RequestContext(request, expressionEngine);
  68. if (!requestContext.containsKey("body")) {
  69. requestContext.setRequestBody(requestBody);
  70. }
  71. Statement statement = configuration.getStatement(requestContext.getRequestMapping());
  72. requestContext.setStatement(statement);
  73. // 执行前置拦截器
  74. for (RequestInterceptor requestInterceptor : requestInterceptors) {
  75. Object value = requestInterceptor.preHandle(requestContext);
  76. if (value != null) {
  77. return value;
  78. }
  79. }
  80. // 执行校验
  81. Object value = validate(statement, requestContext);
  82. if (value != null) {
  83. return value;
  84. }
  85. // 执行语句
  86. value = new JsonBean<>(statementExecutor.execute(statement, requestContext));
  87. // 执行后置拦截器
  88. for (RequestInterceptor requestInterceptor : requestInterceptors) {
  89. Object target = requestInterceptor.postHandle(requestContext, value);
  90. if (target != null) {
  91. return target;
  92. }
  93. }
  94. return value;
  95. } catch (Exception e) {
  96. if (configuration.isThrowException()) {
  97. throw new S8Exception("ssssssss执行出错", e);
  98. }
  99. logger.error("系统出现错误", e);
  100. return new JsonBean<>(-1, e.getMessage());
  101. }
  102. }
  103. /**
  104. * 验证节点
  105. *
  106. * @param statement
  107. * @param requestContext
  108. * @return
  109. */
  110. private JsonBean<Void> validate(Statement statement, RequestContext requestContext) {
  111. List<String> validates = statement.getValidates();
  112. XMLStatement xmlStatement = statement.getXmlStatement();
  113. for (String validateId : validates) {
  114. ValidateStatement validateStatement = xmlStatement.getValidateStatement(validateId);
  115. NodeList nodeList = validateStatement.getNodes();
  116. for (int i = 0, len = nodeList.getLength(); i < len; i++) {
  117. Node node = nodeList.item(i);
  118. // 获取name值
  119. String name = DomUtils.getNodeAttributeValue(node, "name");
  120. Object value = null;
  121. // 如果name值填了,则取其表达式值
  122. if (StringUtils.isNotBlank(name)) {
  123. value = requestContext.evaluate(name);
  124. }
  125. NodeList ruleList = (NodeList) DomUtils.evaluate("*", node, XPathConstants.NODESET);
  126. for (int j = 0, l = ruleList.getLength(); j < l; j++) {
  127. Node rule = ruleList.item(j);
  128. // 如果验证失败,返回自定义code
  129. String nodeName = rule.getNodeName();
  130. IValidator validator = validators.get(nodeName);
  131. Assert.isNotNull(validator, String.format("找不到验证器:%s", nodeName));
  132. if (!validator.validate(value, rule)) {
  133. // rule->param->validate
  134. int defaultCode = NumberUtils.toInt(DomUtils.getNodeAttributeValue(node, "code"), validateStatement.getCode());
  135. int code = NumberUtils.toInt(DomUtils.getNodeAttributeValue(rule, "code"), defaultCode);
  136. String message = rule.getTextContent();
  137. if (StringUtils.isNotBlank(message)) {
  138. message = message.trim();
  139. } else {
  140. message = DomUtils.getNodeAttributeValue(node, "message");
  141. if (StringUtils.isNotBlank(message)) {
  142. message = message.trim();
  143. } else {
  144. message = validateStatement.getMessage();
  145. }
  146. }
  147. return new JsonBean<>(code, message);
  148. }
  149. }
  150. }
  151. }
  152. // 验证通过
  153. return null;
  154. }
  155. }