diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..1853ee7eaedd7537965b6a250427d1b67ba16430 --- /dev/null +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java @@ -0,0 +1,69 @@ +package org.tinygroup.tinyscript.collection.function.list; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.impl.DefaultScriptContext; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.ScriptContextUtil; + +public class ListGroupDynamicFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "groupDynamic"; + } + + @Override + public boolean enableExpressionParameter() { + return true; + } + + @Override + public String getBindingTypes() { + return List.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 2)) { + List dataArray = (List) getValue(parameters[0]); + String expression = ScriptContextUtil.convertExpression(getExpression(parameters[1])); + return groupDynamic(dataArray, expression, context); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + private Object groupDynamic(List dataArray, String expression, ScriptContext context) throws ScriptException { + Map> result = new LinkedHashMap>(); + for (int i = 0; i < dataArray.size(); i++) { + ScriptContext subContext = new DefaultScriptContext(); + subContext.setParent(context); + ScriptContextUtil.setCurData(subContext, dataArray.get(i)); + Object key = executeDynamicObject(expression, subContext); + List group = result.get(key); + if (group == null) { + group = new ArrayList(); + result.put(key, group); + } + group.add(dataArray.get(i)); + } + return result.values(); + } + +} diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..7536c358756992d5ac1f45e24d06d4bb99010f28 --- /dev/null +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java @@ -0,0 +1,77 @@ +package org.tinygroup.tinyscript.collection.function.list; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.impl.DefaultScriptContext; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.ScriptContextUtil; + +public class ListGroupStagedFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "groupStaged"; + } + + public boolean enableExpressionParameter() { + return true; + } + + @Override + public String getBindingTypes() { + return List.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (parameters.length > 1) { + List dataArray = (List) getValue(parameters[0]); + String[] expressions = new String[parameters.length - 1]; + for (int i = 0; i < expressions.length; i++) { + expressions[i] = ScriptContextUtil.convertExpression(getExpression(parameters[i + 1])); + } + return groupStaged(dataArray, expressions, context); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + private Object groupStaged(List dataArray, String[] expressions, ScriptContext context) throws ScriptException { + Map> result = new LinkedHashMap>(); + for (int i = 0; i < dataArray.size(); i++) { + String key = null; + ScriptContext subContext = new DefaultScriptContext(); + subContext.setParent(context); + ScriptContextUtil.setCurData(subContext, dataArray.get(i)); + for (String expression : expressions) { + if (executeDynamicBoolean(expression, subContext)) { + key = expression; + break; + } + } + List list = result.get(key); + if (list == null) { + list = new ArrayList(); + result.put(key, list); + } + list.add(dataArray.get(i)); + } + return result.values(); + } + +} diff --git a/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml b/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml index 64b61870e3c3c1b8e9df7f8629614e5e35cbbafa..cda71c7e406c66fe8406941f0b3c56e79e80bf1d 100644 --- a/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml +++ b/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml @@ -114,4 +114,12 @@ + + + + + + diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupDynamicFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupDynamicFunction.java index 0e62730ef763d78ecea4824fd2f46cc42ba2dbc3..5348d30103efe7de9382396f71e3a597b323a0a7 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupDynamicFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupDynamicFunction.java @@ -76,6 +76,8 @@ public class DataSetGroupDynamicFunction extends AbstractGroupFunction { //逐条遍历记录 for(int i=0;i(result.values()); }catch(Exception e){ throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); diff --git a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java index 5df31f6c0df94b53b628006d7cdc1aa159d95ec8..7ef73549784c1e45d894d3a52f169d1230c8b36f 100644 --- a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java +++ b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java @@ -14,6 +14,8 @@ import org.tinygroup.tinyscript.collection.function.list.CopyFunction; import org.tinygroup.tinyscript.collection.function.list.FillFunction; import org.tinygroup.tinyscript.collection.function.list.FilterFunction; import org.tinygroup.tinyscript.collection.function.list.IntersectionFunction; +import org.tinygroup.tinyscript.collection.function.list.ListGroupDynamicFunction; +import org.tinygroup.tinyscript.collection.function.list.ListGroupStagedFunction; import org.tinygroup.tinyscript.collection.function.list.RemoveFunction; import org.tinygroup.tinyscript.collection.function.list.SortFunction; import org.tinygroup.tinyscript.collection.function.list.SubtractFunction; @@ -215,6 +217,9 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new JsonToDataSetFunction()); addScriptFunction(new DataSetToXmlFunction()); addScriptFunction(new XmlToDataSetFunction()); + addScriptFunction(new ListGroupDynamicFunction()); + addScriptFunction(new ListGroupStagedFunction()); + addScriptFunction(new GroupDataSetFilterFunction()); addScriptFunction(new GroupDataSetSortFunction()); diff --git a/org.tinygroup.tinyscript/src/test/resources/example/String.tsf b/org.tinygroup.tinyscript/src/test/resources/example/String.tsf new file mode 100644 index 0000000000000000000000000000000000000000..8f9d2d355f67b1eaa4b93d463ee29d6390360372 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/String.tsf @@ -0,0 +1,6 @@ +a = "abcdefg"; +println(a.ascii()); +println(char(97)); +println(a.repeat(2)); +println(a.subRight(3)); +println(lcs("abcde","bcbcadcde")); \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf b/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf new file mode 100644 index 0000000000000000000000000000000000000000..7ed4cc6ffefbf48896064effd3d1560b4ed524a1 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf @@ -0,0 +1,3 @@ +list = [1..5]; +println(list.groupStaged(curData<3)); +println(list.groupDynamic(curData%2)); \ No newline at end of file diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/NumberToCharFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/NumberToCharFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..209494e7553a6bcb9b367fd730bb5e9ed2afa137 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/NumberToCharFunction.java @@ -0,0 +1,34 @@ +package org.tinygroup.tinyscript.function.string; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class NumberToCharFunction extends AbstractScriptFunction{ + + @Override + public String getNames() { + return "char"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try{ + if(parameters==null || parameters.length==0){ + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + }else if(this.checkParameters(parameters, 1)){ + int number = (Integer)parameters[0]; + return (char)number; + }else{ + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + }catch(ScriptException e){ + throw e; + }catch(Exception e){ + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()),e); + } + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringAsciiFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringAsciiFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..301afffba209de30dfa7c307f5313aaf8252a2c6 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringAsciiFunction.java @@ -0,0 +1,38 @@ +package org.tinygroup.tinyscript.function.string; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class StringAsciiFunction extends AbstractScriptFunction{ + + @Override + public String getNames() { + return "ascii"; + } + + public String getBindingTypes() { + return String.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try{ + if(parameters==null || parameters.length==0){ + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + }else if(this.checkParameters(parameters, 1)){ + String str = (String)parameters[0]; + return (int)str.toCharArray()[0]; + }else{ + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + }catch(ScriptException e){ + throw e; + }catch(Exception e){ + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()),e); + } + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringLCSFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringLCSFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..4a2efc28f01aa0ab51554fb50496999ff909b108 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringLCSFunction.java @@ -0,0 +1,71 @@ +package org.tinygroup.tinyscript.function.string; + +import org.tinygroup.commons.tools.StringUtil; +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class StringLCSFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "lcs"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (this.checkParameters(parameters, 2)) { + String str1 = (String) parameters[0]; + String str2 = (String) parameters[1]; + return calculate(str1, str2); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + private String calculate(String strOne, String strTwo) { + if (StringUtil.isBlank(strOne) || StringUtil.isBlank(strTwo)) { + return ""; + } + int[] topLine = new int[strOne.length()]; + int[] currentLine = new int[strTwo.length()]; + int maxLen = 0; + + // 矩阵元素最大值出现在第几列 + int pos = 0; + char ch = ' '; + for (int i = 0; i < strTwo.length(); i++) { + ch = strTwo.charAt(i); + for (int j = 0; j < strOne.length(); j++) { + if (ch == strOne.charAt(j)) { + if (j == 0) { + currentLine[j] = 1; + } else { + currentLine[j] = topLine[j - 1] + 1; + } + if (currentLine[j] > maxLen) { + maxLen = currentLine[j]; + pos = j; + } + } + } + // 将矩阵的当前行元素赋值给topLine数组; 并清空currentLine数组 + for (int k = 0; k < strOne.length(); k++) { + topLine[k] = currentLine[k]; + currentLine[k] = 0; + } + } + return strOne.substring(pos - maxLen + 1, pos + 1); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringRepeatFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringRepeatFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..6137fb1ac32805cf7c6c21a2ecf27761d8a24a38 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringRepeatFunction.java @@ -0,0 +1,44 @@ +package org.tinygroup.tinyscript.function.string; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class StringRepeatFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "repeat"; + } + + @Override + public String getBindingTypes() { + return String.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (this.checkParameters(parameters, 2)) { + String str = (String) parameters[0]; + int count = (Integer) parameters[1]; + StringBuilder builder = new StringBuilder(); + for (int i = 1; i <= count; i++) { + builder.append(str); + } + return builder.toString(); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringSubRightFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringSubRightFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..fd6949d546c290911cf79608e607686b7f92be9c --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringSubRightFunction.java @@ -0,0 +1,40 @@ +package org.tinygroup.tinyscript.function.string; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class StringSubRightFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "subRight"; + } + + @Override + public String getBindingTypes() { + return String.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (this.checkParameters(parameters, 2)) { + String str = (String) parameters[0]; + int count = (Integer) parameters[1]; + return str.substring(str.length() - count); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java index 75e49138317d71979e57cae18b63792e3bc3da93..c6174275682671c590422ce3fd992a2d7155d3a5 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java @@ -13,12 +13,60 @@ import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptFunction; import org.tinygroup.tinyscript.ScriptSegment; import org.tinygroup.tinyscript.config.FunctionConfig; -import org.tinygroup.tinyscript.function.*; -import org.tinygroup.tinyscript.function.date.*; -import org.tinygroup.tinyscript.function.locale.*; -import org.tinygroup.tinyscript.function.math.*; -import org.tinygroup.tinyscript.function.random.*; -import org.tinygroup.tinyscript.function.output.*; +import org.tinygroup.tinyscript.function.DynamicNameScriptFunction; +import org.tinygroup.tinyscript.function.EvalScriptFunction; +import org.tinygroup.tinyscript.function.TypeConvertFunction; +import org.tinygroup.tinyscript.function.date.ClearTimeFunction; +import org.tinygroup.tinyscript.function.date.DateAddFunction; +import org.tinygroup.tinyscript.function.date.DateDifferentFunction; +import org.tinygroup.tinyscript.function.date.DateNameFunction; +import org.tinygroup.tinyscript.function.date.DatePartFunction; +import org.tinygroup.tinyscript.function.date.DateToStringFunction; +import org.tinygroup.tinyscript.function.date.DateTruncFunction; +import org.tinygroup.tinyscript.function.date.DayFunction; +import org.tinygroup.tinyscript.function.date.EqualsDateFunction; +import org.tinygroup.tinyscript.function.date.MakeDateFunction; +import org.tinygroup.tinyscript.function.date.MakeDateTime; +import org.tinygroup.tinyscript.function.date.MonthFunction; +import org.tinygroup.tinyscript.function.date.NowFunction; +import org.tinygroup.tinyscript.function.date.TodayFunction; +import org.tinygroup.tinyscript.function.date.YearFunction; +import org.tinygroup.tinyscript.function.locale.SetLocaleFunction; +import org.tinygroup.tinyscript.function.math.MathAbsFunction; +import org.tinygroup.tinyscript.function.math.MathAcosFunction; +import org.tinygroup.tinyscript.function.math.MathAggregateFunction; +import org.tinygroup.tinyscript.function.math.MathAsinFunction; +import org.tinygroup.tinyscript.function.math.MathAtan2Function; +import org.tinygroup.tinyscript.function.math.MathAtanFunction; +import org.tinygroup.tinyscript.function.math.MathCeilFunction; +import org.tinygroup.tinyscript.function.math.MathCosFunction; +import org.tinygroup.tinyscript.function.math.MathCotFunction; +import org.tinygroup.tinyscript.function.math.MathDegreesFunction; +import org.tinygroup.tinyscript.function.math.MathExpFunction; +import org.tinygroup.tinyscript.function.math.MathFloorFunction; +import org.tinygroup.tinyscript.function.math.MathLnFunction; +import org.tinygroup.tinyscript.function.math.MathLogFunction; +import org.tinygroup.tinyscript.function.math.MathPowFunction; +import org.tinygroup.tinyscript.function.math.MathRadiansFunction; +import org.tinygroup.tinyscript.function.math.MathRoundFunction; +import org.tinygroup.tinyscript.function.math.MathSignFunction; +import org.tinygroup.tinyscript.function.math.MathSinFunction; +import org.tinygroup.tinyscript.function.math.MathSqrtFunction; +import org.tinygroup.tinyscript.function.math.MathTanFunction; +import org.tinygroup.tinyscript.function.output.ConsolePrintFunction; +import org.tinygroup.tinyscript.function.output.ConsolePrintfFunction; +import org.tinygroup.tinyscript.function.output.ConsolePrintlnFunction; +import org.tinygroup.tinyscript.function.output.LoggerFunction; +import org.tinygroup.tinyscript.function.random.ArrayRandFunction; +import org.tinygroup.tinyscript.function.random.DoubleRandFunction; +import org.tinygroup.tinyscript.function.random.FloatRandFunction; +import org.tinygroup.tinyscript.function.random.IntRandFunction; +import org.tinygroup.tinyscript.function.random.LongRandFunction; +import org.tinygroup.tinyscript.function.string.NumberToCharFunction; +import org.tinygroup.tinyscript.function.string.StringAsciiFunction; +import org.tinygroup.tinyscript.function.string.StringLCSFunction; +import org.tinygroup.tinyscript.function.string.StringRepeatFunction; +import org.tinygroup.tinyscript.function.string.StringSubRightFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; import org.tinygroup.tinyscript.interpret.ScriptContextUtil; @@ -106,6 +154,11 @@ public class DefaultScriptEngine extends AbstractScriptEngine { addScriptFunction(new SetLocaleFunction()); + addScriptFunction(new StringAsciiFunction()); + addScriptFunction(new NumberToCharFunction()); + addScriptFunction(new StringRepeatFunction()); + addScriptFunction(new StringSubRightFunction()); + addScriptFunction(new StringLCSFunction()); // 注册数学常量 getScriptContext().put("PI", Math.PI); getScriptContext().put("E", Math.E); diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java index 1028ee68ba9e690ca5accf2a54876ed73857a118..2eb659eaddd75868890923540f9e3be102c60216 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java @@ -8,80 +8,93 @@ import org.tinygroup.tinyscript.ScriptException; /** * 脚本上下文工具类 + * * @author yancheng11334 * */ public class ScriptContextUtil { private static final String LAMBDA_PRE = "$lambda"; - + private static final String INSTANCE_NAME = "$intance"; - + private static final String ENGINE_NAME = "$scriptEngine"; - + private static final String DYNAMIC_FUNCTION_NAME = "$dynamicFunctionName"; - + + private static final String DATASET_ROWID = "$rowId"; + + private static final String CURRENT_DATA = "$curData"; + private static final String CUSTOM_BEAN_NAME = "customBean"; + + public static void setCurData(ScriptContext context, Object value) { + context.put(CURRENT_DATA.substring(1), value); + } + + public static void setDataSetRowId(ScriptContext context, int rowId) { + context.put(DATASET_ROWID.substring(1), rowId); + } - public static void setLambdaFunction(ScriptContext context,LambdaFunction function){ - if(context!=null && function!=null){ - if(function.getFunctionName()!=null){ - //有名字的lambda函数 - context.put(LAMBDA_PRE+function.getFunctionName(), function); - }else{ - //匿名lambda函数 - context.put(LAMBDA_PRE, function); - } + public static void setLambdaFunction(ScriptContext context, LambdaFunction function) { + if (context != null && function != null) { + if (function.getFunctionName() != null) { + // 有名字的lambda函数 + context.put(LAMBDA_PRE + function.getFunctionName(), function); + } else { + // 匿名lambda函数 + context.put(LAMBDA_PRE, function); + } } } - - public static LambdaFunction getLambdaFunction(ScriptContext context,String functionName){ - if(context!=null){ - if(functionName!=null){ - return context.get(LAMBDA_PRE+functionName); - }else{ - return context.get(LAMBDA_PRE); - } + + public static LambdaFunction getLambdaFunction(ScriptContext context, String functionName) { + if (context != null) { + if (functionName != null) { + return context.get(LAMBDA_PRE + functionName); + } else { + return context.get(LAMBDA_PRE); + } } return null; } - - public static ScriptClassInstance getScriptClassInstance(ScriptContext context){ - if(context!=null){ - return (ScriptClassInstance) context.get(INSTANCE_NAME); + + public static ScriptClassInstance getScriptClassInstance(ScriptContext context) { + if (context != null) { + return (ScriptClassInstance) context.get(INSTANCE_NAME); } return null; } - - public static void setScriptClassInstance(ScriptContext context,ScriptClassInstance instance){ - if(context!=null){ - context.put(INSTANCE_NAME, instance); + + public static void setScriptClassInstance(ScriptContext context, ScriptClassInstance instance) { + if (context != null) { + context.put(INSTANCE_NAME, instance); } } - - public static ScriptEngine getScriptEngine(ScriptContext context){ + + public static ScriptEngine getScriptEngine(ScriptContext context) { return context.get(ENGINE_NAME); } - - public static void setScriptEngine(ScriptContext context,ScriptEngine engine){ + + public static void setScriptEngine(ScriptContext context, ScriptEngine engine) { context.put(ENGINE_NAME, engine); } - - public static String getDynamicFunctionName(ScriptContext context){ + + public static String getDynamicFunctionName(ScriptContext context) { return context.get(DYNAMIC_FUNCTION_NAME); } - - public static void addDynamicFunctionName(ScriptContext context,String name){ + + public static void addDynamicFunctionName(ScriptContext context, String name) { context.put(DYNAMIC_FUNCTION_NAME, name); } - - public static void removeDynamicFunctionName(ScriptContext context,String name){ + + public static void removeDynamicFunctionName(ScriptContext context, String name) { String value = context.get(DYNAMIC_FUNCTION_NAME); - if(name!=null && name.equals(value)){ - context.remove(DYNAMIC_FUNCTION_NAME); + if (name != null && name.equals(value)) { + context.remove(DYNAMIC_FUNCTION_NAME); } } - + /** * 转换一般表达式为可执行脚本 * @@ -89,7 +102,7 @@ public class ScriptContextUtil { * @return */ public static String convertExpression(String expression) { - if (expression.indexOf("->")>0){ + if (expression.indexOf("->") > 0) { return expression; } if (!expression.startsWith("return")) { @@ -100,65 +113,69 @@ public class ScriptContextUtil { } return expression; } - + /** * 执行脚本 + * * @param context * @param expression * @return * @throws ScriptException */ - public static Object executeExpression(ScriptContext context,String expression) throws ScriptException { + public static Object executeExpression(ScriptContext context, String expression) throws ScriptException { String newExpression = convertExpression(expression); ScriptEngine engine = getScriptEngine(context); return engine.execute(newExpression, context); } - + /** * 批量执行脚本 + * * @param context * @param expressions * @return * @throws ScriptException */ - public static Object[] executeExpression(ScriptContext context,String... expressions) throws ScriptException { + public static Object[] executeExpression(ScriptContext context, String... expressions) throws ScriptException { Object[] result = new Object[expressions.length]; ScriptEngine engine = getScriptEngine(context); - for(int i=0;i