mxd 4 anni fa
parent
commit
98b49dde18

+ 1 - 2
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java

@@ -62,7 +62,6 @@ import org.ssssssss.script.MagicScript;
 import org.ssssssss.script.MagicScriptEngine;
 import org.ssssssss.script.functions.ExtensionMethod;
 import org.ssssssss.script.parsing.ast.statement.AsyncCall;
-import org.ssssssss.script.reflection.AbstractReflection;
 import org.ssssssss.script.reflection.JavaReflection;
 
 import javax.servlet.http.HttpServletRequest;
@@ -489,7 +488,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
 		});
 		extensionMethods.forEach(extension -> extension.supports().forEach(support -> {
 			logger.info("注册扩展:{} -> {}", support, extension.getClass());
-			AbstractReflection.getInstance().registerMethodExtension(support, extension);
+			JavaReflection.registerMethodExtension(support, extension);
 		}));
 	}
 

+ 3 - 3
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicMongoAutoConfiguration.java

@@ -10,7 +10,7 @@ import org.springframework.data.mongodb.core.MongoTemplate;
 import org.ssssssss.magicapi.modules.MongoCollectionExtension;
 import org.ssssssss.magicapi.modules.MongoFindIterableExtension;
 import org.ssssssss.magicapi.modules.MongoModule;
-import org.ssssssss.script.reflection.AbstractReflection;
+import org.ssssssss.script.reflection.JavaReflection;
 
 /**
  * mongo配置
@@ -25,8 +25,8 @@ public class MagicMongoAutoConfiguration {
 	 */
 	@Bean
 	public MongoModule mongoFunctions(MongoTemplate mongoTemplate) {
-		AbstractReflection.getInstance().registerMethodExtension(MongoCollection.class, new MongoCollectionExtension());
-		AbstractReflection.getInstance().registerMethodExtension(FindIterable.class, new MongoFindIterableExtension());
+		JavaReflection.registerMethodExtension(MongoCollection.class, new MongoCollectionExtension());
+		JavaReflection.registerMethodExtension(FindIterable.class, new MongoFindIterableExtension());
 		return new MongoModule(mongoTemplate);
 	}
 }

+ 7 - 4
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicFunctionManager.java

@@ -13,9 +13,12 @@ import org.ssssssss.magicapi.utils.PathUtils;
 import org.ssssssss.script.MagicResourceLoader;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.exception.MagicExitException;
-import org.ssssssss.script.parsing.ast.statement.Exit;
+import org.ssssssss.script.runtime.ExitValue;
 
-import java.util.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -49,8 +52,8 @@ public class MagicFunctionManager {
 							}
 						}
 						Object value =  ScriptManager.executeScript(info.getScript(), functionContext);
