diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/scripting/GraalvmScriptingFactory.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/scripting/GraalvmScriptingFactory.java index b32980b86d394741bba3a7b0397688b19e8e71a6..d658a6025e4ed657a2858453b0cafb58b55db8cd 100755 --- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/scripting/GraalvmScriptingFactory.java +++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/scripting/GraalvmScriptingFactory.java @@ -1,10 +1,13 @@ package com.x.base.core.project.scripting; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; @@ -16,6 +19,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.beanutils.MethodUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.graalvm.polyglot.Context; @@ -77,11 +81,27 @@ public class GraalvmScriptingFactory { try (Context context = Context.newBuilder().engine(ENGINE).allowHostClassLoading(true) .allowHostAccess(HostAccess.ALL).allowHostClassLookup(GraalvmScriptingFactory::allowClass).build()) { Value bind = context.getBindings(LANGUAGE_ID_JS); + Map> dataAssignDataEmbedDataClasses = new HashMap<>(); if (null != bindings) { + dataAssignDataEmbedDataClasses = Stream.of(BINDING_NAME_EMBEDDATA, BINDING_NAME_DATA) + .filter(bindings::containsKey).filter(o -> Objects.nonNull(bindings.get(o))) + .collect(Collectors.toMap(Function.identity(), o -> bindings.get(o).getClass())); bindings.entrySet().forEach(en -> bind.putMember(en.getKey(), en.getValue())); } context.eval(getcommonScriptSource()); - return promise(context, context.eval(source)); + Value value = context.eval(source); + if ((null != bindings) && (!dataAssignDataEmbedDataClasses.isEmpty())) { + dataAssignDataEmbedDataClasses.entrySet().forEach(o -> { + Value v = bind.getMember(o.getKey().substring(o.getKey().indexOf("_") + 1)); + try { + MethodUtils.invokeExactMethod(bindings.get(o.getKey()), "replaceContent", + bind.getMember("JSON").invokeMember("stringify", v).asString()); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + LOGGER.error(e); + } + }); + } + return promise(context, value); } } diff --git a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Data.java b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Data.java index cf67746ea759605ff45b56b83fd0fec363c16673..386a6266df818a1f4f08ccb37ea4c7dfaeddea88 100755 --- a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Data.java +++ b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Data.java @@ -4,6 +4,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Objects; import org.apache.commons.beanutils.PropertyUtils; @@ -491,6 +492,12 @@ public class Data extends ListOrderedMap { .count() == 0; } + @SuppressWarnings("unchecked") + public void replaceContent(String json) { + this.clear(); + this.putAll(XGsonBuilder.instance().fromJson(json, Map.class)); + } + @Override /* 需要重载,前端toString需要这个方法. */ public String toString() { diff --git a/o2server/x_processplatform_core_entity/src/test/java/test/com/x/processplatform/core/entity/TestClient.java b/o2server/x_processplatform_core_entity/src/test/java/test/com/x/processplatform/core/entity/TestClient.java new file mode 100644 index 0000000000000000000000000000000000000000..50423ccd7f9d085fd1d3e124cc5d1f724037e823 --- /dev/null +++ b/o2server/x_processplatform_core_entity/src/test/java/test/com/x/processplatform/core/entity/TestClient.java @@ -0,0 +1,21 @@ +package test.com.x.processplatform.core.entity; + +import java.util.Arrays; + +import com.x.base.core.project.gson.XGsonBuilder; +import com.x.processplatform.core.entity.content.Data; + +public class TestClient { + public static void main(String[] args) { + + Data data = new Data(); + + data.put("a", Arrays.asList("bb", "c")); + + System.out.println(XGsonBuilder.toJson(data)); + + data.replaceContent("{\"d\":\"aaa\"}"); + System.out.println(XGsonBuilder.toJson(data)); + } + +} diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/Processing.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/Processing.java index aa726e30f536d3a3f2285ed1cde62a6dcde494eb..3bd3d35664b1195df62593965176701dd6bd348c 100755 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/Processing.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/Processing.java @@ -9,7 +9,6 @@ import org.apache.commons.lang3.StringUtils; import com.x.base.core.container.EntityManagerContainer; import com.x.base.core.container.factory.EntityManagerContainerFactory; -import com.x.base.core.project.gson.XGsonBuilder; import com.x.base.core.project.tools.ListTools; import com.x.processplatform.core.entity.content.Work; import com.x.processplatform.core.express.ProcessingAttributes; diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeProcessor.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeProcessor.java index 5143211e1217cd1f3bc1bf488c304642e137b8ff..e05508b7c7cd259d6c29f28cc35b7ba4a233b91f 100755 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeProcessor.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeProcessor.java @@ -480,7 +480,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor { GraalvmScriptingFactory.Bindings bindings = aeiObjects.bindings() .putMember(GraalvmScriptingFactory.BINDING_NAME_JAXRSBODY, jaxrsBody); GraalvmScriptingFactory.eval(source, bindings, jsonElement -> { - if (!jsonElement.isJsonNull()) { + if (Objects.nonNull(jsonElement) && (!jsonElement.isJsonNull())) { jaxrsBody.set(gson.toJson(jsonElement)); } });