diff --git a/pom.xml b/pom.xml
index 79bf7d72b7..88b0a4e23d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -674,7 +674,6 @@
spring-reactor
spring-remoting
spring-rest-http-2
- spring-rest-query-language
spring-rest-shell
spring-rest-simple
spring-resttemplate
@@ -1141,7 +1140,6 @@
spring-reactor
spring-remoting
- spring-rest-query-language
spring-rest-shell
spring-rest-simple
spring-resttemplate
diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml
index ce0524f957..19ec1c2a74 100644
--- a/spring-web-modules/pom.xml
+++ b/spring-web-modules/pom.xml
@@ -22,6 +22,7 @@
spring-mvc-forms-jsp
spring-rest-angular
spring-rest-http
+ spring-rest-query-language
spring-resttemplate-2
spring-thymeleaf
spring-thymeleaf-2
diff --git a/spring-rest-query-language/.gitignore b/spring-web-modules/spring-rest-query-language/.gitignore
similarity index 100%
rename from spring-rest-query-language/.gitignore
rename to spring-web-modules/spring-rest-query-language/.gitignore
diff --git a/spring-rest-query-language/README.md b/spring-web-modules/spring-rest-query-language/README.md
similarity index 100%
rename from spring-rest-query-language/README.md
rename to spring-web-modules/spring-rest-query-language/README.md
diff --git a/spring-rest-query-language/pom.xml b/spring-web-modules/spring-rest-query-language/pom.xml
similarity index 99%
rename from spring-rest-query-language/pom.xml
rename to spring-web-modules/spring-rest-query-language/pom.xml
index 4458aa0580..5e7ca023dd 100644
--- a/spring-rest-query-language/pom.xml
+++ b/spring-web-modules/spring-rest-query-language/pom.xml
@@ -11,7 +11,7 @@
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../../parent-boot-2
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
similarity index 97%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
index 75fb4456c4..b6623e8885 100644
--- a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
+++ b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
@@ -1,100 +1,100 @@
-package com.baeldung.persistence.dao;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import org.springframework.data.jpa.domain.Specification;
-
-import com.baeldung.web.util.SearchOperation;
-import com.baeldung.web.util.SpecSearchCriteria;
-
-public class GenericSpecificationsBuilder {
-
- private final List params;
-
- public GenericSpecificationsBuilder() {
- this.params = new ArrayList<>();
- }
-
- public final GenericSpecificationsBuilder with(final String key, final String operation, final Object value, final String prefix, final String suffix) {
- return with(null, key, operation, value, prefix, suffix);
- }
-
- public final GenericSpecificationsBuilder with(final String precedenceIndicator, final String key, final String operation, final Object value, final String prefix, final String suffix) {
- SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0));
- if (op != null) {
- if (op == SearchOperation.EQUALITY) // the operation may be complex operation
- {
- final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
- final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
-
- if (startWithAsterisk && endWithAsterisk) {
- op = SearchOperation.CONTAINS;
- } else if (startWithAsterisk) {
- op = SearchOperation.ENDS_WITH;
- } else if (endWithAsterisk) {
- op = SearchOperation.STARTS_WITH;
- }
- }
- params.add(new SpecSearchCriteria(precedenceIndicator, key, op, value));
- }
- return this;
- }
-
- public Specification build(Function> converter) {
-
- if (params.size() == 0) {
- return null;
- }
-
- final List> specs = params.stream()
- .map(converter)
- .collect(Collectors.toCollection(ArrayList::new));
-
- Specification result = specs.get(0);
-
- for (int idx = 1; idx < specs.size(); idx++) {
- result = params.get(idx)
- .isOrPredicate()
- ? Specification.where(result)
- .or(specs.get(idx))
- : Specification.where(result)
- .and(specs.get(idx));
- }
-
- return result;
- }
-
- public Specification build(Deque> postFixedExprStack, Function> converter) {
-
- Deque> specStack = new LinkedList<>();
-
- Collections.reverse((List>) postFixedExprStack);
-
- while (!postFixedExprStack.isEmpty()) {
- Object mayBeOperand = postFixedExprStack.pop();
-
- if (!(mayBeOperand instanceof String)) {
- specStack.push(converter.apply((SpecSearchCriteria) mayBeOperand));
- } else {
- Specification operand1 = specStack.pop();
- Specification operand2 = specStack.pop();
- if (mayBeOperand.equals(SearchOperation.AND_OPERATOR))
- specStack.push(Specification.where(operand1)
- .and(operand2));
- else if (mayBeOperand.equals(SearchOperation.OR_OPERATOR))
- specStack.push(Specification.where(operand1)
- .or(operand2));
- }
-
- }
- return specStack.pop();
-
- }
-
-}
+package com.baeldung.persistence.dao;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.data.jpa.domain.Specification;
+
+import com.baeldung.web.util.SearchOperation;
+import com.baeldung.web.util.SpecSearchCriteria;
+
+public class GenericSpecificationsBuilder {
+
+ private final List params;
+
+ public GenericSpecificationsBuilder() {
+ this.params = new ArrayList<>();
+ }
+
+ public final GenericSpecificationsBuilder with(final String key, final String operation, final Object value, final String prefix, final String suffix) {
+ return with(null, key, operation, value, prefix, suffix);
+ }
+
+ public final GenericSpecificationsBuilder with(final String precedenceIndicator, final String key, final String operation, final Object value, final String prefix, final String suffix) {
+ SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0));
+ if (op != null) {
+ if (op == SearchOperation.EQUALITY) // the operation may be complex operation
+ {
+ final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
+ final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
+
+ if (startWithAsterisk && endWithAsterisk) {
+ op = SearchOperation.CONTAINS;
+ } else if (startWithAsterisk) {
+ op = SearchOperation.ENDS_WITH;
+ } else if (endWithAsterisk) {
+ op = SearchOperation.STARTS_WITH;
+ }
+ }
+ params.add(new SpecSearchCriteria(precedenceIndicator, key, op, value));
+ }
+ return this;
+ }
+
+ public Specification build(Function> converter) {
+
+ if (params.size() == 0) {
+ return null;
+ }
+
+ final List> specs = params.stream()
+ .map(converter)
+ .collect(Collectors.toCollection(ArrayList::new));
+
+ Specification result = specs.get(0);
+
+ for (int idx = 1; idx < specs.size(); idx++) {
+ result = params.get(idx)
+ .isOrPredicate()
+ ? Specification.where(result)
+ .or(specs.get(idx))
+ : Specification.where(result)
+ .and(specs.get(idx));
+ }
+
+ return result;
+ }
+
+ public Specification build(Deque> postFixedExprStack, Function> converter) {
+
+ Deque> specStack = new LinkedList<>();
+
+ Collections.reverse((List>) postFixedExprStack);
+
+ while (!postFixedExprStack.isEmpty()) {
+ Object mayBeOperand = postFixedExprStack.pop();
+
+ if (!(mayBeOperand instanceof String)) {
+ specStack.push(converter.apply((SpecSearchCriteria) mayBeOperand));
+ } else {
+ Specification operand1 = specStack.pop();
+ Specification operand2 = specStack.pop();
+ if (mayBeOperand.equals(SearchOperation.AND_OPERATOR))
+ specStack.push(Specification.where(operand1)
+ .and(operand2));
+ else if (mayBeOperand.equals(SearchOperation.OR_OPERATOR))
+ specStack.push(Specification.where(operand1)
+ .or(operand2));
+ }
+
+ }
+ return specStack.pop();
+
+ }
+
+}
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
similarity index 97%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
index 72d7274226..eac1562294 100644
--- a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
+++ b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
@@ -1,70 +1,70 @@
-package com.baeldung.persistence.dao;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.springframework.data.jpa.domain.Specification;
-
-import com.baeldung.persistence.model.User;
-import com.baeldung.web.util.SearchOperation;
-import com.baeldung.web.util.SpecSearchCriteria;
-
-public final class UserSpecificationsBuilder {
-
- private final List params;
-
- public UserSpecificationsBuilder() {
- params = new ArrayList<>();
- }
-
- // API
-
- public final UserSpecificationsBuilder with(final String key, final String operation, final Object value, final String prefix, final String suffix) {
- return with(null, key, operation, value, prefix, suffix);
- }
-
- public final UserSpecificationsBuilder with(final String orPredicate, final String key, final String operation, final Object value, final String prefix, final String suffix) {
- SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0));
- if (op != null) {
- if (op == SearchOperation.EQUALITY) { // the operation may be complex operation
- final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
- final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
-
- if (startWithAsterisk && endWithAsterisk) {
- op = SearchOperation.CONTAINS;
- } else if (startWithAsterisk) {
- op = SearchOperation.ENDS_WITH;
- } else if (endWithAsterisk) {
- op = SearchOperation.STARTS_WITH;
- }
- }
- params.add(new SpecSearchCriteria(orPredicate, key, op, value));
- }
- return this;
- }
-
- public Specification build() {
- if (params.size() == 0)
- return null;
-
- Specification result = new UserSpecification(params.get(0));
-
- for (int i = 1; i < params.size(); i++) {
- result = params.get(i).isOrPredicate()
- ? Specification.where(result).or(new UserSpecification(params.get(i)))
- : Specification.where(result).and(new UserSpecification(params.get(i)));
- }
-
- return result;
- }
-
- public final UserSpecificationsBuilder with(UserSpecification spec) {
- params.add(spec.getCriteria());
- return this;
- }
-
- public final UserSpecificationsBuilder with(SpecSearchCriteria criteria) {
- params.add(criteria);
- return this;
- }
-}
+package com.baeldung.persistence.dao;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.data.jpa.domain.Specification;
+
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.SearchOperation;
+import com.baeldung.web.util.SpecSearchCriteria;
+
+public final class UserSpecificationsBuilder {
+
+ private final List params;
+
+ public UserSpecificationsBuilder() {
+ params = new ArrayList<>();
+ }
+
+ // API
+
+ public final UserSpecificationsBuilder with(final String key, final String operation, final Object value, final String prefix, final String suffix) {
+ return with(null, key, operation, value, prefix, suffix);
+ }
+
+ public final UserSpecificationsBuilder with(final String orPredicate, final String key, final String operation, final Object value, final String prefix, final String suffix) {
+ SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0));
+ if (op != null) {
+ if (op == SearchOperation.EQUALITY) { // the operation may be complex operation
+ final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
+ final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
+
+ if (startWithAsterisk && endWithAsterisk) {
+ op = SearchOperation.CONTAINS;
+ } else if (startWithAsterisk) {
+ op = SearchOperation.ENDS_WITH;
+ } else if (endWithAsterisk) {
+ op = SearchOperation.STARTS_WITH;
+ }
+ }
+ params.add(new SpecSearchCriteria(orPredicate, key, op, value));
+ }
+ return this;
+ }
+
+ public Specification build() {
+ if (params.size() == 0)
+ return null;
+
+ Specification result = new UserSpecification(params.get(0));
+
+ for (int i = 1; i < params.size(); i++) {
+ result = params.get(i).isOrPredicate()
+ ? Specification.where(result).or(new UserSpecification(params.get(i)))
+ : Specification.where(result).and(new UserSpecification(params.get(i)));
+ }
+
+ return result;
+ }
+
+ public final UserSpecificationsBuilder with(UserSpecification spec) {
+ params.add(spec.getCriteria());
+ return this;
+ }
+
+ public final UserSpecificationsBuilder with(SpecSearchCriteria criteria) {
+ params.add(criteria);
+ return this;
+ }
+}
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
similarity index 97%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
index 54e8618b27..73a97f84ae 100644
--- a/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
+++ b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
@@ -1,171 +1,171 @@
-package com.baeldung.web.controller;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.querydsl.binding.QuerydslPredicate;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
-
-import com.baeldung.persistence.dao.GenericSpecificationsBuilder;
-import com.baeldung.persistence.dao.IUserDAO;
-import com.baeldung.persistence.dao.MyUserPredicatesBuilder;
-import com.baeldung.persistence.dao.MyUserRepository;
-import com.baeldung.persistence.dao.UserRepository;
-import com.baeldung.persistence.dao.UserSpecification;
-import com.baeldung.persistence.dao.UserSpecificationsBuilder;
-import com.baeldung.persistence.dao.rsql.CustomRsqlVisitor;
-import com.baeldung.persistence.model.MyUser;
-import com.baeldung.persistence.model.User;
-import com.baeldung.web.util.CriteriaParser;
-import com.baeldung.web.util.SearchCriteria;
-import com.baeldung.web.util.SearchOperation;
-import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
-import com.querydsl.core.types.Predicate;
-import com.querydsl.core.types.dsl.BooleanExpression;
-
-import cz.jirutka.rsql.parser.RSQLParser;
-import cz.jirutka.rsql.parser.ast.Node;
-
-//@EnableSpringDataWebSupport
-@Controller
-@RequestMapping(value = "/auth/")
-public class UserController {
-
- @Autowired
- private IUserDAO service;
-
- @Autowired
- private UserRepository dao;
-
- @Autowired
- private MyUserRepository myUserRepository;
-
- public UserController() {
- super();
- }
-
- // API - READ
-
- @RequestMapping(method = RequestMethod.GET, value = "/users")
- @ResponseBody
- public List search(@RequestParam(value = "search", required = false) String search) {
- List params = new ArrayList();
- if (search != null) {
- Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
- Matcher matcher = pattern.matcher(search + ",");
- while (matcher.find()) {
- params.add(new SearchCriteria(matcher.group(1), matcher.group(2), matcher.group(3)));
- }
- }
- return service.searchUser(params);
- }
-
- @RequestMapping(method = RequestMethod.GET, value = "/users/spec")
- @ResponseBody
- public List findAllBySpecification(@RequestParam(value = "search") String search) {
- UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
- String operationSetExper = Joiner.on("|")
- .join(SearchOperation.SIMPLE_OPERATION_SET);
- Pattern pattern = Pattern.compile("(\\w+?)(" + operationSetExper + ")(\\p{Punct}?)(\\w+?)(\\p{Punct}?),");
- Matcher matcher = pattern.matcher(search + ",");
- while (matcher.find()) {
- builder.with(matcher.group(1), matcher.group(2), matcher.group(4), matcher.group(3), matcher.group(5));
- }
-
- Specification spec = builder.build();
- return dao.findAll(spec);
- }
-
- @GetMapping(value = "/users/espec")
- @ResponseBody
- public List findAllByOrPredicate(@RequestParam(value = "search") String search) {
- Specification spec = resolveSpecification(search);
- return dao.findAll(spec);
- }
-
- @GetMapping(value = "/users/spec/adv")
- @ResponseBody
- public List findAllByAdvPredicate(@RequestParam(value = "search") String search) {
- Specification spec = resolveSpecificationFromInfixExpr(search);
- return dao.findAll(spec);
- }
-
- protected Specification resolveSpecificationFromInfixExpr(String searchParameters) {
- CriteriaParser parser = new CriteriaParser();
- GenericSpecificationsBuilder specBuilder = new GenericSpecificationsBuilder<>();
- return specBuilder.build(parser.parse(searchParameters), UserSpecification::new);
- }
-
- protected Specification resolveSpecification(String searchParameters) {
-
- UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
- String operationSetExper = Joiner.on("|")
- .join(SearchOperation.SIMPLE_OPERATION_SET);
- Pattern pattern = Pattern.compile("(\\p{Punct}?)(\\w+?)(" + operationSetExper + ")(\\p{Punct}?)(\\w+?)(\\p{Punct}?),");
- Matcher matcher = pattern.matcher(searchParameters + ",");
- while (matcher.find()) {
- builder.with(matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(5), matcher.group(4), matcher.group(6));
- }
- return builder.build();
- }
-
- @RequestMapping(method = RequestMethod.GET, value = "/myusers")
- @ResponseBody
- public Iterable findAllByQuerydsl(@RequestParam(value = "search") String search) {
- MyUserPredicatesBuilder builder = new MyUserPredicatesBuilder();
- if (search != null) {
- Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
- Matcher matcher = pattern.matcher(search + ",");
- while (matcher.find()) {
- builder.with(matcher.group(1), matcher.group(2), matcher.group(3));
- }
- }
- BooleanExpression exp = builder.build();
- return myUserRepository.findAll(exp);
- }
-
- @RequestMapping(method = RequestMethod.GET, value = "/users/rsql")
- @ResponseBody
- public List findAllByRsql(@RequestParam(value = "search") String search) {
- Node rootNode = new RSQLParser().parse(search);
- Specification spec = rootNode.accept(new CustomRsqlVisitor());
- return dao.findAll(spec);
- }
-
- @RequestMapping(method = RequestMethod.GET, value = "/api/myusers")
- @ResponseBody
- public Iterable findAllByWebQuerydsl(@QuerydslPredicate(root = MyUser.class) Predicate predicate) {
- return myUserRepository.findAll(predicate);
- }
-
- // API - WRITE
-
- @RequestMapping(method = RequestMethod.POST, value = "/users")
- @ResponseStatus(HttpStatus.CREATED)
- public void create(@RequestBody User resource) {
- Preconditions.checkNotNull(resource);
- dao.save(resource);
- }
-
- @RequestMapping(method = RequestMethod.POST, value = "/myusers")
- @ResponseStatus(HttpStatus.CREATED)
- public void addMyUser(@RequestBody MyUser resource) {
- Preconditions.checkNotNull(resource);
- myUserRepository.save(resource);
-
- }
-
-}
+package com.baeldung.web.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.querydsl.binding.QuerydslPredicate;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.baeldung.persistence.dao.GenericSpecificationsBuilder;
+import com.baeldung.persistence.dao.IUserDAO;
+import com.baeldung.persistence.dao.MyUserPredicatesBuilder;
+import com.baeldung.persistence.dao.MyUserRepository;
+import com.baeldung.persistence.dao.UserRepository;
+import com.baeldung.persistence.dao.UserSpecification;
+import com.baeldung.persistence.dao.UserSpecificationsBuilder;
+import com.baeldung.persistence.dao.rsql.CustomRsqlVisitor;
+import com.baeldung.persistence.model.MyUser;
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.CriteriaParser;
+import com.baeldung.web.util.SearchCriteria;
+import com.baeldung.web.util.SearchOperation;
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.querydsl.core.types.Predicate;
+import com.querydsl.core.types.dsl.BooleanExpression;
+
+import cz.jirutka.rsql.parser.RSQLParser;
+import cz.jirutka.rsql.parser.ast.Node;
+
+//@EnableSpringDataWebSupport
+@Controller
+@RequestMapping(value = "/auth/")
+public class UserController {
+
+ @Autowired
+ private IUserDAO service;
+
+ @Autowired
+ private UserRepository dao;
+
+ @Autowired
+ private MyUserRepository myUserRepository;
+
+ public UserController() {
+ super();
+ }
+
+ // API - READ
+
+ @RequestMapping(method = RequestMethod.GET, value = "/users")
+ @ResponseBody
+ public List search(@RequestParam(value = "search", required = false) String search) {
+ List params = new ArrayList();
+ if (search != null) {
+ Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
+ Matcher matcher = pattern.matcher(search + ",");
+ while (matcher.find()) {
+ params.add(new SearchCriteria(matcher.group(1), matcher.group(2), matcher.group(3)));
+ }
+ }
+ return service.searchUser(params);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, value = "/users/spec")
+ @ResponseBody
+ public List findAllBySpecification(@RequestParam(value = "search") String search) {
+ UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
+ String operationSetExper = Joiner.on("|")
+ .join(SearchOperation.SIMPLE_OPERATION_SET);
+ Pattern pattern = Pattern.compile("(\\w+?)(" + operationSetExper + ")(\\p{Punct}?)(\\w+?)(\\p{Punct}?),");
+ Matcher matcher = pattern.matcher(search + ",");
+ while (matcher.find()) {
+ builder.with(matcher.group(1), matcher.group(2), matcher.group(4), matcher.group(3), matcher.group(5));
+ }
+
+ Specification spec = builder.build();
+ return dao.findAll(spec);
+ }
+
+ @GetMapping(value = "/users/espec")
+ @ResponseBody
+ public List findAllByOrPredicate(@RequestParam(value = "search") String search) {
+ Specification spec = resolveSpecification(search);
+ return dao.findAll(spec);
+ }
+
+ @GetMapping(value = "/users/spec/adv")
+ @ResponseBody
+ public List findAllByAdvPredicate(@RequestParam(value = "search") String search) {
+ Specification spec = resolveSpecificationFromInfixExpr(search);
+ return dao.findAll(spec);
+ }
+
+ protected Specification resolveSpecificationFromInfixExpr(String searchParameters) {
+ CriteriaParser parser = new CriteriaParser();
+ GenericSpecificationsBuilder specBuilder = new GenericSpecificationsBuilder<>();
+ return specBuilder.build(parser.parse(searchParameters), UserSpecification::new);
+ }
+
+ protected Specification resolveSpecification(String searchParameters) {
+
+ UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
+ String operationSetExper = Joiner.on("|")
+ .join(SearchOperation.SIMPLE_OPERATION_SET);
+ Pattern pattern = Pattern.compile("(\\p{Punct}?)(\\w+?)(" + operationSetExper + ")(\\p{Punct}?)(\\w+?)(\\p{Punct}?),");
+ Matcher matcher = pattern.matcher(searchParameters + ",");
+ while (matcher.find()) {
+ builder.with(matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(5), matcher.group(4), matcher.group(6));
+ }
+ return builder.build();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, value = "/myusers")
+ @ResponseBody
+ public Iterable findAllByQuerydsl(@RequestParam(value = "search") String search) {
+ MyUserPredicatesBuilder builder = new MyUserPredicatesBuilder();
+ if (search != null) {
+ Pattern pattern = Pattern.compile("(\\w+?)(:|<|>)(\\w+?),");
+ Matcher matcher = pattern.matcher(search + ",");
+ while (matcher.find()) {
+ builder.with(matcher.group(1), matcher.group(2), matcher.group(3));
+ }
+ }
+ BooleanExpression exp = builder.build();
+ return myUserRepository.findAll(exp);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, value = "/users/rsql")
+ @ResponseBody
+ public List findAllByRsql(@RequestParam(value = "search") String search) {
+ Node rootNode = new RSQLParser().parse(search);
+ Specification spec = rootNode.accept(new CustomRsqlVisitor());
+ return dao.findAll(spec);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, value = "/api/myusers")
+ @ResponseBody
+ public Iterable findAllByWebQuerydsl(@QuerydslPredicate(root = MyUser.class) Predicate predicate) {
+ return myUserRepository.findAll(predicate);
+ }
+
+ // API - WRITE
+
+ @RequestMapping(method = RequestMethod.POST, value = "/users")
+ @ResponseStatus(HttpStatus.CREATED)
+ public void create(@RequestBody User resource) {
+ Preconditions.checkNotNull(resource);
+ dao.save(resource);
+ }
+
+ @RequestMapping(method = RequestMethod.POST, value = "/myusers")
+ @ResponseStatus(HttpStatus.CREATED)
+ public void addMyUser(@RequestBody MyUser resource) {
+ Preconditions.checkNotNull(resource);
+ myUserRepository.save(resource);
+
+ }
+
+}
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java
similarity index 100%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
similarity index 96%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
index acc9e0c0a8..86ad9ad749 100644
--- a/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
+++ b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
@@ -1,36 +1,36 @@
-package com.baeldung.web.util;
-
-public enum SearchOperation {
- EQUALITY, NEGATION, GREATER_THAN, LESS_THAN, LIKE, STARTS_WITH, ENDS_WITH, CONTAINS;
-
- public static final String[] SIMPLE_OPERATION_SET = { ":", "!", ">", "<", "~" };
-
- public static final String OR_PREDICATE_FLAG = "'";
-
- public static final String ZERO_OR_MORE_REGEX = "*";
-
- public static final String OR_OPERATOR = "OR";
-
- public static final String AND_OPERATOR = "AND";
-
- public static final String LEFT_PARANTHESIS = "(";
-
- public static final String RIGHT_PARANTHESIS = ")";
-
- public static SearchOperation getSimpleOperation(final char input) {
- switch (input) {
- case ':':
- return EQUALITY;
- case '!':
- return NEGATION;
- case '>':
- return GREATER_THAN;
- case '<':
- return LESS_THAN;
- case '~':
- return LIKE;
- default:
- return null;
- }
- }
-}
+package com.baeldung.web.util;
+
+public enum SearchOperation {
+ EQUALITY, NEGATION, GREATER_THAN, LESS_THAN, LIKE, STARTS_WITH, ENDS_WITH, CONTAINS;
+
+ public static final String[] SIMPLE_OPERATION_SET = { ":", "!", ">", "<", "~" };
+
+ public static final String OR_PREDICATE_FLAG = "'";
+
+ public static final String ZERO_OR_MORE_REGEX = "*";
+
+ public static final String OR_OPERATOR = "OR";
+
+ public static final String AND_OPERATOR = "AND";
+
+ public static final String LEFT_PARANTHESIS = "(";
+
+ public static final String RIGHT_PARANTHESIS = ")";
+
+ public static SearchOperation getSimpleOperation(final char input) {
+ switch (input) {
+ case ':':
+ return EQUALITY;
+ case '!':
+ return NEGATION;
+ case '>':
+ return GREATER_THAN;
+ case '<':
+ return LESS_THAN;
+ case '~':
+ return LIKE;
+ default:
+ return null;
+ }
+ }
+}
diff --git a/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
similarity index 96%
rename from spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
rename to spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
index 73b690673b..22b55c78fb 100644
--- a/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
+++ b/spring-web-modules/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
@@ -1,82 +1,82 @@
-package com.baeldung.web.util;
-
-public class SpecSearchCriteria {
-
- private String key;
- private SearchOperation operation;
- private Object value;
- private boolean orPredicate;
-
- public SpecSearchCriteria() {
-
- }
-
- public SpecSearchCriteria(final String key, final SearchOperation operation, final Object value) {
- super();
- this.key = key;
- this.operation = operation;
- this.value = value;
- }
-
- public SpecSearchCriteria(final String orPredicate, final String key, final SearchOperation operation, final Object value) {
- super();
- this.orPredicate = orPredicate != null && orPredicate.equals(SearchOperation.OR_PREDICATE_FLAG);
- this.key = key;
- this.operation = operation;
- this.value = value;
- }
-
- public SpecSearchCriteria(String key, String operation, String prefix, String value, String suffix) {
- SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0));
- if (op != null) {
- if (op == SearchOperation.EQUALITY) { // the operation may be complex operation
- final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
- final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
-
- if (startWithAsterisk && endWithAsterisk) {
- op = SearchOperation.CONTAINS;
- } else if (startWithAsterisk) {
- op = SearchOperation.ENDS_WITH;
- } else if (endWithAsterisk) {
- op = SearchOperation.STARTS_WITH;
- }
- }
- }
- this.key = key;
- this.operation = op;
- this.value = value;
- }
-
- public String getKey() {
- return key;
- }
-
- public void setKey(final String key) {
- this.key = key;
- }
-
- public SearchOperation getOperation() {
- return operation;
- }
-
- public void setOperation(final SearchOperation operation) {
- this.operation = operation;
- }
-
- public Object getValue() {
- return value;
- }
-
- public void setValue(final Object value) {
- this.value = value;
- }
-
- public boolean isOrPredicate() {
- return orPredicate;
- }
-
- public void setOrPredicate(boolean orPredicate) {
- this.orPredicate = orPredicate;
- }
-
-}
+package com.baeldung.web.util;
+
+public class SpecSearchCriteria {
+
+ private String key;
+ private SearchOperation operation;
+ private Object value;
+ private boolean orPredicate;
+
+ public SpecSearchCriteria() {
+
+ }
+
+ public SpecSearchCriteria(final String key, final SearchOperation operation, final Object value) {
+ super();
+ this.key = key;
+ this.operation = operation;
+ this.value = value;
+ }
+
+ public SpecSearchCriteria(final String orPredicate, final String key, final SearchOperation operation, final Object value) {
+ super();
+ this.orPredicate = orPredicate != null && orPredicate.equals(SearchOperation.OR_PREDICATE_FLAG);
+ this.key = key;
+ this.operation = operation;
+ this.value = value;
+ }
+
+ public SpecSearchCriteria(String key, String operation, String prefix, String value, String suffix) {
+ SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0));
+ if (op != null) {
+ if (op == SearchOperation.EQUALITY) { // the operation may be complex operation
+ final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
+ final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX);
+
+ if (startWithAsterisk && endWithAsterisk) {
+ op = SearchOperation.CONTAINS;
+ } else if (startWithAsterisk) {
+ op = SearchOperation.ENDS_WITH;
+ } else if (endWithAsterisk) {
+ op = SearchOperation.STARTS_WITH;
+ }
+ }
+ }
+ this.key = key;
+ this.operation = op;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(final String key) {
+ this.key = key;
+ }
+
+ public SearchOperation getOperation() {
+ return operation;
+ }
+
+ public void setOperation(final SearchOperation operation) {
+ this.operation = operation;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void setValue(final Object value) {
+ this.value = value;
+ }
+
+ public boolean isOrPredicate() {
+ return orPredicate;
+ }
+
+ public void setOrPredicate(boolean orPredicate) {
+ this.orPredicate = orPredicate;
+ }
+
+}
diff --git a/spring-rest-query-language/src/main/resources/application.properties b/spring-web-modules/spring-rest-query-language/src/main/resources/application.properties
similarity index 100%
rename from spring-rest-query-language/src/main/resources/application.properties
rename to spring-web-modules/spring-rest-query-language/src/main/resources/application.properties
diff --git a/spring-rest-query-language/src/main/resources/data.sql b/spring-web-modules/spring-rest-query-language/src/main/resources/data.sql
similarity index 100%
rename from spring-rest-query-language/src/main/resources/data.sql
rename to spring-web-modules/spring-rest-query-language/src/main/resources/data.sql
diff --git a/spring-rest-query-language/src/main/resources/logback.xml b/spring-web-modules/spring-rest-query-language/src/main/resources/logback.xml
similarity index 100%
rename from spring-rest-query-language/src/main/resources/logback.xml
rename to spring-web-modules/spring-rest-query-language/src/main/resources/logback.xml
diff --git a/spring-rest-query-language/src/main/resources/persistence-h2.properties b/spring-web-modules/spring-rest-query-language/src/main/resources/persistence-h2.properties
similarity index 100%
rename from spring-rest-query-language/src/main/resources/persistence-h2.properties
rename to spring-web-modules/spring-rest-query-language/src/main/resources/persistence-h2.properties
diff --git a/spring-rest-query-language/src/main/resources/persistence-mysql.properties b/spring-web-modules/spring-rest-query-language/src/main/resources/persistence-mysql.properties
similarity index 100%
rename from spring-rest-query-language/src/main/resources/persistence-mysql.properties
rename to spring-web-modules/spring-rest-query-language/src/main/resources/persistence-mysql.properties
diff --git a/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml b/spring-web-modules/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml
similarity index 100%
rename from spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml
rename to spring-web-modules/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml
diff --git a/spring-rest-query-language/src/main/webapp/WEB-INF/api-servlet.xml b/spring-web-modules/spring-rest-query-language/src/main/webapp/WEB-INF/api-servlet.xml
similarity index 100%
rename from spring-rest-query-language/src/main/webapp/WEB-INF/api-servlet.xml
rename to spring-web-modules/spring-rest-query-language/src/main/webapp/WEB-INF/api-servlet.xml
diff --git a/spring-rest-query-language/src/main/webapp/WEB-INF/view/homepage.jsp b/spring-web-modules/spring-rest-query-language/src/main/webapp/WEB-INF/view/homepage.jsp
similarity index 100%
rename from spring-rest-query-language/src/main/webapp/WEB-INF/view/homepage.jsp
rename to spring-web-modules/spring-rest-query-language/src/main/webapp/WEB-INF/view/homepage.jsp
diff --git a/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml b/spring-web-modules/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from spring-rest-query-language/src/main/webapp/WEB-INF/web.xml
rename to spring-web-modules/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
similarity index 100%
rename from spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
similarity index 100%
rename from spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
similarity index 97%
rename from spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
index 707426769e..f6fff10506 100644
--- a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
+++ b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
@@ -1,180 +1,180 @@
-package com.baeldung.persistence.query;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.test.annotation.Rollback;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.baeldung.persistence.dao.GenericSpecificationsBuilder;
-import com.baeldung.persistence.dao.UserRepository;
-import com.baeldung.persistence.dao.UserSpecification;
-import com.baeldung.persistence.dao.UserSpecificationsBuilder;
-import com.baeldung.persistence.model.User;
-import com.baeldung.spring.PersistenceConfig;
-import com.baeldung.web.util.CriteriaParser;
-import com.baeldung.web.util.SearchOperation;
-import com.baeldung.web.util.SpecSearchCriteria;
-
-import java.util.List;
-import java.util.function.Function;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-import static org.hamcrest.collection.IsIn.isIn;
-import static org.hamcrest.core.IsNot.not;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class })
-@Transactional
-@Rollback
-public class JPASpecificationIntegrationTest {
-
- @Autowired
- private UserRepository repository;
-
- private User userJohn;
-
- private User userTom;
-
- private User userPercy;
-
- @Before
- public void init() {
- userJohn = new User();
- userJohn.setFirstName("john");
- userJohn.setLastName("doe");
- userJohn.setEmail("john@doe.com");
- userJohn.setAge(22);
- repository.save(userJohn);
-
- userTom = new User();
- userTom.setFirstName("tom");
- userTom.setLastName("doe");
- userTom.setEmail("tom@doe.com");
- userTom.setAge(26);
- repository.save(userTom);
-
- userPercy = new User();
- userPercy.setFirstName("percy");
- userPercy.setLastName("blackney");
- userPercy.setEmail("percy@blackney.com");
- userPercy.setAge(30);
- repository.save(userPercy);
- }
-
- @Test
- public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john"));
- final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("lastName", SearchOperation.EQUALITY, "doe"));
- final List results = repository.findAll(Specification
- .where(spec)
- .and(spec1));
-
- assertThat(userJohn, isIn(results));
- assertThat(userTom, not(isIn(results)));
- }
-
- @Test
- public void givenFirstOrLastName_whenGettingListOfUsers_thenCorrect() {
- UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
-
- SpecSearchCriteria spec = new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john");
- SpecSearchCriteria spec1 = new SpecSearchCriteria("'","lastName", SearchOperation.EQUALITY, "doe");
-
- List results = repository.findAll(builder
- .with(spec)
- .with(spec1)
- .build());
-
- assertThat(results, hasSize(2));
- assertThat(userJohn, isIn(results));
- assertThat(userTom, isIn(results));
- }
-
- @Test
- public void givenFirstOrLastNameAndAgeGenericBuilder_whenGettingListOfUsers_thenCorrect() {
- GenericSpecificationsBuilder builder = new GenericSpecificationsBuilder<>();
- Function> converter = UserSpecification::new;
-
- CriteriaParser parser=new CriteriaParser();
- List results = repository.findAll(builder.build(parser.parse("( lastName:doe OR firstName:john ) AND age:22"), converter));
-
- assertThat(results, hasSize(1));
- assertThat(userJohn, isIn(results));
- assertThat(userTom, not(isIn(results)));
- }
-
- @Test
- public void givenFirstOrLastNameGenericBuilder_whenGettingListOfUsers_thenCorrect() {
- GenericSpecificationsBuilder builder = new GenericSpecificationsBuilder<>();
- Function> converter = UserSpecification::new;
-
- builder.with("firstName", ":", "john", null, null);
- builder.with("'", "lastName", ":", "doe", null, null);
-
- List results = repository.findAll(builder.build(converter));
-
- assertThat(results, hasSize(2));
- assertThat(userJohn, isIn(results));
- assertThat(userTom, isIn(results));
- }
-
- @Test
- public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.NEGATION, "john"));
- final List results = repository.findAll(Specification.where(spec));
-
- assertThat(userTom, isIn(results));
- assertThat(userJohn, not(isIn(results)));
- }
-
- @Test
- public void givenMinAge_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "25"));
- final List results = repository.findAll(Specification.where(spec));
- assertThat(userTom, isIn(results));
- assertThat(userJohn, not(isIn(results)));
- }
-
- @Test
- public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.STARTS_WITH, "jo"));
- final List results = repository.findAll(spec);
- assertThat(userJohn, isIn(results));
- assertThat(userTom, not(isIn(results)));
- }
-
- @Test
- public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.ENDS_WITH, "n"));
- final List results = repository.findAll(spec);
- assertThat(userJohn, isIn(results));
- assertThat(userTom, not(isIn(results)));
- }
-
- @Test
- public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.CONTAINS, "oh"));
- final List results = repository.findAll(spec);
-
- assertThat(userJohn, isIn(results));
- assertThat(userTom, not(isIn(results)));
- }
-
- @Test
- public void givenAgeRange_whenGettingListOfUsers_thenCorrect() {
- final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "20"));
- final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.LESS_THAN, "25"));
- final List results = repository.findAll(Specification
- .where(spec)
- .and(spec1));
-
- assertThat(userJohn, isIn(results));
- assertThat(userTom, not(isIn(results)));
- }
-}
+package com.baeldung.persistence.query;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baeldung.persistence.dao.GenericSpecificationsBuilder;
+import com.baeldung.persistence.dao.UserRepository;
+import com.baeldung.persistence.dao.UserSpecification;
+import com.baeldung.persistence.dao.UserSpecificationsBuilder;
+import com.baeldung.persistence.model.User;
+import com.baeldung.spring.PersistenceConfig;
+import com.baeldung.web.util.CriteriaParser;
+import com.baeldung.web.util.SearchOperation;
+import com.baeldung.web.util.SpecSearchCriteria;
+
+import java.util.List;
+import java.util.function.Function;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.hamcrest.collection.IsIn.isIn;
+import static org.hamcrest.core.IsNot.not;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceConfig.class })
+@Transactional
+@Rollback
+public class JPASpecificationIntegrationTest {
+
+ @Autowired
+ private UserRepository repository;
+
+ private User userJohn;
+
+ private User userTom;
+
+ private User userPercy;
+
+ @Before
+ public void init() {
+ userJohn = new User();
+ userJohn.setFirstName("john");
+ userJohn.setLastName("doe");
+ userJohn.setEmail("john@doe.com");
+ userJohn.setAge(22);
+ repository.save(userJohn);
+
+ userTom = new User();
+ userTom.setFirstName("tom");
+ userTom.setLastName("doe");
+ userTom.setEmail("tom@doe.com");
+ userTom.setAge(26);
+ repository.save(userTom);
+
+ userPercy = new User();
+ userPercy.setFirstName("percy");
+ userPercy.setLastName("blackney");
+ userPercy.setEmail("percy@blackney.com");
+ userPercy.setAge(30);
+ repository.save(userPercy);
+ }
+
+ @Test
+ public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john"));
+ final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("lastName", SearchOperation.EQUALITY, "doe"));
+ final List results = repository.findAll(Specification
+ .where(spec)
+ .and(spec1));
+
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, not(isIn(results)));
+ }
+
+ @Test
+ public void givenFirstOrLastName_whenGettingListOfUsers_thenCorrect() {
+ UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
+
+ SpecSearchCriteria spec = new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john");
+ SpecSearchCriteria spec1 = new SpecSearchCriteria("'","lastName", SearchOperation.EQUALITY, "doe");
+
+ List results = repository.findAll(builder
+ .with(spec)
+ .with(spec1)
+ .build());
+
+ assertThat(results, hasSize(2));
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, isIn(results));
+ }
+
+ @Test
+ public void givenFirstOrLastNameAndAgeGenericBuilder_whenGettingListOfUsers_thenCorrect() {
+ GenericSpecificationsBuilder builder = new GenericSpecificationsBuilder<>();
+ Function> converter = UserSpecification::new;
+
+ CriteriaParser parser=new CriteriaParser();
+ List results = repository.findAll(builder.build(parser.parse("( lastName:doe OR firstName:john ) AND age:22"), converter));
+
+ assertThat(results, hasSize(1));
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, not(isIn(results)));
+ }
+
+ @Test
+ public void givenFirstOrLastNameGenericBuilder_whenGettingListOfUsers_thenCorrect() {
+ GenericSpecificationsBuilder builder = new GenericSpecificationsBuilder<>();
+ Function> converter = UserSpecification::new;
+
+ builder.with("firstName", ":", "john", null, null);
+ builder.with("'", "lastName", ":", "doe", null, null);
+
+ List results = repository.findAll(builder.build(converter));
+
+ assertThat(results, hasSize(2));
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, isIn(results));
+ }
+
+ @Test
+ public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.NEGATION, "john"));
+ final List results = repository.findAll(Specification.where(spec));
+
+ assertThat(userTom, isIn(results));
+ assertThat(userJohn, not(isIn(results)));
+ }
+
+ @Test
+ public void givenMinAge_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "25"));
+ final List results = repository.findAll(Specification.where(spec));
+ assertThat(userTom, isIn(results));
+ assertThat(userJohn, not(isIn(results)));
+ }
+
+ @Test
+ public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.STARTS_WITH, "jo"));
+ final List results = repository.findAll(spec);
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, not(isIn(results)));
+ }
+
+ @Test
+ public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.ENDS_WITH, "n"));
+ final List results = repository.findAll(spec);
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, not(isIn(results)));
+ }
+
+ @Test
+ public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.CONTAINS, "oh"));
+ final List results = repository.findAll(spec);
+
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, not(isIn(results)));
+ }
+
+ @Test
+ public void givenAgeRange_whenGettingListOfUsers_thenCorrect() {
+ final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "20"));
+ final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.LESS_THAN, "25"));
+ final List results = repository.findAll(Specification
+ .where(spec)
+ .and(spec1));
+
+ assertThat(userJohn, isIn(results));
+ assertThat(userTom, not(isIn(results)));
+ }
+}
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
similarity index 97%
rename from spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
index ad6a4259e7..d1fded3f10 100644
--- a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
+++ b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
@@ -1,147 +1,147 @@
-package com.baeldung.persistence.query;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import io.restassured.RestAssured;
-import io.restassured.response.Response;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.test.context.ActiveProfiles;
-
-import com.baeldung.persistence.model.User;
-
-//@RunWith(SpringJUnit4ClassRunner.class)
-//@ContextConfiguration(classes = { ConfigTest.class,
-// PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
-@ActiveProfiles("test")
-public class JPASpecificationLiveTest {
-
- // @Autowired
- // private UserRepository repository;
-
- private User userJohn;
-
- private User userTom;
-
- private final String URL_PREFIX = "http://localhost:8082/spring-rest-query-language/auth/users/spec?search=";
-
- @Before
- public void init() {
- userJohn = new User();
- userJohn.setFirstName("john");
- userJohn.setLastName("doe");
- userJohn.setEmail("john@doe.com");
- userJohn.setAge(22);
- // repository.save(userJohn);
-
- userTom = new User();
- userTom.setFirstName("tom");
- userTom.setLastName("doe");
- userTom.setEmail("tom@doe.com");
- userTom.setAge(26);
- // repository.save(userTom);
- }
-
- private final String EURL_PREFIX = "http://localhost:8082/spring-rest-query-language/auth/users/espec?search=";
-
- @Test
- public void givenFirstOrLastName_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(EURL_PREFIX + "firstName:john,'lastName:doe");
- final String result = response.body()
- .asString();
- assertTrue(result.contains(userJohn.getEmail()));
- assertTrue(result.contains(userTom.getEmail()));
- }
-
- @Test
- public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "firstName:john,lastName:doe");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userJohn.getEmail()));
- assertFalse(result.contains(userTom.getEmail()));
- }
-
- @Test
- public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "firstName!john");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userTom.getEmail()));
- assertFalse(result.contains(userJohn.getEmail()));
- }
-
- @Test
- public void givenMinAge_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "age>25");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userTom.getEmail()));
- assertFalse(result.contains(userJohn.getEmail()));
- }
-
- @Test
- public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "firstName:jo*");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userJohn.getEmail()));
- assertFalse(result.contains(userTom.getEmail()));
- }
-
- @Test
- public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "firstName:*n");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userJohn.getEmail()));
- assertFalse(result.contains(userTom.getEmail()));
- }
-
- @Test
- public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "firstName:*oh*");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userJohn.getEmail()));
- assertFalse(result.contains(userTom.getEmail()));
- }
-
- @Test
- public void givenAgeRange_whenGettingListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(URL_PREFIX + "age>20,age<25");
- final String result = response.body()
- .asString();
-
- assertTrue(result.contains(userJohn.getEmail()));
- assertFalse(result.contains(userTom.getEmail()));
- }
-
- private final String ADV_URL_PREFIX = "http://localhost:8082/spring-rest-query-language/auth/users/spec/adv?search=";
-
- @Test
- public void givenFirstOrLastName_whenGettingAdvListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(ADV_URL_PREFIX + "firstName:john OR lastName:doe");
- final String result = response.body()
- .asString();
- assertTrue(result.contains(userJohn.getEmail()));
- assertTrue(result.contains(userTom.getEmail()));
- }
-
- @Test
- public void givenFirstOrFirstNameAndAge_whenGettingAdvListOfUsers_thenCorrect() {
- final Response response = RestAssured.get(ADV_URL_PREFIX + "( firstName:john OR firstName:tom ) AND age>22");
- final String result = response.body()
- .asString();
- assertFalse(result.contains(userJohn.getEmail()));
- assertTrue(result.contains(userTom.getEmail()));
- }
-
-}
+package com.baeldung.persistence.query;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import io.restassured.RestAssured;
+import io.restassured.response.Response;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.test.context.ActiveProfiles;
+
+import com.baeldung.persistence.model.User;
+
+//@RunWith(SpringJUnit4ClassRunner.class)
+//@ContextConfiguration(classes = { ConfigTest.class,
+// PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ActiveProfiles("test")
+public class JPASpecificationLiveTest {
+
+ // @Autowired
+ // private UserRepository repository;
+
+ private User userJohn;
+
+ private User userTom;
+
+ private final String URL_PREFIX = "http://localhost:8082/spring-rest-query-language/auth/users/spec?search=";
+
+ @Before
+ public void init() {
+ userJohn = new User();
+ userJohn.setFirstName("john");
+ userJohn.setLastName("doe");
+ userJohn.setEmail("john@doe.com");
+ userJohn.setAge(22);
+ // repository.save(userJohn);
+
+ userTom = new User();
+ userTom.setFirstName("tom");
+ userTom.setLastName("doe");
+ userTom.setEmail("tom@doe.com");
+ userTom.setAge(26);
+ // repository.save(userTom);
+ }
+
+ private final String EURL_PREFIX = "http://localhost:8082/spring-rest-query-language/auth/users/espec?search=";
+
+ @Test
+ public void givenFirstOrLastName_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(EURL_PREFIX + "firstName:john,'lastName:doe");
+ final String result = response.body()
+ .asString();
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertTrue(result.contains(userTom.getEmail()));
+ }
+
+ @Test
+ public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "firstName:john,lastName:doe");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertFalse(result.contains(userTom.getEmail()));
+ }
+
+ @Test
+ public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "firstName!john");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userTom.getEmail()));
+ assertFalse(result.contains(userJohn.getEmail()));
+ }
+
+ @Test
+ public void givenMinAge_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "age>25");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userTom.getEmail()));
+ assertFalse(result.contains(userJohn.getEmail()));
+ }
+
+ @Test
+ public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "firstName:jo*");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertFalse(result.contains(userTom.getEmail()));
+ }
+
+ @Test
+ public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "firstName:*n");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertFalse(result.contains(userTom.getEmail()));
+ }
+
+ @Test
+ public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "firstName:*oh*");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertFalse(result.contains(userTom.getEmail()));
+ }
+
+ @Test
+ public void givenAgeRange_whenGettingListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX + "age>20,age<25");
+ final String result = response.body()
+ .asString();
+
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertFalse(result.contains(userTom.getEmail()));
+ }
+
+ private final String ADV_URL_PREFIX = "http://localhost:8082/spring-rest-query-language/auth/users/spec/adv?search=";
+
+ @Test
+ public void givenFirstOrLastName_whenGettingAdvListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(ADV_URL_PREFIX + "firstName:john OR lastName:doe");
+ final String result = response.body()
+ .asString();
+ assertTrue(result.contains(userJohn.getEmail()));
+ assertTrue(result.contains(userTom.getEmail()));
+ }
+
+ @Test
+ public void givenFirstOrFirstNameAndAge_whenGettingAdvListOfUsers_thenCorrect() {
+ final Response response = RestAssured.get(ADV_URL_PREFIX + "( firstName:john OR firstName:tom ) AND age>22");
+ final String result = response.body()
+ .asString();
+ assertFalse(result.contains(userJohn.getEmail()));
+ assertTrue(result.contains(userTom.getEmail()));
+ }
+
+}
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java
similarity index 100%
rename from spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java
diff --git a/spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java b/spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java
similarity index 100%
rename from spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java
rename to spring-web-modules/spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java
diff --git a/spring-rest-query-language/src/test/resources/.gitignore b/spring-web-modules/spring-rest-query-language/src/test/resources/.gitignore
similarity index 100%
rename from spring-rest-query-language/src/test/resources/.gitignore
rename to spring-web-modules/spring-rest-query-language/src/test/resources/.gitignore