Преглед изворни кода

增加Java接口,以及脚本中调用另一个接口。

mxd пре 5 година
родитељ
комит
39aac9413a

+ 4 - 0
src/main/java/org/ssssssss/magicapi/config/MappingHandlerMapping.java

@@ -70,6 +70,10 @@ public class MappingHandlerMapping {
 		}
 	}
 
+	public ApiInfo getApiInfo(String method, String requestMapping) {
+		return mappings.get(buildMappingKey(method, requestMapping));
+	}
+
 	/**
 	 * 注册请求映射
 	 *

+ 3 - 30
src/main/java/org/ssssssss/magicapi/config/RequestHandler.java

@@ -12,15 +12,12 @@ import org.ssssssss.magicapi.context.SessionContext;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.MagicScriptEngine;
-import org.ssssssss.script.exception.MagicScriptAssertException;
-import org.ssssssss.script.exception.MagicScriptException;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public class RequestHandler {
 
@@ -53,8 +50,8 @@ public class RequestHandler {
 		try {
 			info = MappingHandlerMapping.getMappingApiInfo(request);
 			MagicScriptContext context = new MagicScriptContext();
-			putMapIntoContext(parameters, context);
-			putMapIntoContext(pathVariables, context);
+			context.putMapIntoContext(parameters);
+			context.putMapIntoContext(pathVariables);
 			context.set("cookie", new CookieContext(request));
 			context.set("header", new HeaderContext(request));
 			context.set("session", new SessionContext(request.getSession()));
@@ -82,32 +79,8 @@ public class RequestHandler {
 			if (throwException) {
 				throw root;
 			}
-			MagicScriptException se = null;
-			Throwable parent = root;
-			do {
-				if (parent instanceof MagicScriptAssertException) {
-					MagicScriptAssertException sae = (MagicScriptAssertException) parent;
-					return resultProvider.buildResult(sae.getCode(), sae.getMessage());
-				}
-				if (parent instanceof MagicScriptException) {
-					se = (MagicScriptException) parent;
-				}
-			} while ((parent = parent.getCause()) != null);
-			logger.error("执行接口出错", root);
-			if (se != null) {
-				return resultProvider.buildResult(-1, se.getSimpleMessage());
-			}
-			return resultProvider.buildResult(-1, root.getMessage());
+			return resultProvider.buildResult(root);
 		}
 
 	}
-
-	private void putMapIntoContext(Map<String, Object> map, MagicScriptContext context) {
-		if (map != null && !map.isEmpty()) {
-			Set<Map.Entry<String, Object>> entries = map.entrySet();
-			for (Map.Entry<String, Object> entry : entries) {
-				context.set(entry.getKey(), entry.getValue());
-			}
-		}
-	}
 }

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

@@ -10,6 +10,7 @@ import org.ssssssss.magicapi.functions.DatabaseQuery;
 import org.ssssssss.magicapi.model.JsonBean;
 import org.ssssssss.magicapi.model.JsonBodyBean;
 import org.ssssssss.magicapi.provider.ApiServiceProvider;
+import org.ssssssss.magicapi.provider.MagicAPIService;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.script.*;
 import org.ssssssss.script.exception.MagicScriptAssertException;
@@ -35,6 +36,7 @@ public class WebUIController {
 
 	public WebUIController() {
 		MagicScriptEngine.addScriptClass(DatabaseQuery.class);
+		MagicScriptEngine.addScriptClass(MagicAPIService.class);
 	}
 
 	public void setResultProvider(ResultProvider resultProvider) {

+ 8 - 0
src/main/java/org/ssssssss/magicapi/exception/MagicServiceException.java

@@ -0,0 +1,8 @@
+package org.ssssssss.magicapi.exception;
+
+public class MagicServiceException extends RuntimeException{
+
+	public MagicServiceException(String message) {
+		super(message);
+	}
+}

+ 26 - 0
src/main/java/org/ssssssss/magicapi/provider/MagicAPIService.java

@@ -0,0 +1,26 @@
+package org.ssssssss.magicapi.provider;
+
+import org.ssssssss.magicapi.config.MagicModule;
+
+import java.util.Map;
+
+public interface MagicAPIService extends MagicModule {
+
+	/**
+	 * 执行MagicAPI中的接口,原始内容,不包含code以及message信息
+	 * @param method	请求方法
+	 * @param path	请求路径
+	 * @param context 请求上下文,主要给脚本中使用
+	 * @return
+	 */
+	public Object execute(String method, String path, Map<String,Object> context);
+
+	/**
+	 * 执行MagicAPI中的接口,带code和message信息
+	 * @param method	请求方法
+	 * @param path	请求路径
+	 * @param context 请求上下文,主要给脚本中使用
+	 * @return
+	 */
+	Object call(String method, String path, Map<String,Object> context);
+}

