提交 96e70387 编写于 作者: NoSubject's avatar NoSubject

Merge branch 'cherry-pick-24432380' into 'master'

修复脚本执行中无法正常赋值对象.

See merge request o2oa/o2oa!2614
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<String, Class<?>> 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);
}
}
......
......@@ -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<String, Object> {
.count() == 0;
}
@SuppressWarnings("unchecked")
public void replaceContent(String json) {
this.clear();
this.putAll(XGsonBuilder.instance().fromJson(json, Map.class));
}
@Override
/* 需要重载,前端toString需要这个方法. */
public String toString() {
......
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));
}
}
......@@ -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;
......
......@@ -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));
}
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册