From 943385ca98c70451c24886f921dd3001f36aa86a Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Fri, 24 Nov 2017 14:31:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0list=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=88=86=E7=BB=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../list/ListGroupDynamicFunction.java | 69 +++++++++ .../list/ListGroupStagedFunction.java | 77 ++++++++++ .../src/main/resources/collection.beans.xml | 8 + .../impl/DefaultTinyScriptEngine.java | 5 + .../interpret/ScriptContextUtil.java | 141 ++++++++++-------- 5 files changed, 238 insertions(+), 62 deletions(-) create mode 100644 org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java create mode 100644 org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java 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 0000000..1d88cd9 --- /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 dataSet = (List) getValue(parameters[0]); + String expression = ScriptContextUtil.convertExpression(getExpression(parameters[1])); + return groupDynamic(dataSet, 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 0000000..f5237d4 --- /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 dataSet = (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(dataSet, 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 64b6187..cda71c7 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/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java index 5df31f6..7ef7354 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.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java index 1028ee6..2eb659e 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 Date: Fri, 24 Nov 2017 14:32:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collection/function/list/ListGroupDynamicFunction.java | 4 ++-- .../collection/function/list/ListGroupStagedFunction.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 index 1d88cd9..1853ee7 100644 --- 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 @@ -36,9 +36,9 @@ public class ListGroupDynamicFunction extends AbstractScriptFunction { if (parameters == null || parameters.length == 0) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 2)) { - List dataSet = (List) getValue(parameters[0]); + List dataArray = (List) getValue(parameters[0]); String expression = ScriptContextUtil.convertExpression(getExpression(parameters[1])); - return groupDynamic(dataSet, expression, context); + return groupDynamic(dataArray, expression, context); } else { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } 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 index f5237d4..7536c35 100644 --- 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 @@ -35,12 +35,12 @@ public class ListGroupStagedFunction extends AbstractScriptFunction { if (parameters == null || parameters.length == 0) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (parameters.length > 1) { - List dataSet = (List) getValue(parameters[0]); + 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(dataSet, expressions, context); + return groupStaged(dataArray, expressions, context); } else { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } -- Gitee From 25ef13a76d1bbc6d948e61ba8ef7f103195592c5 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sat, 25 Nov 2017 12:38:54 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0string=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/DataSetGroupDynamicFunction.java | 3 +- .../src/test/resources/example/String.tsf | 6 ++ .../src/test/resources/group/ListGroup.tsf | 3 + .../function/string/NumberToCharFunction.java | 34 +++++++++ .../function/string/StringAsciiFunction.java | 38 ++++++++++ .../function/string/StringLCSFunction.java | 71 +++++++++++++++++++ .../function/string/StringRepeatFunction.java | 44 ++++++++++++ .../string/StringSubRightFunction.java | 40 +++++++++++ .../tinyscript/impl/DefaultScriptEngine.java | 65 +++++++++++++++-- 9 files changed, 297 insertions(+), 7 deletions(-) create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/String.tsf create mode 100644 org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/NumberToCharFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringAsciiFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringLCSFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringRepeatFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/string/StringSubRightFunction.java 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 0e62730..5348d30 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/test/resources/example/String.tsf b/org.tinygroup.tinyscript/src/test/resources/example/String.tsf new file mode 100644 index 0000000..8f9d2d3 --- /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 0000000..7ed4cc6 --- /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 0000000..209494e --- /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 0000000..301afff --- /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 0000000..4a2efc2 --- /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 0000000..6137fb1 --- /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 0000000..fd6949d --- /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 75e4913..c617427 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); -- Gitee