+ 41 - 9
src/main/java/org/ssssssss/magicapi/provider/ResultProvider.java

@@ -1,14 +1,45 @@
 package org.ssssssss.magicapi.provider;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.ssssssss.magicapi.model.PageResult;
+import org.ssssssss.script.exception.MagicScriptAssertException;
+import org.ssssssss.script.exception.MagicScriptException;
 
 import java.util.List;
 
 public interface ResultProvider {
 
+	Logger logger = LoggerFactory.getLogger(ResultProvider.class);
+
+	/**
+	 * 根据异常内容构建结果
+	 * @param root
+	 * @return
+	 */
+	default Object buildResult(Throwable root) {
+		MagicScriptException se = null;
+		Throwable parent = root;
+		do {
+			if (parent instanceof MagicScriptAssertException) {
+				MagicScriptAssertException sae = (MagicScriptAssertException) parent;
+				return buildResult(sae.getCode(), sae.getMessage());
+			}
+			if (parent instanceof MagicScriptException) {
+				se = (MagicScriptException) parent;
+			}
+		} while ((parent = parent.getCause()) != null);
+		logger.error("调用接口出错", root);
+		if (se != null) {
+			return buildResult(-1, se.getSimpleMessage());
+		}
+		return buildResult(-1, root.getMessage());
+	}
+
 	/**
 	 * 构建JSON返回结果(默认状态码和状态说明)
-	 * @param data	数据内容,状态码和状态说明默认为1 "success"
+	 *
+	 * @param data 数据内容,状态码和状态说明默认为1 "success"
 	 * @return
 	 */
 	default Object buildResult(Object data) {
@@ -17,8 +48,9 @@ public interface ResultProvider {
 
 	/**
 	 * 构建JSON返回结果(无数据内容)
-	 * @param code	状态码
-	 * @param message	状态说明
+	 *
+	 * @param code    状态码
+	 * @param message 状态说明
 	 * @return
 	 */
 	default Object buildResult(int code, String message) {
@@ -27,17 +59,17 @@ public interface ResultProvider {
 
 	/**
 	 * 构建JSON返回结果
-	 * @param code	状态码
-	 * @param message	状态说明
-	 * @param data	数据内容,可以通过data的类型判断是否是分页结果进行区分普通结果集和分页结果集
+	 *
+	 * @param code    状态码
+	 * @param message 状态说明
+	 * @param data    数据内容,可以通过data的类型判断是否是分页结果进行区分普通结果集和分页结果集
 	 * @return
 	 */
 	Object buildResult(int code, String message, Object data);
 
 	/**
-	 *
-	 * @param total	总数
-	 * @param data	数据内容
+	 * @param total 总数
+	 * @param data  数据内容
 	 * @return
 	 */
 	default Object buildPageResult(long total, List<Object> data) {

+ 57 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

@@ -0,0 +1,57 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.config.ApiInfo;
+import org.ssssssss.magicapi.config.MagicScriptCompiler;
+import org.ssssssss.magicapi.config.MappingHandlerMapping;
+import org.ssssssss.magicapi.exception.MagicServiceException;
+import org.ssssssss.magicapi.provider.MagicAPIService;
+import org.ssssssss.magicapi.provider.ResultProvider;
+import org.ssssssss.script.MagicScriptContext;
+import org.ssssssss.script.MagicScriptEngine;
+
+import java.util.Map;
+
+public class DefaultMagicAPIService implements MagicAPIService {
+
+	private MappingHandlerMapping mappingHandlerMapping;
+
+	private boolean throwException;
+
+	private ResultProvider resultProvider;
+
+	public DefaultMagicAPIService(MappingHandlerMapping mappingHandlerMapping, ResultProvider resultProvider, boolean throwException) {
+		this.mappingHandlerMapping = mappingHandlerMapping;
+		this.resultProvider = resultProvider;
+		this.throwException = throwException;
+	}
+
+	@Override
+	public Object execute(String method, String path, Map<String, Object> context) {
+		ApiInfo info = this.mappingHandlerMapping.getApiInfo(method, path);
+		if (info == null) {
+			throw new MagicServiceException(String.format("找不到对应接口 [%s:%s]", method, path));
+		}
+		MagicScriptContext scriptContext = new MagicScriptContext();
+		scriptContext.putMapIntoContext(context);
+		return MagicScriptEngine.execute(MagicScriptCompiler.compile(info.getScript()), scriptContext);
+	}
+
+	@Override
+	public Object call(String method, String path, Map<String, Object> context) {
+		try {
+			return resultProvider.buildResult(execute(method, path, context));
+		} catch (MagicServiceException e) {
+			return null;    //找不到对应接口
+		} catch (Throwable root) {
+			if (throwException) {
+				throw root;
+			}
+			return resultProvider.buildResult(root);
+		}
+	}
+
+	@Override
+	public String getModuleName() {
+		return "magic";
+	}
+}