Bladeren bron

补充注释

mxd 5 jaren geleden
bovenliggende
commit
19e16fc73c

+ 3 - 0
src/main/java/org/ssssssss/magicapi/config/ApiInfo.java

@@ -4,6 +4,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 import java.util.Map;
 
+/**
+ * 接口信息
+ */
 public class ApiInfo {
 
 	/**

+ 24 - 1
src/main/java/org/ssssssss/magicapi/config/DynamicDataSource.java

@@ -11,16 +11,27 @@ import javax.sql.DataSource;
 import java.util.HashMap;
 import java.util.Map;
 
+/**
+ * 动态数据源
+ */
 public class DynamicDataSource {
 
     private static Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);
 
     private Map<String, DataSourceNode> dataSourceMap = new HashMap<>();
 
+    /**
+     * 注册默认数据源
+     */
     public void put(DataSource dataSource) {
         put(null, dataSource);
     }
 
+    /**
+     * 注册数据源(可以运行时注册)
+     *
+     * @param dataSourceName 数据源名称
+     */
     public void put(String dataSourceName, DataSource dataSource) {
         if (dataSourceName == null) {
             dataSourceName = "";
@@ -29,10 +40,19 @@ public class DynamicDataSource {
         this.dataSourceMap.put(dataSourceName, new DataSourceNode(dataSource));
     }
 
+    /**
+     * 获取默认数据源
+     * @return
+     */
     public DataSourceNode getDataSource() {
         return getDataSource(null);
     }
 
+    /**
+     * 获取数据源
+     * @param dataSourceName    数据源名称
+     * @return
+     */
     public DataSourceNode getDataSource(String dataSourceName) {
         if (dataSourceName == null) {
             dataSourceName = "";
@@ -42,8 +62,11 @@ public class DynamicDataSource {
         return dataSourceNode;
     }
 
-    public static class DataSourceNode{
+    public static class DataSourceNode {
 
+        /**
+         * 事务管理器
+         */
         private DataSourceTransactionManager dataSourceTransactionManager;
 
         private JdbcTemplate jdbcTemplate;

+ 6 - 0
src/main/java/org/ssssssss/magicapi/config/MagicModule.java

@@ -1,6 +1,12 @@
 package org.ssssssss.magicapi.config;
 
+/**
+ * 模块,主要用于import指令,import时根据模块名获取当前类如:import assert;
+ */
 public interface MagicModule {
 
+	/**
+	 * 获取模块名
+	 */
 	public String getModuleName();
 }

+ 15 - 4
src/main/java/org/ssssssss/magicapi/config/MagicScriptCompiler.java

@@ -4,16 +4,27 @@ import org.ssssssss.magicapi.cache.DefaultSqlCache;
 import org.ssssssss.magicapi.utils.MD5Utils;
 import org.ssssssss.script.MagicScript;
 
+/**
+ * 脚本编译
+ */
 public class MagicScriptCompiler {
 
+	/**
+	 * 编译缓存
+	 */
 	private static DefaultSqlCache compileCache = new DefaultSqlCache(500, -1);
 
+	/**
+	 * 编译脚本
+	 *
+	 * @param script 脚本内容
+	 */
 	public static MagicScript compile(String script) {
-		String key = MD5Utils.encrypt(script);
+		String key = MD5Utils.encrypt(script);    //先对脚本MD5作为key
 		MagicScript magicScript = (MagicScript) compileCache.get("default", key);
-		if(magicScript == null){
-			magicScript = MagicScript.create(script);
-			compileCache.put("default",key,magicScript,-1);
+		if (magicScript == null) {
+			magicScript = MagicScript.create(script);    //编译
+			compileCache.put("default", key, magicScript, -1);
 		}
 		return magicScript;
 	}

+ 59 - 2
src/main/java/org/ssssssss/magicapi/config/MappingHandlerMapping.java

@@ -18,14 +18,40 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+/**
+ * 请求映射
+ */
 public class MappingHandlerMapping {
 
+	/**
+	 * 已缓存的映射信息
+	 */
 	private static Map<String, ApiInfo> mappings = new ConcurrentHashMap<>();
+
 	private static Logger logger = LoggerFactory.getLogger(MappingHandlerMapping.class);
+
+	/**
+	 * spring中的请求映射处理器
+	 */
 	private RequestMappingHandlerMapping requestMappingHandlerMapping;
+
+	/**
+	 * 请求处理器
+	 */
 	private RequestHandler handler;
+
+	/**
+	 * 请求到达时处理的方法
+	 */
 	private Method method = RequestHandler.class.getDeclaredMethod("invoke", HttpServletRequest.class, HttpServletResponse.class, Map.class, Map.class, Map.class);
+
+	/**
+	 * 接口信息读取
+	 */
 	private ApiServiceProvider magicApiService;
+	/**
+	 * 统一接口前缀
+	 */
 	private String prefix;
 
 	public MappingHandlerMapping() throws NoSuchMethodException {
@@ -35,16 +61,30 @@ public class MappingHandlerMapping {
 		this.prefix = prefix;
 	}
 
+	/**
+	 * 根据request获取对应的接口信息
+	 */
 	public static ApiInfo getMappingApiInfo(HttpServletRequest request) {
 		NativeWebRequest webRequest = new ServletWebRequest(request);
+		// 找到注册的路径
 		String requestMapping = (String) webRequest.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
+		// 根据请求方法和路径获取接口信息
 		return getMappingApiInfo(buildMappingKey(request.getMethod(), requestMapping));
 	}
 
+	/**
+	 * 根据绑定的key获取接口信息
+	 */
 	public static ApiInfo getMappingApiInfo(String key) {
 		return mappings.get(key);
 	}
 
+	/**
+	 * 构建缓存map的key
+	 * @param requestMethod	请求方法
+	 * @param requestMapping	请求路径
+	 * @return
+	 */
 	public static String buildMappingKey(String requestMethod, String requestMapping) {
 		return requestMethod.toUpperCase() + ":" + requestMapping;
 	}
@@ -61,6 +101,9 @@ public class MappingHandlerMapping {
 		this.magicApiService = magicApiService;
 	}
 
+	/**
+	 * 注册请求
+	 */
 	public void registerAllMapping() {
 		List<ApiInfo> list = magicApiService.listWithScript();
 		if (list != null) {
@@ -70,6 +113,11 @@ public class MappingHandlerMapping {
 		}
 	}
 
+	/**
+	 * 根据请求方法和路径获取接口信息
+	 * @param method	请求方法
+	 * @param requestMapping	请求路径
+	 */
 	public ApiInfo getApiInfo(String method, String requestMapping) {
 		return mappings.get(buildMappingKey(method, requestMapping));
 	}
@@ -80,6 +128,7 @@ public class MappingHandlerMapping {
 	 * @param info
 	 */
 	public void registerMapping(ApiInfo info) {
+		// 先判断是否已注册,如果已注册,则先取消注册在进行注册。
 		if (mappings.containsKey(info.getId())) {
 			ApiInfo oldInfo = mappings.get(info.getId());
 			logger.info("取消注册接口:{}", oldInfo.getName());
@@ -97,8 +146,6 @@ public class MappingHandlerMapping {
 
 	/**
 	 * 取消注册请求映射
-	 *
-	 * @param id
 	 */
 	public void unregisterMapping(String id) {
 		ApiInfo info = mappings.remove(id);
@@ -109,10 +156,17 @@ public class MappingHandlerMapping {
 		}
 	}
 
+	/**
+	 * 根据接口信息获取绑定map的key
+	 */
 	private String getMappingKey(ApiInfo info) {
 		return buildMappingKey(info.getMethod(), getRequestPath(info.getPath()));
 	}
 
+	/**
+	 * 处理前缀
+	 * @param path	请求路径
+	 */
 	private String getRequestPath(String path) {
 		if (prefix != null) {
 			path = prefix + (path.startsWith("/") ? path.substring(1) : path);
@@ -120,6 +174,9 @@ public class MappingHandlerMapping {
 		return path;
 	}
 
+	/**
+	 * 根据接口信息构建 RequestMappingInfo
+	 */
 	private RequestMappingInfo getRequestMapping(ApiInfo info) {
 		return RequestMappingInfo.paths(getRequestPath(info.getPath())).methods(RequestMethod.valueOf(info.getMethod().toUpperCase())).build();
 	}

+ 13 - 0
src/main/java/org/ssssssss/magicapi/config/RequestHandler.java

@@ -23,10 +23,19 @@ public class RequestHandler {
 
 	private static Logger logger = LoggerFactory.getLogger(RequestHandler.class);
 
+	/**
+	 * 请求拦截器
+	 */
 	private List<RequestInterceptor> requestInterceptors = new ArrayList<>();
 
+	/**
+	 * 请求出错时,是否抛出异常
+	 */
 	private boolean throwException = false;
 
+	/**
+	 * 结果处理器
+	 */
 	private ResultProvider resultProvider;
 
 	public void setResultProvider(ResultProvider resultProvider) {
@@ -48,7 +57,9 @@ public class RequestHandler {
 						 @RequestBody(required = false) Map<String, Object> requestBody) throws Throwable {
 		ApiInfo info;
 		try {
+			//	找到对应的接口信息
 			info = MappingHandlerMapping.getMappingApiInfo(request);
+			// 构建脚本上下文
 			MagicScriptContext context = new MagicScriptContext();
 			context.putMapIntoContext(parameters);
 			context.putMapIntoContext(pathVariables);
@@ -66,6 +77,7 @@ public class RequestHandler {
 					return value;
 				}
 			}
+			// 执行脚本
 			Object value = MagicScriptEngine.execute(MagicScriptCompiler.compile(info.getScript()), context);
 			// 执行后置拦截器
 			for (RequestInterceptor requestInterceptor : requestInterceptors) {
@@ -79,6 +91,7 @@ public class RequestHandler {
 			if (throwException) {
 				throw root;
 			}
+			logger.error("接口请求出错", root);
 			return resultProvider.buildResult(root);
 		}
 

+ 5 - 2
src/main/java/org/ssssssss/magicapi/config/WebUIController.java

@@ -26,6 +26,9 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
+/**
+ * 页面UI对应的Controller
+ */
 public class WebUIController {
 
 	private static Logger logger = LoggerFactory.getLogger(WebUIController.class);
@@ -104,7 +107,7 @@ public class WebUIController {
 		}
 		try {
 			boolean success = this.magicApiService.delete(id);
-			if (success) {
+			if (success) {	//删除成功时在取消注册
 				mappingHandlerMapping.unregisterMapping(id);
 			}
 			return new JsonBean<>(success);
@@ -130,7 +133,7 @@ public class WebUIController {
 		}
 		try {
 			boolean success = this.magicApiService.deleteGroup(groupName);
-			if (success) {
+			if (success) {	//删除成功时取消注册
 				if (StringUtils.isNotBlank(apiIds)) {
 					String[] ids = apiIds.split(",");
 					if (ids != null && ids.length > 0) {

+ 0 - 107
src/main/java/org/ssssssss/magicapi/context/RequestContext.java

@@ -1,107 +0,0 @@
-package org.ssssssss.magicapi.context;
-
-import org.springframework.web.context.request.NativeWebRequest;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.ServletWebRequest;
-import org.springframework.web.servlet.HandlerMapping;
-import org.ssssssss.magicapi.model.Page;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
-public class RequestContext extends HashMap<String, Object> {
-
-    private HttpServletRequest request;
-
-    private List<Object> parameters = new ArrayList<>();
-
-    private Map<String, String> pathVariables;
-
-    private String requestMapping;
-
-    private String requestMethod;
-
-    private Object requestBody;
-
-    private Page page;
-
-    public RequestContext(Map<String, Object> params) {
-        putAll(params);
-    }
-
-    public RequestContext(Map<String, Object> params, Page page) {
-        putAll(params);
-        this.page = page;
-    }
-
-    public RequestContext(HttpServletRequest request) {
-        this.request = request;
-        Enumeration<String> parameterNames = request.getParameterNames();
-        while (parameterNames.hasMoreElements()) {
-            String key = parameterNames.nextElement();
-            put(key, request.getParameter(key));
-        }
-        NativeWebRequest webRequest = new ServletWebRequest(request);
-        // 解析requestMapping
-        this.requestMapping = (String) webRequest.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
-        // 解析pathVariable
-        this.pathVariables = (Map<String, String>) webRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
-        this.putAll(this.pathVariables);
-        // 请求方法
-        this.requestMethod = request.getMethod();
-        put("header", new HeaderContext(request));
-        put("cookie", new CookieContext(request));
-        put("session", new SessionContext(request.getSession()));
-    }
-
-    /**
-     * 获取HttpServletRequest对象
-     */
-    public HttpServletRequest getRequest() {
-        return request;
-    }
-
-    /**
-     * 追加SQL参数
-     *
-     * @param value
-     */
-    public void addParameter(Object value) {
-        this.parameters.add(value);
-    }
-
-    /**
-     * 获取SQL参数
-     *
-     * @return
-     */
-    public List<Object> getParameters() {
-        return parameters;
-    }
-
-
-    public Object getRequestBody() {
-        return requestBody;
-    }
-
-    public void setRequestBody(Object requestBody) {
-        this.requestBody = requestBody;
-        this.put("body", this.requestBody);
-    }
-
-    public Map<String, String> getPathVariables() {
-        return pathVariables;
-    }
-
-    public String getRequestMapping() {
-        return requestMapping;
-    }
-
-    public String getRequestMethod() {
-        return requestMethod;
-    }
-
-    public Page getPage() {
-        return page;
-    }
-}

+ 0 - 18
src/main/java/org/ssssssss/magicapi/context/RequestContextHolder.java

@@ -1,18 +0,0 @@
-package org.ssssssss.magicapi.context;
-
-public class RequestContextHolder {
-
-	private static final ThreadLocal<RequestContext> THREAD_LOCAL = new ThreadLocal<>();
-
-	public static RequestContext get() {
-		return THREAD_LOCAL.get();
-	}
-
-	public static void set(RequestContext requestContext) {
-		THREAD_LOCAL.set(requestContext);
-	}
-
-	public static void remove() {
-		THREAD_LOCAL.remove();
-	}
-}

+ 30 - 0
src/main/java/org/ssssssss/magicapi/functions/AssertFunctions.java

@@ -8,30 +8,60 @@ import java.util.regex.Pattern;
 
 public class AssertFunctions implements MagicModule {
 
+	/**
+	 * 判断值不能为null
+	 * @param value	值
+	 * @param code	状态码
+	 * @param message	状态说明
+	 */
 	public static void notNull(Object value, int code, String message) {
 		if (value == null) {
 			throw new MagicScriptAssertException(code, message);
 		}
 	}
 
+	/**
+	 * 判断值不能为empty
+	 * @param value	值
+	 * @param code	状态码
+	 * @param message	状态说明
+	 */
 	public static void notEmpty(String value, int code, String message) {
 		if (StringUtils.isEmpty(value)) {
 			throw new MagicScriptAssertException(code, message);
 		}
 	}
 
+	/**
+	 * 判断值不能为blank
+	 * @param value	值
+	 * @param code	状态码
+	 * @param message	状态说明
+	 */
 	public static void notBlank(String value, int code, String message) {
 		if (StringUtils.isBlank(value)) {
 			throw new MagicScriptAssertException(code, message);
 		}
 	}
 
+	/**
+	 * 正则验证值
+	 * @param value	值
+	 * @param code	状态码
+	 * @param message	状态说明
+	 */
 	public static void regx(String value, String pattern, int code, String message) {
 		if (value == null || !Pattern.compile(pattern).matcher(value).matches()) {
 			throw new MagicScriptAssertException(code, message);
 		}
 	}
 
+	/**
+	 * 判断值值是否为true
+	 * @param value	值
+	 * @param code	状态码
+	 * @param message	状态说明
+	 */
 	public static void isTrue(boolean value, int code, String message) {
 		if (!value) {
 			throw new MagicScriptAssertException(code, message);

+ 71 - 0
src/main/java/org/ssssssss/magicapi/functions/DatabaseQuery.java

@@ -112,6 +112,11 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		return query;
 	}
 
+	/**
+	 * 开启事务,在一个回调中进行操作
+	 * @param function	回调函数
+	 * @return
+	 */
 	public Object transaction(Function<?, ?> function) {
 		Transaction transaction = transaction();    //创建事务
 		try {
@@ -124,10 +129,18 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		}
 	}
 
+	/**
+	 * 开启事务,手动提交和回滚
+	 * @return
+	 */
 	public Transaction transaction() {
 		return new Transaction(this.dataSourceNode.getDataSourceTransactionManager());
 	}
 
+	/**
+	 * 添加至缓存
+	 * @param value	缓存名
+	 */
 	@UnableCall
 	private <T> T putCacheValue(T value, BoundSql boundSql) {
 		if (this.cacheName != null) {
@@ -136,6 +149,12 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		return value;
 	}
 
+	/**
+	 * 使用缓存
+	 * @param cacheName	缓存名
+	 * @param ttl 过期时间
+	 * @return
+	 */
 	public DatabaseQuery cache(String cacheName, long ttl) {
 		if (cacheName == null) {
 			return this;
@@ -146,10 +165,18 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		return query;
 	}
 
+	/**
+	 * 使用缓存(采用默认缓存时间)
+	 * @param cacheName	缓冲名
+	 * @return
+	 */
 	public DatabaseQuery cache(String cacheName) {
 		return cache(cacheName, 0);
 	}
 
+	/**
+	 * 数据源切换
+	 */
 	@Override
 	public DatabaseQuery get(Object key) {
 		DatabaseQuery query = cloneQuery();
@@ -162,12 +189,18 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 	}
 
 
+	/**
+	 * 查询List
+	 */
 	public List<Map<String, Object>> select(String sql) {
 		BoundSql boundSql = new BoundSql(sql);
 		return (List<Map<String, Object>>) boundSql.getCacheValue(this.sqlCache, this.cacheName)
 				.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), this.rowMapper, boundSql.getParameters()), boundSql));
 	}
 
+	/**
+	 * 执行update
+	 */
 	public int update(String sql) {
 		BoundSql boundSql = new BoundSql(sql);
 		int value = dataSourceNode.getJdbcTemplate().update(boundSql.getSql(), boundSql.getParameters());
@@ -177,11 +210,17 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		return value;
 	}
 
+	/**
+	 * 分页查询
+	 */
 	public Object page(String sql) {
 		Page page = pageProvider.getPage(MagicScriptContext.get());
 		return page(sql, page.getLimit(), page.getOffset());
 	}
 
+	/**
+	 * 分页查询(手动传入limit和offset参数)
+	 */
 	public Object page(String sql, long limit, long offset) {
 		BoundSql boundSql = new BoundSql(sql);
 		Connection connection = null;
@@ -208,12 +247,18 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		return resultProvider.buildPageResult(count, list);
 	}
 
+	/**
+	 * 查询int值
+	 */
 	public Integer selectInt(String sql) {
 		BoundSql boundSql = new BoundSql(sql);
 		return (Integer) boundSql.getCacheValue(this.sqlCache, this.cacheName)
 				.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().queryForObject(boundSql.getSql(), boundSql.getParameters(), Integer.class), boundSql));
 	}
 
+	/**
+	 * 查询Map
+	 */
 	public Map<String, Object> selectOne(String sql) {
 		BoundSql boundSql = new BoundSql(sql);
 		return (Map<String, Object>) boundSql.getCacheValue(this.sqlCache, this.cacheName)
@@ -223,6 +268,9 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 				});
 	}
 
+	/**
+	 * 查询单行单列的值
+	 */
 	public Object selectValue(String sql) {
 		BoundSql boundSql = new BoundSql(sql);
 		return boundSql.getCacheValue(this.sqlCache, this.cacheName)
@@ -247,10 +295,12 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 
 		BoundSql(String sql) {
 			MagicScriptContext context = MagicScriptContext.get();
+			// 处理?{}参数
 			this.sql = ifTokenParser.parse(sql.trim(), text -> {
 				AtomicBoolean ifTrue = new AtomicBoolean(false);
 				String val = ifParamTokenParser.parse("?{" + text, param -> {
 					Object result = Parser.parseExpression(new TokenStream(tokenizer.tokenize(param))).evaluate(context);
+					//如果是String则判断是否是空,否则和判断值是否为true
 					if (result != null) {
 						if (result instanceof String) {
 							ifTrue.set(!result.toString().isEmpty());
@@ -265,10 +315,13 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 				}
 				return "";
 			});
+			// 处理${}参数
 			this.sql = concatTokenParser.parse(this.sql, text -> String.valueOf(Parser.parseExpression(new TokenStream(tokenizer.tokenize(text))).evaluate(context)));
+			// 处理#{}参数
 			this.sql = replaceTokenParser.parse(this.sql, text -> {
 				Object value = Parser.parseExpression(new TokenStream(tokenizer.tokenize(text))).evaluate(context);
 				try {
+					//对集合自动展开
 					List<Object> objects = StreamExtension.arrayLikeToList(value);
 					StringBuilder sb = new StringBuilder();
 					for (int i = 0, size = objects.size(); i < size; i++) {
@@ -286,23 +339,38 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 			});
 		}
 
+		/**
+		 * 添加SQL参数
+		 */
 		public void addParameter(Object value) {
 			parameters.add(value);
 		}
 
+		/**
+		 * 获取要执行的SQL
+		 */
 		public String getSql() {
 			return sql;
 		}
 
+		/**
+		 * 获取要执行的参数
+		 */
 		public Object[] getParameters() {
 			return parameters.toArray();
 		}
 
+		/**
+		 * 清空缓存key
+		 */
 		public BoundSql removeCacheKey() {
 			this.cacheKey = null;
 			return this;
 		}
 
+		/**
+		 * 获取缓存key
+		 */
 		public String getCacheKey(SqlCache sqlCache) {
 			if (cacheKey == null) {
 				cacheKey = sqlCache.buildSqlCacheKey(this);
@@ -310,6 +378,9 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 			return cacheKey;
 		}
 
+		/**
+		 * 获取缓存值
+		 */
 		public <T> Optional<T> getCacheValue(SqlCache sqlCache, String cacheName) {
 			return Optional.ofNullable(cacheName == null ? null : sqlCache.get(cacheName, getCacheKey(sqlCache)));
 		}

+ 6 - 0
src/main/java/org/ssssssss/magicapi/functions/Transaction.java

@@ -22,10 +22,16 @@ public class Transaction {
 		this.transactionStatus = dataSourceTransactionManager.getTransaction(TRANSACTION_DEFINITION);
 	}
 
+	/**
+	 * 回滚
+	 */
 	public void rollback(){
 		this.dataSourceTransactionManager.rollback(this.transactionStatus);
 	}
 
+	/**
+	 * 提交
+	 */
 	public void commit(){
 		this.dataSourceTransactionManager.commit(this.transactionStatus);
 	}