RequestExecutor.java 6.0 KB

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