-						if(value instanceof Exit.Value){
-							throw new MagicExitException((Exit.Value) value);
+						if(value instanceof ExitValue){
+							throw new MagicExitException((ExitValue) value);
 						}
 						return value;
 					} finally {

+ 3 - 1
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java

@@ -20,6 +20,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Stream;
 
+import static org.ssssssss.magicapi.model.Constants.EMPTY_OBJECT_ARRAY;
+
 public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 
 	private static final Logger logger = LoggerFactory.getLogger(MagicWebSocketDispatcher.class);
@@ -68,7 +70,7 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 				Class<?>[] pTypes = invoker.getParameterTypes();
 				int pCount = pTypes.length;
 				if (pCount == 0) {
-					returnValue = invoker.invoke0(null, null);
+					returnValue = invoker.invoke0(null, null, EMPTY_OBJECT_ARRAY);
 				} else {
 					Object[] pValues = new Object[pCount];
 					for (int i = 0; i < pCount; i++) {

+ 9 - 7
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -164,12 +164,12 @@ public class RequestHandler extends MagicController {
 				List<Object> list = (List) parameters.get(parameter.getName());
 				if (list != null) {
 					List<BaseDefinition> definitions = parameter.getChildren();
-					parameters.put(parameter.getName(), list.stream()
-							.map(it -> doValidate(VAR_NAME_REQUEST_BODY, definitions,  new HashMap<String, Object>(2) {{    // 使用 hashmap
-								put(EMPTY, it);
-								}}, jsonCode))
-							.collect(Collectors.toList())
-					);
+					List<Map<String, Object>> newList = list.stream().map(it -> doValidate(VAR_NAME_REQUEST_BODY, definitions, new HashMap<String, Object>() {{    // 使用 hashmap
+						put(EMPTY, it);
+					}}, jsonCode)).collect(Collectors.toList());
+					for (int i = 0, size = newList.size(); i < size; i++) {
+						list.set(i, newList.get(i).get(EMPTY));
+					}
 				}
 
 			} else if (StringUtils.isNotBlank(parameter.getName()) || parameters.containsKey(parameter.getName())) {
@@ -225,7 +225,7 @@ public class RequestHandler extends MagicController {
 				if (decimal == null) {
 					throw new IllegalArgumentException();
 				}
-				return dataType.getInvoker().invoke0(decimal, null);
+				return dataType.getInvoker().invoke0(decimal, null, EMPTY_OBJECT_ARRAY);
 			} else {
 				JavaInvoker<Method> invoker = dataType.getInvoker();
 				if (invoker != null) {
@@ -247,6 +247,7 @@ public class RequestHandler extends MagicController {
 
 	private Object invokeRequest(RequestEntity requestEntity) throws Throwable {
 		try {
+			MagicScriptContext.set(requestEntity.getMagicScriptContext());
 			Object result = ScriptManager.executeScript(requestEntity.getApiInfo().getScript(), requestEntity.getMagicScriptContext());
 			Object value = result;
 			// 执行后置拦截器
@@ -259,6 +260,7 @@ public class RequestHandler extends MagicController {
 			return processException(requestEntity, root);
 		} finally {
 			RequestContext.remove();
+			MagicScriptContext.remove();
 		}
 	}
 

+ 5 - 25
magic-api/src/main/java/org/ssssssss/magicapi/model/Constants.java

@@ -7,11 +7,6 @@ public class Constants {
 	 */
 	public static final String CONST_STRING_TRUE = "true";
 
-	/**
-	 * false 常量
-	 */
-	public static final String CONST_STRING_FALSE = "false";
-
 
 	/**
 	 * 分组类型: 接口
@@ -78,16 +73,6 @@ public class Constants {
 	 */
 	public static final String VAR_NAME_PATH_VARIABLE = "path";
 
-	/**
-	 * WebSocket存储的sessionId
-	 */
-	public static final String WS_DEBUG_SESSION_KEY = "sessionId";
-
-	/**
-	 * WebSocket存储的MagicScriptDebugContext
-	 */
-	public static final String WS_DEBUG_MAGIC_SCRIPT_CONTEXT = "magicScriptContext";
-
 	/**
 	 * 脚本中header的变量名
 	 */
@@ -109,19 +94,11 @@ public class Constants {
 	 * 脚本中RequestBody的变量名字段类型
 	 */
 	public static final String VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY = "array";
-	/**
-	 * 脚本中RequestBody的变量名
-	 */
-	public static final String HEADER_PREFIX_FOR_TEST = "MA-";
 
 	public static final String HEADER_REQUEST_SESSION = "Magic-Request-Session";
 
 	public static final String HEADER_REQUEST_BREAKPOINTS = "Magic-Request-Breakpoints";
 
-	public static final String HEADER_REQUEST_CONTINUE = "Magic-Request-Continue";
-
-	public static final String HEADER_REQUEST_STEP_INTO = "Magic-Request-Step-Into";
-
 	public static final String HEADER_RESPONSE_WITH_MAGIC_API = "Response-With-Magic-API";
 
 	public static final String ATTRIBUTE_MAGIC_USER = "MAGIC_API_ATTRIBUTE_USER";
@@ -130,8 +107,6 @@ public class Constants {
 
 	public static final String GROUP_METABASE = "group.json";
 
-	public static final String UPLOAD_MODE_INCREMENT = "increment";
-
 	public static final String UPLOAD_MODE_FULL = "full";
 
 	/**
@@ -205,4 +180,9 @@ public class Constants {
 	 */
 	public static final int NOTIFY_WS_S_C = 200;
 
+	/**
+	 * 空数组
+	 */
+	public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
+
 }

+ 8 - 8
magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoModule.java

@@ -8,8 +8,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.ssssssss.magicapi.config.MagicModule;
-import org.ssssssss.script.reflection.AbstractReflection;
+import org.ssssssss.magicapi.model.Constants;
 import org.ssssssss.script.reflection.JavaInvoker;
+import org.ssssssss.script.reflection.JavaReflection;
 
 import java.lang.reflect.Method;
 import java.util.HashMap;
@@ -27,14 +28,13 @@ public class MongoModule extends HashMap<String, Object> implements MagicModule
 
 	public MongoModule(MongoTemplate mongoTemplate) {
 		this.mongoTemplate = mongoTemplate;
-		AbstractReflection reflection = AbstractReflection.getInstance();
-		mongoDbFactoryInvoker = reflection.getMethod(this.mongoTemplate, "getMongoDbFactory");
+		mongoDbFactoryInvoker = JavaReflection.getMethod(this.mongoTemplate, "getMongoDbFactory");
 		if (mongoDbFactoryInvoker != null) {
 			try {
-				Object factory = mongoDbFactoryInvoker.invoke0(this.mongoTemplate, null);
-				invoker = reflection.getMethod(factory, "getDb", StringUtils.EMPTY);
+				Object factory = mongoDbFactoryInvoker.invoke0(this.mongoTemplate, null, Constants.EMPTY_OBJECT_ARRAY);
+				invoker = JavaReflection.getMethod(factory, "getDb", StringUtils.EMPTY);
 				if (invoker == null) {
-					invoker = reflection.getMethod(factory, "getMongoDatabase", StringUtils.EMPTY);
+					invoker = JavaReflection.getMethod(factory, "getMongoDatabase", StringUtils.EMPTY);
 				}
 			} catch (Throwable e) {
 				logger.error("mongo模块初始化失败", e);
@@ -53,8 +53,8 @@ public class MongoModule extends HashMap<String, Object> implements MagicModule
 					return null;
 				}
 				try {
-					Object factory = mongoDbFactoryInvoker.invoke0(mongoTemplate, null);
-					MongoDatabase database = (MongoDatabase) invoker.invoke0(factory, null, databaseName.toString());
+					Object factory = mongoDbFactoryInvoker.invoke0(mongoTemplate, null, Constants.EMPTY_OBJECT_ARRAY);
+					MongoDatabase database = (MongoDatabase) invoker.invoke0(factory, null, new Object[]{databaseName.toString()});
 					return database.getCollection(collection.toString());
 				} catch (Throwable throwable) {
 					throw new RuntimeException(throwable);

+ 3 - 3
magic-api/src/main/java/org/ssssssss/magicapi/provider/ResultProvider.java

@@ -8,7 +8,7 @@ import org.ssssssss.magicapi.model.RequestEntity;
 import org.ssssssss.script.exception.MagicScriptAssertException;
 import org.ssssssss.script.exception.MagicScriptException;
 import org.ssssssss.script.functions.ObjectConvertExtension;
-import org.ssssssss.script.parsing.ast.statement.Exit;
+import org.ssssssss.script.runtime.ExitValue;
 
 import java.util.List;
 import java.util.Map;
@@ -55,8 +55,8 @@ public interface ResultProvider {
 	 * @param data          返回内容
 	 */
 	default Object buildResult(RequestEntity requestEntity, Object data) {
-		if (data instanceof Exit.Value) {
-			Exit.Value exitValue = (Exit.Value) data;
+		if (data instanceof ExitValue) {
+			ExitValue exitValue = (ExitValue) data;
 			Object[] values = exitValue.getValues();
 			int code = values.length > 0 ? ObjectConvertExtension.asInt(values[0], RESPONSE_CODE_SUCCESS) : RESPONSE_CODE_SUCCESS;
 			String message = values.length > 1 ? Objects.toString(values[1], RESPONSE_MESSAGE_SUCCESS) : RESPONSE_MESSAGE_SUCCESS;

+ 14 - 12
magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

@@ -21,7 +21,6 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 import org.ssssssss.magicapi.adapter.Resource;
-import org.ssssssss.magicapi.adapter.resource.KeyValueResource;
 import org.ssssssss.magicapi.adapter.resource.ZipResource;
 import org.ssssssss.magicapi.config.MagicDynamicDataSource;
 import org.ssssssss.magicapi.config.MagicFunctionManager;
@@ -43,10 +42,7 @@ import org.ssssssss.script.MagicScript;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.exception.MagicExitException;
 import org.ssssssss.script.functions.ObjectConvertExtension;
-import org.ssssssss.script.parsing.Scope;
-import org.ssssssss.script.parsing.Span;
-import org.ssssssss.script.parsing.ast.Expression;
-import org.ssssssss.script.parsing.ast.statement.Exit;
+import org.ssssssss.script.runtime.ExitValue;
 
 import javax.script.ScriptContext;
 import javax.script.SimpleScriptContext;
@@ -54,6 +50,7 @@ import javax.sql.DataSource;
 import java.io.*;
 import java.sql.Connection;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
@@ -119,14 +116,19 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
 				String path = name.substring(index + 1);
 				ApiInfo info = this.mappingHandlerMapping.getApiInfo(method, path);
 				if (info != null) {
-					return new Expression(new Span("unknown source")) {
-						@Override
-						public Object evaluate(MagicScriptContext context, Scope scope) {
-							Object value = execute(info, scope.getVariables());
-							if(value instanceof Exit.Value){
-								throw new MagicExitException((Exit.Value) value);
+					return (Function<Object[], Object>) objects -> {
+						MagicScriptContext context = MagicScriptContext.get();
+						MagicScriptContext newContext = new MagicScriptContext();
+						newContext.putMapIntoContext(context.getVariables());
+						MagicScriptContext.set(newContext);
+						try {
+							Object value = ScriptManager.executeScript(info.getScript(), newContext);
+							if(value instanceof ExitValue){
+								throw new MagicExitException((ExitValue) value);
 							}
 							return value;
+						} finally {
+							MagicScriptContext.set(context);
 						}
 					};
 				}
@@ -599,7 +601,7 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
 			notNull(resource, GROUP_NOT_FOUND);
 			resource.parent().export(os);
 		} else if (resources == null || resources.isEmpty()) {
-			workspace.export(os, PATH_BACKUPS);
+			workspace.export(os, PATH_BACKUPS, "backup");
 		} else {
 			ZipOutputStream zos = new ZipOutputStream(os);
 			for (SelectedResource item : resources) {

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/script/ScriptManager.java

@@ -56,6 +56,8 @@ public class ScriptManager {
 			return compile("MagicScript", script).eval(simpleScriptContext);
 		} catch (ScriptException e) {
 			throw new MagicAPIException(e.getMessage(), e);
+		} finally {
+			MagicScriptContext.remove();
 		}
 	}