From 7105ebe9ce30def903118707d007aa4195e0fbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim=20ALTINOLUK?= Date: Tue, 25 Aug 2020 00:35:15 +0300 Subject: [PATCH] Java version upgraded to 1.8 from 1.7 (#2) * Java version upgraded to 1.8 --- README.md | 44 ++- dist/JQueryBuilder-1.0.0.jar | Bin 21214 -> 23279 bytes pom.xml | 14 +- .../operation/BinaryExecutor.java | 5 + .../jquerybuilder/operation/Operation.java | 82 ++++++ .../operation/OperationExecutor.java | 18 ++ .../operation/UnaryExecutor.java | 5 + .../operation/function/BeginsWith.java | 12 + .../operation/function/Between.java | 21 ++ .../operation/function/Contains.java | 15 + .../operation/function/EndsWith.java | 12 + .../operation/function/Equal.java | 16 ++ .../operation/function/Greater.java | 18 ++ .../operation/function/GreaterOrEqual.java | 18 ++ .../jquerybuilder/operation/function/In.java | 16 ++ .../operation/function/IsEmpty.java | 24 ++ .../operation/function/IsNotEmpty.java | 21 ++ .../operation/function/IsNotNull.java | 11 + .../operation/function/IsNull.java | 11 + .../operation/function/Less.java | 19 ++ .../operation/function/LessOrEqual.java | 18 ++ .../operation/function/NotBeginsWith.java | 17 ++ .../operation/function/NotBetween.java | 21 ++ .../operation/function/NotContains.java | 16 ++ .../operation/function/NotEndsWith.java | 12 + .../operation/function/NotEqual.java | 16 ++ .../operation/function/NotIn.java | 16 ++ .../jquerybuilder/validation/Operation.java | 266 ------------------ .../validation/ValidationGroup.java | 4 +- .../validation/ValidationRule.java | 16 +- .../java/com/jquerybuilder/test/BaseTest.java | 26 +- .../com/jquerybuilder/test/OperationTest.java | 161 ++++++++--- .../OperationWithValidationGroupTest.java | 53 ++++ 33 files changed, 668 insertions(+), 356 deletions(-) create mode 100644 src/main/java/com/jquerybuilder/operation/BinaryExecutor.java create mode 100644 src/main/java/com/jquerybuilder/operation/Operation.java create mode 100644 src/main/java/com/jquerybuilder/operation/OperationExecutor.java create mode 100644 src/main/java/com/jquerybuilder/operation/UnaryExecutor.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/BeginsWith.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/Between.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/Contains.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/EndsWith.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/Equal.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/Greater.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/GreaterOrEqual.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/In.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/IsEmpty.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/IsNotEmpty.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/IsNotNull.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/IsNull.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/Less.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/LessOrEqual.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/NotBeginsWith.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/NotBetween.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/NotContains.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/NotEndsWith.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/NotEqual.java create mode 100644 src/main/java/com/jquerybuilder/operation/function/NotIn.java delete mode 100644 src/main/java/com/jquerybuilder/validation/Operation.java create mode 100644 src/test/java/com/jquerybuilder/test/OperationWithValidationGroupTest.java diff --git a/README.md b/README.md index 54f5c7d..452596c 100644 --- a/README.md +++ b/README.md @@ -6,36 +6,28 @@ This library helps you for executing to created validations with [jQuery QueryBu You can execute to generated validations as simply. Generated validation text/json should be convert to `Map` for using executions. `Gson` dependency is good choice for converting to `Map` from string. -```xml - - com.google.code.gson - gson - 2.8.0 - -``` - #### Example Validation Json ```js // String validationString=.. - { - "condition":"OR", - "rules":[ - { - "field":"number", - "type":"integer", - "operator":"equal", - "value":"7" - }, - { - "field":"number", - "type":"integer", - "operator":"equal", - "value":"8" - } - ], - "not":false +{ + "condition":"OR", + "rules":[ + { + "field":"number", + "type":"integer", + "operator":"equal", + "value":"7" + }, + { + "field":"number", + "type":"integer", + "operator":"equal", + "value":"8" } + ], + "not":false +} ``` #### Using Validation Execution ```java @@ -52,7 +44,7 @@ ValidationGroup validationGroup = new ValidationGroup(map); //execute validation boolean result=validationGroup.execute(yourData) -assertTrue(result);// result will `true` according to example +assertTrue(result);// true ``` diff --git a/dist/JQueryBuilder-1.0.0.jar b/dist/JQueryBuilder-1.0.0.jar index c1a09fca7b46c9e26bbdb413abfcc0a72fd27d42..2b45ce89c60a135d0f6ca2999a800f2904cb5d73 100644 GIT binary patch literal 23279 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 M0kBP$=>y^c01NOMw*UYD literal 21214 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 diff --git a/pom.xml b/pom.xml index f475fb0..84ebe03 100644 --- a/pom.xml +++ b/pom.xml @@ -1,20 +1,20 @@ - 4.0.0 com.ibrahim - JQueryBuilder + QueryBuilderResolver 1.0.0 jar - JavaResolver for jQuery QueryBuilder - http://maven.apache.org - + QueryBuilderResolver + JavaResolver for jQuery QueryBuilder UTF-8 UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/src/main/java/com/jquerybuilder/operation/BinaryExecutor.java b/src/main/java/com/jquerybuilder/operation/BinaryExecutor.java new file mode 100644 index 0000000..778f983 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/BinaryExecutor.java @@ -0,0 +1,5 @@ +package com.jquerybuilder.operation; + +public interface BinaryExecutor { + public boolean apply(Object argument1, Object argument2); +} diff --git a/src/main/java/com/jquerybuilder/operation/Operation.java b/src/main/java/com/jquerybuilder/operation/Operation.java new file mode 100644 index 0000000..23ccf55 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/Operation.java @@ -0,0 +1,82 @@ +package com.jquerybuilder.operation; + +import java.util.HashMap; +import java.util.Map; +import com.jquerybuilder.operation.function.BeginsWith; +import com.jquerybuilder.operation.function.Between; +import com.jquerybuilder.operation.function.Contains; +import com.jquerybuilder.operation.function.EndsWith; +import com.jquerybuilder.operation.function.Equal; +import com.jquerybuilder.operation.function.Greater; +import com.jquerybuilder.operation.function.GreaterOrEqual; +import com.jquerybuilder.operation.function.In; +import com.jquerybuilder.operation.function.IsEmpty; +import com.jquerybuilder.operation.function.IsNotEmpty; +import com.jquerybuilder.operation.function.IsNotNull; +import com.jquerybuilder.operation.function.IsNull; +import com.jquerybuilder.operation.function.Less; +import com.jquerybuilder.operation.function.LessOrEqual; +import com.jquerybuilder.operation.function.NotBeginsWith; +import com.jquerybuilder.operation.function.NotBetween; +import com.jquerybuilder.operation.function.NotContains; +import com.jquerybuilder.operation.function.NotEndsWith; +import com.jquerybuilder.operation.function.NotEqual; +import com.jquerybuilder.operation.function.NotIn; + +public class Operation { + private static Map operationMap = new HashMap<>(); + public static final Less Less = new Less(); + public static final LessOrEqual LessOrEqual = new LessOrEqual(); + public static final Greater Greater = new Greater(); + public static final GreaterOrEqual GreaterOrEqual = new GreaterOrEqual(); + public static final Between Between = new Between(); + public static final NotBetween NotBetween = new NotBetween(); + public static final Equal Equal = new Equal(); + public static final NotEqual NotEqual = new NotEqual(); + public static final Contains Contains = new Contains(); + public static final NotContains NotContains = new NotContains(); + public static final In In = new In(); + public static final NotIn NotIn = new NotIn(); + public static final IsNull IsNull = new IsNull(); + public static final IsNotNull IsNotNull = new IsNotNull(); + public static final BeginsWith BeginsWith = new BeginsWith(); + public static final NotBeginsWith NotBeginsWith = new NotBeginsWith(); + public static final EndsWith EndsWith = new EndsWith(); + public static final NotEndsWith NotEndsWith = new NotEndsWith(); + public static final IsEmpty IsEmpty = new IsEmpty(); + public static final IsNotEmpty IsNotEmpty = new IsNotEmpty(); + + static { + operationMap.put("less", Less); + operationMap.put("less_or_equal", LessOrEqual); + operationMap.put("greater", Greater); + operationMap.put("greater_or_equal", GreaterOrEqual); + operationMap.put("between", Between); + operationMap.put("not_between", NotBetween); + operationMap.put("equal", Equal); + operationMap.put("not_equal", NotEqual); + operationMap.put("contains", Contains); + operationMap.put("not_contains", NotContains); + operationMap.put("in", In); + operationMap.put("not_in", NotIn); + operationMap.put("is_null", IsNull); + operationMap.put("is_not_null", IsNotNull); + operationMap.put("begins_with", BeginsWith); + operationMap.put("not_begins_with", NotBeginsWith); + operationMap.put("ends_with", EndsWith); + operationMap.put("not_ends_with", NotEndsWith); + operationMap.put("is_empty", IsEmpty); + operationMap.put("is_not_empty", IsNotEmpty); + + } + + public static boolean apply(String operation, Object v1) { + Object operator = operationMap.get(operation); + return ((UnaryExecutor) operator).apply(v1); + } + + public static boolean apply(String operation, Object v1, Object v2) { + Object operator = operationMap.get(operation); + return ((BinaryExecutor) operator).apply(v1, v2); + } +} diff --git a/src/main/java/com/jquerybuilder/operation/OperationExecutor.java b/src/main/java/com/jquerybuilder/operation/OperationExecutor.java new file mode 100644 index 0000000..7fd54ea --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/OperationExecutor.java @@ -0,0 +1,18 @@ +package com.jquerybuilder.operation; + +import java.util.List; + +public class OperationExecutor { + + public Long number(Object argument) { + return argument == null || "".equals(argument) ? 0 : Long.parseLong(String.valueOf(argument)); + } + + public List list(Object argument) { + return argument == null ? List.of() : (List) argument; + } + + protected String string(Object argument) { + return argument == null ? "" : String.valueOf(argument); + } +} diff --git a/src/main/java/com/jquerybuilder/operation/UnaryExecutor.java b/src/main/java/com/jquerybuilder/operation/UnaryExecutor.java new file mode 100644 index 0000000..81688a3 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/UnaryExecutor.java @@ -0,0 +1,5 @@ +package com.jquerybuilder.operation; + +public interface UnaryExecutor { + public boolean apply(Object argument); +} diff --git a/src/main/java/com/jquerybuilder/operation/function/BeginsWith.java b/src/main/java/com/jquerybuilder/operation/function/BeginsWith.java new file mode 100644 index 0000000..fb107b7 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/BeginsWith.java @@ -0,0 +1,12 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class BeginsWith extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object term, Object text) { + return string(text).toLowerCase().startsWith(string(term).toLowerCase()); + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/Between.java b/src/main/java/com/jquerybuilder/operation/function/Between.java new file mode 100644 index 0000000..1103556 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/Between.java @@ -0,0 +1,21 @@ +package com.jquerybuilder.operation.function; + +import java.util.List; +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class Between extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object number, Object range) { + try { + List list = list(range); + long i1 = number(number); + long i2 = Long.parseLong(list.get(0).toString()); + long i3 = Long.parseLong(list.get(1).toString()); + return i2 > i3 ? i1 > i3 && i1 < i2 : i1 > i2 && i1 < i3; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/Contains.java b/src/main/java/com/jquerybuilder/operation/function/Contains.java new file mode 100644 index 0000000..890bf75 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/Contains.java @@ -0,0 +1,15 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class Contains extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object text, Object term) { + try { + return string(text).contains(string(term)); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/EndsWith.java b/src/main/java/com/jquerybuilder/operation/function/EndsWith.java new file mode 100644 index 0000000..80c124e --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/EndsWith.java @@ -0,0 +1,12 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class EndsWith extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object term, Object text) { + return string(text).toLowerCase().endsWith(string(term).toLowerCase()); + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/Equal.java b/src/main/java/com/jquerybuilder/operation/function/Equal.java new file mode 100644 index 0000000..b280dcd --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/Equal.java @@ -0,0 +1,16 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class Equal extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object argument1, Object argument2) { + try { + return (argument1 == null && argument2 == null) || argument1.equals(argument2); + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/Greater.java b/src/main/java/com/jquerybuilder/operation/function/Greater.java new file mode 100644 index 0000000..f38511c --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/Greater.java @@ -0,0 +1,18 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.BinaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class Greater extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object greater, Object less) { + try { + long i1 = number(greater); + long i2 = number(less); + return i1 > i2; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/GreaterOrEqual.java b/src/main/java/com/jquerybuilder/operation/function/GreaterOrEqual.java new file mode 100644 index 0000000..941e897 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/GreaterOrEqual.java @@ -0,0 +1,18 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.BinaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class GreaterOrEqual extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object greatherOrEqual, Object less) { + try { + long i1 = number(greatherOrEqual); + long i2 = number(less); + return i1 >= i2; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/In.java b/src/main/java/com/jquerybuilder/operation/function/In.java new file mode 100644 index 0000000..3cffef7 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/In.java @@ -0,0 +1,16 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class In extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object arg, Object list) { + try { + return list(list).contains(arg); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/IsEmpty.java b/src/main/java/com/jquerybuilder/operation/function/IsEmpty.java new file mode 100644 index 0000000..dacf284 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/IsEmpty.java @@ -0,0 +1,24 @@ +package com.jquerybuilder.operation.function; + +import java.util.List; +import com.jquerybuilder.operation.UnaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class IsEmpty extends OperationExecutor implements UnaryExecutor { + @Override + public boolean apply(Object argument) { + try { + if (argument == null) { + return false; + } + if (argument instanceof List) { + List list = list(argument); + return list == null || list.isEmpty(); + } else if (argument instanceof String) { + return "".equals(argument); + } + } catch (Exception e) { + } + return false; + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/IsNotEmpty.java b/src/main/java/com/jquerybuilder/operation/function/IsNotEmpty.java new file mode 100644 index 0000000..2219716 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/IsNotEmpty.java @@ -0,0 +1,21 @@ +package com.jquerybuilder.operation.function; + +import java.util.List; +import com.jquerybuilder.operation.UnaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class IsNotEmpty extends OperationExecutor implements UnaryExecutor { + @Override + public boolean apply(Object argument) { + try { + if (argument instanceof List) { + List list = list(argument); + return list != null && !list.isEmpty(); + } else if (argument instanceof String) { + return !"".equals(argument); + } + } catch (Exception e) { + } + return false; + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/IsNotNull.java b/src/main/java/com/jquerybuilder/operation/function/IsNotNull.java new file mode 100644 index 0000000..c58e763 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/IsNotNull.java @@ -0,0 +1,11 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.UnaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class IsNotNull extends OperationExecutor implements UnaryExecutor { + @Override + public boolean apply(Object argument) { + return argument != null; + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/IsNull.java b/src/main/java/com/jquerybuilder/operation/function/IsNull.java new file mode 100644 index 0000000..831e086 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/IsNull.java @@ -0,0 +1,11 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.UnaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class IsNull extends OperationExecutor implements UnaryExecutor { + @Override + public boolean apply(Object argument) { + return argument == null; + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/Less.java b/src/main/java/com/jquerybuilder/operation/function/Less.java new file mode 100644 index 0000000..3fd24ab --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/Less.java @@ -0,0 +1,19 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public final class Less extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object less, Object greater) { + try { + long i1 = number(less); + long i2 = number(greater); + return i1 < i2; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/LessOrEqual.java b/src/main/java/com/jquerybuilder/operation/function/LessOrEqual.java new file mode 100644 index 0000000..4746700 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/LessOrEqual.java @@ -0,0 +1,18 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class LessOrEqual extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object less, Object greaterOrEqual ) { + try { + long i1 = number(less); + long i2 = number(greaterOrEqual); + return i1 <= i2; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/NotBeginsWith.java b/src/main/java/com/jquerybuilder/operation/function/NotBeginsWith.java new file mode 100644 index 0000000..ce8bd09 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/NotBeginsWith.java @@ -0,0 +1,17 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class NotBeginsWith extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object term, Object text) { + String trm = string(term); + String txt = string(text); + if ("".equals(trm) && !"".equals(txt)) { + return true; + } + return !txt.startsWith(trm); + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/NotBetween.java b/src/main/java/com/jquerybuilder/operation/function/NotBetween.java new file mode 100644 index 0000000..c3fba05 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/NotBetween.java @@ -0,0 +1,21 @@ +package com.jquerybuilder.operation.function; + +import java.util.List; +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class NotBetween extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object number, Object listOf) { + try { + List list = list(listOf); + long i1 = number(number); + long i2 = Long.parseLong(list.get(0).toString()); + long i3 = Long.parseLong(list.get(1).toString()); + return !(i2 > i3 ? i1 > i3 && i1 < i2 : i1 > i2 && i1 < i3); + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/NotContains.java b/src/main/java/com/jquerybuilder/operation/function/NotContains.java new file mode 100644 index 0000000..c7503a0 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/NotContains.java @@ -0,0 +1,16 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class NotContains extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object term, Object text) { + try { + return !string(text).contains(string(term)); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/NotEndsWith.java b/src/main/java/com/jquerybuilder/operation/function/NotEndsWith.java new file mode 100644 index 0000000..63f916c --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/NotEndsWith.java @@ -0,0 +1,12 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class NotEndsWith extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object term, Object text) { + return !string(text).toLowerCase().endsWith(string(term).toLowerCase()); + } +} diff --git a/src/main/java/com/jquerybuilder/operation/function/NotEqual.java b/src/main/java/com/jquerybuilder/operation/function/NotEqual.java new file mode 100644 index 0000000..2c59f15 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/NotEqual.java @@ -0,0 +1,16 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.OperationExecutor; +import com.jquerybuilder.operation.BinaryExecutor; + +public class NotEqual extends OperationExecutor implements BinaryExecutor { + @Override + public boolean apply(Object argument1, Object argument2) { + try { + return !String.valueOf(argument1).equals(String.valueOf(argument2)); + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/main/java/com/jquerybuilder/operation/function/NotIn.java b/src/main/java/com/jquerybuilder/operation/function/NotIn.java new file mode 100644 index 0000000..2c25d82 --- /dev/null +++ b/src/main/java/com/jquerybuilder/operation/function/NotIn.java @@ -0,0 +1,16 @@ +package com.jquerybuilder.operation.function; + +import com.jquerybuilder.operation.BinaryExecutor; +import com.jquerybuilder.operation.OperationExecutor; + +public class NotIn extends OperationExecutor implements BinaryExecutor { + + @Override + public boolean apply(Object arg, Object listOf) { + try { + return !list(listOf).contains(arg); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/java/com/jquerybuilder/validation/Operation.java b/src/main/java/com/jquerybuilder/validation/Operation.java deleted file mode 100644 index 3b5b51a..0000000 --- a/src/main/java/com/jquerybuilder/validation/Operation.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.jquerybuilder.validation; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Operation { - private static Map operationMap = new HashMap<>(); - - public static boolean apply(String operation, Object v1, Object v2) { - return operationMap.get(operation).apply(v1, v2); - } - - private static class Function { - public boolean apply(Object v1, Object v2) { - return false; - } - - public boolean apply(Object v1) { - return false; - } - } - - static { - operationMap.put("less", new Function() { - - @Override - public boolean apply(Object v1, Object v2) { - try { - long i1 = Long.parseLong(v1.toString()); - long i2 = Long.parseLong(v2.toString()); - return i1 < i2; - } catch (Exception e) { - } - return false; - } - }); - operationMap.put("less_or_equal", new Function() { - - @Override - public boolean apply(Object v1, Object v2) { - try { - long i1 = Long.parseLong(v1.toString()); - long i2 = Long.parseLong(v2.toString()); - return i1 <= i2; - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("greater", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - long i1 = Long.parseLong(v1.toString()); - long i2 = Long.parseLong(v2.toString()); - return i1 > i2; - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("greater_or_equal", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - long i1 = Long.parseLong(v1.toString()); - long i2 = Long.parseLong(v2.toString()); - return i1 >= i2; - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("between", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - List list = (List) v2; - long i1 = Long.parseLong(v1.toString()); - long i2 = Long.parseLong(list.get(0).toString()); - long i3 = Long.parseLong(list.get(1).toString()); - return i2 > i3 ? i1 > i3 && i1 < i2 : i1 > i2 && i1 < i3; - } catch (Exception e) { - } - return false; - } - }); - operationMap.put("not_between", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - List list = (List) v2; - long i1 = Long.parseLong(v1.toString()); - long i2 = Long.parseLong(list.get(0).toString()); - long i3 = Long.parseLong(list.get(1).toString()); - return !(i2 > i3 ? i1 > i3 && i1 < i2 : i1 > i2 && i1 < i3); - } catch (Exception e) { - } - return false; - } - }); - operationMap.put("equal", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return v1.equals(v2); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("not_equal", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return !v1.equals(v2); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("contains", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return v1.toString().contains(v2.toString()); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("not_contains", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return !v1.toString().contains(v2.toString()); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("in", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - List list = (List) v2; - return list.contains(v1); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("not_in", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - List list = (List) v2; - return !list.contains(v1); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("is_null", new Function() { - @Override - public boolean apply(Object v1) { - return v1 == null; - } - }); - - operationMap.put("is_not_null", new Function() { - @Override - public boolean apply(Object v1) { - return v1 != null; - } - }); - - operationMap.put("begins_with", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return v1.toString().startsWith(v2.toString()); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("not_begins_with", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return !v1.toString().startsWith(v2.toString()); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("ends_with", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return v1.toString().endsWith(v2.toString()); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("not_ends_with", new Function() { - @Override - public boolean apply(Object v1, Object v2) { - try { - return !v1.toString().endsWith(v2.toString()); - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("is_empty", new Function() { - @Override - public boolean apply(Object v1) { - try { - if (v1 instanceof List) { - List list = ((List) v1); - return list == null || list.isEmpty(); - } else if (v1 instanceof String) { - return "" == v1.toString(); - } - } catch (Exception e) { - } - return false; - } - }); - - operationMap.put("is_not_empty", new Function() { - @Override - public boolean apply(Object v1) { - try { - if (v1 instanceof List) { - List list = ((List) v1); - return list != null && !list.isEmpty(); - } else if (v1 instanceof String) { - return "" != v1.toString(); - } - } catch (Exception e) { - } - return false; - } - }); - - } - -} diff --git a/src/main/java/com/jquerybuilder/validation/ValidationGroup.java b/src/main/java/com/jquerybuilder/validation/ValidationGroup.java index ada6085..39de548 100644 --- a/src/main/java/com/jquerybuilder/validation/ValidationGroup.java +++ b/src/main/java/com/jquerybuilder/validation/ValidationGroup.java @@ -3,13 +3,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; - import com.jquerybuilder.exception.FieldNotFoundException; public class ValidationGroup { public enum Condition { AND, OR; + public static Condition get(Object v) { return Condition.valueOf(v.toString().toUpperCase()); } @@ -25,7 +25,7 @@ public static Condition get(Object v) { private Condition condition; private boolean not = false; - public ValidationGroup(Map map) { + public ValidationGroup(Map map) { build(map); } diff --git a/src/main/java/com/jquerybuilder/validation/ValidationRule.java b/src/main/java/com/jquerybuilder/validation/ValidationRule.java index dd06047..644f859 100644 --- a/src/main/java/com/jquerybuilder/validation/ValidationRule.java +++ b/src/main/java/com/jquerybuilder/validation/ValidationRule.java @@ -1,8 +1,8 @@ package com.jquerybuilder.validation; import java.util.Map; - import com.jquerybuilder.exception.FieldNotFoundException; +import com.jquerybuilder.operation.Operation; public class ValidationRule { private String id; @@ -16,18 +16,18 @@ public ValidationRule(Map map) { } public void build(Map map) { - setId(map.get("id")); - setField(map.get("field")); - setType(map.get("type")); - setOperator(map.get("operator")); - setValue(map.get("value")); + this.id = map.get("id"); + this.field = map.get("field"); + this.type = map.get("type"); + this.operator = map.get("operator"); + this.value = map.get("value"); } public boolean execute(Map data) throws FieldNotFoundException { if (!data.containsKey(field)) { - throw new FieldNotFoundException("(field:"+field + ") not found in map"); + throw new FieldNotFoundException("(field:" + field + ") not found in map"); } - String rawDataValue = data.get(field).toString(); + String rawDataValue = String.valueOf(data.get(field)); return Operation.apply(operator, rawDataValue, value); } diff --git a/src/test/java/com/jquerybuilder/test/BaseTest.java b/src/test/java/com/jquerybuilder/test/BaseTest.java index 424d1bf..1a73873 100644 --- a/src/test/java/com/jquerybuilder/test/BaseTest.java +++ b/src/test/java/com/jquerybuilder/test/BaseTest.java @@ -6,24 +6,22 @@ import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; - import junit.framework.TestCase; public class BaseTest extends TestCase { - protected Map data1 = new HashMap(); - protected Map data2 = new HashMap(); - protected Map data3 = new HashMap(); - protected Map data4 = new HashMap(); - protected Map data5 = new HashMap(); - protected Map data6 = new HashMap(); - protected Map data7 = new HashMap(); - protected Map data8 = new HashMap(); - protected Map data9 = new HashMap(); - protected Map data10 = new HashMap(); + protected Map data1 = new HashMap<>(); + protected Map data2 = new HashMap<>(); + protected Map data3 = new HashMap<>(); + protected Map data4 = new HashMap<>(); + protected Map data5 = new HashMap<>(); + protected Map data6 = new HashMap<>(); + protected Map data7 = new HashMap<>(); + protected Map data8 = new HashMap<>(); + protected Map data9 = new HashMap<>(); + protected Map data10 = new HashMap<>(); protected Gson gson = new GsonBuilder().create(); @@ -33,8 +31,9 @@ protected String readFile(String file) { File fileDir = new File(file); BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileDir), "UTF8")); String str; - while ((str = in.readLine()) != null) + while ((str = in.readLine()) != null) { sb.append(str); + } in.close(); } catch (Exception e) { e.printStackTrace(); @@ -46,5 +45,4 @@ protected String readFile(String file) { public void testBase() { assertNotNull(gson); } - } diff --git a/src/test/java/com/jquerybuilder/test/OperationTest.java b/src/test/java/com/jquerybuilder/test/OperationTest.java index 1efbb33..1f61802 100644 --- a/src/test/java/com/jquerybuilder/test/OperationTest.java +++ b/src/test/java/com/jquerybuilder/test/OperationTest.java @@ -1,58 +1,153 @@ package com.jquerybuilder.test; -import java.util.Map; - -import com.jquerybuilder.exception.FieldNotFoundException; -import com.jquerybuilder.validation.ValidationGroup; +import java.util.Arrays; +import com.jquerybuilder.operation.Operation; public class OperationTest extends BaseTest { - public OperationTest() { - data1.put("number", "11"); - data1.put("hobby", "music"); - data2.put("number", "2"); - data2.put("hobby", "tenis"); + public void testLessOperation() { + assertTrue(Operation.Less.apply(1, 2)); + // null is 0 + assertTrue(Operation.Less.apply(null, 1)); + // empty is 0 + assertTrue(Operation.Less.apply("", 1)); + assertFalse(Operation.Less.apply(2, 1)); + } + + public void testLessOrEqualOperation() { + assertTrue(Operation.LessOrEqual.apply(1, 1)); + assertTrue(Operation.LessOrEqual.apply(1, 2)); + assertFalse(Operation.LessOrEqual.apply(2, 1)); + } - data3.put("number", "50"); - data3.put("hobby", "painting"); + public void testGreaterOperation() { + assertTrue(Operation.Greater.apply(2, 1)); + assertFalse(Operation.Greater.apply(1, 2)); + // null is 0 + assertFalse(Operation.Greater.apply(null, 1)); + // empty is 0 + assertFalse(Operation.Greater.apply("", 1)); + } - data4.put("number", "7"); - data4.put("hobby", "tenis"); + public void testGreaterOrEqualOperation() { + assertTrue(Operation.GreaterOrEqual.apply(2, 1)); + assertTrue(Operation.GreaterOrEqual.apply(1, 1)); + } - data5.put("number", "10"); - data6.put("number", "60"); + public void testBetweenOperation() { + assertTrue(Operation.Between.apply(3, Arrays.asList(1, 5))); + } + public void testNotBetweenOperation() { + assertTrue(Operation.NotBetween.apply(10, Arrays.asList(1, 5))); } - public void testInOperation() throws FieldNotFoundException { - Map map = gson.fromJson(readFile("input/operation/in.json"), Map.class); - ValidationGroup validationGroup = new ValidationGroup(map); + public void testEqualOperation() { + assertTrue(Operation.Equal.apply(1, 1)); + assertTrue(Operation.Equal.apply("", "")); + assertTrue(Operation.Equal.apply("a", "a")); + assertTrue(Operation.Equal.apply(null, null)); + assertFalse(Operation.Equal.apply(null, "")); + assertFalse(Operation.Equal.apply("", " ")); + assertFalse(Operation.Equal.apply("", "\t")); + } - assertTrue(validationGroup.execute(data1)); - assertTrue(validationGroup.execute(data2)); - assertFalse(validationGroup.execute(data3)); - assertFalse(validationGroup.execute(data4)); + public void testNotEqualOperation() { + assertTrue(Operation.NotEqual.apply(null, "")); + assertTrue(Operation.NotEqual.apply("", " ")); + assertTrue(Operation.NotEqual.apply("", "\t")); + assertTrue(Operation.NotEqual.apply(1, 2)); + assertFalse(Operation.NotEqual.apply(1, 1)); + assertFalse(Operation.NotEqual.apply("", "")); + assertFalse(Operation.NotEqual.apply("a", "a")); + assertFalse(Operation.NotEqual.apply(null, null)); + } + public void testContainsOperation() { + assertTrue(Operation.Contains.apply("abc", "a")); + assertTrue(Operation.Contains.apply("abc", "b")); + assertTrue(Operation.Contains.apply("abc", "c")); + assertTrue(Operation.Contains.apply("abc", "ab")); + assertFalse(Operation.Contains.apply("abc", "ac")); } - public void testLessOperation() throws FieldNotFoundException { - Map map = gson.fromJson(readFile("input/operation/less.json"), Map.class); - ValidationGroup validationGroup = new ValidationGroup(map); + public void testNotContainsOperation() { + assertTrue(Operation.NotContains.apply("x", "abc")); + assertFalse(Operation.NotContains.apply("a", "abc")); + assertFalse(Operation.NotContains.apply("b", "abc")); + } - assertFalse(validationGroup.execute(data5)); - assertTrue(validationGroup.execute(data6)); + public void testInOperation() { + assertTrue(Operation.In.apply("b", Arrays.asList("a", "b", "c"))); + assertTrue(Operation.In.apply("c", Arrays.asList("a", "b", "c"))); + assertTrue(Operation.In.apply("a", Arrays.asList("a", "b", "c"))); + assertFalse(Operation.In.apply("x", Arrays.asList("a", "b", "c"))); + assertFalse(Operation.In.apply(null, Arrays.asList("a", "b", "c"))); + assertFalse(Operation.In.apply("", Arrays.asList("a", "b", "c"))); + } + public void testNotInOperation() { + assertTrue(Operation.NotIn.apply("x", Arrays.asList("a", "b", "c"))); + assertTrue(Operation.NotIn.apply(null, Arrays.asList("a", "b", "c"))); + assertTrue(Operation.NotIn.apply("", Arrays.asList("a", "b", "c"))); + assertFalse(Operation.NotIn.apply("a", Arrays.asList("a", "b", "c"))); + assertFalse(Operation.NotIn.apply("b", Arrays.asList("a", "b", "c"))); + assertFalse(Operation.NotIn.apply("c", Arrays.asList("a", "b", "c"))); } - public void testBetweenOperation() throws FieldNotFoundException { - Map map = gson.fromJson(readFile("input/operation/between.json"), Map.class); - ValidationGroup conditionGroup = new ValidationGroup(map); + public void testIsNullOperation() { + assertTrue(Operation.IsNull.apply(null)); + assertFalse(Operation.IsNull.apply(1)); + assertFalse(Operation.IsNull.apply("")); + assertFalse(Operation.IsNull.apply("a")); + } - assertFalse(conditionGroup.execute(data1)); - assertFalse(conditionGroup.execute(data5)); - assertTrue(conditionGroup.execute(data6)); + public void testIsNotNullOperation() { + assertFalse(Operation.IsNotNull.apply(null)); + assertTrue(Operation.IsNotNull.apply(1)); + assertTrue(Operation.IsNotNull.apply("")); + assertTrue(Operation.IsNotNull.apply("a")); + } + + public void testBeginsWithOperation() { + assertTrue(Operation.BeginsWith.apply("", "abc")); + assertTrue(Operation.BeginsWith.apply("A", "abc")); + assertTrue(Operation.BeginsWith.apply("a", "abc")); + assertFalse(Operation.BeginsWith.apply("b", "abc")); + } + + public void testNotBeginsWithOperation() { + assertTrue(Operation.NotBeginsWith.apply("b", "abc")); + assertTrue(Operation.NotBeginsWith.apply("", "abc")); + assertFalse(Operation.NotBeginsWith.apply("a", "abc")); + } + + public void testEndsWithOperation() { + assertTrue(Operation.EndsWith.apply("c", "abc")); + assertTrue(Operation.EndsWith.apply("C", "abc")); + assertTrue(Operation.EndsWith.apply("", "abc")); + assertFalse(Operation.EndsWith.apply("a", "abc")); + } + + public void testNotEndsWithOperation() { + assertTrue(Operation.NotEndsWith.apply("a", "abc")); + assertFalse(Operation.NotEndsWith.apply("c", "abc")); + assertFalse(Operation.NotEndsWith.apply("C", "abc")); + assertFalse(Operation.NotEndsWith.apply("", "abc")); + } + + public void testIsEmptyOperation() { + assertTrue(Operation.IsEmpty.apply("")); + assertFalse(Operation.IsEmpty.apply(null)); + assertFalse(Operation.IsEmpty.apply("a")); + assertFalse(Operation.IsEmpty.apply(1)); + } + public void testIsNotEmptyOperation() { + assertTrue(Operation.IsNotEmpty.apply("a")); + assertFalse(Operation.IsNotEmpty.apply("")); + assertFalse(Operation.IsNotEmpty.apply(null)); } } diff --git a/src/test/java/com/jquerybuilder/test/OperationWithValidationGroupTest.java b/src/test/java/com/jquerybuilder/test/OperationWithValidationGroupTest.java new file mode 100644 index 0000000..9331a6d --- /dev/null +++ b/src/test/java/com/jquerybuilder/test/OperationWithValidationGroupTest.java @@ -0,0 +1,53 @@ +package com.jquerybuilder.test; + +import java.util.Map; +import com.jquerybuilder.exception.FieldNotFoundException; +import com.jquerybuilder.validation.ValidationGroup; + +public class OperationWithValidationGroupTest extends BaseTest { + + public OperationWithValidationGroupTest() { + data1.put("number", "11"); + data1.put("hobby", "music"); + + data2.put("number", "2"); + data2.put("hobby", "tenis"); + + data3.put("number", "50"); + data3.put("hobby", "painting"); + + data4.put("number", "7"); + data4.put("hobby", "tenis"); + + data5.put("number", "10"); + data6.put("number", "60"); + } + + public void testInOperation() throws FieldNotFoundException { + Map map = gson.fromJson(readFile("input/operation/in.json"), Map.class); + ValidationGroup validationGroup = new ValidationGroup(map); + + assertTrue(validationGroup.execute(data1)); + assertTrue(validationGroup.execute(data2)); + assertFalse(validationGroup.execute(data3)); + assertFalse(validationGroup.execute(data4)); + } + + public void testLessOperation() throws FieldNotFoundException { + Map map = gson.fromJson(readFile("input/operation/less.json"), Map.class); + ValidationGroup validationGroup = new ValidationGroup(map); + + assertFalse(validationGroup.execute(data5)); + assertTrue(validationGroup.execute(data6)); + } + + public void testBetweenOperation() throws FieldNotFoundException { + Map map = gson.fromJson(readFile("input/operation/between.json"), Map.class); + ValidationGroup conditionGroup = new ValidationGroup(map); + + assertFalse(conditionGroup.execute(data1)); + assertFalse(conditionGroup.execute(data5)); + assertTrue(conditionGroup.execute(data6)); + } + +}