diff --git a/li.strolch.service/src/main/java/li/strolch/report/policy/GenericReport.java b/li.strolch.service/src/main/java/li/strolch/report/policy/GenericReport.java index 97d32d4ea..8ee304983 100644 --- a/li.strolch.service/src/main/java/li/strolch/report/policy/GenericReport.java +++ b/li.strolch.service/src/main/java/li/strolch/report/policy/GenericReport.java @@ -5,6 +5,7 @@ import static li.strolch.model.StrolchModelConstants.*; import static li.strolch.report.ReportConstants.*; import static li.strolch.utils.helper.StringHelper.EMPTY; +import java.time.ZonedDateTime; import java.util.*; import java.util.function.Supplier; import java.util.stream.Collector; @@ -18,8 +19,8 @@ import li.strolch.model.parameter.DateParameter; import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.model.policy.PolicyDef; -import li.strolch.model.visitor.ElementDateVisitor; import li.strolch.model.visitor.ElementStateVisitor; +import li.strolch.model.visitor.ElementZdtDateVisitor; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.policy.PolicyHandler; import li.strolch.report.ReportConstants; @@ -29,7 +30,7 @@ import li.strolch.utils.collections.DateRange; import li.strolch.utils.collections.MapOfLists; import li.strolch.utils.collections.MapOfSets; import li.strolch.utils.collections.TypedTuple; -import li.strolch.utils.iso8601.ISO8601FormatFactory; +import li.strolch.utils.iso8601.ISO8601; /** * A Generic Report defines a report as is described at Strolch @@ -405,8 +406,10 @@ public class GenericReport extends ReportPolicy { return buildStream().map(e -> new ReportElement(this.columnIds, columnId -> { StringParameter columnDefP = this.columnsBag.getParameter(columnId, true); Object value = evaluateColumnValue(columnDefP, e, false); + if (value instanceof ZonedDateTime) + return ISO8601.toString((ZonedDateTime) value); if (value instanceof Date) - return ISO8601FormatFactory.getInstance().formatDate((Date) value); + return ISO8601.toString((Date) value); if (value instanceof Parameter) return ((Parameter) value).getValueAsString(); return value.toString(); @@ -594,9 +597,9 @@ public class GenericReport extends ReportPolicy { String dateRangeSel = this.dateRangeSelP.getValue(); - Date date; + ZonedDateTime date; if (dateRangeSel.equals(COL_DATE)) { - date = element.accept(new ElementDateVisitor()); + date = element.accept(new ElementZdtDateVisitor()); } else { Optional> param = lookupParameter(this.dateRangeSelP, element); if (!param.isPresent() || StrolchValueType.parse(param.get().getType()) != StrolchValueType.DATE) @@ -604,7 +607,7 @@ public class GenericReport extends ReportPolicy { "Date Range selector is invalid, as referenced parameter is not a Date but " + (param .isPresent() ? param.get().getType() : "null")); - date = ((DateParameter) param.get()).getValue(); + date = ((DateParameter) param.get()).getValueZdt(); } if (!this.dateRange.contains(date)) @@ -664,7 +667,7 @@ public class GenericReport extends ReportPolicy { } else if (columnDef.equals(COL_STATE)) { columnValue = column.accept(new ElementStateVisitor()); } else if (columnDef.equals(COL_DATE)) { - columnValue = column.accept(new ElementDateVisitor()); + columnValue = column.accept(new ElementZdtDateVisitor()); } else if (columnDef.startsWith(COL_SEARCH)) { Parameter parameter = findParameter(columnDefP, column); if (parameter == null) diff --git a/li.strolch.service/src/main/java/li/strolch/report/policy/ReportFilterPolicy.java b/li.strolch.service/src/main/java/li/strolch/report/policy/ReportFilterPolicy.java index beb89d28a..6f9bf3b1c 100644 --- a/li.strolch.service/src/main/java/li/strolch/report/policy/ReportFilterPolicy.java +++ b/li.strolch.service/src/main/java/li/strolch/report/policy/ReportFilterPolicy.java @@ -3,6 +3,7 @@ package li.strolch.report.policy; import java.time.LocalDateTime; import java.time.Period; import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.Date; import li.strolch.model.StrolchValueType; @@ -10,6 +11,7 @@ import li.strolch.model.parameter.Parameter; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.policy.StrolchPolicy; import li.strolch.utils.dbc.DBC; +import li.strolch.utils.iso8601.ISO8601; import li.strolch.utils.iso8601.ISO8601FormatFactory; public abstract class ReportFilterPolicy extends StrolchPolicy { @@ -47,7 +49,14 @@ public abstract class ReportFilterPolicy extends StrolchPolicy { DBC.PRE.assertNotNull("value required!", value); Object left; - if (value instanceof Date) { + if (value instanceof ZonedDateTime) { + + if (this.right == null) + this.right = parseFilterValueToZdt(this.filterValue); + + left = value; + + } else if (value instanceof Date) { if (this.right == null) this.right = parseFilterValueToDate(this.filterValue); @@ -83,6 +92,7 @@ public abstract class ReportFilterPolicy extends StrolchPolicy { protected Date parseFilterValueToDate(String filterValue) { DBC.INTERIM.assertNotEmpty("filterValue must not be empty for date comparisons!", filterValue); + logger.error("DEPRECATED, use ZonedDateTime"); if (!filterValue.startsWith("now")) return ISO8601FormatFactory.getInstance().parseDate(filterValue); @@ -99,6 +109,23 @@ public abstract class ReportFilterPolicy extends StrolchPolicy { return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); } + protected ZonedDateTime parseFilterValueToZdt(String filterValue) { + DBC.INTERIM.assertNotEmpty("filterValue must not be empty for date comparisons!", filterValue); + + if (!filterValue.startsWith("now")) + return ISO8601.parseToZdt(filterValue); + + if (filterValue.charAt(3) != '(' || filterValue.charAt(filterValue.length() - 1) != ')') + throw new IllegalArgumentException("now() format invalid for " + filterValue); + + String periodS = filterValue.substring(4, filterValue.length() - 1); + if (periodS.isEmpty()) + return ZonedDateTime.now(); + + Period period = Period.parse(periodS); + return ZonedDateTime.now().plus(period); + } + protected abstract boolean filter(Object left, Object right, boolean negate); @Override