|
@@ -1,5 +1,6 @@
|
|
|
package com.scbfkj.uni.library.script;
|
|
|
|
|
|
+import com.scbfkj.uni.library.DataFormatUtil;
|
|
|
import com.scbfkj.uni.library.UniReturnUtil;
|
|
|
import org.apache.commons.pool2.BaseKeyedPooledObjectFactory;
|
|
|
import org.apache.commons.pool2.KeyedObjectPool;
|
|
@@ -14,6 +15,7 @@ import org.graalvm.polyglot.Value;
|
|
|
import java.time.Instant;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
|
|
@@ -51,41 +53,8 @@ public final class JsScriptEngineUtil {
|
|
|
function = scriptPool.borrowObject(script);
|
|
|
if (function.canExecute()) {
|
|
|
Value result = function.execute(args);
|
|
|
- if (result.isString()) {
|
|
|
- return UniReturnUtil.success(result.asString());
|
|
|
- } else if (result.isBoolean()) {
|
|
|
- return UniReturnUtil.success(result.asBoolean());
|
|
|
- } else if (result.isNumber()) {
|
|
|
- if (result.fitsInShort()) {
|
|
|
- return UniReturnUtil.success(result.asShort());
|
|
|
- }
|
|
|
- if (result.fitsInInt()) {
|
|
|
- return UniReturnUtil.success(result.asInt());
|
|
|
- }
|
|
|
- if (result.fitsInLong()) {
|
|
|
- return UniReturnUtil.success(result.asLong());
|
|
|
- }
|
|
|
- if (result.fitsInFloat()) {
|
|
|
- return UniReturnUtil.success(result.asFloat());
|
|
|
- }
|
|
|
- if (result.fitsInDouble()) {
|
|
|
- return UniReturnUtil.success(result.asDouble());
|
|
|
- }
|
|
|
- if (result.fitsInBigInteger()) {
|
|
|
- return UniReturnUtil.success(result.asBigInteger());
|
|
|
- }
|
|
|
- if (result.fitsInByte()) {
|
|
|
- return UniReturnUtil.success(result.asByte());
|
|
|
- }
|
|
|
- } else if (result.isInstant()) {
|
|
|
- Instant instant = result.asInstant();
|
|
|
- return UniReturnUtil.success(LocalDateTime.now(ZoneId.from(instant)));
|
|
|
- } else if (result.isNull()) {
|
|
|
- return UniReturnUtil.success(null);
|
|
|
- } else if (result.isHostObject()) {
|
|
|
- return UniReturnUtil.success(result.asHostObject());
|
|
|
- }
|
|
|
- return UniReturnUtil.success(toString(result));
|
|
|
+
|
|
|
+ return UniReturnUtil.success(toHostObject(result));
|
|
|
} else {
|
|
|
return UniReturnUtil.success(toString(function));
|
|
|
}
|
|
@@ -99,6 +68,61 @@ public final class JsScriptEngineUtil {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static Object toHostObject(Value result) throws Exception {
|
|
|
+ if (result.isString()) {
|
|
|
+ return result.asString();
|
|
|
+ } else if (result.isBoolean()) {
|
|
|
+ return result.asBoolean();
|
|
|
+ } else if (result.isNumber()) {
|
|
|
+ if (result.fitsInShort()) {
|
|
|
+ return result.asShort();
|
|
|
+ }
|
|
|
+ if (result.fitsInInt()) {
|
|
|
+ return result.asInt();
|
|
|
+ }
|
|
|
+ if (result.fitsInLong()) {
|
|
|
+ return result.asLong();
|
|
|
+ }
|
|
|
+ if (result.fitsInFloat()) {
|
|
|
+ return result.asFloat();
|
|
|
+ }
|
|
|
+ if (result.fitsInDouble()) {
|
|
|
+ return result.asDouble();
|
|
|
+ }
|
|
|
+ if (result.fitsInBigInteger()) {
|
|
|
+ return result.asBigInteger();
|
|
|
+ }
|
|
|
+ if (result.fitsInByte()) {
|
|
|
+ return result.asByte();
|
|
|
+ }
|
|
|
+ } else if (result.isInstant()) {
|
|
|
+ Instant instant = result.asInstant();
|
|
|
+ return LocalDateTime.now(ZoneId.from(instant));
|
|
|
+ } else if (result.isNull()) {
|
|
|
+ return null;
|
|
|
+ } else if (result.isHostObject()) {
|
|
|
+ return result.asHostObject();
|
|
|
+ } else if (result.hasIterator()) {
|
|
|
+ ArrayList<Object> objects = new ArrayList<>();
|
|
|
+ Value iterator = result.getIterator();
|
|
|
+
|
|
|
+ while (iterator.hasIteratorNextElement()) {
|
|
|
+ Value next = iterator.getIteratorNextElement();
|
|
|
+ objects.add(toHostObject(next));
|
|
|
+ }
|
|
|
+ return objects;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return result.as(Map.class);
|
|
|
+ } catch (Exception e) {
|
|
|
+ try {
|
|
|
+ return result.as(Object.class);
|
|
|
+ } catch (Exception e2) {
|
|
|
+ return DataFormatUtil.toString(result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private static String toString(Value value) throws Exception {
|
|
|
Value function = scriptPool.borrowObject(TO_STRING_SCRIPT);
|
|
|
try {
|