From 4cef83e633c607aed8a975f1ff792a80752119e0 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sun, 5 Nov 2017 19:36:00 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9Etableaudate=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=87=BD=E6=95=B0=E3=80=822.=E5=A2=9E=E5=8A=A0date?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E5=92=8C?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/resources/example/date.ts | 14 + .../tinyscript/expression/ExpressionUtil.java | 113 +++++- .../function/date/DateAddFunction.java | 45 +++ .../function/date/DateDifferentFunction.java | 61 +++- .../tinyscript/function/date/DateEnum.java | 20 + .../function/date/DateNameFunction.java | 70 ++++ .../function/date/DatePartFunction.java | 69 ++++ .../function/date/DateTruncFunction.java | 73 ++++ .../tinyscript/function/date/DateUtil.java | 58 +++ .../tinyscript/function/date/DayFunction.java | 42 +++ .../function/date/IsDateFunction.java | 41 +++ .../function/date/MakeDateFunction.java | 45 +++ .../function/date/MakeDateTime.java | 46 +++ .../function/date/MonthFunction.java | 42 +++ .../tinyscript/function/date/NowFunction.java | 28 ++ .../function/date/TodayFunction.java | 27 ++ .../function/date/YearFunction.java | 42 +++ .../tinyscript/impl/DefaultScriptEngine.java | 344 +++++++++--------- .../org/tinygroup/tinyscript/DateTest.java | 33 +- 19 files changed, 1019 insertions(+), 194 deletions(-) create mode 100644 org.tinygroup.tinyscript/src/test/resources/example/date.ts create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateAddFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateEnum.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateNameFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DatePartFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateTruncFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateUtil.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DayFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/IsDateFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MakeDateFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MakeDateTime.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MonthFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/NowFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/TodayFunction.java create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/YearFunction.java diff --git a/org.tinygroup.tinyscript/src/test/resources/example/date.ts b/org.tinygroup.tinyscript/src/test/resources/example/date.ts new file mode 100644 index 0000000..ffe74e0 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/date.ts @@ -0,0 +1,14 @@ +println(dateAdd("YEAR",1,"2017-10-31 11:1:1")); +println(datediff("WEEK","2017-10-31","2017-11-1","wednesday")); +println(dateName("MONTH","2017-10-31 11:1:1")); +println(datePart("WEEK","2017-10-31 11:1:1","monday")); +println(dateTrunc("WEEKDAY","2017-11-30 11:1:1")); +println(day("2017-11-30 11:1:1")); +println(isDate("2017/11/30")); +println(makeDate(2010,10,1)); +println(makeDateTime("2016-1-1","11:1:1")); +println(month("2016-12-1")); +println(year("2017-12-1")); +println(now()); +println(today()); +println(max("2017-12-1","2017-12-1 11:1:59")); \ No newline at end of file diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java index bff5eda..0cb0a6e 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java @@ -2,8 +2,11 @@ package org.tinygroup.tinyscript.expression; import java.lang.reflect.Array; import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -11,12 +14,94 @@ import java.util.Map; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; -import org.tinygroup.tinyscript.expression.booleanconvert.*; -import org.tinygroup.tinyscript.expression.calculator.*; -import org.tinygroup.tinyscript.expression.convert.*; -import org.tinygroup.tinyscript.expression.iteratorconvert.*; -import org.tinygroup.tinyscript.expression.operator.*; -import org.tinygroup.tinyscript.expression.range.*; +import org.tinygroup.tinyscript.expression.booleanconvert.ArrayBooleanConverter; +import org.tinygroup.tinyscript.expression.booleanconvert.CollectionBooleanConverter; +import org.tinygroup.tinyscript.expression.booleanconvert.EnumeratorBooleanConverter; +import org.tinygroup.tinyscript.expression.booleanconvert.IteratorBooleanConverter; +import org.tinygroup.tinyscript.expression.booleanconvert.MapBooleanConverter; +import org.tinygroup.tinyscript.expression.booleanconvert.StringBooleanConverter; +import org.tinygroup.tinyscript.expression.calculator.AvgCalculator; +import org.tinygroup.tinyscript.expression.calculator.CountAllCalculator; +import org.tinygroup.tinyscript.expression.calculator.CountCalculator; +import org.tinygroup.tinyscript.expression.calculator.DistinctCalculator; +import org.tinygroup.tinyscript.expression.calculator.MaxCalculator; +import org.tinygroup.tinyscript.expression.calculator.MedianCalculator; +import org.tinygroup.tinyscript.expression.calculator.MinCalculator; +import org.tinygroup.tinyscript.expression.calculator.PercentileCalculator; +import org.tinygroup.tinyscript.expression.calculator.RangeCalculator; +import org.tinygroup.tinyscript.expression.calculator.SampleStdevpCalculator; +import org.tinygroup.tinyscript.expression.calculator.SampleVarianceCalculator; +import org.tinygroup.tinyscript.expression.calculator.StandardDeviationCalculator; +import org.tinygroup.tinyscript.expression.calculator.SumCalculator; +import org.tinygroup.tinyscript.expression.calculator.VarianceCalculator; +import org.tinygroup.tinyscript.expression.convert.ByteBigDecimal; +import org.tinygroup.tinyscript.expression.convert.ByteCharacter; +import org.tinygroup.tinyscript.expression.convert.ByteDouble; +import org.tinygroup.tinyscript.expression.convert.ByteFloat; +import org.tinygroup.tinyscript.expression.convert.ByteInteger; +import org.tinygroup.tinyscript.expression.convert.CharacterBigDecimal; +import org.tinygroup.tinyscript.expression.convert.CharacterDouble; +import org.tinygroup.tinyscript.expression.convert.CharacterFloat; +import org.tinygroup.tinyscript.expression.convert.CharacterInteger; +import org.tinygroup.tinyscript.expression.convert.DoubleBigDecimal; +import org.tinygroup.tinyscript.expression.convert.DoubleFloat; +import org.tinygroup.tinyscript.expression.convert.DoubleInteger; +import org.tinygroup.tinyscript.expression.convert.DoubleLong; +import org.tinygroup.tinyscript.expression.convert.FloatBigDecimal; +import org.tinygroup.tinyscript.expression.convert.FloatDouble; +import org.tinygroup.tinyscript.expression.convert.FloatInteger; +import org.tinygroup.tinyscript.expression.convert.FloatLong; +import org.tinygroup.tinyscript.expression.convert.IntegerBigDecimal; +import org.tinygroup.tinyscript.expression.convert.IntegerDouble; +import org.tinygroup.tinyscript.expression.convert.IntegerFloat; +import org.tinygroup.tinyscript.expression.convert.IntegerLong; +import org.tinygroup.tinyscript.expression.convert.LongBigDecimal; +import org.tinygroup.tinyscript.expression.convert.LongDouble; +import org.tinygroup.tinyscript.expression.convert.LongFloat; +import org.tinygroup.tinyscript.expression.convert.LongInteger; +import org.tinygroup.tinyscript.expression.convert.StringBigDecimal; +import org.tinygroup.tinyscript.expression.convert.StringDouble; +import org.tinygroup.tinyscript.expression.convert.StringFloat; +import org.tinygroup.tinyscript.expression.convert.StringInteger; +import org.tinygroup.tinyscript.expression.convert.StringLong; +import org.tinygroup.tinyscript.expression.iteratorconvert.ArrayIteratorConverter; +import org.tinygroup.tinyscript.expression.iteratorconvert.CollectionIteratorConverter; +import org.tinygroup.tinyscript.expression.iteratorconvert.MapIteratorConverter; +import org.tinygroup.tinyscript.expression.iteratorconvert.StringIteratorConverter; +import org.tinygroup.tinyscript.expression.operator.AdOperator; +import org.tinygroup.tinyscript.expression.operator.AddOperator; +import org.tinygroup.tinyscript.expression.operator.AndLogicOperator; +import org.tinygroup.tinyscript.expression.operator.BigEqualsOperator; +import org.tinygroup.tinyscript.expression.operator.BigOperator; +import org.tinygroup.tinyscript.expression.operator.ComplementOperator; +import org.tinygroup.tinyscript.expression.operator.ComplexOperator; +import org.tinygroup.tinyscript.expression.operator.DevideOperator; +import org.tinygroup.tinyscript.expression.operator.EqualsOperator; +import org.tinygroup.tinyscript.expression.operator.LeftAddOperator; +import org.tinygroup.tinyscript.expression.operator.LeftLiteralOperator; +import org.tinygroup.tinyscript.expression.operator.LeftNotOperator; +import org.tinygroup.tinyscript.expression.operator.LeftPlusPlusOperator; +import org.tinygroup.tinyscript.expression.operator.LeftSubtractOperator; +import org.tinygroup.tinyscript.expression.operator.LeftSubtractSubtractOperator; +import org.tinygroup.tinyscript.expression.operator.LessEqualsOperator; +import org.tinygroup.tinyscript.expression.operator.LessOperator; +import org.tinygroup.tinyscript.expression.operator.ModOperator; +import org.tinygroup.tinyscript.expression.operator.MultiplyOperator; +import org.tinygroup.tinyscript.expression.operator.NotEqualsOperator; +import org.tinygroup.tinyscript.expression.operator.OrLogicOperator; +import org.tinygroup.tinyscript.expression.operator.OrOperator; +import org.tinygroup.tinyscript.expression.operator.RightPlusPlusOperator; +import org.tinygroup.tinyscript.expression.operator.RightSubtractSubtractOperator; +import org.tinygroup.tinyscript.expression.operator.ShlOperator; +import org.tinygroup.tinyscript.expression.operator.Shr2Operator; +import org.tinygroup.tinyscript.expression.operator.ShrOperator; +import org.tinygroup.tinyscript.expression.operator.SimpleConditionOperator; +import org.tinygroup.tinyscript.expression.operator.SubtractOperator; +import org.tinygroup.tinyscript.expression.operator.XorOperator; +import org.tinygroup.tinyscript.expression.range.CharRangeOperator; +import org.tinygroup.tinyscript.expression.range.IntegerRangeOperator; +import org.tinygroup.tinyscript.expression.range.LongRangeOperator; +import org.tinygroup.tinyscript.expression.range.NumberRangeOperator; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; /** @@ -180,6 +265,22 @@ public final class ExpressionUtil { } } + public static Date convertDate(Object date) throws ParseException { + if(date instanceof Date) { + return (Date)date; + } + String strDate = (String)date; + SimpleDateFormat sdf; + if (strDate.indexOf("-") > 0) { + sdf = strDate.indexOf(":") > 0 ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + : new SimpleDateFormat("yyyy-MM-dd"); + } else { + sdf = strDate.indexOf(":") > 0 ? new SimpleDateFormat("yyyy/MM/dd HH:mm:ss") + : new SimpleDateFormat("yyyy/MM/dd"); + } + return sdf.parse(strDate); + } + public static Double convertDouble(Object value) throws ScriptException { return (Double) convert(value, Double.class); } diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateAddFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateAddFunction.java new file mode 100644 index 0000000..aabc1fb --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateAddFunction.java @@ -0,0 +1,45 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class DateAddFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "dateAdd"; + } + + @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, 3)) { + DateEnum datePart = DateEnum.valueOf((String) parameters[0]); + Integer interval = ExpressionUtil.convertInteger(parameters[1]); + Date date = ExpressionUtil.convertDate(parameters[2]); + Calendar newDate = Calendar.getInstance(); + newDate.setTime(date); + newDate.set(datePart.getCalendarId(), newDate.get(datePart.getCalendarId()) + interval); + return new Date(newDate.getTimeInMillis()); + } else { + throw new NotMatchException( + 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/date/DateDifferentFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateDifferentFunction.java index 21878b1..7c4fcc1 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateDifferentFunction.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateDifferentFunction.java @@ -1,42 +1,77 @@ package org.tinygroup.tinyscript.function.date; +import java.util.Calendar; import java.util.Date; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; import org.tinygroup.tinyscript.interpret.exception.NotMatchException; /** * 判断日期之间相差多少秒 + * * @author yancheng11334 * */ -public class DateDifferentFunction extends AbstractScriptFunction{ +public class DateDifferentFunction extends AbstractScriptFunction { public String getNames() { return "datediff"; } - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + DateEnum datePart = null; + Date d1 = null; + Date d2 = null; + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + String startWeekDay = null; + try { if (parameters == null || parameters.length == 0) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); - }else if(checkParameters(parameters, 2) && parameters[0] instanceof Date && parameters[1] instanceof Date){ - Date d1 = (Date) parameters[0]; - Date d2 = (Date) parameters[1]; - return (d1.getTime()-d2.getTime())/1000; - }else{ - throw new NotMatchException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } else if (checkParameters(parameters, 3)) { + datePart = DateEnum.valueOf((String) parameters[0]); + d1 = ExpressionUtil.convertDate(parameters[1]); + d2 = ExpressionUtil.convertDate(parameters[2]); + } else if (checkParameters(parameters, 4)) { + datePart = DateEnum.valueOf((String) parameters[0]); + d1 = ExpressionUtil.convertDate(parameters[1]); + d2 = ExpressionUtil.convertDate(parameters[2]); + startWeekDay = (String) parameters[3]; + } else { + throw new NotMatchException( + ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - }catch(ScriptException e){ + c1.setTime(d1); + c2.setTime(d2); + switch (datePart) { + case YEAR: + case MONTH: + case WEEKDAY: + return c1.get(datePart.getCalendarId()) - c2.get(datePart.getCalendarId()); + case WEEK: + return DateUtil.countWeekDiff(c1, c2, startWeekDay); + case DAY: + return (d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24); + case HOUR: + return (d1.getTime() - d2.getTime()) / (1000 * 60 * 60); + case MINUTE: + return (d1.getTime() - d2.getTime()) / (1000 * 60); + case SECOND: + return (d1.getTime() - d2.getTime()) / 1000; + } + return null; + } catch (ScriptException e) { throw e; - }catch(Exception e){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames()),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/date/DateEnum.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateEnum.java new file mode 100644 index 0000000..400b3ca --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateEnum.java @@ -0,0 +1,20 @@ +package org.tinygroup.tinyscript.function.date; + +public enum DateEnum { + YEAR(1), MONTH(2), WEEK(3), DAY(5), HOUR(10), MINUTE(12), SECOND(13), WEEKDAY(7); + + private int calendarId; + + + private DateEnum(int calendarId) { + this.calendarId = calendarId; + } + + public int getCalendarId() { + return calendarId; + } + + public void setCalendarId(int calendarId) { + this.calendarId = calendarId; + } +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateNameFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateNameFunction.java new file mode 100644 index 0000000..2410a5c --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateNameFunction.java @@ -0,0 +1,70 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class DateNameFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "dateName"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + DateEnum datePart = null; + Calendar cal = Calendar.getInstance(); + String startWeekDay = null; + + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 2)) { + datePart = DateEnum.valueOf((String) parameters[0]); + Date date = ExpressionUtil.convertDate(parameters[1]); + cal.setTime(date); + } else if (checkParameters(parameters, 3)) { + datePart = DateEnum.valueOf((String) parameters[0]); + Date date = ExpressionUtil.convertDate(parameters[1]); + startWeekDay = (String) parameters[2]; + cal.setTime(date); + } else { + throw new NotMatchException( + ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + switch (datePart) { + case YEAR: + case DAY: + case HOUR: + case MINUTE: + case SECOND: + return cal.get(datePart.getCalendarId()) + ""; + case WEEK: + Calendar start = Calendar.getInstance(); + start.setTime(new Date()); + start.set(Calendar.MONTH, 0); + start.set(Calendar.DATE, 1); + return DateUtil.countWeekDiff(start, cal, startWeekDay); + case WEEKDAY: + return DateUtil.getWeekday(cal.get(datePart.getCalendarId()) - 1); + case MONTH: + return DateUtil.dateToString(cal.getTime(), "MMM"); + default: + return null; + } + } 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/date/DatePartFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DatePartFunction.java new file mode 100644 index 0000000..7611565 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DatePartFunction.java @@ -0,0 +1,69 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class DatePartFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "datePart"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + DateEnum datePart = null; + Calendar cal = Calendar.getInstance(); + String startWeekDay = null; + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 2)) { + datePart = DateEnum.valueOf((String) parameters[0]); + Date date = ExpressionUtil.convertDate(parameters[1]); + cal.setTime(date); + } else if (checkParameters(parameters, 3)) { + datePart = DateEnum.valueOf((String) parameters[0]); + Date date = ExpressionUtil.convertDate(parameters[1]); + startWeekDay = (String) parameters[2]; + cal.setTime(date); + } else { + throw new NotMatchException( + ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + switch (datePart) { + case DAY: + case HOUR: + case MINUTE: + case SECOND: + case WEEKDAY: + case YEAR: + return cal.get(datePart.getCalendarId()); + case WEEK: + Calendar start = Calendar.getInstance(); + start.setTime(new Date()); + start.set(Calendar.MONTH, 0); + start.set(Calendar.DATE, 1); + return DateUtil.countWeekDiff(start, cal, startWeekDay); + case MONTH: + return cal.get(datePart.getCalendarId()) + 1; + default: + return null; + } + + } 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/date/DateTruncFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateTruncFunction.java new file mode 100644 index 0000000..afa2c7d --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateTruncFunction.java @@ -0,0 +1,73 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class DateTruncFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "dateTrunc"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + DateEnum datePart = null; + Calendar cal = Calendar.getInstance(); + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 2)) { + datePart = DateEnum.valueOf((String) parameters[0]); + Date date = ExpressionUtil.convertDate(parameters[1]); + cal.setTime(date); + } else { + throw new NotMatchException( + ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + switch (datePart) { + case WEEK: + Calendar start = Calendar.getInstance(); + start.setTime(new Date()); + start.set(Calendar.MONTH, 0); + start.set(Calendar.DATE, 1); + if (start.get(Calendar.DAY_OF_WEEK) != 1) { + start.set(Calendar.DATE, 9 - start.get(Calendar.DAY_OF_WEEK)); + } + return start.getTime(); + case WEEKDAY: + if (cal.get(Calendar.DAY_OF_WEEK) != 1) { + cal.set(Calendar.DATE, cal.get(Calendar.DATE) - cal.get(Calendar.DAY_OF_WEEK) + 1); + } + return cal.getTime(); + case YEAR: + case MONTH: + cal.set(Calendar.MONTH, 0); + case DAY: + cal.set(Calendar.DATE, 1); + case HOUR: + cal.set(Calendar.HOUR, 0); + case MINUTE: + cal.set(Calendar.MINUTE, 0); + case SECOND: + cal.set(Calendar.SECOND, 0); + return cal.getTime(); + default: + return null; + } + } 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/date/DateUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateUtil.java new file mode 100644 index 0000000..5ed026d --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DateUtil.java @@ -0,0 +1,58 @@ +package org.tinygroup.tinyscript.function.date; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +public class DateUtil { + private static final List weekDays = new ArrayList(); + static { + weekDays.add("sunday"); + weekDays.add("monday"); + weekDays.add("tuesday"); + weekDays.add("wednesday"); + weekDays.add("thursday"); + weekDays.add("friday"); + weekDays.add("saturday"); + } + + public static String getWeekday(int index) { + return weekDays.get(index); + } + + public static int getWeekDay(String weekDay) { + return weekDays.indexOf(weekDay); + } + + public static int countWeekDiff(Calendar c1, Calendar c2, String startWeekDay) { + int diffWeeks = 0; + startWeekDay = startWeekDay == null ? "sunday" : startWeekDay; + if (c1.get(Calendar.DAY_OF_WEEK) > 1 + getWeekDay(startWeekDay)) { + c1.set(Calendar.DATE, + c1.get(Calendar.DATE) + 8 - c1.get(Calendar.DAY_OF_WEEK) + getWeekDay(startWeekDay)); + if (c1.getTimeInMillis() <= c2.getTimeInMillis()) { + diffWeeks = 1; + } + } else if (c1.get(Calendar.DAY_OF_WEEK) < 1 + getWeekDay(startWeekDay)) { + c1.set(Calendar.DATE, + c1.get(Calendar.DATE) + 1 - c1.get(Calendar.DAY_OF_WEEK) + getWeekDay(startWeekDay)); + if (c1.getTimeInMillis() <= c2.getTimeInMillis()) { + diffWeeks = 1; + } + } + if (c1.getTimeInMillis() > c2.getTimeInMillis()) { + return diffWeeks; + } + int daysDiff = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24)); + return daysDiff / 7 + diffWeeks; + } + + public static String dateToString(Date date,String format) { + DateFormat df = new SimpleDateFormat(format, Locale.ENGLISH); + return df.format(date); + } +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DayFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DayFunction.java new file mode 100644 index 0000000..f02cdec --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/DayFunction.java @@ -0,0 +1,42 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class DayFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "day"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + Calendar cal = Calendar.getInstance(); + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + Date date = ExpressionUtil.convertDate(parameters[0]); + cal.setTime(date); + return cal.get(Calendar.DAY_OF_MONTH); + } else { + throw new NotMatchException( + 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/date/IsDateFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/IsDateFunction.java new file mode 100644 index 0000000..8201232 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/IsDateFunction.java @@ -0,0 +1,41 @@ +package org.tinygroup.tinyscript.function.date; + +import java.text.ParseException; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class IsDateFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "isDate"; + } + + @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, 1)) { + ExpressionUtil.convertDate(parameters[0]); + return true; + } else { + throw new NotMatchException( + ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ParseException e) { + return false; + } 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/date/MakeDateFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MakeDateFunction.java new file mode 100644 index 0000000..4ad184f --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MakeDateFunction.java @@ -0,0 +1,45 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class MakeDateFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "makeDate"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + Calendar cal = Calendar.getInstance(); + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 3)) { + int year = ExpressionUtil.convertInteger(parameters[0]); + int month = ExpressionUtil.convertInteger(parameters[1]); + int day = ExpressionUtil.convertInteger(parameters[2]); + cal.set(Calendar.YEAR, year); + cal.set(Calendar.MONTH, month - 1); + cal.set(Calendar.DATE, day); + return cal.getTime(); + } else { + throw new NotMatchException( + 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/date/MakeDateTime.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MakeDateTime.java new file mode 100644 index 0000000..1b9d3f2 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MakeDateTime.java @@ -0,0 +1,46 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class MakeDateTime extends AbstractScriptFunction { + + @Override + public String getNames() { + return "makeDateTime"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + Calendar cal = Calendar.getInstance(); + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 2)) { + Date date = ExpressionUtil.convertDate(parameters[0]); + String[] times = ((String) parameters[1]).split(":"); + cal.setTime(date); + cal.set(Calendar.HOUR, Integer.parseInt(times[0])); + cal.set(Calendar.MINUTE, Integer.parseInt(times[1])); + cal.set(Calendar.SECOND, Integer.parseInt(times[2])); + return cal.getTime(); + } else { + throw new NotMatchException( + 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/date/MonthFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MonthFunction.java new file mode 100644 index 0000000..9ff18b5 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/MonthFunction.java @@ -0,0 +1,42 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class MonthFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "month"; + } + + @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, 1)) { + Date date = ExpressionUtil.convertDate(parameters[0]); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.MONTH) + 1; + } else { + throw new NotMatchException( + 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/date/NowFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/NowFunction.java new file mode 100644 index 0000000..1ae25aa --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/NowFunction.java @@ -0,0 +1,28 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Date; + +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 NowFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "now"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + return new Date(); + } 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/date/TodayFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/TodayFunction.java new file mode 100644 index 0000000..d67a5c5 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/TodayFunction.java @@ -0,0 +1,27 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Date; + +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 TodayFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "today"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + return DateUtil.dateToString(new Date(),"yyyy-MM-dd"); + } 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/date/YearFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/YearFunction.java new file mode 100644 index 0000000..43b5c6e --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/date/YearFunction.java @@ -0,0 +1,42 @@ +package org.tinygroup.tinyscript.function.date; + +import java.util.Calendar; +import java.util.Date; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.expression.ExpressionUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.exception.NotMatchException; + +public class YearFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "year"; + } + + @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, 1)) { + Date date = ExpressionUtil.convertDate(parameters[0]); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } else { + throw new NotMatchException( + 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 727a393..0288d41 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 @@ -30,109 +30,120 @@ import org.tinygroup.tinyscript.interpret.ScriptContextUtil; */ public class DefaultScriptEngine extends AbstractScriptEngine { - //无绑定一般函数 + // 无绑定一般函数 private Map functionMap = new HashMap(); - //绑定一般函数 + // 绑定一般函数 private Map, Map> typeFunctionMap = new HashMap, Map>(); - //无绑定动态名称函数 + // 无绑定动态名称函数 private List dynamicList = new ArrayList(); - //绑定动态名称函数 - private Map,List> typeDynamicMap = new HashMap,List>(); + // 绑定动态名称函数 + private Map, List> typeDynamicMap = new HashMap, List>(); - protected static final Logger LOGGER = LoggerFactory - .getLogger(DefaultScriptEngine.class); - - public DefaultScriptEngine() throws ScriptException{ + protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultScriptEngine.class); + + public DefaultScriptEngine() throws ScriptException { super(); initScriptEngine(); } - - public DefaultScriptEngine(Map map) throws ScriptException{ + + public DefaultScriptEngine(Map map) throws ScriptException { super(map); initScriptEngine(); } - - private void initScriptEngine() throws ScriptException{ - //注册函数 + + private void initScriptEngine() throws ScriptException { + // 注册函数 addScriptFunction(new MathAbsFunction()); - addScriptFunction(new MathAcosFunction()); - addScriptFunction(new MathAsinFunction()); + addScriptFunction(new MathAcosFunction()); + addScriptFunction(new MathAsinFunction()); addScriptFunction(new MathAtanFunction()); addScriptFunction(new MathCosFunction()); addScriptFunction(new MathSinFunction()); addScriptFunction(new MathTanFunction()); addScriptFunction(new MathSqrtFunction()); - addScriptFunction(new MathPowFunction()); - addScriptFunction(new MathRoundFunction()); - addScriptFunction(new MathCeilFunction()); - addScriptFunction(new MathFloorFunction()); - addScriptFunction(new MathSignFunction()); - addScriptFunction(new MathLogFunction()); - addScriptFunction(new MathRadiansFunction()); - addScriptFunction(new MathLnFunction()); - addScriptFunction(new MathExpFunction()); - addScriptFunction(new MathDegreesFunction()); - addScriptFunction(new MathCotFunction()); - addScriptFunction(new MathAtan2Function()); + addScriptFunction(new MathPowFunction()); + addScriptFunction(new MathRoundFunction()); + addScriptFunction(new MathCeilFunction()); + addScriptFunction(new MathFloorFunction()); + addScriptFunction(new MathSignFunction()); + addScriptFunction(new MathLogFunction()); + addScriptFunction(new MathRadiansFunction()); + addScriptFunction(new MathLnFunction()); + addScriptFunction(new MathExpFunction()); + addScriptFunction(new MathDegreesFunction()); + addScriptFunction(new MathCotFunction()); + addScriptFunction(new MathAtan2Function()); addScriptFunction(new MathAggregateFunction()); - + addScriptFunction(new ClearTimeFunction()); + addScriptFunction(new DateAddFunction()); + addScriptFunction(new DateNameFunction()); + addScriptFunction(new DatePartFunction()); + addScriptFunction(new DateTruncFunction()); + addScriptFunction(new DayFunction()); + addScriptFunction(new IsDateFunction()); + addScriptFunction(new MakeDateFunction()); + addScriptFunction(new MakeDateTime()); + addScriptFunction(new MonthFunction()); + addScriptFunction(new NowFunction()); + addScriptFunction(new TodayFunction()); + addScriptFunction(new YearFunction()); addScriptFunction(new EqualsDateFunction()); addScriptFunction(new DateDifferentFunction()); addScriptFunction(new TypeConvertFunction()); addScriptFunction(new EvalScriptFunction()); - + addScriptFunction(new DoubleRandFunction()); addScriptFunction(new FloatRandFunction()); addScriptFunction(new IntRandFunction()); addScriptFunction(new LongRandFunction()); addScriptFunction(new ArrayRandFunction()); - + addScriptFunction(new ConsolePrintFunction()); addScriptFunction(new ConsolePrintfFunction()); addScriptFunction(new ConsolePrintlnFunction()); addScriptFunction(new LoggerFunction()); - + addScriptFunction(new SetLocaleFunction()); - - //注册数学常量 + + // 注册数学常量 getScriptContext().put("PI", Math.PI); getScriptContext().put("E", Math.E); - - //注册引擎到上下文 + + // 注册引擎到上下文 ScriptContextUtil.setScriptEngine(getScriptContext(), this); } - - public void addScriptFunction(ScriptFunction function) - throws ScriptException { + + public void addScriptFunction(ScriptFunction function) throws ScriptException { function.setScriptEngine(this); - if(function instanceof DynamicNameScriptFunction){ - //动态名称函数处理 + if (function instanceof DynamicNameScriptFunction) { + // 动态名称函数处理 DynamicNameScriptFunction dynamicNameScriptFunction = (DynamicNameScriptFunction) function; if (function.getBindingTypes() == null) { - if(!dynamicList.contains(dynamicNameScriptFunction)){ - dynamicList.add(dynamicNameScriptFunction); - } - }else{ + if (!dynamicList.contains(dynamicNameScriptFunction)) { + dynamicList.add(dynamicNameScriptFunction); + } + } else { String[] types = function.getBindingTypes().split(","); for (String type : types) { try { Class clazz = Class.forName(type); List dynamicNameList = typeDynamicMap.get(clazz); - if(dynamicNameList==null){ - dynamicNameList = new ArrayList(); - typeDynamicMap.put(clazz, dynamicNameList); + if (dynamicNameList == null) { + dynamicNameList = new ArrayList(); + typeDynamicMap.put(clazz, dynamicNameList); } - if(!dynamicNameList.contains(dynamicNameScriptFunction)){ + if (!dynamicNameList.contains(dynamicNameScriptFunction)) { dynamicNameList.add(dynamicNameScriptFunction); } - }catch (ClassNotFoundException e) { - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class1", type),e); + } catch (ClassNotFoundException e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class1", type), + e); } } } - }else{ - //一般函数处理 + } else { + // 一般函数处理 String[] names = function.getNames().split(","); if (function.getBindingTypes() == null) { for (String name : names) { @@ -143,8 +154,7 @@ public class DefaultScriptEngine extends AbstractScriptEngine { for (String type : types) { try { Class clazz = Class.forName(type); - Map nameMap = typeFunctionMap - .get(clazz); + Map nameMap = typeFunctionMap.get(clazz); if (nameMap == null) { nameMap = new HashMap(); typeFunctionMap.put(clazz, nameMap); @@ -153,19 +163,19 @@ public class DefaultScriptEngine extends AbstractScriptEngine { nameMap.put(name, function); } } catch (ClassNotFoundException e) { - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class1", type),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class1", type), + e); } } } } - + } - public void removeScriptFunction(ScriptFunction function) - throws ScriptException { + public void removeScriptFunction(ScriptFunction function) throws ScriptException { function.setScriptEngine(null); - if(function instanceof DynamicNameScriptFunction){ - //动态名称函数处理 + if (function instanceof DynamicNameScriptFunction) { + // 动态名称函数处理 if (function.getBindingTypes() == null) { dynamicList.remove(function); } else { @@ -174,20 +184,21 @@ public class DefaultScriptEngine extends AbstractScriptEngine { try { Class clazz = Class.forName(type); List dynamicNameList = typeDynamicMap.get(clazz); - if(dynamicNameList!=null){ - dynamicNameList.remove(function); - - if(dynamicNameList.isEmpty()){ - typeDynamicMap.remove(clazz); - } - } - }catch (ClassNotFoundException e) { - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class2", type),e); + if (dynamicNameList != null) { + dynamicNameList.remove(function); + + if (dynamicNameList.isEmpty()) { + typeDynamicMap.remove(clazz); + } + } + } catch (ClassNotFoundException e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class2", type), + e); } } } } else { - //一般函数处理 + // 一般函数处理 String[] names = function.getNames().split(","); if (function.getBindingTypes() == null) { for (String name : names) { @@ -198,142 +209,141 @@ public class DefaultScriptEngine extends AbstractScriptEngine { for (String type : types) { try { Class clazz = Class.forName(type); - Map nameMap = typeFunctionMap - .get(clazz); - if(nameMap!=null){ + Map nameMap = typeFunctionMap.get(clazz); + if (nameMap != null) { for (String name : names) { - nameMap.remove(name); + nameMap.remove(name); } - if(nameMap.isEmpty()){ - typeFunctionMap.remove(clazz); + if (nameMap.isEmpty()) { + typeFunctionMap.remove(clazz); } } - + } catch (ClassNotFoundException e) { - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class2", type),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.notfind.class2", type), + e); } } } } - + } - public ScriptFunction findScriptFunction(Object object, - String functionName) throws ScriptException { - if(object==null){ - //一般函数 + public ScriptFunction findScriptFunction(Object object, String functionName) throws ScriptException { + if (object == null) { + // 一般函数 ScriptFunction function = functionMap.get(functionName); - - if(function==null){ - //动态名称函数 - for(DynamicNameScriptFunction dynamicNameScriptFunction:dynamicList){ - if(dynamicNameScriptFunction.exsitFunctionName(functionName)){ - return dynamicNameScriptFunction; - } - } + + if (function == null) { + // 动态名称函数 + for (DynamicNameScriptFunction dynamicNameScriptFunction : dynamicList) { + if (dynamicNameScriptFunction.exsitFunctionName(functionName)) { + return dynamicNameScriptFunction; + } + } } return function; - }else{ - //一般函数 - ScriptFunction function = findScriptFunctionByClass(object.getClass(),functionName); - if(function!=null){ - return function; + } else { + // 一般函数 + ScriptFunction function = findScriptFunctionByClass(object.getClass(), functionName); + if (function != null) { + return function; } - for(Class clazz:typeFunctionMap.keySet()){ - if(clazz.isInstance(object)){ - function = findScriptFunctionByClass(clazz,functionName); - if(function!=null){ - return function; - } - } + for (Class clazz : typeFunctionMap.keySet()) { + if (clazz.isInstance(object)) { + function = findScriptFunctionByClass(clazz, functionName); + if (function != null) { + return function; + } + } } - //动态名称函数 - function = findDynamicNameScriptFunction(object.getClass(),functionName); - if(function!=null){ - return function; + // 动态名称函数 + function = findDynamicNameScriptFunction(object.getClass(), functionName); + if (function != null) { + return function; } - for(Class clazz:typeDynamicMap.keySet()){ - if(clazz.isInstance(object)){ - function = findDynamicNameScriptFunction(clazz,functionName); - if(function!=null){ - return function; - } - } + for (Class clazz : typeDynamicMap.keySet()) { + if (clazz.isInstance(object)) { + function = findDynamicNameScriptFunction(clazz, functionName); + if (function != null) { + return function; + } + } } } return null; } - - public List getFunctionConfigs(Object object) throws ScriptException{ + + public List getFunctionConfigs(Object object) throws ScriptException { List configs = new ArrayList(); - if(object==null){ - //一般非绑定函数 - for(ScriptFunction function:functionMap.values()){ - configs.addAll(function.getFunctionConfigs()); - } - //动态非绑定函数 - for(DynamicNameScriptFunction dynamicNameScriptFunction:dynamicList){ - configs.addAll(dynamicNameScriptFunction.getFunctionConfigs()); - } - }else{ - //一般绑定函数 - for(Class clazz:typeFunctionMap.keySet()){ - if(clazz.equals(object.getClass()) || clazz.isInstance(object)){ - Map nameMap = typeFunctionMap.get(clazz); - for(ScriptFunction function:nameMap.values()){ - configs.addAll(function.getFunctionConfigs()); - } - } - } - //动态绑定函数 - for(Class clazz:typeDynamicMap.keySet()){ - if(clazz.equals(object.getClass()) || clazz.isInstance(object)){ - List dynamicNameScriptFunctions = typeDynamicMap.get(clazz); - for(DynamicNameScriptFunction dynamicNameScriptFunction:dynamicNameScriptFunctions){ - configs.addAll(dynamicNameScriptFunction.getFunctionConfigs()); - } - } - } + if (object == null) { + // 一般非绑定函数 + for (ScriptFunction function : functionMap.values()) { + configs.addAll(function.getFunctionConfigs()); + } + // 动态非绑定函数 + for (DynamicNameScriptFunction dynamicNameScriptFunction : dynamicList) { + configs.addAll(dynamicNameScriptFunction.getFunctionConfigs()); + } + } else { + // 一般绑定函数 + for (Class clazz : typeFunctionMap.keySet()) { + if (clazz.equals(object.getClass()) || clazz.isInstance(object)) { + Map nameMap = typeFunctionMap.get(clazz); + for (ScriptFunction function : nameMap.values()) { + configs.addAll(function.getFunctionConfigs()); + } + } + } + // 动态绑定函数 + for (Class clazz : typeDynamicMap.keySet()) { + if (clazz.equals(object.getClass()) || clazz.isInstance(object)) { + List dynamicNameScriptFunctions = typeDynamicMap.get(clazz); + for (DynamicNameScriptFunction dynamicNameScriptFunction : dynamicNameScriptFunctions) { + configs.addAll(dynamicNameScriptFunction.getFunctionConfigs()); + } + } + } } - //进行排序 + // 进行排序 Collections.sort(configs); return configs; } - - private ScriptFunction findDynamicNameScriptFunction(Class clazz,String functionName){ + + private ScriptFunction findDynamicNameScriptFunction(Class clazz, String functionName) { List dynamicNameList = typeDynamicMap.get(clazz); - if(dynamicNameList!=null){ - for(DynamicNameScriptFunction dynamicNameScriptFunction:dynamicNameList){ - if(dynamicNameScriptFunction.exsitFunctionName(functionName)){ - return dynamicNameScriptFunction; - } - } + if (dynamicNameList != null) { + for (DynamicNameScriptFunction dynamicNameScriptFunction : dynamicNameList) { + if (dynamicNameScriptFunction.exsitFunctionName(functionName)) { + return dynamicNameScriptFunction; + } + } } return null; } - - private ScriptFunction findScriptFunctionByClass(Class clazz,String functionName){ + + private ScriptFunction findScriptFunctionByClass(Class clazz, String functionName) { Map nameMap = typeFunctionMap.get(clazz); - return nameMap!=null?nameMap.get(functionName):null; + return nameMap != null ? nameMap.get(functionName) : null; } - protected ScriptSegment findScriptSegmentWithoutCache(Object queryRule) - throws ScriptException { + protected ScriptSegment findScriptSegmentWithoutCache(Object queryRule) throws ScriptException { ScriptSegment segment = null; - //执行创建段逻辑 - String sourceName= "S"+System.nanoTime(); - try{ - segment = getScriptInterpret().createScriptSegment(this, sourceName,(String)queryRule); - }catch(Exception e){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("engine.parser.error", queryRule,e.getMessage())); + // 执行创建段逻辑 + String sourceName = "S" + System.nanoTime(); + try { + segment = getScriptInterpret().createScriptSegment(this, sourceName, (String) queryRule); + } catch (Exception e) { + throw new ScriptException( + ResourceBundleUtil.getDefaultMessage("engine.parser.error", queryRule, e.getMessage())); } - return segment; + return segment; } public void start() throws ScriptException { LOGGER.logMessage(LogLevel.INFO, ResourceBundleUtil.getDefaultMessage("engine.start.finish")); } - + public void stop() throws ScriptException { super.stop(); functionMap.clear(); diff --git a/org.tinygroup.tinyscriptbase/src/test/java/org/tinygroup/tinyscript/DateTest.java b/org.tinygroup.tinyscriptbase/src/test/java/org/tinygroup/tinyscript/DateTest.java index 8af0945..1db3f77 100644 --- a/org.tinygroup.tinyscriptbase/src/test/java/org/tinygroup/tinyscript/DateTest.java +++ b/org.tinygroup.tinyscriptbase/src/test/java/org/tinygroup/tinyscript/DateTest.java @@ -1,6 +1,10 @@ package org.tinygroup.tinyscript; import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import junit.framework.TestCase; @@ -15,18 +19,18 @@ public class DateTest extends TestCase { scriptEngine = new DefaultScriptEngine(); scriptEngine.start(); } - - public void testDateDiff() throws Exception{ + + public void testDateDiff() throws Exception { Timestamp t1 = Timestamp.valueOf("2017-04-28 00:00:13.0"); Timestamp t2 = Timestamp.valueOf("2017-04-27 23:59:59.0"); ScriptContext context = new DefaultScriptContext(); context.put("t1", t1); context.put("t2", t2); - - assertEquals(14L, scriptEngine.execute("return datediff(t1,t2);", context)); + + assertEquals(14L, scriptEngine.execute("return datediff(\"SECOND\",t1,t2);", context)); } - - public void testEqualsDate() throws Exception{ + + public void testEqualsDate() throws Exception { Timestamp t1 = Timestamp.valueOf("2017-04-28 00:00:13.0"); Timestamp t2 = Timestamp.valueOf("2017-04-27 23:59:59.0"); Timestamp t3 = Timestamp.valueOf("2017-04-28 23:59:59.0"); @@ -34,10 +38,23 @@ public class DateTest extends TestCase { context.put("t1", t1); context.put("t2", t2); context.put("t3", t3); - + assertEquals(false, scriptEngine.execute("return t1.equalsDate(t2);", context)); assertEquals(true, scriptEngine.execute("return t1.equalsDate(t3);", context)); } - + public void testTableau() throws ScriptException, ParseException { + assertNotNull(scriptEngine.execute("return now();")); + assertNotNull(scriptEngine.execute("return today();")); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = dateFormat.parse("2018-10-31 11:1:1"); + assertEquals(date, scriptEngine.execute("return dateAdd(\"YEAR\",1,\"2017-10-31 11:1:1\");")); + assertEquals(1, scriptEngine.execute("return datediff(\"WEEK\",\"2017-10-31\",\"2017-11-1\",\"wednesday\");")); + assertEquals("Oct", scriptEngine.execute("return dateName(\"MONTH\",\"2017-10-31 11:1:1\");")); + assertEquals(44, scriptEngine.execute("return datePart(\"WEEK\",\"2017-10-31 11:1:1\",\"monday\");")); + assertNotNull(scriptEngine.execute("return dateTrunc(\"WEEKDAY\",\"2017-11-30 11:1:1\");")); + assertEquals(true, scriptEngine.execute("return isDate(\"2017/11/30\");")); + + } + } -- Gitee