package nl.ipo.cds.validation;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Set;
import nl.ipo.cds.validation.callbacks.BinaryCallback;
import nl.ipo.cds.validation.callbacks.BinaryCallbackExpression;
import nl.ipo.cds.validation.callbacks.Callback;
import nl.ipo.cds.validation.callbacks.CallbackExpression;
import nl.ipo.cds.validation.callbacks.UnaryCallback;
import nl.ipo.cds.validation.callbacks.UnaryCallbackExpression;
import nl.ipo.cds.validation.constants.Constant;
import nl.ipo.cds.validation.flow.ForEachExpression;
import nl.ipo.cds.validation.flow.IfExpression;
import nl.ipo.cds.validation.flow.SplitExpression;
import nl.ipo.cds.validation.geometry.GeometryExpression;
import nl.ipo.cds.validation.gml.CodeExpression;
import nl.ipo.cds.validation.gml.ValidateCodeSpaceExpression;
import nl.ipo.cds.validation.logical.AndExpression;
import nl.ipo.cds.validation.logical.NotExpression;
import nl.ipo.cds.validation.logical.OrExpression;
import nl.ipo.cds.validation.operators.Compare;
import nl.ipo.cds.validation.operators.In;
import nl.ipo.cds.validation.string.Strings;
import org.deegree.geometry.Geometry;
public class Validation<K extends Enum<K> & ValidationMessage<K, C>, C extends ValidatorContext<K, C>> {
// =========================================================================
// Strings:
// =========================================================================
public Strings.IsBlank<K, C> isBlank (final Expression<K, C, String> input) {
return new Strings.IsBlank<K, C> (input);
}
public Strings.IsUrl<K, C> isUrl (final Expression<K, C, String> input) {
return new Strings.IsUrl<K, C> (input);
}
public Strings.IsUUID<K, C> isUUID (final Expression<K, C, String> input) {
return new Strings.IsUUID<K, C> (input);
}
public Strings.Join<K, C> join (final Expression<K, C, String[]> input, final Expression<K, C, String> separator) {
return new Strings.Join<K, C> (input, separator);
}
public Strings.Length<K, C> length (final Expression<K, C, String> input) {
return new Strings.Length<K, C> (input);
}
public Strings.Matches<K, C> matches (final Expression<K, C, String> input, final Expression<K, C, String> pattern) {
return new Strings.Matches<> (input, pattern);
}
// =========================================================================
// GML:
// =========================================================================
public GeometryExpression<K, C, Geometry> geometry (final String name) {
return new GeometryExpression<K, C, Geometry> (name, Geometry.class);
}
public <T extends Geometry> GeometryExpression<K, C, T> geometry (final String name, final Class<T> type) {
return new GeometryExpression<K, C, T> (name, type);
}
public LastLocationExpression<K, C> lastLocation () {
return new LastLocationExpression<K, C> ();
}
public CodeExpression<K, C> code (final String name) {
return new CodeExpression<> (name);
}
public ValidateCodeSpaceExpression<K, C> codeSpace (final Expression<K, C, String> codeSpace) {
return new ValidateCodeSpaceExpression<> (codeSpace);
}
// =========================================================================
// Operators:
// =========================================================================
public <T extends Comparable<T>> Compare.Equals<K, C, T> eq (final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new Compare.Equals<K, C, T> (a, b);
}
public <T extends Comparable<T>> Compare.NotEquals<K, C, T> ne (final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new Compare.NotEquals<K, C, T> (a, b);
}
public <T extends Comparable<T>> Compare.LessThan<K, C, T> lt (final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new Compare.LessThan<K, C, T> (a, b);
}
public <T extends Comparable<T>> Compare.GreaterThan<K, C, T> gt (final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new Compare.GreaterThan<K, C, T> (a, b);
}
public <T extends Comparable<T>> Compare.LessThanEquals<K, C, T> lte (final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new Compare.LessThanEquals<K, C, T> (a, b);
}
public <T extends Comparable<T>> Compare.GreaterThanEquals<K, C, T> gte (final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new Compare.GreaterThanEquals<K, C, T> (a, b);
}
public <T> In<K, C, T> in (final Expression<K, C, T> a, final Expression<K, C, Set<T>> b) {
return new In<K, C, T> (a, b);
}
// =========================================================================
// Callbacks:
// =========================================================================
public <T> CallbackExpression<K, C, T> callback (final Class<T> type, final Callback<K, C, T> callback) {
return new CallbackExpression<K, C, T> (type, callback);
}
public <R, I> UnaryCallbackExpression<K, C, R, I> callback (final Class<R> type, final Expression<K, C, I> input, final UnaryCallback<K, C, R, I> callback) {
return new UnaryCallbackExpression<K, C, R, I> (type, input, callback);
}
public <R, A, B> BinaryCallbackExpression<K, C, R, A, B> callback (final Class<R> type, final Expression<K, C, A> a, final Expression<K, C, B> b, final BinaryCallback<K, C, R, A, B> callback) {
return new BinaryCallbackExpression<> (type, a, b, callback);
}
// =========================================================================
// Constants:
// =========================================================================
public Constant<K, C, Byte> constant (final byte v) {
return new Constant<K, C, Byte> (v, Byte.class);
}
public Constant<K, C, Character> constant (final char v) {
return new Constant<K, C, Character> (v, Character.class);
}
public Constant<K, C, Short> constant (final short v) {
return new Constant<K, C, Short> (v, Short.class);
}
public Constant<K, C, Integer> constant (final int v) {
return new Constant<K, C, Integer> (v, Integer.class);
}
public Constant<K, C, Long> constant (final long v) {
return new Constant<K, C, Long> (v, Long.class);
}
public Constant<K, C, Float> constant (final float v) {
return new Constant<K, C, Float> (v, Float.class);
}
public Constant<K, C, Double> constant (final double v) {
return new Constant<K, C, Double> (v, Double.class);
}
public Constant<K, C, Boolean> constant (final boolean v) {
return new Constant<K, C, Boolean> (v, Boolean.class);
}
public Constant<K, C, String> constant (final String v) {
return new Constant<K, C, String> (v, String.class);
}
@SuppressWarnings("unchecked")
public <T> Constant<K, C, Set<T>> constant (final Set<T> v) {
return new Constant<K, C, Set<T>> (v, (Class<Set<T>>)v.getClass ());
}
// =========================================================================
// Control-flow expressions:
// =========================================================================
public <T> IfExpression<K, C, T> ifExp (final Expression<K, C, Boolean> condition, final Expression<K, C, T> a, final Expression<K, C, T> b) {
return new IfExpression<K, C, T> (condition, a, b);
}
public <T> ForEachExpression<K, C, T> forEach (final String variableName, final Expression<K, C, T[]> input, final Validator<K, C> validator) {
return new ForEachExpression<K, C, T> (variableName, input, validator);
}
public SplitExpression<K, C> split (final Expression<K, C, String> input, final Expression<K, C, String> splitter, final Validator<K, C> validator) {
return new SplitExpression<K, C> (input, splitter, validator);
}
// =========================================================================
// Logical operators:
// =========================================================================
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (2);
l.add (a);
l.add (b);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (3);
l.add (a);
l.add (b);
l.add (c);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (4);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d, final Expression<K, C, Boolean> e) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (5);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
l.add (e);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d, final Expression<K, C, Boolean> e, final Expression<K, C, Boolean> f) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (6);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
l.add (e);
l.add (f);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d, final Expression<K, C, Boolean> e, final Expression<K, C, Boolean> f, final Expression<K, C, Boolean> g) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (7);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
l.add (e);
l.add (f);
l.add (g);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d, final Expression<K, C, Boolean> e, final Expression<K, C, Boolean> f, final Expression<K, C, Boolean> g, final Expression<K, C, Boolean> h) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (8);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
l.add (e);
l.add (f);
l.add (g);
l.add (h);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d, final Expression<K, C, Boolean> e, final Expression<K, C, Boolean> f, final Expression<K, C, Boolean> g, final Expression<K, C, Boolean> h, final Expression<K, C, Boolean> i) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (9);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
l.add (e);
l.add (f);
l.add (g);
l.add (h);
l.add (i);
return new AndExpression<K, C> (l);
}
public AndExpression<K, C> and (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d, final Expression<K, C, Boolean> e, final Expression<K, C, Boolean> f, final Expression<K, C, Boolean> g, final Expression<K, C, Boolean> h, final Expression<K, C, Boolean> i, final Expression<K, C, Boolean> j) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (10);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
l.add (e);
l.add (f);
l.add (g);
l.add (h);
l.add (i);
l.add (j);
return new AndExpression<K, C> (l);
}
public OrExpression<K, C> or (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (2);
l.add (a);
l.add (b);
return new OrExpression<K, C> (l);
}
public OrExpression<K, C> or (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (3);
l.add (a);
l.add (b);
l.add (c);
return new OrExpression<K, C> (l);
}
public OrExpression<K, C> or (final Expression<K, C, Boolean> a, final Expression<K, C, Boolean> b, final Expression<K, C, Boolean> c, final Expression<K, C, Boolean> d) {
final ArrayList<Expression<K, C, Boolean>> l = new ArrayList<Expression<K, C, Boolean>> (3);
l.add (a);
l.add (b);
l.add (c);
l.add (d);
return new OrExpression<K, C> (l);
}
public NotExpression<K, C> not (final Expression<K, C, Boolean> input) {
return new NotExpression<K, C> (input);
}
// =========================================================================
// Attributes:
// =========================================================================
public <T> AttributeExpression<K, C, T> attribute (final String name, final Class<T> type, final String label) {
return new AttributeExpression<K, C, T> (name, type, label);
}
public <T> AttributeExpression<K, C, T> attribute (final String name, final Class<T> type) {
return new AttributeExpression<K, C, T> (name, type);
}
public AttributeExpression<K, C, Byte> byteAttr (final String name) {
return new AttributeExpression<K, C, Byte> (name, Byte.class);
}
public AttributeExpression<K, C, Character> charAttr (final String name) {
return new AttributeExpression<K, C, Character> (name, Character.class);
}
public AttributeExpression<K, C, Short> shortAttr (final String name) {
return new AttributeExpression<K, C, Short> (name, Short.class);
}
public AttributeExpression<K, C, Integer> intAttr (final String name) {
return new AttributeExpression<K, C, Integer> (name, Integer.class);
}
public AttributeExpression<K, C, Long> longAttr (final String name) {
return new AttributeExpression<K, C, Long> (name, Long.class);
}
public AttributeExpression<K, C, BigInteger> bigIntegerAttr (final String name) {
return new AttributeExpression<K, C, BigInteger> (name, BigInteger.class);
}
public AttributeExpression<K, C, Float> floatAttr (final String name) {
return new AttributeExpression<K, C, Float> (name, Float.class);
}
public AttributeExpression<K, C, Double> doubleAttr (final String name) {
return new AttributeExpression<K, C, Double> (name, Double.class);
}
public AttributeExpression<K, C, Boolean> booleanAttr (final String name) {
return new AttributeExpression<K, C, Boolean> (name, Boolean.class);
}
public AttributeExpression<K, C, String> stringAttr (final String name) {
return new AttributeExpression<K, C, String> (name, String.class);
}
public AttributeExpression<K, C, Timestamp> timestampAttr (final String name) {
return new AttributeExpression<K, C, Timestamp> (name, Timestamp.class);
}
public <T> AttributeExpression<K, C, T> attr (final String name, final Class<T> type) {
return new AttributeExpression<K, C, T> (name, type);
}
// =========================================================================
// Constructing a validator:
// =========================================================================
public Validator<K, C> validate (final Expression<K, C, Boolean> input) {
return new Validator<K, C> (input, null, null);
}
}