From d7c6025c592e372a3e11480fe67e7f9fd4b0bb1e Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Sat, 4 Oct 2014 13:40:52 +0200 Subject: [PATCH] [New] Added a new parameter: DurationParameter of type "Duration" The parameter is implemented in all visitors and also persistence layer postgre. --- .../query/inmemory/InMemoryQueryVisitor.java | 7 ++ .../query/inmemory/ParameterSelector.java | 29 +++++ .../java/li/strolch/model/ModelGenerator.java | 10 ++ .../strolch/model/ParameterizedElement.java | 4 + .../model/parameter/DurationParameter.java | 115 ++++++++++++++++++ .../model/query/ParameterSelection.java | 29 +++++ .../query/ParameterSelectionVisitor.java | 3 + .../li/strolch/model/query/QueryVisitor.java | 4 +- .../model/visitor/ParameterVisitor.java | 3 + .../visitor/SetParameterValueVisitor.java | 8 +- .../strolch/model/xml/XmlModelSaxReader.java | 7 ++ .../src/test/resources/data/orders/Orders.xml | 1 + .../resources/data/resources/Resources.xml | 1 + .../postgresql/PostgreSqlQueryVisitor.java | 7 ++ .../postgresql/dao/test/QueryTest.java | 7 ++ 15 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 li.strolch.model/src/main/java/li/strolch/model/parameter/DurationParameter.java diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java index 67285491b..c74f00be9 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java @@ -31,6 +31,7 @@ import li.strolch.model.query.ParameterBagSelection.NullParameterBagSelection; import li.strolch.model.query.ParameterSelection.BooleanParameterSelection; import li.strolch.model.query.ParameterSelection.DateParameterSelection; import li.strolch.model.query.ParameterSelection.DateRangeParameterSelection; +import li.strolch.model.query.ParameterSelection.DurationParameterSelection; import li.strolch.model.query.ParameterSelection.FloatParameterSelection; import li.strolch.model.query.ParameterSelection.IntegerParameterSelection; import li.strolch.model.query.ParameterSelection.LongParameterSelection; @@ -188,6 +189,12 @@ public abstract class InMemoryQueryVisitor durationSelector(selection.getBagKey(), selection.getParamKey(), + selection.getValue())); + } + @Override public void visit(DateRangeParameterSelection selection) { addSelector(ParameterSelector. dateRangeSelector(selection.getBagKey(), selection.getParamKey(), diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/ParameterSelector.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/ParameterSelector.java index d8d5e4819..bb752cb38 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/ParameterSelector.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/ParameterSelector.java @@ -22,6 +22,7 @@ import li.strolch.model.GroupedParameterizedElement; import li.strolch.model.ParameterBag; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.DateParameter; +import li.strolch.model.parameter.DurationParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.IntegerParameter; import li.strolch.model.parameter.LongParameter; @@ -75,6 +76,11 @@ public abstract class ParameterSelector i return new DateParameterSelector<>(bagKey, paramKey, value); } + public static DurationParameterSelector durationSelector(String bagKey, + String paramKey, Long value) { + return new DurationParameterSelector<>(bagKey, paramKey, value); + } + public static DateRangeParameterSelector dateRangeSelector( String bagKey, String paramKey, Date from, Date to) { return new DateRangeParameterSelector<>(bagKey, paramKey, from, to); @@ -304,4 +310,27 @@ public abstract class ParameterSelector i return param.getValue().equals(this.value); } } + + public static class DurationParameterSelector extends ParameterSelector { + + private Long value; + + public DurationParameterSelector(String bagKey, String paramKey, Long value) { + super(bagKey, paramKey); + this.value = value; + } + + @Override + public boolean select(GroupedParameterizedElement element) { + if (!element.hasParameterBag(this.bagKey)) + return false; + + ParameterBag bag = element.getParameterBag(this.bagKey); + if (!bag.hasParameter(this.paramKey)) + return false; + + DurationParameter param = bag.getParameter(this.paramKey); + return param.getValue().equals(this.value); + } + } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/ModelGenerator.java b/li.strolch.model/src/main/java/li/strolch/model/ModelGenerator.java index 701b9a248..0af4d167c 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/ModelGenerator.java +++ b/li.strolch.model/src/main/java/li/strolch/model/ModelGenerator.java @@ -27,6 +27,7 @@ import li.strolch.model.audit.AccessType; import li.strolch.model.audit.Audit; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.DateParameter; +import li.strolch.model.parameter.DurationParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.IntegerParameter; import li.strolch.model.parameter.LongParameter; @@ -45,6 +46,7 @@ import li.strolch.model.timevalue.impl.IntegerValue; import li.strolch.model.timevalue.impl.StringSetValue; import li.strolch.model.timevalue.impl.ValueChange; import ch.eitchnet.utils.helper.StringHelper; +import ch.eitchnet.utils.iso8601.ISO8601FormatFactory; /** * Class which can be used to generate objects which implement {@link StrolchElement}. These generated classes can then @@ -76,6 +78,9 @@ public class ModelGenerator { public static final String PARAM_LIST_STRING_ID = "@param7"; public static final String PARAM_LIST_STRING_NAME = "StringList Param"; + public static final String PARAM_DURATION_ID = "@param8"; + public static final String PARAM_DURATION_NAME = "Duration Param"; + public static final String STATE_FLOAT_ID = "@state1"; public static final String STATE_FLOAT_NAME = "Float State"; @@ -371,6 +376,11 @@ public class ModelGenerator { stringList); stringListP.setIndex(7); bag.addParameter(stringListP); + + DurationParameter durationParam = new DurationParameter(PARAM_DURATION_ID, PARAM_DURATION_NAME, + ISO8601FormatFactory.getInstance().getDurationFormat().parse("P1D")); + durationParam.setIndex(8); + bag.addParameter(durationParam); } private static String randomValue(Random rand, String[] values) { diff --git a/li.strolch.model/src/main/java/li/strolch/model/ParameterizedElement.java b/li.strolch.model/src/main/java/li/strolch/model/ParameterizedElement.java index ac6270fbe..d69122886 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/ParameterizedElement.java +++ b/li.strolch.model/src/main/java/li/strolch/model/ParameterizedElement.java @@ -28,6 +28,7 @@ import li.strolch.exception.StrolchException; import li.strolch.model.Locator.LocatorBuilder; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.DateParameter; +import li.strolch.model.parameter.DurationParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.IntegerParameter; import li.strolch.model.parameter.LongParameter; @@ -232,6 +233,9 @@ public abstract class ParameterizedElement extends AbstractStrolchElement { } else if (paramtype.equals(DateParameter.TYPE)) { DateParameter param = new DateParameter(paramElement); addParameter(param); + } else if (paramtype.equals(DurationParameter.TYPE)) { + DurationParameter param = new DurationParameter(paramElement); + addParameter(param); } else if (paramtype.equals(BooleanParameter.TYPE)) { BooleanParameter param = new BooleanParameter(paramElement); addParameter(param); diff --git a/li.strolch.model/src/main/java/li/strolch/model/parameter/DurationParameter.java b/li.strolch.model/src/main/java/li/strolch/model/parameter/DurationParameter.java new file mode 100644 index 000000000..626ce8635 --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/parameter/DurationParameter.java @@ -0,0 +1,115 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.parameter; + +import java.text.MessageFormat; + +import li.strolch.exception.StrolchException; +import li.strolch.model.Tags; +import li.strolch.model.visitor.ParameterVisitor; + +import org.w3c.dom.Element; + +import ch.eitchnet.utils.helper.StringHelper; +import ch.eitchnet.utils.iso8601.ISO8601FormatFactory; + +/** + * @author Robert von Burg + */ +public class DurationParameter extends AbstractParameter { + + public static final String TYPE = "Duration"; //$NON-NLS-1$ + private static final long serialVersionUID = 0L; + + private Long value; + + /** + * Empty constructor + */ + public DurationParameter() { + // + } + + /** + * Default Constructor + * + * @param id + * @param name + * @param value + */ + public DurationParameter(String id, String name, Long value) { + super(id, name); + setValue(value); + } + + /** + * DOM Constructor + * + * @param element + */ + public DurationParameter(Element element) { + super.fromDom(element); + + String valueS = element.getAttribute(Tags.VALUE); + if (StringHelper.isEmpty(valueS)) { + String msg = MessageFormat.format("No value defined for {0}", this.id); //$NON-NLS-1$ + throw new StrolchException(msg); + } + + setValue(parseFromString(valueS)); + } + + @Override + public String getValueAsString() { + return ISO8601FormatFactory.getInstance().formatDuration(this.value); + } + + @Override + public Long getValue() { + return this.value; + } + + @Override + public void setValue(Long value) { + validateValue(value); + this.value = value; + } + + @Override + public String getType() { + return DurationParameter.TYPE; + } + + @Override + public DurationParameter getClone() { + DurationParameter clone = new DurationParameter(); + + super.fillClone(clone); + + clone.setValue(this.value); + + return clone; + } + + @Override + public U accept(ParameterVisitor visitor) { + return visitor.visitDurationParam(this); + } + + public static Long parseFromString(String valueS) { + return ISO8601FormatFactory.getInstance().getDurationFormat().parse(valueS); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelection.java b/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelection.java index d6742d54c..9ad1e693d 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelection.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelection.java @@ -20,6 +20,7 @@ import java.util.List; import ch.eitchnet.utils.StringMatchMode; import ch.eitchnet.utils.dbc.DBC; +import ch.eitchnet.utils.iso8601.ISO8601FormatFactory; /** * @author Robert von Burg @@ -97,6 +98,15 @@ public abstract class ParameterSelection implements Selection { return new DateParameterSelection(bagKey, paramKey, value); } + public static DurationParameterSelection durationSelection(String bagKey, String paramKey, String valueAsString) { + return durationSelection(bagKey, paramKey, + ISO8601FormatFactory.getInstance().getDurationFormat().parse(valueAsString)); + } + + public static DurationParameterSelection durationSelection(String bagKey, String paramKey, long value) { + return new DurationParameterSelection(bagKey, paramKey, value); + } + public static DateRangeParameterSelection dateRangeSelection(String bagKey, String paramKey, Date from, Date to) { return new DateRangeParameterSelection(bagKey, paramKey, from, to); } @@ -267,6 +277,25 @@ public abstract class ParameterSelection implements Selection { } } + public static class DurationParameterSelection extends ParameterSelection { + + private Long value; + + public DurationParameterSelection(String bagKey, String paramKey, Long value) { + super(bagKey, paramKey); + this.value = value; + } + + public Long getValue() { + return this.value; + } + + @Override + public void accept(ParameterSelectionVisitor visitor) { + visitor.visit(this); + } + } + public static class StringListParameterSelection extends ParameterSelection { private List value; diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelectionVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelectionVisitor.java index 3b53f54f6..1fd6da15b 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelectionVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ParameterSelectionVisitor.java @@ -18,6 +18,7 @@ package li.strolch.model.query; import li.strolch.model.query.ParameterSelection.BooleanParameterSelection; import li.strolch.model.query.ParameterSelection.DateParameterSelection; import li.strolch.model.query.ParameterSelection.DateRangeParameterSelection; +import li.strolch.model.query.ParameterSelection.DurationParameterSelection; import li.strolch.model.query.ParameterSelection.FloatParameterSelection; import li.strolch.model.query.ParameterSelection.IntegerParameterSelection; import li.strolch.model.query.ParameterSelection.LongParameterSelection; @@ -42,6 +43,8 @@ public interface ParameterSelectionVisitor extends QueryVisitor { public void visit(DateParameterSelection selection); + public void visit(DurationParameterSelection selection); + public void visit(DateRangeParameterSelection selection); public void visit(StringListParameterSelection selection); diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/QueryVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/query/QueryVisitor.java index 0209ae2bc..7846915ed 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/QueryVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/QueryVisitor.java @@ -15,10 +15,12 @@ */ package li.strolch.model.query; +import li.strolch.model.visitor.StrolchVisitor; + /** * @author Robert von Burg */ -public interface QueryVisitor { +public interface QueryVisitor extends StrolchVisitor { public void visitAny(); diff --git a/li.strolch.model/src/main/java/li/strolch/model/visitor/ParameterVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/visitor/ParameterVisitor.java index a4a914849..39555bc2f 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/visitor/ParameterVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/visitor/ParameterVisitor.java @@ -17,6 +17,7 @@ package li.strolch.model.visitor; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.DateParameter; +import li.strolch.model.parameter.DurationParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.IntegerParameter; import li.strolch.model.parameter.ListParameter; @@ -36,6 +37,8 @@ public interface ParameterVisitor { public T visitDateParam(DateParameter param); + public T visitDurationParam(DurationParameter param); + public T visitFloatParam(FloatParameter param); public T visitIntegerParam(IntegerParameter param); diff --git a/li.strolch.model/src/main/java/li/strolch/model/visitor/SetParameterValueVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/visitor/SetParameterValueVisitor.java index c31bd6718..a013c6646 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/visitor/SetParameterValueVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/visitor/SetParameterValueVisitor.java @@ -17,6 +17,7 @@ package li.strolch.model.visitor; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.DateParameter; +import li.strolch.model.parameter.DurationParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.IntegerParameter; import li.strolch.model.parameter.ListParameter; @@ -63,6 +64,12 @@ public class SetParameterValueVisitor implements ParameterVisitor { return null; } + @Override + public T visitDurationParam(DurationParameter param) { + param.setValue(DurationParameter.parseFromString(this.value)); + return null; + } + @Override public T visitFloatParam(FloatParameter param) { param.setValue(FloatParameter.parseFromString(this.value)); @@ -92,5 +99,4 @@ public class SetParameterValueVisitor implements ParameterVisitor { param.setValue(StringListParameter.parseFromString(this.value)); return null; } - } diff --git a/li.strolch.model/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java b/li.strolch.model/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java index 61ea31067..69f143ddf 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java +++ b/li.strolch.model/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java @@ -30,6 +30,7 @@ import li.strolch.model.State; import li.strolch.model.Tags; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.DateParameter; +import li.strolch.model.parameter.DurationParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.IntegerParameter; import li.strolch.model.parameter.LongParameter; @@ -130,6 +131,9 @@ public class XmlModelSaxReader extends DefaultHandler { break; case Tags.PARAMETER: + + // TODO refactor this code into using visitors + String paramId = attributes.getValue(Tags.ID); String paramName = attributes.getValue(Tags.NAME); String paramType = attributes.getValue(Tags.TYPE); @@ -159,6 +163,9 @@ public class XmlModelSaxReader extends DefaultHandler { case DateParameter.TYPE: param = new DateParameter(paramId, paramName, DateParameter.parseFromString(paramValue)); break; + case DurationParameter.TYPE: + param = new DurationParameter(paramId, paramName, DurationParameter.parseFromString(paramValue)); + break; case StringListParameter.TYPE: param = new StringListParameter(paramId, paramName, StringListParameter.parseFromString(paramValue)); break; diff --git a/li.strolch.model/src/test/resources/data/orders/Orders.xml b/li.strolch.model/src/test/resources/data/orders/Orders.xml index 1e4b66d00..a09c05ffe 100644 --- a/li.strolch.model/src/test/resources/data/orders/Orders.xml +++ b/li.strolch.model/src/test/resources/data/orders/Orders.xml @@ -5,6 +5,7 @@ + diff --git a/li.strolch.model/src/test/resources/data/resources/Resources.xml b/li.strolch.model/src/test/resources/data/resources/Resources.xml index 9ac7b632a..bdcd02b52 100644 --- a/li.strolch.model/src/test/resources/data/resources/Resources.xml +++ b/li.strolch.model/src/test/resources/data/resources/Resources.xml @@ -5,6 +5,7 @@ + diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java index 6051c7f53..052517334 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java @@ -33,6 +33,7 @@ import li.strolch.model.query.ParameterBagSelection.NullParameterBagSelection; import li.strolch.model.query.ParameterSelection.BooleanParameterSelection; import li.strolch.model.query.ParameterSelection.DateParameterSelection; import li.strolch.model.query.ParameterSelection.DateRangeParameterSelection; +import li.strolch.model.query.ParameterSelection.DurationParameterSelection; import li.strolch.model.query.ParameterSelection.FloatParameterSelection; import li.strolch.model.query.ParameterSelection.IntegerParameterSelection; import li.strolch.model.query.ParameterSelection.LongParameterSelection; @@ -301,6 +302,12 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect ISO8601FormatFactory.getInstance().formatDate(selection.getValue())); } + @Override + public void visit(DurationParameterSelection selection) { + xpath(selection.getBagKey(), selection.getParamKey(), + ISO8601FormatFactory.getInstance().formatDuration(selection.getValue())); + } + @Override public void visit(NullParameterSelection selection) { String xpath = "cast(xpath('//Resource/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\"]', asxml) as text[]) = '{}'\n"; diff --git a/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java b/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java index 328d00f36..abac2ec80 100644 --- a/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java +++ b/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java @@ -328,6 +328,13 @@ public class QueryTest { performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } + @Test + public void shouldQueryResourceByDurationParam() throws SQLException { + ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + query.and().with(ParameterSelection.durationSelection("@bag01", "@param8", "P1D")); + performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); + } + @Test public void shouldQueryResourceByNullParam1() throws SQLException { ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1"));