/* * Copyright 2013 Robert von Burg <eitch@eitchnet.ch> * * 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.runtime.query.inmemory; import java.util.Date; import java.util.List; 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.ListParameter; import li.strolch.model.parameter.LongParameter; import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringParameter; import li.strolch.utils.StringMatchMode; import li.strolch.utils.collections.DateRange; /** * @author Robert von Burg <eitch@eitchnet.ch> */ public abstract class ParameterSelector<T extends GroupedParameterizedElement> implements Selector<T> { protected String bagKey; protected String paramKey; public ParameterSelector(String bagKey, String key) { this.bagKey = bagKey; this.paramKey = key; } @Override public abstract boolean select(GroupedParameterizedElement element); public static <T extends GroupedParameterizedElement> StringParameterSelector<T> stringSelector(String bagKey, String paramKey, String value, StringMatchMode matchMode) { return new StringParameterSelector<>(bagKey, paramKey, value, matchMode); } public static <T extends GroupedParameterizedElement> IntegerParameterSelector<T> integerSelector(String bagKey, String paramKey, int value) { return new IntegerParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> BooleanParameterSelector<T> booleanSelector(String bagKey, String paramKey, boolean value) { return new BooleanParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> FloatParameterSelector<T> floatSelector(String bagKey, String paramKey, double value) { return new FloatParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> LongParameterSelector<T> longSelector(String bagKey, String paramKey, long value) { return new LongParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> DateParameterSelector<T> dateSelector(String bagKey, String paramKey, Date value) { return new DateParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> DurationParameterSelector<T> durationSelector(String bagKey, String paramKey, Long value) { return new DurationParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> DateRangeParameterSelector<T> dateRangeSelector(String bagKey, String paramKey, DateRange dateRange) { return new DateRangeParameterSelector<>(bagKey, paramKey, dateRange); } public static <T extends GroupedParameterizedElement> StringListParameterSelector<T> stringListSelector( String bagKey, String paramKey, List<String> value) { return new StringListParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> IntegerListParameterSelector<T> integerListSelector( String bagKey, String paramKey, List<Integer> value) { return new IntegerListParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> FloatListParameterSelector<T> floatListSelector(String bagKey, String paramKey, List<Double> value) { return new FloatListParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> LongListParameterSelector<T> longListSelector(String bagKey, String paramKey, List<Long> value) { return new LongListParameterSelector<>(bagKey, paramKey, value); } public static <T extends GroupedParameterizedElement> NullParameterSelector<T> nullSelector(String bagKey, String paramKey) { return new NullParameterSelector<>(bagKey, paramKey); } public static <T extends GroupedParameterizedElement> AnyTypeParameterSelector<T> anyTypeSelection(String bagKey, String paramKey, String value, StringMatchMode matchMode) { return new AnyTypeParameterSelector<>(bagKey, paramKey, value, matchMode); } public static class AnyTypeParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private StringMatchMode matchMode; private String value; public AnyTypeParameterSelector(String bagKey, String key, String value, StringMatchMode matchMode) { super(bagKey, key); this.value = value; this.matchMode = matchMode; } @Override public boolean select(GroupedParameterizedElement element) { ParameterBag bag = element.getParameterBag(this.bagKey); if (bag == null) { return false; } Parameter<?> parameter = bag.getParameter(this.paramKey); if (parameter == null) return false; String valueAsString = parameter.getValueAsString(); return this.matchMode.matches(valueAsString, this.value); } } public static class NullParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { public NullParameterSelector(String bagKey, String key) { super(bagKey, key); } @Override public boolean select(GroupedParameterizedElement element) { ParameterBag bag = element.getParameterBag(this.bagKey); if (bag == null) { return false; } return !bag.hasParameter(this.paramKey); } } public static class StringParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private StringMatchMode matchMode; private String value; public StringParameterSelector(String bagKey, String paramKey, String value, StringMatchMode matchMode) { super(bagKey, paramKey); this.value = value; this.matchMode = matchMode; } public StringMatchMode getMatchMode() { return this.matchMode; } @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; StringParameter param = bag.getParameter(this.paramKey); String paramValue = param.getValue(); return this.matchMode.matches(paramValue, this.value); } } public static class IntegerParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private Integer value; public IntegerParameterSelector(String bagKey, String paramKey, Integer 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; IntegerParameter param = bag.getParameter(this.paramKey); return param.getValue().equals(this.value); } } public static class BooleanParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private Boolean value; public BooleanParameterSelector(String bagKey, String paramKey, Boolean 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; BooleanParameter param = bag.getParameter(this.paramKey); return param.getValue().equals(this.value); } } public static class FloatParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private Double value; public FloatParameterSelector(String bagKey, String paramKey, Double 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; FloatParameter param = bag.getParameter(this.paramKey); return param.getValue().equals(this.value); } } public static class LongParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private Long value; public LongParameterSelector(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; LongParameter param = bag.getParameter(this.paramKey); return param.getValue().equals(this.value); } } public static class DateParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private Date value; public DateParameterSelector(String bagKey, String paramKey, Date 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; DateParameter param = bag.getParameter(this.paramKey); return param.getValue().equals(this.value); } } public static class DateRangeParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { private DateRange dateRange; public DateRangeParameterSelector(String bagKey, String paramKey, DateRange dateRange) { super(bagKey, paramKey); this.dateRange = dateRange; } @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; DateParameter param = bag.getParameter(this.paramKey); Date value = param.getValue(); return this.dateRange.contains(value); } } public static class DurationParameterSelector<T extends GroupedParameterizedElement> extends ParameterSelector<T> { 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); } } public static abstract class AbstractListParameterSelector<U, T extends GroupedParameterizedElement> extends ParameterSelector<T> { private List<U> value; public AbstractListParameterSelector(String bagKey, String paramKey, List<U> 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; ListParameter<U> param = bag.getParameter(this.paramKey); return param.getValue().containsAll(this.value); } } public static class StringListParameterSelector<T extends GroupedParameterizedElement> extends AbstractListParameterSelector<String, T> { public StringListParameterSelector(String bagKey, String paramKey, List<String> value) { super(bagKey, paramKey, value); } } public static class IntegerListParameterSelector<T extends GroupedParameterizedElement> extends AbstractListParameterSelector<Integer, T> { public IntegerListParameterSelector(String bagKey, String paramKey, List<Integer> value) { super(bagKey, paramKey, value); } } public static class FloatListParameterSelector<T extends GroupedParameterizedElement> extends AbstractListParameterSelector<Double, T> { public FloatListParameterSelector(String bagKey, String paramKey, List<Double> value) { super(bagKey, paramKey, value); } } public static class LongListParameterSelector<T extends GroupedParameterizedElement> extends AbstractListParameterSelector<Long, T> { public LongListParameterSelector(String bagKey, String paramKey, List<Long> value) { super(bagKey, paramKey, value); } } }