From 99e75746f37cc1b4c622be8433b14035df559f38 Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Sun, 15 Jan 2017 15:34:37 -0600 Subject: [PATCH 001/192] BAEL-203: Updated versions of dependencies --- couchbase-sdk/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/couchbase-sdk/pom.xml b/couchbase-sdk/pom.xml index 301fd81c51..1200fab454 100644 --- a/couchbase-sdk/pom.xml +++ b/couchbase-sdk/pom.xml @@ -102,10 +102,10 @@ 1.8 UTF-8 - 2.3.6 - 4.3.4.RELEASE - 1.1.7 - 1.7.21 + 2.4.0 + 4.3.5.RELEASE + 1.1.8 + 1.7.22 4.12 3.5 3.6.0 From e371bb9093f2b7479ddb9fc7bc4ee28c4b32cb40 Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Mon, 30 Jan 2017 21:48:28 -0600 Subject: [PATCH 002/192] BAEL-203: Querying Couchbase with MapReduce Views --- .../mapreduce/CouchbaseKeyGenerator.java | 6 + .../mapreduce/DuplicateKeyException.java | 10 ++ .../mapreduce/RandomUUIDGenerator.java | 11 ++ .../couchbase/mapreduce/StudentGrade.java | 50 ++++++ .../mapreduce/StudentGradeKeyGenerator.java | 9 + .../mapreduce/StudentGradeQueryBuilder.java | 70 ++++++++ .../mapreduce/StudentGradeService.java | 169 ++++++++++++++++++ .../StudentGradeServiceIntegrationTest.java | 150 ++++++++++++++++ couchbase-sdk/src/test/resources/logback.xml | 17 ++ 9 files changed, 492 insertions(+) create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java create mode 100644 couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java create mode 100644 couchbase-sdk/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java create mode 100644 couchbase-sdk/src/test/resources/logback.xml diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java new file mode 100644 index 0000000000..9ac1bbb3f7 --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java @@ -0,0 +1,6 @@ +package com.baeldung.couchbase.mapreduce; + +public interface CouchbaseKeyGenerator { + + String generateKey(T t); +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java new file mode 100644 index 0000000000..78baaa155c --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java @@ -0,0 +1,10 @@ +package com.baeldung.couchbase.mapreduce; + +@SuppressWarnings("serial") +public class DuplicateKeyException extends Exception { + + public DuplicateKeyException(String s) { + super(s); + } + +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java new file mode 100644 index 0000000000..9baf4a4f43 --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java @@ -0,0 +1,11 @@ +package com.baeldung.couchbase.mapreduce; + +import java.util.UUID; + +public class RandomUUIDGenerator implements CouchbaseKeyGenerator { + + @Override + public String generateKey(T t) { + return UUID.randomUUID().toString(); + } +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java new file mode 100644 index 0000000000..846aba716a --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java @@ -0,0 +1,50 @@ +package com.baeldung.couchbase.mapreduce; + +public class StudentGrade { + + private String name; + private String course; + private Integer grade; + private Integer hours; + + public StudentGrade() { } + + public StudentGrade(String name, String course, Integer grade, Integer hours) { + this.name = name; + this.course = course; + this.grade = grade; + this.hours = hours; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCourse() { + return course; + } + + public void setCourse(String course) { + this.course = course; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public Integer getHours() { + return hours; + } + + public void setHours(Integer hours) { + this.hours = hours; + } +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java new file mode 100644 index 0000000000..680e37ba57 --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java @@ -0,0 +1,9 @@ +package com.baeldung.couchbase.mapreduce; + +public class StudentGradeKeyGenerator implements CouchbaseKeyGenerator { + + @Override + public String generateKey(StudentGrade g) { + return g.getName() + ":" + g.getCourse(); + } +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java new file mode 100644 index 0000000000..37bb03645a --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java @@ -0,0 +1,70 @@ +package com.baeldung.couchbase.mapreduce; + +import com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper; +import com.couchbase.client.java.document.json.JsonArray; +import com.couchbase.client.java.view.ViewQuery; + +public class StudentGradeQueryBuilder { + + final ObjectMapper om = new ObjectMapper(); + + public ViewQuery findAll() { + return ViewQuery.from("studentGrades", "findByCourse"); + } + + public ViewQuery findByCourse(String course) { + return ViewQuery.from("studentGrades", "findByCourse") + .key(course); + } + + public ViewQuery findByCourses(String... courses) { + return ViewQuery.from("studentGrades", "findByCourse") + .keys(JsonArray.from(courses)); + } + + public ViewQuery findByGradeInRange(int lower, int upper, boolean inclusiveEnd) { + return ViewQuery.from("studentGrades", "findByGrade") + .startKey(lower) + .endKey(upper) + .inclusiveEnd(inclusiveEnd); + } + + public ViewQuery findByGradeLessThan(int upper) { + return ViewQuery.from("studentGrades", "findByGrade") + .endKey(upper) + .inclusiveEnd(false); + } + + public ViewQuery findByGradeGreaterThan(int lower) { + return ViewQuery.from("studentGrades", "findByGrade") + .startKey(lower); + } + + public ViewQuery findByCourseAndGradeInRange(String course, int minGrade, int maxGrade, boolean inclusiveEnd) { + return ViewQuery.from("studentGrades", "findByCourseAndGrade") + .startKey(JsonArray.from(course, minGrade)) + .endKey(JsonArray.from(course, maxGrade)) + .inclusiveEnd(inclusiveEnd); + } + + public ViewQuery findTopGradesByCourse(String course, int limit) { + return ViewQuery.from("studentGrades", "findByCourseAndGrade") + .startKey(JsonArray.from(course, 100)) + .endKey(JsonArray.from(course, 0)) + .inclusiveEnd(true) + .descending() + .limit(limit); + } + + public ViewQuery countStudentsByCourse() { + return ViewQuery.from("studentGrades", "countStudentsByCourse") + .reduce() + .groupLevel(1); + } + + public ViewQuery sumCreditsByStudent() { + return ViewQuery.from("studentGrades", "sumCreditsByStudent") + .reduce() + .groupLevel(1); + } +} diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java new file mode 100644 index 0000000000..2d2c63f699 --- /dev/null +++ b/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java @@ -0,0 +1,169 @@ +package com.baeldung.couchbase.mapreduce; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper; +import com.couchbase.client.java.Bucket; +import com.couchbase.client.java.CouchbaseCluster; +import com.couchbase.client.java.document.JsonDocument; +import com.couchbase.client.java.document.json.JsonArray; +import com.couchbase.client.java.document.json.JsonObject; +import com.couchbase.client.java.view.ViewQuery; +import com.couchbase.client.java.view.ViewResult; +import com.couchbase.client.java.view.ViewRow; + +public class StudentGradeService { + + final CouchbaseKeyGenerator keyGenerator; + final CouchbaseCluster cluster; + final Bucket bucket; + final ObjectMapper om = new ObjectMapper(); + final StudentGradeQueryBuilder queryBuilder; + + public StudentGradeService(CouchbaseKeyGenerator keyGenerator) { + this.keyGenerator = keyGenerator; + this.queryBuilder = new StudentGradeQueryBuilder(); + cluster = CouchbaseCluster.create("127.0.0.1"); + bucket = cluster.openBucket("baeldung-tutorial"); + } + + public String insert(StudentGrade studentGrade) throws DuplicateKeyException { + String id = keyGenerator.generateKey(studentGrade); + if(bucket.exists(id)) { + throw new DuplicateKeyException("document already exists with key " + id); + } + JsonObject content = JsonObject.empty() + .put("type", "StudentGrade") + .put("name", studentGrade.getName()) + .put("course", studentGrade.getCourse()) + .put("grade", studentGrade.getGrade()) + .put("hours", studentGrade.getHours()); + JsonDocument doc = JsonDocument.create(id, content); + bucket.insert(doc); + return id; + } + + public List findAll() { + ViewQuery query = queryBuilder.findAll(); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + private List extractDocuments(ViewResult result) { + List docs = new ArrayList<>(); + for(ViewRow row : result.allRows()) { + JsonDocument doc = row.document(); + docs.add(doc); + } + return docs; + } + + public List findByCourse(String course) { + ViewQuery query = queryBuilder.findByCourse(course); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public List findByCourses(String... courses) { + ViewQuery query = queryBuilder.findByCourses(courses); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public List findByGradeInRange(int lower, int upper, boolean inclusiveEnd) { + ViewQuery query = queryBuilder.findByGradeInRange(lower, upper, inclusiveEnd); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public List findByGradeLessThan(int upper) { + ViewQuery query = queryBuilder.findByGradeLessThan(upper); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public List findByGradeGreaterThan(int lower) { + ViewQuery query = queryBuilder.findByGradeGreaterThan(lower); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public List findByCourseAndGradeInRange(String course, int minGrade, int maxGrade, boolean inclusiveEnd) { + ViewQuery query = queryBuilder.findByCourseAndGradeInRange(course, minGrade, maxGrade, inclusiveEnd); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public List findTopGradesByCourse(String course, int limit) { + ViewQuery query = queryBuilder.findTopGradesByCourse(course, limit); + ViewResult result = bucket.query(query); + return extractDocuments(result); + } + + public Map countStudentsByCourse() { + ViewQuery query = ViewQuery.from("studentGrades", "countStudentsByCourse") + .reduce() + .groupLevel(1); + ViewResult result = bucket.query(query); + + Map numStudentsByCourse = new HashMap<>(); + for(ViewRow row : result.allRows()) { + JsonArray keyArray = (JsonArray) row.key(); + String course = keyArray.getString(0); + long count = Long.valueOf(row.value().toString()); + numStudentsByCourse.put(course, count); + } + + return numStudentsByCourse; + } + + public Map sumCreditHoursByStudent() { + ViewQuery query = ViewQuery.from("studentGrades", "sumHoursByStudent") + .reduce() + .groupLevel(1); + ViewResult result = bucket.query(query); + + Map creditHoursByStudent = new HashMap<>(); + for(ViewRow row : result.allRows()) { + String course = (String) row.key(); + long sum = Long.valueOf(row.value().toString()); + creditHoursByStudent.put(course, sum); + } + + return creditHoursByStudent; + } + + public Map sumGradePointsByStudent() { + ViewQuery query = ViewQuery.from("studentGrades", "sumGradePointsByStudent") + .reduce() + .groupLevel(1); + ViewResult result = bucket.query(query); + + Map gradePointsByStudent = new HashMap<>(); + for(ViewRow row : result.allRows()) { + String course = (String) row.key(); + long sum = Long.valueOf(row.value().toString()); + gradePointsByStudent.put(course, sum); + } + + return gradePointsByStudent; + } + + public Map calculateGpaByStudent() { + Map creditHoursByStudent = sumCreditHoursByStudent(); + Map gradePointsByStudent = sumGradePointsByStudent(); + + Map result = new HashMap<>(); + for(Entry creditHoursEntry : creditHoursByStudent.entrySet()) { + String name = creditHoursEntry.getKey(); + long totalHours = creditHoursEntry.getValue(); + long totalGradePoints = gradePointsByStudent.get(name); + result.put(name, ((float) totalGradePoints / totalHours)); + } + return result; + } +} diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java b/couchbase-sdk/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java new file mode 100644 index 0000000000..00d462e32a --- /dev/null +++ b/couchbase-sdk/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java @@ -0,0 +1,150 @@ +package com.baeldung.couchbase.mapreduce; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.couchbase.client.java.document.JsonDocument; +import com.couchbase.client.java.view.ViewResult; +import com.couchbase.client.java.view.ViewRow; + +public class StudentGradeServiceIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(StudentGradeServiceIntegrationTest.class); + + static StudentGradeService studentGradeService; + static Set gradeIds = new HashSet<>(); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + studentGradeService = new StudentGradeService(new StudentGradeKeyGenerator()); + insertStudentGrade(new StudentGrade("John Doe", "History", 80, 3)); + insertStudentGrade(new StudentGrade("Jane Doe", "History", 89, 3)); + insertStudentGrade(new StudentGrade("Bob Smith", "History", 90, 3)); + insertStudentGrade(new StudentGrade("Mary Jones", "History", 92, 3)); + insertStudentGrade(new StudentGrade("Jane Doe", "Math", 59, 3)); + insertStudentGrade(new StudentGrade("Bob Smith", "Math", 91, 3)); + insertStudentGrade(new StudentGrade("Mary Jones", "Math", 86, 3)); + insertStudentGrade(new StudentGrade("John Doe", "Science", 85, 4)); + insertStudentGrade(new StudentGrade("Bob Smith", "Science", 97, 4)); + insertStudentGrade(new StudentGrade("Mary Jones", "Science", 84, 4)); + } + + private static void insertStudentGrade(StudentGrade studentGrade) { + try { + String id = studentGradeService.insert(studentGrade); + gradeIds.add(id); + } catch (DuplicateKeyException e) { + } + } + + @Test + public final void whenFindAll_thenSuccess() { + List docs = studentGradeService.findAll(); + printDocuments(docs); + } + + @Test + public final void whenFindByCourse_thenSuccess() { + List docs = studentGradeService.findByCourse("History"); + printDocuments(docs); + } + + @Test + public final void whenFindByCourses_thenSuccess() { + List docs = studentGradeService.findByCourses("History", "Science"); + printDocuments(docs); + } + + @Test + public final void whenFindByGradeInRange_thenSuccess() { + List docs = studentGradeService.findByGradeInRange(80, 89, true); + printDocuments(docs); + } + + @Test + public final void whenFindByGradeLessThan_thenSuccess() { + List docs = studentGradeService.findByGradeLessThan(60); + printDocuments(docs); + } + + @Test + public final void whenFindByGradeGreaterThan_thenSuccess() { + List docs = studentGradeService.findByGradeGreaterThan(90); + printDocuments(docs); + } + + @Test + public final void whenFindByCourseAndGradeInRange_thenSuccess() { + List docs = studentGradeService.findByCourseAndGradeInRange("Math", 80, 89, true); + printDocuments(docs); + } + + @Test + public final void whenFindTopGradesByCourse_thenSuccess() { + List docs = studentGradeService.findTopGradesByCourse("Science", 2); + printDocuments(docs); + } + + @Test + public final void whenCountStudentsByCourse_thenSuccess() { + Map map = studentGradeService.countStudentsByCourse(); + printMap(map); + } + + @Test + public final void whenSumCreditHoursByStudent_thenSuccess() { + Map map = studentGradeService.sumCreditHoursByStudent(); + printMap(map); + } + + @Test + public final void whenSumGradePointsByStudent_thenSuccess() { + Map map = studentGradeService.sumGradePointsByStudent(); + printMap(map); + } + + @Test + public final void whenCalculateGpaByStudent_thenSuccess() { + Map map = studentGradeService.calculateGpaByStudent(); + printGpaMap(map); + } + + private void printMap(Map map) { + for(Map.Entry entry : map.entrySet()) { + logger.info(entry.getKey() + "=" + entry.getValue()); + } + } + + private void printGpaMap(Map map) { + for(Map.Entry entry : map.entrySet()) { + logger.info(entry.getKey() + "=" + entry.getValue()); + } + } + + private void printDocuments(List docs) { + for(JsonDocument doc : docs) { + String key = doc.id(); + logger.info(key + " = " + doc.content().toString()); + } + } + + private void printViewResultDocuments(ViewResult result) { + for(ViewRow row : result.allRows()) { + JsonDocument doc = row.document(); + String key = doc.id(); + logger.info(key + "=" + doc.content().toString()); + } + } + + private void printViewResultRows(ViewResult result) { + for(ViewRow row : result.allRows()) { + logger.info(row.toString()); + } + } +} diff --git a/couchbase-sdk/src/test/resources/logback.xml b/couchbase-sdk/src/test/resources/logback.xml new file mode 100644 index 0000000000..efcc6fb4c7 --- /dev/null +++ b/couchbase-sdk/src/test/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + \ No newline at end of file From 626360dedd1b36c5511e68b940340d631d1e15dc Mon Sep 17 00:00:00 2001 From: tschiman Date: Mon, 30 Jan 2017 23:07:09 -0700 Subject: [PATCH 003/192] BAEL-649 Making updates to add two service applications that are domain specific --- ...rce.properties => book-service.properties} | 2 +- .../application-config/gateway.properties | 10 ++- .../rating-service.properties | 17 ++++ .../bootstrap/gateway/SecurityConfig.java | 4 +- spring-cloud/spring-cloud-bootstrap/pom.xml | 3 +- .../resource/ResourceApplication.java | 41 --------- .../{resource => svc-book}/pom.xml | 3 +- .../spring/cloud/bootstrap/svcbook/Book.java | 40 +++++++++ .../svcbook/BookServiceApplication.java | 37 ++++++++ .../bootstrap/svcbook}/SecurityConfig.java | 7 +- .../bootstrap/svcbook}/SessionConfig.java | 2 +- .../src/main/resources/bootstrap.properties | 2 +- .../spring-cloud-bootstrap/svc-rating/pom.xml | 85 +++++++++++++++++++ .../cloud/bootstrap/svcrating/Rating.java | 40 +++++++++ .../svcrating/RatingServiceApplication.java | 41 +++++++++ .../bootstrap/svcrating/SecurityConfig.java | 32 +++++++ .../bootstrap/svcrating/SessionConfig.java | 10 +++ .../src/main/resources/bootstrap.properties | 7 ++ 18 files changed, 328 insertions(+), 55 deletions(-) rename spring-cloud/spring-cloud-bootstrap/application-config/{resource.properties => book-service.properties} (91%) create mode 100644 spring-cloud/spring-cloud-bootstrap/application-config/rating-service.properties delete mode 100644 spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/ResourceApplication.java rename spring-cloud/spring-cloud-bootstrap/{resource => svc-book}/pom.xml (96%) create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java rename spring-cloud/spring-cloud-bootstrap/{resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource => svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook}/SecurityConfig.java (83%) rename spring-cloud/spring-cloud-bootstrap/{resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource => svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook}/SessionConfig.java (87%) rename spring-cloud/spring-cloud-bootstrap/{resource => svc-book}/src/main/resources/bootstrap.properties (87%) create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties diff --git a/spring-cloud/spring-cloud-bootstrap/application-config/resource.properties b/spring-cloud/spring-cloud-bootstrap/application-config/book-service.properties similarity index 91% rename from spring-cloud/spring-cloud-bootstrap/application-config/resource.properties rename to spring-cloud/spring-cloud-bootstrap/application-config/book-service.properties index 9fb610d655..e1244a0cf0 100644 --- a/spring-cloud/spring-cloud-bootstrap/application-config/resource.properties +++ b/spring-cloud/spring-cloud-bootstrap/application-config/book-service.properties @@ -1,4 +1,4 @@ -spring.application.name=resource +spring.application.name=book-service server.port=8083 resource.returnString=hello cloud diff --git a/spring-cloud/spring-cloud-bootstrap/application-config/gateway.properties b/spring-cloud/spring-cloud-bootstrap/application-config/gateway.properties index 6f52a59db9..09f7f3bf4a 100644 --- a/spring-cloud/spring-cloud-bootstrap/application-config/gateway.properties +++ b/spring-cloud/spring-cloud-bootstrap/application-config/gateway.properties @@ -6,9 +6,13 @@ eureka.client.registryFetchIntervalSeconds = 5 management.security.sessions=always -zuul.routes.resource.path=/resource/** -zuul.routes.resource.sensitive-headers=Set-Cookie,Authorization -hystrix.command.resource.execution.isolation.thread.timeoutInMilliseconds=600000 +zuul.routes.book-service.path=/book-service/** +zuul.routes.book-service.sensitive-headers=Set-Cookie,Authorization +hystrix.command.book-service.execution.isolation.thread.timeoutInMilliseconds=600000 + +zuul.routes.rating-service.path=/rating-service/** +zuul.routes.rating-service.sensitive-headers=Set-Cookie,Authorization +hystrix.command.rating-service.execution.isolation.thread.timeoutInMilliseconds=600000 zuul.routes.discovery.path=/discovery/** zuul.routes.discovery.sensitive-headers=Set-Cookie,Authorization diff --git a/spring-cloud/spring-cloud-bootstrap/application-config/rating-service.properties b/spring-cloud/spring-cloud-bootstrap/application-config/rating-service.properties new file mode 100644 index 0000000000..4817d12c83 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/application-config/rating-service.properties @@ -0,0 +1,17 @@ +spring.application.name=rating-service +server.port=8084 + +resource.returnString=hello cloud +resource.user.returnString=hello cloud user +resource.admin.returnString=hello cloud admin + +eureka.client.region = default +eureka.client.registryFetchIntervalSeconds = 5 + +management.security.sessions=never + +logging.level.org.springframework.web.=debug +logging.level.org.springframework.security=debug + +spring.redis.host=localhost +spring.redis.port=6379 diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java index 60dccf9042..9e5c424403 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java @@ -22,14 +22,14 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/resource/hello/cloud").permitAll() + .antMatchers("/book-service/books").permitAll() .antMatchers("/eureka/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .and() .logout().permitAll() - .logoutSuccessUrl("/resource/hello/cloud").permitAll() + .logoutSuccessUrl("/book-service/books").permitAll() .and() .csrf() .disable(); diff --git a/spring-cloud/spring-cloud-bootstrap/pom.xml b/spring-cloud/spring-cloud-bootstrap/pom.xml index 9a1b2e6d0e..ccfbdb9735 100644 --- a/spring-cloud/spring-cloud-bootstrap/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/pom.xml @@ -14,7 +14,8 @@ config discovery gateway - resource + svc-book + svc-rating diff --git a/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/ResourceApplication.java b/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/ResourceApplication.java deleted file mode 100644 index accef18a14..0000000000 --- a/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/ResourceApplication.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.spring.cloud.bootstrap.resource; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@EnableEurekaClient -@RestController -public class ResourceApplication { - public static void main(String[] args) { - SpringApplication.run(ResourceApplication.class, args); - } - - @Value("${resource.returnString}") - private String returnString; - - @Value("${resource.user.returnString}") - private String userReturnString; - - @Value("${resource.admin.returnString}") - private String adminReturnString; - - @RequestMapping("/hello/cloud") - public String getString() { - return returnString; - } - - @RequestMapping("/hello/user") - public String getUserString() { - return userReturnString; - } - - @RequestMapping("/hello/admin") - public String getAdminString() { - return adminReturnString; - } -} diff --git a/spring-cloud/spring-cloud-bootstrap/resource/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml similarity index 96% rename from spring-cloud/spring-cloud-bootstrap/resource/pom.xml rename to spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml index 1472693de8..ac7cd30dbf 100644 --- a/spring-cloud/spring-cloud-bootstrap/resource/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml @@ -4,7 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - resource + com.baeldung.spring.cloud + svc-book 1.0.0-SNAPSHOT diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java new file mode 100644 index 0000000000..e652437454 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.cloud.bootstrap.svcbook; + +public class Book { + private Long id; + private String author; + private String title; + + public Book(Long id, String title, String author) { + this.id = id; + this.author = author; + this.title = title; + } + + public Book() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java new file mode 100644 index 0000000000..25ad2a83b2 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.cloud.bootstrap.svcbook; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; + +@SpringBootApplication +@EnableEurekaClient +@RestController +@RequestMapping("/books") +public class BookServiceApplication { + public static void main(String[] args) { + SpringApplication.run(BookServiceApplication.class, args); + } + + private List bookList = Arrays.asList( + new Book(1L, "Baeldung goes to the market", "Tim Schimandle"), + new Book(2L, "Baeldung goes to the park", "Slavisa") + ); + + @GetMapping("") + public List findAllBooks() { + return bookList; + } + + @GetMapping("/{bookId}") + public Book findBook(@PathVariable Long bookId) { + return bookList.stream().filter(b -> b.getId().equals(bookId)).findFirst().orElse(null); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java similarity index 83% rename from spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/SecurityConfig.java rename to spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java index 0b0de6ec20..300b4d7c5a 100644 --- a/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/SecurityConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.cloud.bootstrap.resource; +package com.baeldung.spring.cloud.bootstrap.svcbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -22,9 +22,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { http.httpBasic() .disable() .authorizeRequests() - .antMatchers("/hello/cloud").permitAll() - .antMatchers("/hello/user").hasAnyRole("USER", "ADMIN") - .antMatchers("/hello/admin").hasRole("ADMIN") + .antMatchers("/books").permitAll() + .antMatchers("/books/*").hasAnyRole("USER", "ADMIN") .anyRequest().authenticated() .and() .csrf() diff --git a/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/SessionConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java similarity index 87% rename from spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/SessionConfig.java rename to spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java index f11f316826..dbde068069 100644 --- a/spring-cloud/spring-cloud-bootstrap/resource/src/main/java/com/baeldung/spring/cloud/bootstrap/resource/SessionConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.cloud.bootstrap.resource; +package com.baeldung.spring.cloud.bootstrap.svcbook; import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; diff --git a/spring-cloud/spring-cloud-bootstrap/resource/src/main/resources/bootstrap.properties b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties similarity index 87% rename from spring-cloud/spring-cloud-bootstrap/resource/src/main/resources/bootstrap.properties rename to spring-cloud/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties index 9ecfb46125..8f3a3261ac 100644 --- a/spring-cloud/spring-cloud-bootstrap/resource/src/main/resources/bootstrap.properties +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties @@ -1,4 +1,4 @@ -spring.cloud.config.name=resource +spring.cloud.config.name=book-service spring.cloud.config.discovery.service-id=config spring.cloud.config.discovery.enabled=true spring.cloud.config.username=configUser diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml new file mode 100644 index 0000000000..36a29708a6 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + svc-rating + 1.0.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + + + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-eureka + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.session + spring-session + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + Brixton.SR7 + 3.6.0 + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java new file mode 100644 index 0000000000..5dd3572098 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating; + +public class Rating { + private Long id; + private Long bookId; + private int stars; + + public Rating() { + } + + public Rating(Long id, Long bookId, int stars) { + this.id = id; + this.bookId = bookId; + this.stars = stars; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getBookId() { + return bookId; + } + + public void setBookId(Long bookId) { + this.bookId = bookId; + } + + public int getStars() { + return stars; + } + + public void setStars(int stars) { + this.stars = stars; + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java new file mode 100644 index 0000000000..11fb5f06b6 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java @@ -0,0 +1,41 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +@SpringBootApplication +@EnableEurekaClient +@RestController +@RequestMapping("/ratings") +public class RatingServiceApplication { + public static void main(String[] args) { + SpringApplication.run(RatingServiceApplication.class, args); + } + + private List ratingList = Arrays.asList( + new Rating(1L, 1L, 2), + new Rating(2L, 1L, 3), + new Rating(3L, 2L, 4), + new Rating(4L, 2L, 5) + ); + + @GetMapping("") + public List findRatingsByBookId(@RequestParam Long bookId) { + return bookId == null || bookId.equals(0L) ? Collections.EMPTY_LIST : ratingList.stream().filter(r -> r.getBookId().equals(bookId)).collect(Collectors.toList()); + } + + @GetMapping("/all") + public List findAllRatings() { + return ratingList; + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java new file mode 100644 index 0000000000..66b714634c --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@EnableWebSecurity +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + public void configureGlobal1(AuthenticationManagerBuilder auth) throws Exception { + //try in memory auth with no users to support the case that this will allow for users that are logged in to go anywhere + auth.inMemoryAuthentication(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.httpBasic() + .disable() + .authorizeRequests() + .antMatchers("/ratings").hasRole("USER") + .antMatchers("/ratings/all").hasAnyRole("USER", "ADMIN") + .anyRequest().authenticated() + .and() + .csrf() + .disable(); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java new file mode 100644 index 0000000000..62bc701868 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating; + +import org.springframework.context.annotation.Configuration; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; + +@Configuration +@EnableRedisHttpSession +public class SessionConfig extends AbstractHttpSessionApplicationInitializer { +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties new file mode 100644 index 0000000000..be5cf7f1e1 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties @@ -0,0 +1,7 @@ +spring.cloud.config.name=rating-service +spring.cloud.config.discovery.service-id=config +spring.cloud.config.discovery.enabled=true +spring.cloud.config.username=configUser +spring.cloud.config.password=configPassword + +eureka.client.serviceUrl.defaultZone=http://discUser:discPassword@localhost:8082/eureka/ From fb950e2dfa5883941620d8e9eaec6a484f2983a7 Mon Sep 17 00:00:00 2001 From: tschiman Date: Thu, 2 Feb 2017 21:18:06 -0700 Subject: [PATCH 004/192] BAEL-649 changing test content and some security changes to make all the tests work. --- .../gateway/GatewayApplicationLiveTest.java | 16 ++++++++-------- .../bootstrap/svcrating/SecurityConfig.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java index cea431d461..aa39232bb2 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java @@ -14,12 +14,12 @@ public class GatewayApplicationLiveTest { TestRestTemplate testRestTemplate = new TestRestTemplate(); String testUrl = "http://localhost:8080"; - ResponseEntity response = testRestTemplate.getForEntity(testUrl + "/resource/hello/cloud", String.class); + ResponseEntity response = testRestTemplate.getForEntity(testUrl + "/book-service/books", String.class); Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - Assert.assertEquals("hello cloud", response.getBody()); + Assert.assertNotNull(response.getBody()); //try the protected resource and confirm the redirect to login - response = testRestTemplate.getForEntity(testUrl + "/resource/hello/user", String.class); + response = testRestTemplate.getForEntity(testUrl + "/book-service/books/1", String.class); Assert.assertEquals(HttpStatus.FOUND, response.getStatusCode()); Assert.assertEquals("http://localhost:8080/login", response.getHeaders().get("Location").get(0)); @@ -36,12 +36,12 @@ public class GatewayApplicationLiveTest { HttpEntity httpEntity = new HttpEntity<>(headers); //request the protected resource - response = testRestTemplate.exchange(testUrl + "/resource/hello/user", HttpMethod.GET, httpEntity, String.class); + response = testRestTemplate.exchange(testUrl + "/book-service/books/1", HttpMethod.GET, httpEntity, String.class); Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - Assert.assertEquals("hello cloud user", response.getBody()); + Assert.assertNotNull(response.getBody()); //request the admin protected resource to determine it is still protected - response = testRestTemplate.exchange(testUrl + "/resource/hello/admin", HttpMethod.GET, httpEntity, String.class); + response = testRestTemplate.exchange(testUrl + "/rating-service/ratings/all", HttpMethod.GET, httpEntity, String.class); Assert.assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); //login as the admin @@ -57,9 +57,9 @@ public class GatewayApplicationLiveTest { httpEntity = new HttpEntity<>(headers); //request the protected resource - response = testRestTemplate.exchange(testUrl + "/resource/hello/admin", HttpMethod.GET, httpEntity, String.class); + response = testRestTemplate.exchange(testUrl + "/rating-service/ratings/all", HttpMethod.GET, httpEntity, String.class); Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - Assert.assertEquals("hello cloud admin", response.getBody()); + Assert.assertNotNull(response.getBody()); //request the discovery resources as the admin response = testRestTemplate.exchange(testUrl + "/discovery", HttpMethod.GET, httpEntity, String.class); diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java index 66b714634c..371dc810d5 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java @@ -23,7 +23,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .disable() .authorizeRequests() .antMatchers("/ratings").hasRole("USER") - .antMatchers("/ratings/all").hasAnyRole("USER", "ADMIN") + .antMatchers("/ratings/all").hasRole("ADMIN") .anyRequest().authenticated() .and() .csrf() From 4d5624161f46863203cad5486a15fe20d80f3d7c Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sat, 4 Feb 2017 06:15:54 +0100 Subject: [PATCH 005/192] Refactor Spring with Lombok samples --- .../lombok/{Apologizer.java => ApologizeService.java} | 4 ++-- .../lombok/{Fareweller.java => FarewellService.java} | 4 ++-- .../lombok/{Greeter.java => GreetingService.java} | 2 +- .../lombok/{Thanker.java => ThankingService.java} | 3 +-- ...ngTest.java => ApologizeServiceAutowiringTest.java} | 6 +++--- .../{ApologizerTest.java => ApologizeServiceTest.java} | 6 +++--- .../com/baeldung/lombok/FarewellAutowiringTest.java | 4 ++-- .../{FarewellerTest.java => FarewellServiceTest.java} | 6 +++--- .../{GreeterTest.java => GreetingServiceTest.java} | 10 +++++----- ...ingTest.java => ThankingServiceAutowiringTest.java} | 6 +++--- .../{ThankerTest.java => ThankingServiceTest.java} | 6 +++--- 11 files changed, 28 insertions(+), 29 deletions(-) rename spring-core/src/main/java/com/baeldung/lombok/{Apologizer.java => ApologizeService.java} (83%) rename spring-core/src/main/java/com/baeldung/lombok/{Fareweller.java => FarewellService.java} (79%) rename spring-core/src/main/java/com/baeldung/lombok/{Greeter.java => GreetingService.java} (90%) rename spring-core/src/main/java/com/baeldung/lombok/{Thanker.java => ThankingService.java} (76%) rename spring-core/src/test/java/com/baeldung/lombok/{ApologizerAutowiringTest.java => ApologizeServiceAutowiringTest.java} (84%) rename spring-core/src/test/java/com/baeldung/lombok/{ApologizerTest.java => ApologizeServiceTest.java} (72%) rename spring-core/src/test/java/com/baeldung/lombok/{FarewellerTest.java => FarewellServiceTest.java} (70%) rename spring-core/src/test/java/com/baeldung/lombok/{GreeterTest.java => GreetingServiceTest.java} (79%) rename spring-core/src/test/java/com/baeldung/lombok/{ThankerAutowiringTest.java => ThankingServiceAutowiringTest.java} (84%) rename spring-core/src/test/java/com/baeldung/lombok/{ThankerTest.java => ThankingServiceTest.java} (71%) diff --git a/spring-core/src/main/java/com/baeldung/lombok/Apologizer.java b/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java similarity index 83% rename from spring-core/src/main/java/com/baeldung/lombok/Apologizer.java rename to spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java index ddce9cdc52..25ef65cad2 100644 --- a/spring-core/src/main/java/com/baeldung/lombok/Apologizer.java +++ b/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java @@ -6,13 +6,13 @@ import org.springframework.stereotype.Component; @Component @AllArgsConstructor -public class Apologizer { +public class ApologizeService { private final Translator translator; private final String message; @Autowired - public Apologizer(Translator translator) { + public ApologizeService(Translator translator) { this(translator, "sorry"); } diff --git a/spring-core/src/main/java/com/baeldung/lombok/Fareweller.java b/spring-core/src/main/java/com/baeldung/lombok/FarewellService.java similarity index 79% rename from spring-core/src/main/java/com/baeldung/lombok/Fareweller.java rename to spring-core/src/main/java/com/baeldung/lombok/FarewellService.java index b10ebb72b9..4e8c4993cb 100644 --- a/spring-core/src/main/java/com/baeldung/lombok/Fareweller.java +++ b/spring-core/src/main/java/com/baeldung/lombok/FarewellService.java @@ -4,11 +4,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class Fareweller { +public class FarewellService { private final Translator translator; - public Fareweller(Translator translator) { + public FarewellService(Translator translator) { this.translator = translator; } diff --git a/spring-core/src/main/java/com/baeldung/lombok/Greeter.java b/spring-core/src/main/java/com/baeldung/lombok/GreetingService.java similarity index 90% rename from spring-core/src/main/java/com/baeldung/lombok/Greeter.java rename to spring-core/src/main/java/com/baeldung/lombok/GreetingService.java index ddbc024ce7..0e03e177e1 100644 --- a/spring-core/src/main/java/com/baeldung/lombok/Greeter.java +++ b/spring-core/src/main/java/com/baeldung/lombok/GreetingService.java @@ -4,7 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class Greeter { +public class GreetingService { @Autowired private Translator translator; diff --git a/spring-core/src/main/java/com/baeldung/lombok/Thanker.java b/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java similarity index 76% rename from spring-core/src/main/java/com/baeldung/lombok/Thanker.java rename to spring-core/src/main/java/com/baeldung/lombok/ThankingService.java index 784100c258..f3bdf8bb7f 100644 --- a/spring-core/src/main/java/com/baeldung/lombok/Thanker.java +++ b/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java @@ -1,12 +1,11 @@ package com.baeldung.lombok; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component @AllArgsConstructor -public class Thanker { +public class ThankingService { private final Translator translator; diff --git a/spring-core/src/test/java/com/baeldung/lombok/ApologizerAutowiringTest.java b/spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringTest.java similarity index 84% rename from spring-core/src/test/java/com/baeldung/lombok/ApologizerAutowiringTest.java rename to spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringTest.java index 3e7c775f91..755fc5868b 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/ApologizerAutowiringTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringTest.java @@ -14,12 +14,12 @@ import static org.mockito.Mockito.when; @ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = TestConfig.class) -public class ApologizerAutowiringTest { +public class ApologizeServiceAutowiringTest { private final static String TRANSLATED = "TRANSLATED"; @Autowired - private Apologizer apologizer; + private ApologizeService apologizeService; @Autowired private Translator translator; @@ -27,7 +27,7 @@ public class ApologizerAutowiringTest { @Test public void apologizeWithTranslatedMessage() { when(translator.translate("sorry")).thenReturn(TRANSLATED); - assertEquals(TRANSLATED, apologizer.apologize()); + assertEquals(TRANSLATED, apologizeService.apologize()); } } \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/lombok/ApologizerTest.java b/spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceTest.java similarity index 72% rename from spring-core/src/test/java/com/baeldung/lombok/ApologizerTest.java rename to spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceTest.java index 28bd08c89f..ab545e7adf 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/ApologizerTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceTest.java @@ -6,7 +6,7 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ApologizerTest { +public class ApologizeServiceTest { private final static String MESSAGE = "MESSAGE"; private final static String TRANSLATED = "TRANSLATED"; @@ -14,8 +14,8 @@ public class ApologizerTest { @Test public void apologizeWithCustomTranslatedMessage() { Translator translator = mock(Translator.class); - Apologizer apologizer = new Apologizer(translator, MESSAGE); + ApologizeService apologizeService = new ApologizeService(translator, MESSAGE); when(translator.translate(MESSAGE)).thenReturn(TRANSLATED); - assertEquals(TRANSLATED, apologizer.apologize()); + assertEquals(TRANSLATED, apologizeService.apologize()); } } diff --git a/spring-core/src/test/java/com/baeldung/lombok/FarewellAutowiringTest.java b/spring-core/src/test/java/com/baeldung/lombok/FarewellAutowiringTest.java index d55d44fb3e..592e309236 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/FarewellAutowiringTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/FarewellAutowiringTest.java @@ -17,7 +17,7 @@ import static org.mockito.Mockito.when; public class FarewellAutowiringTest { @Autowired - private Fareweller fareweller; + private FarewellService farewellService; @Autowired private Translator translator; @@ -26,6 +26,6 @@ public class FarewellAutowiringTest { public void sayByeWithTranslatedMessage() { String translated = "translated"; when(translator.translate("bye")).thenReturn(translated); - assertEquals(translated, fareweller.farewell()); + assertEquals(translated, farewellService.farewell()); } } diff --git a/spring-core/src/test/java/com/baeldung/lombok/FarewellerTest.java b/spring-core/src/test/java/com/baeldung/lombok/FarewellServiceTest.java similarity index 70% rename from spring-core/src/test/java/com/baeldung/lombok/FarewellerTest.java rename to spring-core/src/test/java/com/baeldung/lombok/FarewellServiceTest.java index a02ad1d8ac..9ad593a489 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/FarewellerTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/FarewellServiceTest.java @@ -6,7 +6,7 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class FarewellerTest { +public class FarewellServiceTest { private final static String TRANSLATED = "TRANSLATED"; @@ -14,7 +14,7 @@ public class FarewellerTest { public void sayByeWithTranslatedMessage() { Translator translator = mock(Translator.class); when(translator.translate("bye")).thenReturn(TRANSLATED); - Fareweller fareweller = new Fareweller(translator); - assertEquals(TRANSLATED, fareweller.farewell()); + FarewellService farewellService = new FarewellService(translator); + assertEquals(TRANSLATED, farewellService.farewell()); } } \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/lombok/GreeterTest.java b/spring-core/src/test/java/com/baeldung/lombok/GreetingServiceTest.java similarity index 79% rename from spring-core/src/test/java/com/baeldung/lombok/GreeterTest.java rename to spring-core/src/test/java/com/baeldung/lombok/GreetingServiceTest.java index 0f66eaf301..d0207d681b 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/GreeterTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/GreetingServiceTest.java @@ -14,10 +14,10 @@ import static org.mockito.Mockito.when; @ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = TestConfig.class) -public class GreeterTest { +public class GreetingServiceTest { @Autowired - private Greeter greeter; + private GreetingService greetingService; @Autowired private Translator translator; @@ -26,12 +26,12 @@ public class GreeterTest { public void greetWithTranslatedMessage() { String translated = "translated"; when(translator.translate("hello")).thenReturn(translated); - assertEquals(translated, greeter.greet()); + assertEquals(translated, greetingService.greet()); } @Test(expected = NullPointerException.class) public void throwWhenInstantiated() { - Greeter greeter = new Greeter(); - greeter.greet(); + GreetingService greetingService = new GreetingService(); + greetingService.greet(); } } \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/lombok/ThankerAutowiringTest.java b/spring-core/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringTest.java similarity index 84% rename from spring-core/src/test/java/com/baeldung/lombok/ThankerAutowiringTest.java rename to spring-core/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringTest.java index 59aded5831..b2a338b18f 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/ThankerAutowiringTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringTest.java @@ -14,10 +14,10 @@ import static org.mockito.Mockito.when; @ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = TestConfig.class) -public class ThankerAutowiringTest { +public class ThankingServiceAutowiringTest { @Autowired - private Thanker thanker; + private ThankingService thankingService; @Autowired private Translator translator; @@ -26,6 +26,6 @@ public class ThankerAutowiringTest { public void thankWithTranslatedMessage() { String translated = "translated"; when(translator.translate("thank you")).thenReturn(translated); - assertEquals(translated, thanker.thank()); + assertEquals(translated, thankingService.thank()); } } \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/lombok/ThankerTest.java b/spring-core/src/test/java/com/baeldung/lombok/ThankingServiceTest.java similarity index 71% rename from spring-core/src/test/java/com/baeldung/lombok/ThankerTest.java rename to spring-core/src/test/java/com/baeldung/lombok/ThankingServiceTest.java index 466762fa50..7dc663622b 100644 --- a/spring-core/src/test/java/com/baeldung/lombok/ThankerTest.java +++ b/spring-core/src/test/java/com/baeldung/lombok/ThankingServiceTest.java @@ -6,7 +6,7 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ThankerTest { +public class ThankingServiceTest { private final static String TRANSLATED = "TRANSLATED"; @@ -14,7 +14,7 @@ public class ThankerTest { public void thankWithTranslatedMessage() { Translator translator = mock(Translator.class); when(translator.translate("thank you")).thenReturn(TRANSLATED); - Thanker thanker = new Thanker(translator); - assertEquals(TRANSLATED, thanker.thank()); + ThankingService thankingService = new ThankingService(translator); + assertEquals(TRANSLATED, thankingService.thank()); } } \ No newline at end of file From bd6fe7269e19db914d2ef0b7dbfc8899d5ba38b7 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 4 Feb 2017 14:14:23 +0200 Subject: [PATCH 006/192] minor cleanup work - formatting --- .../config/HibernateAnnotationUtil.java | 35 +++-- .../HibernateOneToManyAnnotationMain.java | 85 ++++++------ .../hibernate/oneToMany/model/Cart.java | 87 ++++++------ .../hibernate/oneToMany/model/Items.java | 129 ++++++++++-------- .../HibernateOneToManyAnnotationMainTest.java | 93 ++++++------- 5 files changed, 221 insertions(+), 208 deletions(-) diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java index ba54985853..e522dab48d 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java @@ -7,32 +7,31 @@ import org.hibernate.service.ServiceRegistry; public class HibernateAnnotationUtil { - private static SessionFactory sessionFactory; - - private static SessionFactory buildSessionFactory() { + private static SessionFactory sessionFactory; + + private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate-annotation.cfg.xml - Configuration configuration = new Configuration(); - configuration.configure("hibernate-annotation.cfg.xml"); - System.out.println("Hibernate Annotation Configuration loaded"); - - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); - System.out.println("Hibernate Annotation serviceRegistry created"); - - SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); - - + Configuration configuration = new Configuration(); + configuration.configure("hibernate-annotation.cfg.xml"); + System.out.println("Hibernate Annotation Configuration loaded"); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); + System.out.println("Hibernate Annotation serviceRegistry created"); + + SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); + return sessionFactory; - } - catch (Throwable ex) { + } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); ex.printStackTrace(); throw new ExceptionInInitializerError(ex); } } - - public static SessionFactory getSessionFactory() { - if(sessionFactory == null) sessionFactory = buildSessionFactory(); + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) + sessionFactory = buildSessionFactory(); return sessionFactory; } } diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java index d5c41bcfab..63b6450bf4 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java @@ -13,48 +13,49 @@ import com.baeldung.hibernate.oneToMany.model.Items; public class HibernateOneToManyAnnotationMain { - public static void main(String[] args) { + public static void main(String[] args) { - Cart cart = new Cart(); - cart.setName("MyCart"); - - Items item1 = new Items("I10", 10, 1, cart); - Items item2 = new Items("I20", 20, 2, cart); - Set itemsSet = new HashSet(); - itemsSet.add(item1); itemsSet.add(item2); - - cart.setItems(itemsSet); - cart.setTotal(10*1 + 20*2); - - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; - try{ - //Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); - //start transaction - tx = session.beginTransaction(); - //Save the Model object - session.save(cart); - session.save(item1); - session.save(item2); - //Commit transaction - tx.commit(); - System.out.println("Cart ID="+cart.getId()); - System.out.println("item1 ID="+item1.getId()+", Foreign Key Cart ID="+item1.getCart().getId()); - System.out.println("item2 ID="+item2.getId()+", Foreign Key Cart ID="+item1.getCart().getId()); - - }catch(Exception e){ - System.out.println("Exception occured. "+e.getMessage()); - e.printStackTrace(); - }finally{ - if(!sessionFactory.isClosed()){ - System.out.println("Closing SessionFactory"); - sessionFactory.close(); - } - } - } + Cart cart = new Cart(); + cart.setName("MyCart"); + + Items item1 = new Items("I10", 10, 1, cart); + Items item2 = new Items("I20", 20, 2, cart); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + cart.setTotal(10 * 1 + 20 * 2); + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + System.out.println("Cart ID=" + cart.getId()); + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } } diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java index fdbfda2279..61a32ba43f 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java @@ -11,46 +11,53 @@ import javax.persistence.OneToMany; import javax.persistence.Table; @Entity -@Table(name="CART") +@Table(name = "CART") public class Cart { - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - @Column(name="cart_id") - private long id; - - @Column(name="total") - private double total; - - @Column(name="name") - private String name; - - @OneToMany(mappedBy="cart") - private Set items; - - public long getId() { - return id; - } - public void setId(long id) { - this.id = id; - } - public double getTotal() { - return total; - } - public void setTotal(double total) { - this.total = total; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public Set getItems() { - return items; - } - public void setItems(Set items) { - this.items = items; - } - + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cart_id") + private long id; + + @Column(name = "total") + private double total; + + @Column(name = "name") + private String name; + + @OneToMany(mappedBy = "cart") + private Set items; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public double getTotal() { + return total; + } + + public void setTotal(double total) { + this.total = total; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getItems() { + return items; + } + + public void setItems(Set items) { + this.items = items; + } + } diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java index 630bf0a12e..40ee6fdea1 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java @@ -10,65 +10,76 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity -@Table(name="ITEMS") +@Table(name = "ITEMS") public class Items { - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - @Column(name="id") - private long id; - - @Column(name="item_id") - private String itemId; - - @Column(name="item_total") - private double itemTotal; - - @Column(name="quantity") - private int quantity; - - @ManyToOne - @JoinColumn(name="cart_id", nullable=false) - private Cart cart; - - //Hibernate requires no-args constructor - public Items(){} - - public Items(String itemId, double total, int qty, Cart c){ - this.itemId=itemId; - this.itemTotal=total; - this.quantity=qty; - this.cart=c; - } - public String getItemId() { - return itemId; - } - public void setItemId(String itemId) { - this.itemId = itemId; - } - public double getItemTotal() { - return itemTotal; - } - public void setItemTotal(double itemTotal) { - this.itemTotal = itemTotal; - } - public int getQuantity() { - return quantity; - } - public void setQuantity(int quantity) { - this.quantity = quantity; - } - public Cart getCart() { - return cart; - } - public void setCart(Cart cart) { - this.cart = cart; - } - public long getId() { - return id; - } - public void setId(long id) { - this.id = id; - } - + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "item_id") + private String itemId; + + @Column(name = "item_total") + private double itemTotal; + + @Column(name = "quantity") + private int quantity; + + @ManyToOne + @JoinColumn(name = "cart_id", nullable = false) + private Cart cart; + + // Hibernate requires no-args constructor + public Items() { + } + + public Items(String itemId, double total, int qty, Cart c) { + this.itemId = itemId; + this.itemTotal = total; + this.quantity = qty; + this.cart = c; + } + + public String getItemId() { + return itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + + public double getItemTotal() { + return itemTotal; + } + + public void setItemTotal(double itemTotal) { + this.itemTotal = itemTotal; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public Cart getCart() { + return cart; + } + + public void setCart(Cart cart) { + this.cart = cart; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + } diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java index 742bb2b470..10a89cdf14 100644 --- a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java +++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java @@ -1,12 +1,12 @@ package com.baeldung.hibernate.oneToMany.main; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; -import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; import java.util.HashSet; import java.util.Set; -import static org.hamcrest.Matchers.hasSize; + import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; @@ -17,51 +17,47 @@ import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Items; //@RunWith(SpringJUnit4ClassRunner.class) public class HibernateOneToManyAnnotationMainTest { - + private static SessionFactory sessionFactory; private Session session; - + public HibernateOneToManyAnnotationMainTest() { } - - + @BeforeClass public static void beforeTests() { - Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class).setProperty("hibernate.dialect", HSQLDialect.class.getName()).setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()) - .setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test").setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "").setProperty("hibernate.hbm2ddl.auto", "update"); + Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class).setProperty("hibernate.dialect", HSQLDialect.class.getName()) + .setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()).setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test").setProperty("hibernate.connection.username", "sa") + .setProperty("hibernate.connection.password", "").setProperty("hibernate.hbm2ddl.auto", "update"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } - + @Before public void setUp() { session = sessionFactory.openSession(); - session.beginTransaction(); - + session.beginTransaction(); + } - + @Test - public void givenSession_checkIfDatabaseIsEmpty(){ + public void givenSession_checkIfDatabaseIsEmpty() { Cart cart = (Cart) session.get(Cart.class, new Long(1)); assertNull(cart); - + } - - - - @Test public void testAddItemsToCart() { Cart cart = new Cart(); - Set cartItems = new HashSet<>(); + Set cartItems = new HashSet<>(); cartItems = cart.getItems(); Assert.assertNull(cartItems); Items item1 = new Items("I10", 10, 1, cart); @@ -70,33 +66,32 @@ public class HibernateOneToManyAnnotationMainTest { cart.setItems(itemsSet); assertNotNull(cart); System.out.println("Items added to cart"); - + } - + @Test - public void givenSession_checkIfDatabaseIsPopulated_afterCommit(){ - Cart cart = new Cart(); - Set cartItems = new HashSet<>(); - cartItems = cart.getItems(); - Assert.assertNull(cartItems); - Items item1 = new Items(); - item1.setItemId("I10"); - item1.setItemTotal(10); - item1.setQuantity(1); - item1.setCart(cart); - assertNotNull(item1); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - assertNotNull(itemsSet); - cart.setItems(itemsSet); - assertNotNull(cart); - session.persist(cart); - session.getTransaction().commit(); - cart = (Cart) session.get(Cart.class, new Long(1)); - assertNotNull(cart); - session.close(); - + public void givenSession_checkIfDatabaseIsPopulated_afterCommit() { + Cart cart = new Cart(); + Set cartItems = new HashSet<>(); + cartItems = cart.getItems(); + Assert.assertNull(cartItems); + Items item1 = new Items(); + item1.setItemId("I10"); + item1.setItemTotal(10); + item1.setQuantity(1); + item1.setCart(cart); + assertNotNull(item1); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + assertNotNull(itemsSet); + cart.setItems(itemsSet); + assertNotNull(cart); + session.persist(cart); + session.getTransaction().commit(); + cart = (Cart) session.get(Cart.class, new Long(1)); + assertNotNull(cart); + session.close(); + } - - + } From 80c07b0ab2d1c49e6b9c6fb39b4999262fca662e Mon Sep 17 00:00:00 2001 From: Stephen Braimah Date: Sat, 4 Feb 2017 14:07:16 +0000 Subject: [PATCH 007/192] BAEL-639: Guide to Guava's EventBus Tests - corrected formatting --- guava/pom.xml | 29 +++++++++++++++++++ .../java/org/baeldung/guava/CustomEvent.java | 1 - .../org/baeldung/guava/EventBusWrapper.java | 7 ++--- .../org/baeldung/guava/EventListener.java | 20 ++++++------- .../org/baeldung/guava/GuavaEventBusTest.java | 12 ++++---- 5 files changed, 47 insertions(+), 22 deletions(-) diff --git a/guava/pom.xml b/guava/pom.xml index a7b4e79e34..b40df178a6 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -57,6 +57,32 @@ test + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + @@ -105,6 +131,9 @@ 3.6.0 2.19.1 + + 1.7.21 + 1.1.7 \ No newline at end of file diff --git a/guava/src/test/java/org/baeldung/guava/CustomEvent.java b/guava/src/test/java/org/baeldung/guava/CustomEvent.java index 78348065b2..2d5c3382d4 100644 --- a/guava/src/test/java/org/baeldung/guava/CustomEvent.java +++ b/guava/src/test/java/org/baeldung/guava/CustomEvent.java @@ -1,6 +1,5 @@ package org.baeldung.guava; - public class CustomEvent { private String action; diff --git a/guava/src/test/java/org/baeldung/guava/EventBusWrapper.java b/guava/src/test/java/org/baeldung/guava/EventBusWrapper.java index eddaca0baf..243bc9e6ea 100644 --- a/guava/src/test/java/org/baeldung/guava/EventBusWrapper.java +++ b/guava/src/test/java/org/baeldung/guava/EventBusWrapper.java @@ -6,17 +6,16 @@ class EventBusWrapper { private static EventBus eventBus = new EventBus(); - static void register(Object object){ + static void register(Object object) { eventBus.register(object); } - static void unregister(Object object){ + static void unregister(Object object) { eventBus.unregister(object); } - static void post(Object object){ + static void post(Object object) { eventBus.post(object); } - } diff --git a/guava/src/test/java/org/baeldung/guava/EventListener.java b/guava/src/test/java/org/baeldung/guava/EventListener.java index 17a3ac093e..02f22ce6b9 100644 --- a/guava/src/test/java/org/baeldung/guava/EventListener.java +++ b/guava/src/test/java/org/baeldung/guava/EventListener.java @@ -1,25 +1,23 @@ package org.baeldung.guava; + import com.google.common.eventbus.Subscribe; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class EventListener { private static int eventsHandled; + private static final Logger LOG = LoggerFactory.getLogger(EventListener.class); - /** - * Handles events of type String * - */ @Subscribe - public void stringEvent(String event){ - System.out.println("do event ["+event+"]"); + public void stringEvent(String event) { + LOG.info("do event [" + event + "]"); eventsHandled++; } - /** - * Handles events of type CustomEvent - */ @Subscribe - public void someEvent(CustomEvent customEvent){ - System.out.println("do event ["+ customEvent.getAction()+"]"); + public void someCustomEvent(CustomEvent customEvent) { + LOG.info("do event [" + customEvent.getAction() + "]"); eventsHandled++; } @@ -27,7 +25,7 @@ public class EventListener { return eventsHandled; } - public void resetEventsHandled(){ + public void resetEventsHandled() { eventsHandled = 0; } } diff --git a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java index 09f7eb775d..62e275fe92 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java @@ -10,32 +10,32 @@ public class GuavaEventBusTest { private EventListener listener; @Before - public void setUp() throws Exception { + public void setUp() { listener = new EventListener(); EventBusWrapper.register(listener); } @After - public void tearDown() throws Exception { + public void tearDown() { EventBusWrapper.unregister(listener); } @Test - public void givenStringEvent_whenEventHandled_thenSuccess() throws Exception { + public void givenStringEvent_whenEventHandled_thenSuccess() { listener.resetEventsHandled(); EventBusWrapper.post("String Event"); - assertEquals(1,listener.getEventsHandled()); + assertEquals(1, listener.getEventsHandled()); } @Test - public void givenCustomEvent_whenEventHandled_thenSuccess() throws Exception { + public void givenCustomEvent_whenEventHandled_thenSuccess() { listener.resetEventsHandled(); CustomEvent customEvent = new CustomEvent("Custom Event"); EventBusWrapper.post(customEvent); - assertEquals(1,listener.getEventsHandled()); + assertEquals(1, listener.getEventsHandled()); } } From f69deeca2d23b2ae154a2d17468d33c80b25dfcc Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Sat, 4 Feb 2017 15:59:49 +0100 Subject: [PATCH 008/192] BAEL-598 Removed try-catch block, added throws declaration --- .../java/com/baeldung/thrift/Application.java | 4 +++- .../thrift/CrossPlatformServiceServer.java | 19 ++++++++----------- .../thrift/CrossPlatformServiceTest.java | 9 ++++++++- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/apache-thrift/src/main/java/com/baeldung/thrift/Application.java b/apache-thrift/src/main/java/com/baeldung/thrift/Application.java index 09d5cc74f3..3321a0927a 100644 --- a/apache-thrift/src/main/java/com/baeldung/thrift/Application.java +++ b/apache-thrift/src/main/java/com/baeldung/thrift/Application.java @@ -1,8 +1,10 @@ package com.baeldung.thrift; +import org.apache.thrift.transport.TTransportException; + public class Application { - public static void main(String[] args) { + public static void main(String[] args) throws TTransportException { CrossPlatformServiceServer server = new CrossPlatformServiceServer(); server.start(); } diff --git a/apache-thrift/src/main/java/com/baeldung/thrift/CrossPlatformServiceServer.java b/apache-thrift/src/main/java/com/baeldung/thrift/CrossPlatformServiceServer.java index 9a21512b52..32c7891ef2 100644 --- a/apache-thrift/src/main/java/com/baeldung/thrift/CrossPlatformServiceServer.java +++ b/apache-thrift/src/main/java/com/baeldung/thrift/CrossPlatformServiceServer.java @@ -6,25 +6,22 @@ import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TServerTransport; +import org.apache.thrift.transport.TTransportException; public class CrossPlatformServiceServer { private TServer server; - public void start() { - try { - TServerTransport serverTransport = new TServerSocket(9090); - server = new TSimpleServer(new TServer.Args(serverTransport) - .processor(new CrossPlatformService.Processor<>(new CrossPlatformServiceImpl()))); + public void start() throws TTransportException { + TServerTransport serverTransport = new TServerSocket(9090); + server = new TSimpleServer(new TServer.Args(serverTransport) + .processor(new CrossPlatformService.Processor<>(new CrossPlatformServiceImpl()))); - System.out.print("Starting the server... "); + System.out.print("Starting the server... "); - server.serve(); + server.serve(); - System.out.println("done."); - } catch (Exception e) { - e.printStackTrace(); - } + System.out.println("done."); } public void stop() { diff --git a/apache-thrift/src/test/java/com/baeldung/thrift/CrossPlatformServiceTest.java b/apache-thrift/src/test/java/com/baeldung/thrift/CrossPlatformServiceTest.java index 8a7022a281..4ba9ef2914 100644 --- a/apache-thrift/src/test/java/com/baeldung/thrift/CrossPlatformServiceTest.java +++ b/apache-thrift/src/test/java/com/baeldung/thrift/CrossPlatformServiceTest.java @@ -1,5 +1,6 @@ package com.baeldung.thrift; +import org.apache.thrift.transport.TTransportException; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -11,7 +12,13 @@ public class CrossPlatformServiceTest { @Before public void setUp() { - new Thread(() -> server.start()).start(); + new Thread(() -> { + try { + server.start(); + } catch (TTransportException e) { + e.printStackTrace(); + } + }).start(); try { // wait for the server start up Thread.sleep(1000); From 3bda12d20c9b820531e9feebb7bcd89a35421bf7 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 4 Feb 2017 17:00:22 +0100 Subject: [PATCH 009/192] BEAL-572 use same chedulers to be consistent --- .../java/com/baelding/rxjava/ColdObservableBackpressure.java | 2 +- .../java/com/baelding/rxjava/HotObservableOnBackPressure.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java index cebc2d35f6..b0be29957d 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java +++ b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java @@ -9,7 +9,7 @@ public class ColdObservableBackPressure { public static void main(String[] args) throws InterruptedException { Observable.range(1, 1_000_000) .observeOn(Schedulers.computation()) - .subscribe(v -> ComputeFunction.compute(v), Throwable::printStackTrace); + .subscribe(ComputeFunction::compute); Thread.sleep(10_000); diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java index bf86312fff..124ee64d0b 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java +++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackPressure.java @@ -18,7 +18,7 @@ public class HotObservableOnBackPressure { Observable.range(1, 1_000_000) .onBackpressureDrop() - .observeOn(Schedulers.io()) + .observeOn(Schedulers.computation()) .doOnNext(ComputeFunction::compute) .subscribe(v -> { }, Throwable::printStackTrace); From 02245b75a8bbf1db1b526bba56df25253adcff7d Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sat, 4 Feb 2017 17:02:46 +0100 Subject: [PATCH 010/192] Refactor PriorityBlockingQueue examples --- .../PriorityBlockingQueueUnitTest.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java b/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java index 063e07d859..5e6855e18a 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java @@ -1,12 +1,10 @@ package com.baeldung.concurrent.priorityblockingqueue; -import org.assertj.core.api.Assertions; import org.junit.Test; import java.util.ArrayList; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.util.Lists.newArrayList; @@ -24,11 +22,7 @@ public class PriorityBlockingQueueUnitTest { queue.add(3); queue.add(4); - polledElements.add(queue.poll()); - polledElements.add(queue.poll()); - polledElements.add(queue.poll()); - polledElements.add(queue.poll()); - polledElements.add(queue.poll()); + queue.drainTo(polledElements); assertThat(polledElements).containsExactly(1, 2, 3, 4, 5); } From 4771252f6bb4f6064b27e6b1b5862088f61f1b5b Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sat, 4 Feb 2017 17:22:28 +0100 Subject: [PATCH 011/192] AppTest -> AppLiveTest --- .../intro/{AppTest.java => AppLiveTest.java} | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) rename spring-boot/src/test/java/com/baeldung/intro/{AppTest.java => AppLiveTest.java} (95%) diff --git a/spring-boot/src/test/java/com/baeldung/intro/AppTest.java b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java similarity index 95% rename from spring-boot/src/test/java/com/baeldung/intro/AppTest.java rename to spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java index 749fe68838..772709dc30 100644 --- a/spring-boot/src/test/java/com/baeldung/intro/AppTest.java +++ b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java @@ -1,39 +1,39 @@ -package com.baeldung.intro; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -@RunWith(SpringRunner.class) -@SpringBootTest -@AutoConfigureMockMvc -public class AppTest { - - @Autowired - private MockMvc mvc; - - @Test - public void getIndex() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("Index Page"))); - } - - @Test - public void getLocal() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/local").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("/local"))); - } - +package com.baeldung.intro; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class AppLiveTest { + + @Autowired + private MockMvc mvc; + + @Test + public void getIndex() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("Index Page"))); + } + + @Test + public void getLocal() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/local").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("/local"))); + } + } \ No newline at end of file From 93c704cbf7ede95fc7e9b6b582217e315d5837a6 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sat, 4 Feb 2017 16:18:17 +0000 Subject: [PATCH 012/192] mesos marathon demo --- mesos-marathon/Dockerfile | 4 ++ mesos-marathon/dockerise.sh | 5 ++ mesos-marathon/marathon.json | 14 ++++++ mesos-marathon/pom.xml | 46 +++++++++++++++++++ .../java/com/mogronalol/DemoApplication.java | 14 ++++++ .../java/com/mogronalol/HelloController.java | 17 +++++++ .../src/main/resources/application.properties | 1 + .../com/mogronalol/DemoApplicationTests.java | 34 ++++++++++++++ pom.xml | 1 + 9 files changed, 136 insertions(+) create mode 100644 mesos-marathon/Dockerfile create mode 100644 mesos-marathon/dockerise.sh create mode 100644 mesos-marathon/marathon.json create mode 100644 mesos-marathon/pom.xml create mode 100644 mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java create mode 100644 mesos-marathon/src/main/java/com/mogronalol/HelloController.java create mode 100644 mesos-marathon/src/main/resources/application.properties create mode 100644 mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java diff --git a/mesos-marathon/Dockerfile b/mesos-marathon/Dockerfile new file mode 100644 index 0000000000..9f92f7fa6a --- /dev/null +++ b/mesos-marathon/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:8-jre-alpine +ADD build/libs/demo-0.0.1-SNAPSHOT.jar app.jar +EXPOSE 8082 +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/mesos-marathon/dockerise.sh b/mesos-marathon/dockerise.sh new file mode 100644 index 0000000000..85b8554b52 --- /dev/null +++ b/mesos-marathon/dockerise.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +docker login -u mogronalol -p $DOCKER_PASSWORD +docker build -t mogronalol/mesos-marathon-demo:$BUILD_NUMBER . +docker push mogronalol/mesos-marathon-demo:$BUILD_NUMBER diff --git a/mesos-marathon/marathon.json b/mesos-marathon/marathon.json new file mode 100644 index 0000000000..6471259e92 --- /dev/null +++ b/mesos-marathon/marathon.json @@ -0,0 +1,14 @@ +{ + "id": "mesos-marathon-demo", + "container": { + "type": "DOCKER", + "docker": { + "image": "", + "network": "BRIDGE", + "portMappings": [ + { "containerPort": 8082, "hostPort": 0 } + ] + }, + "volumes": [] + } +} \ No newline at end of file diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml new file mode 100644 index 0000000000..ca17a5c4c4 --- /dev/null +++ b/mesos-marathon/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.baeldung + mesos-marathon + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.1.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.1.RELEASE + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java b/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java new file mode 100644 index 0000000000..f757178026 --- /dev/null +++ b/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java @@ -0,0 +1,14 @@ +package com.mogronalol; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } +} diff --git a/mesos-marathon/src/main/java/com/mogronalol/HelloController.java b/mesos-marathon/src/main/java/com/mogronalol/HelloController.java new file mode 100644 index 0000000000..2059280ba0 --- /dev/null +++ b/mesos-marathon/src/main/java/com/mogronalol/HelloController.java @@ -0,0 +1,17 @@ +package com.mogronalol; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController(value = "/") +public class HelloController { + + @GetMapping + @ResponseBody + public String getMapping() { + return "Hello world"; + } + +} diff --git a/mesos-marathon/src/main/resources/application.properties b/mesos-marathon/src/main/resources/application.properties new file mode 100644 index 0000000000..8d51d0c619 --- /dev/null +++ b/mesos-marathon/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8082 \ No newline at end of file diff --git a/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java b/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java new file mode 100644 index 0000000000..5e88f9a70f --- /dev/null +++ b/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java @@ -0,0 +1,34 @@ +package com.mogronalol; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.client.RestTemplate; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = {DemoApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class DemoApplicationTests { + + private RestTemplate restTemplate; + + @LocalServerPort + private int port; + + @Before + public void setUp() { + restTemplate = new RestTemplate(); + } + + @Test + public void contextLoads() { + final String result = restTemplate.getForObject("http://localhost:" + port + "/", String.class); + assertThat(result).isEqualTo("Hello world"); + } + +} diff --git a/pom.xml b/pom.xml index 41235dcc26..a17b8fc9ce 100644 --- a/pom.xml +++ b/pom.xml @@ -79,6 +79,7 @@ mapstruct metrics + mesos-marathon mockito mocks From ad104bfe8cf5c9790b78deda2984d278addf659f Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sat, 4 Feb 2017 17:21:41 +0000 Subject: [PATCH 013/192] Revert "mesos marathon demo" This reverts commit 93c704cbf7ede95fc7e9b6b582217e315d5837a6. --- mesos-marathon/Dockerfile | 4 -- mesos-marathon/dockerise.sh | 5 -- mesos-marathon/marathon.json | 14 ------ mesos-marathon/pom.xml | 46 ------------------- .../java/com/mogronalol/DemoApplication.java | 14 ------ .../java/com/mogronalol/HelloController.java | 17 ------- .../src/main/resources/application.properties | 1 - .../com/mogronalol/DemoApplicationTests.java | 34 -------------- pom.xml | 1 - 9 files changed, 136 deletions(-) delete mode 100644 mesos-marathon/Dockerfile delete mode 100644 mesos-marathon/dockerise.sh delete mode 100644 mesos-marathon/marathon.json delete mode 100644 mesos-marathon/pom.xml delete mode 100644 mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java delete mode 100644 mesos-marathon/src/main/java/com/mogronalol/HelloController.java delete mode 100644 mesos-marathon/src/main/resources/application.properties delete mode 100644 mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java diff --git a/mesos-marathon/Dockerfile b/mesos-marathon/Dockerfile deleted file mode 100644 index 9f92f7fa6a..0000000000 --- a/mesos-marathon/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM openjdk:8-jre-alpine -ADD build/libs/demo-0.0.1-SNAPSHOT.jar app.jar -EXPOSE 8082 -ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/mesos-marathon/dockerise.sh b/mesos-marathon/dockerise.sh deleted file mode 100644 index 85b8554b52..0000000000 --- a/mesos-marathon/dockerise.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -e -docker login -u mogronalol -p $DOCKER_PASSWORD -docker build -t mogronalol/mesos-marathon-demo:$BUILD_NUMBER . -docker push mogronalol/mesos-marathon-demo:$BUILD_NUMBER diff --git a/mesos-marathon/marathon.json b/mesos-marathon/marathon.json deleted file mode 100644 index 6471259e92..0000000000 --- a/mesos-marathon/marathon.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "mesos-marathon-demo", - "container": { - "type": "DOCKER", - "docker": { - "image": "", - "network": "BRIDGE", - "portMappings": [ - { "containerPort": 8082, "hostPort": 0 } - ] - }, - "volumes": [] - } -} \ No newline at end of file diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml deleted file mode 100644 index ca17a5c4c4..0000000000 --- a/mesos-marathon/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - com.baeldung - mesos-marathon - 0.0.1-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-parent - 1.5.1.RELEASE - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - 1.5.1.RELEASE - - - - repackage - - - - - - - - \ No newline at end of file diff --git a/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java b/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java deleted file mode 100644 index f757178026..0000000000 --- a/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.mogronalol; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import javax.annotation.PostConstruct; - -@SpringBootApplication -public class DemoApplication { - - public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); - } -} diff --git a/mesos-marathon/src/main/java/com/mogronalol/HelloController.java b/mesos-marathon/src/main/java/com/mogronalol/HelloController.java deleted file mode 100644 index 2059280ba0..0000000000 --- a/mesos-marathon/src/main/java/com/mogronalol/HelloController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mogronalol; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -@RestController(value = "/") -public class HelloController { - - @GetMapping - @ResponseBody - public String getMapping() { - return "Hello world"; - } - -} diff --git a/mesos-marathon/src/main/resources/application.properties b/mesos-marathon/src/main/resources/application.properties deleted file mode 100644 index 8d51d0c619..0000000000 --- a/mesos-marathon/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -server.port=8082 \ No newline at end of file diff --git a/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java b/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java deleted file mode 100644 index 5e88f9a70f..0000000000 --- a/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.mogronalol; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.web.client.RestTemplate; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = {DemoApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class DemoApplicationTests { - - private RestTemplate restTemplate; - - @LocalServerPort - private int port; - - @Before - public void setUp() { - restTemplate = new RestTemplate(); - } - - @Test - public void contextLoads() { - final String result = restTemplate.getForObject("http://localhost:" + port + "/", String.class); - assertThat(result).isEqualTo("Hello world"); - } - -} diff --git a/pom.xml b/pom.xml index a17b8fc9ce..41235dcc26 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,6 @@ mapstruct metrics - mesos-marathon mockito mocks From ffd17c1b21071a912624792a6de2ccca2bbdf2d0 Mon Sep 17 00:00:00 2001 From: maibin Date: Sat, 4 Feb 2017 18:47:30 +0100 Subject: [PATCH 014/192] Fix the Hibernate4 issues (#1106) * Binary genetic algorithm * Fix the junit tests conflict --- .../com/baeldung/algorithms/RunAlgorithm.java | 44 ++++--- .../algorithms/ga/binary/Individual.java | 44 +++++++ .../algorithms/ga/binary/Population.java | 40 ++++++ .../ga/binary/SimpleGeneticAlgorithm.java | 119 +++++++++++++++++ .../BinaryGeneticAlgorithmTest.java | 16 +++ spring-hibernate4/.gitignore | 3 +- .../HibernateOneToManyAnnotationMainTest.java | 124 +++++++++--------- 7 files changed, 308 insertions(+), 82 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java create mode 100644 core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java create mode 100644 core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java create mode 100644 core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java index 113ac1cc53..6d696dd272 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java +++ b/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java @@ -3,28 +3,34 @@ package com.baeldung.algorithms; import java.util.Scanner; import com.baeldung.algorithms.annealing.SimulatedAnnealing; +import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm; import com.baeldung.algorithms.slope_one.SlopeOne; public class RunAlgorithm { - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - System.out.println("Run algorithm:"); - System.out.println("1 - Simulated Annealing"); - System.out.println("2 - Slope One"); - int decision = in.nextInt(); - switch (decision) { - case 1: - System.out.println("Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995)); - break; - case 2: - SlopeOne.slopeOne(3); - break; - default: - System.out.println("Unknown option"); - break; - } - in.close(); - } + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.println("Run algorithm:"); + System.out.println("1 - Simulated Annealing"); + System.out.println("2 - Slope One"); + System.out.println("3 - Simple Genetic Algorithm"); + int decision = in.nextInt(); + switch (decision) { + case 1: + System.out.println( + "Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995)); + break; + case 2: + SlopeOne.slopeOne(3); + break; + case 3: + SimpleGeneticAlgorithm.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111"); + break; + default: + System.out.println("Unknown option"); + break; + } + in.close(); + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java new file mode 100644 index 0000000000..e9b6c8f66a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java @@ -0,0 +1,44 @@ +package com.baeldung.algorithms.ga.binary; + +import lombok.Data; + +@Data +public class Individual { + + protected int defaultGeneLength = 64; + private byte[] genes = new byte[defaultGeneLength]; + private int fitness = 0; + + public Individual() { + for (int i = 0; i < genes.length; i++) { + byte gene = (byte) Math.round(Math.random()); + genes[i] = gene; + } + } + + protected byte getSingleGene(int index) { + return genes[index]; + } + + protected void setSingleGene(int index, byte value) { + genes[index] = value; + fitness = 0; + } + + public int getFitness() { + if (fitness == 0) { + fitness = SimpleGeneticAlgorithm.getFitness(this); + } + return fitness; + } + + @Override + public String toString() { + String geneString = ""; + for (int i = 0; i < genes.length; i++) { + geneString += getSingleGene(i); + } + return geneString; + } + +} diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java new file mode 100644 index 0000000000..dbd1e04e0f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java @@ -0,0 +1,40 @@ +package com.baeldung.algorithms.ga.binary; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +@Data +public class Population { + + private List individuals; + + public Population(int size, boolean createNew) { + individuals = new ArrayList<>(); + if (createNew) { + createNewPopulation(size); + } + } + + protected Individual getIndividual(int index) { + return individuals.get(index); + } + + protected Individual getFittest() { + Individual fittest = individuals.get(0); + for (int i = 0; i < individuals.size(); i++) { + if (fittest.getFitness() <= getIndividual(i).getFitness()) { + fittest = getIndividual(i); + } + } + return fittest; + } + + private void createNewPopulation(int size) { + for (int i = 0; i < size; i++) { + Individual newIndividual = new Individual(); + individuals.add(i, newIndividual); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java new file mode 100644 index 0000000000..0f640e676a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java @@ -0,0 +1,119 @@ +package com.baeldung.algorithms.ga.binary; + +import lombok.Data; + +@Data +public class SimpleGeneticAlgorithm { + + private static final double uniformRate = 0.5; + private static final double mutationRate = 0.025; + private static final int tournamentSize = 5; + private static final boolean elitism = true; + private static byte[] solution = new byte[64]; + + public static boolean runAlgorithm(int populationSize, String solution) { + if (solution.length() != SimpleGeneticAlgorithm.solution.length) { + throw new RuntimeException( + "The solution needs to have " + SimpleGeneticAlgorithm.solution.length + " bytes"); + } + SimpleGeneticAlgorithm.setSolution(solution); + Population myPop = new Population(populationSize, true); + + int generationCount = 1; + while (myPop.getFittest().getFitness() < SimpleGeneticAlgorithm.getMaxFitness()) { + System.out.println( + "Generation: " + generationCount + " Correct genes found: " + myPop.getFittest().getFitness()); + myPop = SimpleGeneticAlgorithm.evolvePopulation(myPop); + generationCount++; + } + System.out.println("Solution found!"); + System.out.println("Generation: " + generationCount); + System.out.println("Genes: "); + System.out.println(myPop.getFittest()); + return true; + } + + public static Population evolvePopulation(Population pop) { + int elitismOffset; + Population newPopulation = new Population(pop.getIndividuals().size(), false); + + if (elitism) { + newPopulation.getIndividuals().add(0, pop.getFittest()); + elitismOffset = 1; + } else { + elitismOffset = 0; + } + + for (int i = elitismOffset; i < pop.getIndividuals().size(); i++) { + Individual indiv1 = tournamentSelection(pop); + Individual indiv2 = tournamentSelection(pop); + Individual newIndiv = crossover(indiv1, indiv2); + newPopulation.getIndividuals().add(i, newIndiv); + } + + for (int i = elitismOffset; i < newPopulation.getIndividuals().size(); i++) { + mutate(newPopulation.getIndividual(i)); + } + + return newPopulation; + } + + private static Individual crossover(Individual indiv1, Individual indiv2) { + Individual newSol = new Individual(); + for (int i = 0; i < newSol.getDefaultGeneLength(); i++) { + if (Math.random() <= uniformRate) { + newSol.setSingleGene(i, indiv1.getSingleGene(i)); + } else { + newSol.setSingleGene(i, indiv2.getSingleGene(i)); + } + } + return newSol; + } + + private static void mutate(Individual indiv) { + for (int i = 0; i < indiv.getDefaultGeneLength(); i++) { + if (Math.random() <= mutationRate) { + byte gene = (byte) Math.round(Math.random()); + indiv.setSingleGene(i, gene); + } + } + } + + private static Individual tournamentSelection(Population pop) { + Population tournament = new Population(tournamentSize, false); + for (int i = 0; i < tournamentSize; i++) { + int randomId = (int) (Math.random() * pop.getIndividuals().size()); + tournament.getIndividuals().add(i, pop.getIndividual(randomId)); + } + Individual fittest = tournament.getFittest(); + return fittest; + } + + protected static int getFitness(Individual individual) { + int fitness = 0; + for (int i = 0; i < individual.getDefaultGeneLength() && i < solution.length; i++) { + if (individual.getSingleGene(i) == solution[i]) { + fitness++; + } + } + return fitness; + } + + protected static int getMaxFitness() { + int maxFitness = solution.length; + return maxFitness; + } + + protected static void setSolution(String newSolution) { + solution = new byte[newSolution.length()]; + for (int i = 0; i < newSolution.length(); i++) { + String character = newSolution.substring(i, i + 1); + if (character.contains("0") || character.contains("1")) { + solution[i] = Byte.parseByte(character); + } else { + solution[i] = 0; + } + } + } + +} diff --git a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java new file mode 100644 index 0000000000..8a16311dfb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java @@ -0,0 +1,16 @@ +package com.baeldung.algorithms; + +import org.junit.Assert; +import org.junit.Test; + +import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm; + +public class BinaryGeneticAlgorithmTest { + + @Test + public void testGA() { + Assert.assertTrue(SimpleGeneticAlgorithm.runAlgorithm(50, + "1011000100000100010000100000100111001000000100000100000000001111")); + } + +} diff --git a/spring-hibernate4/.gitignore b/spring-hibernate4/.gitignore index 83c05e60c8..478cca6dac 100644 --- a/spring-hibernate4/.gitignore +++ b/spring-hibernate4/.gitignore @@ -10,4 +10,5 @@ # Packaged files # *.jar *.war -*.ear \ No newline at end of file +*.ear +/target/ diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java index 10a89cdf14..688329e329 100644 --- a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java +++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java @@ -1,4 +1,3 @@ - package com.baeldung.hibernate.oneToMany.main; import static org.junit.Assert.assertNotNull; @@ -13,85 +12,86 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.dialect.HSQLDialect; import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; - import com.baeldung.hibernate.oneToMany.model.Cart; import com.baeldung.hibernate.oneToMany.model.Items; -//@RunWith(SpringJUnit4ClassRunner.class) public class HibernateOneToManyAnnotationMainTest { - private static SessionFactory sessionFactory; + private static SessionFactory sessionFactory; - private Session session; + private Session session; - public HibernateOneToManyAnnotationMainTest() { - } + public HibernateOneToManyAnnotationMainTest() { + } - @BeforeClass - public static void beforeTests() { - Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class).setProperty("hibernate.dialect", HSQLDialect.class.getName()) - .setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()).setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test").setProperty("hibernate.connection.username", "sa") - .setProperty("hibernate.connection.password", "").setProperty("hibernate.hbm2ddl.auto", "update"); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); - sessionFactory = configuration.buildSessionFactory(serviceRegistry); - } + @BeforeClass + public static void beforeTests() { + Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class) + .setProperty("hibernate.dialect", HSQLDialect.class.getName()) + .setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()) + .setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test") + .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "") + .setProperty("hibernate.hbm2ddl.auto", "update"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()).build(); + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } - } + @Test + public void givenSession_checkIfDatabaseIsEmpty() { + Cart cart = (Cart) session.get(Cart.class, new Long(1)); + assertNull(cart); - @Test - public void givenSession_checkIfDatabaseIsEmpty() { - Cart cart = (Cart) session.get(Cart.class, new Long(1)); - assertNull(cart); + } - } + @Test + public void givenSession_checkIfDatabaseIsPopulated_afterCommit() { + Cart cart = new Cart(); + Set cartItems = new HashSet<>(); + cartItems = cart.getItems(); + Assert.assertNull(cartItems); + Items item1 = new Items(); + item1.setItemId("I10"); + item1.setItemTotal(10); + item1.setQuantity(1); + item1.setCart(cart); + assertNotNull(item1); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + assertNotNull(itemsSet); + cart.setItems(itemsSet); + assertNotNull(cart); + session.persist(cart); + session.getTransaction().commit(); + session.close(); - @Test - public void testAddItemsToCart() { - Cart cart = new Cart(); - Set cartItems = new HashSet<>(); - cartItems = cart.getItems(); - Assert.assertNull(cartItems); - Items item1 = new Items("I10", 10, 1, cart); - assertNotNull(item1); - Set itemsSet = new HashSet(); - cart.setItems(itemsSet); - assertNotNull(cart); - System.out.println("Items added to cart"); + session = sessionFactory.openSession(); + session.beginTransaction(); + cart = (Cart) session.get(Cart.class, new Long(1)); + assertNotNull(cart); + } - } + @After + public void tearDown() { + session.getTransaction().commit(); + session.close(); + } - @Test - public void givenSession_checkIfDatabaseIsPopulated_afterCommit() { - Cart cart = new Cart(); - Set cartItems = new HashSet<>(); - cartItems = cart.getItems(); - Assert.assertNull(cartItems); - Items item1 = new Items(); - item1.setItemId("I10"); - item1.setItemTotal(10); - item1.setQuantity(1); - item1.setCart(cart); - assertNotNull(item1); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - assertNotNull(itemsSet); - cart.setItems(itemsSet); - assertNotNull(cart); - session.persist(cart); - session.getTransaction().commit(); - cart = (Cart) session.get(Cart.class, new Long(1)); - assertNotNull(cart); - session.close(); - - } + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } } From 1bf70b8f088ca90d644ca5d9e900648185718cf9 Mon Sep 17 00:00:00 2001 From: dhruba619 Date: Sun, 5 Feb 2017 00:46:21 +0530 Subject: [PATCH 015/192] BAEL-183 JUnit vs TestNG --- .../test/comparison/DependentTests.java | 46 ++++++++ .../comparison/MyParameterisedUnitTest.java | 50 +++++++++ .../comparison/MyParameterisedUnitTestNg.java | 80 ++++++++++++++ .../com/baeldung/test/comparison/MyTest1.java | 12 +++ .../com/baeldung/test/comparison/MyTest2.java | 10 ++ .../com/baeldung/test/comparison/MyTest5.java | 13 +++ .../test/comparison/RegistrationTest.java | 11 ++ .../baeldung/test/comparison/SignInTest.java | 12 +++ .../test/comparison/SummationServiceTest.java | 60 +++++++++++ .../SummationServiceTestTestNg.java | 101 ++++++++++++++++++ .../baeldung/test/comparison/TimeOutTest.java | 10 ++ .../src/test/resources/parameterised_test.xml | 10 ++ core-java/src/test/resources/test_group.xml | 13 +++ core-java/src/test/resources/test_suite.xml | 9 ++ 14 files changed, 437 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyTest1.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyTest2.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyTest5.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/RegistrationTest.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/SignInTest.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTest.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java create mode 100644 core-java/src/test/resources/parameterised_test.xml create mode 100644 core-java/src/test/resources/test_group.xml create mode 100644 core-java/src/test/resources/test_suite.xml diff --git a/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java b/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java new file mode 100644 index 0000000000..6b0394a368 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java @@ -0,0 +1,46 @@ +package com.baeldung.test.comparison; + +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class DependentTests { + + private EmailValidator emailValidator; + private LoginValidator loginValidator; + private String validEmail = "abc@qwe.com"; + + @BeforeClass + public void setup(){ + emailValidator = new EmailValidator(); + loginValidator = new LoginValidator(); + } + + @Test + public void validEmailTest() { + boolean valid = emailValidator.validate(validEmail); + Assert.assertEquals(valid, true); + } + + @Test(dependsOnMethods={"validEmailTest"}) + public void validateLogin() { + boolean valid = loginValidator.validate(); + Assert.assertEquals(valid, true); + } +} + +class EmailValidator{ + + public boolean validate(String validEmail) { + return true; + } + +} + +class LoginValidator{ + + public boolean validate() { + return true; + } + +} diff --git a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java new file mode 100644 index 0000000000..9e63956556 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.test.comparison; + +import java.util.Arrays; +import java.util.Collection; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(value = Parameterized.class) +public class MyParameterisedUnitTest { + + private String name; + private NameCheck nameCheck; + + @Before + public void initialSetup() { + nameCheck = new NameCheck(); + } + + public MyParameterisedUnitTest(String myName) { + this.name = myName; + } + + @Parameters + public static Collection data() { + Object[][] data + = new Object[][] { { "Peter" }, { "Sam" }, { "Tim" }, { "Lucy" } }; + return Arrays.asList(data); + } + + @Test + public void pushNameTest() { + boolean valid = nameCheck.nameCheck(name); + Assert.assertEquals(valid, true); + } +} + +class NameCheck{ + + public boolean nameCheck(String name) { + if(name.length()>0) + return true; + return false; + } + +} diff --git a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java new file mode 100644 index 0000000000..d5e4465b3d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java @@ -0,0 +1,80 @@ +package com.baeldung.test.comparison; + +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Parameters; +import org.testng.annotations.Test; + +public class MyParameterisedUnitTestNg { + + private PrimeNumberCheck primeNumberChecker; + + @BeforeClass + public void intialSetup(){ + primeNumberChecker = new PrimeNumberCheck(); + } + + @Test(enabled=false) + @Parameters({"num","expectedResult"}) + public void parameterCheckTest(int number,boolean expectedResult) { + Assert.assertEquals(expectedResult, + primeNumberChecker.validate(number)); + } + + @DataProvider(name = "test1") + public static Object[][] primeNumbers() { + return new Object[][] { + {2, true}, {6, false}, {19, true}, {22, false}, {23, true}}; + } + + @Test(dataProvider = "test1") + public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) { + Assert.assertEquals(expectedResult, + primeNumberChecker.validate(inputNumber)); + } + + @Test(dataProvider = "myDataProvider") + public void parameterCheckTest(User user) { + Assert.assertEquals("sam",user.getName()); + Assert.assertEquals(12,user.getAge()); + } + + @DataProvider(name = "myDataProvider") + public Object[][] parameterProvider() { + User usr = new User(); + usr.setName("sam"); + usr.setAge(12); + return new Object[][]{{usr}}; + } + +} + +class PrimeNumberCheck{ + + public Object validate(int number) { + for(int i=2;i numbers; + + @BeforeClass + public static void initialize() { + numbers = new ArrayList<>(); + } + + @AfterClass + public static void tearDown() { + numbers = null; + } + + @Before + public void runBeforeEachTest() { + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + @After + public void runAfterEachTest() { + numbers.clear(); + } + + @Test + public void givenNumbers_sumEquals_thenCorrect() { + int sum = 0; + for (int num : numbers) + sum += num; + Assert.assertEquals(6, sum); + } + + @Ignore + @Test + public void givenEmptyList_sumEqualsZero_thenCorrect(){ + int sum = 0; + for (int num : numbers) + sum += num; + Assert.assertEquals(6, sum); + } + + @Test(expected = ArithmeticException.class) + public void calculateWithException() { + int i = 1/0; + } +} diff --git a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java b/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java new file mode 100644 index 0000000000..aecc790374 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java @@ -0,0 +1,101 @@ +package com.baeldung.test.comparison; + +import java.util.ArrayList; +import java.util.List; + +import org.testng.Assert; +import org.testng.TestNG; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterGroups; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeGroups; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class SummationServiceTestTestNg extends TestNG{ + + private List numbers; + + private int testCount=0; + + @BeforeClass + public void initialize() { + numbers = new ArrayList<>(); + } + + @AfterClass + public void tearDown() { + numbers = null; + } + + @BeforeMethod + public void runBeforeEachTest() { + testCount++; + } + + @AfterMethod + public void runAfterEachTest() { + + } + + @BeforeGroups("negative_tests") + public void runBeforeEachNegativeGroup() { + numbers.clear(); + } + + @BeforeGroups("regression") + public void runBeforeEachRegressionGroup() { + numbers.add(-11); + numbers.add(2); + } + + @BeforeGroups("positive_tests") + public void runBeforeEachPositiveGroup() { + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + @AfterGroups("positive_tests,regression,negative_tests") + public void runAfterEachGroup() { + numbers.clear(); + } + + @Test(groups="positive_tests",enabled=false) + public void givenNumbers_sumEquals_thenCorrect() { + int sum = 0; + for (int num : numbers) + sum += num; + Assert.assertEquals(sum, 6); + } + + @Test(groups="negative_tests") + public void givenEmptyList_sumEqualsZero_thenCorrect(){ + int sum = 0; + for (int num : numbers) + sum += num; + Assert.assertEquals(0, sum); + } + + @Test(groups = "regression") + public void givenNegativeNumber_sumLessthanZero_thenCorrect() { + int sum = 0; + for (int num : numbers) + sum += num; + System.out.println(sum); + Assert.assertTrue(sum<0);; + } + + @Test(groups="sanity") + public void givenNumbers_doSum(){ + + } + + @Test(expectedExceptions = ArithmeticException.class) + public void calculateWithException() { + int i = 1/0; + } + + +} diff --git a/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java b/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java new file mode 100644 index 0000000000..baf2db9521 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java @@ -0,0 +1,10 @@ +package com.baeldung.test.comparison; + +import org.testng.annotations.Test; + +public class TimeOutTest { + @Test(timeOut = 1000,enabled=false) + public void testInfinity() { + while (true); + } +} diff --git a/core-java/src/test/resources/parameterised_test.xml b/core-java/src/test/resources/parameterised_test.xml new file mode 100644 index 0000000000..69a2c60460 --- /dev/null +++ b/core-java/src/test/resources/parameterised_test.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core-java/src/test/resources/test_group.xml b/core-java/src/test/resources/test_group.xml new file mode 100644 index 0000000000..0c9a6c73df --- /dev/null +++ b/core-java/src/test/resources/test_group.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java/src/test/resources/test_suite.xml b/core-java/src/test/resources/test_suite.xml new file mode 100644 index 0000000000..36305aa5fc --- /dev/null +++ b/core-java/src/test/resources/test_suite.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file From 791142c67e2f38b4eade3f82a6442253365f6625 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 4 Feb 2017 21:56:11 +0200 Subject: [PATCH 016/192] cleanup and testing work --- .../com/baeldung/algorithms/RunAlgorithm.java | 47 +++-- .../algorithms/ga/binary/Individual.java | 60 +++--- .../algorithms/ga/binary/Population.java | 50 ++--- .../ga/binary/SimpleGeneticAlgorithm.java | 192 +++++++++--------- .../concurrent/future/SquareCalculator.java | 2 +- .../baeldung/CharArrayToStringUnitTest.java | 44 ++-- .../baeldung/StringToCharArrayUnitTest.java | 14 +- .../BinaryGeneticAlgorithmTest.java | 16 -- .../BinaryGeneticAlgorithmUnitTest.java | 15 ++ .../PriorityBlockingQueueUnitTest.java | 15 +- .../ConcurrentNavigableMapTests.java | 4 +- .../ThreadPoolInParallelStreamTest.java | 23 +-- log-mdc/pom.xml | 4 +- ... ExternalPropertiesWithXmlManualTest.java} | 2 +- ...t.java => SpringRetryIntegrationTest.java} | 2 +- ...readPoolTaskSchedulerIntegrationTest.java} | 3 +- .../baeldung/test/IntegrationTestSuite.java | 4 +- ...BeanNameMappingConfigIntegrationTest.java} | 2 +- ...assNameHandlerMappingIntegrationTest.java} | 2 +- ...rMappingDefaultConfigIntegrationTest.java} | 14 +- ...MappingPriorityConfigIntegrationTest.java} | 2 +- ...impleUrlMappingConfigIntegrationTest.java} | 2 +- 22 files changed, 256 insertions(+), 263 deletions(-) delete mode 100644 core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java create mode 100644 core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java rename spring-all/src/test/java/org/baeldung/properties/external/{ExternalPropertiesWithXmlIntegrationTest.java => ExternalPropertiesWithXmlManualTest.java} (95%) rename spring-all/src/test/java/org/baeldung/springretry/{SpringRetryTest.java => SpringRetryIntegrationTest.java} (96%) rename spring-all/src/test/java/org/baeldung/taskscheduler/{ThreadPoolTaskSchedulerTest.java => ThreadPoolTaskSchedulerIntegrationTest.java} (90%) rename spring-mvc-java/src/test/java/com/baeldung/handlermappings/{BeanNameMappingConfigTest.java => BeanNameMappingConfigIntegrationTest.java} (96%) rename spring-mvc-java/src/test/java/com/baeldung/handlermappings/{ControllerClassNameHandlerMappingTest.java => ControllerClassNameHandlerMappingIntegrationTest.java} (96%) rename spring-mvc-java/src/test/java/com/baeldung/handlermappings/{HandlerMappingDefaultConfigTest.java => HandlerMappingDefaultConfigIntegrationTest.java} (93%) rename spring-mvc-java/src/test/java/com/baeldung/handlermappings/{HandlerMappingPriorityConfigTest.java => HandlerMappingPriorityConfigIntegrationTest.java} (96%) rename spring-mvc-java/src/test/java/com/baeldung/handlermappings/{SimpleUrlMappingConfigTest.java => SimpleUrlMappingConfigIntegrationTest.java} (96%) diff --git a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java index 6d696dd272..476e873f90 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java +++ b/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java @@ -8,29 +8,28 @@ import com.baeldung.algorithms.slope_one.SlopeOne; public class RunAlgorithm { - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - System.out.println("Run algorithm:"); - System.out.println("1 - Simulated Annealing"); - System.out.println("2 - Slope One"); - System.out.println("3 - Simple Genetic Algorithm"); - int decision = in.nextInt(); - switch (decision) { - case 1: - System.out.println( - "Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995)); - break; - case 2: - SlopeOne.slopeOne(3); - break; - case 3: - SimpleGeneticAlgorithm.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111"); - break; - default: - System.out.println("Unknown option"); - break; - } - in.close(); - } + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.println("Run algorithm:"); + System.out.println("1 - Simulated Annealing"); + System.out.println("2 - Slope One"); + System.out.println("3 - Simple Genetic Algorithm"); + int decision = in.nextInt(); + switch (decision) { + case 1: + System.out.println("Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995)); + break; + case 2: + SlopeOne.slopeOne(3); + break; + case 3: + SimpleGeneticAlgorithm.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111"); + break; + default: + System.out.println("Unknown option"); + break; + } + in.close(); + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java index e9b6c8f66a..2a740777f3 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java @@ -5,40 +5,40 @@ import lombok.Data; @Data public class Individual { - protected int defaultGeneLength = 64; - private byte[] genes = new byte[defaultGeneLength]; - private int fitness = 0; + protected int defaultGeneLength = 64; + private byte[] genes = new byte[defaultGeneLength]; + private int fitness = 0; - public Individual() { - for (int i = 0; i < genes.length; i++) { - byte gene = (byte) Math.round(Math.random()); - genes[i] = gene; - } - } + public Individual() { + for (int i = 0; i < genes.length; i++) { + byte gene = (byte) Math.round(Math.random()); + genes[i] = gene; + } + } - protected byte getSingleGene(int index) { - return genes[index]; - } + protected byte getSingleGene(int index) { + return genes[index]; + } - protected void setSingleGene(int index, byte value) { - genes[index] = value; - fitness = 0; - } + protected void setSingleGene(int index, byte value) { + genes[index] = value; + fitness = 0; + } - public int getFitness() { - if (fitness == 0) { - fitness = SimpleGeneticAlgorithm.getFitness(this); - } - return fitness; - } + public int getFitness() { + if (fitness == 0) { + fitness = SimpleGeneticAlgorithm.getFitness(this); + } + return fitness; + } - @Override - public String toString() { - String geneString = ""; - for (int i = 0; i < genes.length; i++) { - geneString += getSingleGene(i); - } - return geneString; - } + @Override + public String toString() { + String geneString = ""; + for (int i = 0; i < genes.length; i++) { + geneString += getSingleGene(i); + } + return geneString; + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java index dbd1e04e0f..47677d7d88 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java @@ -8,33 +8,33 @@ import lombok.Data; @Data public class Population { - private List individuals; + private List individuals; - public Population(int size, boolean createNew) { - individuals = new ArrayList<>(); - if (createNew) { - createNewPopulation(size); - } - } + public Population(int size, boolean createNew) { + individuals = new ArrayList<>(); + if (createNew) { + createNewPopulation(size); + } + } - protected Individual getIndividual(int index) { - return individuals.get(index); - } + protected Individual getIndividual(int index) { + return individuals.get(index); + } - protected Individual getFittest() { - Individual fittest = individuals.get(0); - for (int i = 0; i < individuals.size(); i++) { - if (fittest.getFitness() <= getIndividual(i).getFitness()) { - fittest = getIndividual(i); - } - } - return fittest; - } + protected Individual getFittest() { + Individual fittest = individuals.get(0); + for (int i = 0; i < individuals.size(); i++) { + if (fittest.getFitness() <= getIndividual(i).getFitness()) { + fittest = getIndividual(i); + } + } + return fittest; + } - private void createNewPopulation(int size) { - for (int i = 0; i < size; i++) { - Individual newIndividual = new Individual(); - individuals.add(i, newIndividual); - } - } + private void createNewPopulation(int size) { + for (int i = 0; i < size; i++) { + Individual newIndividual = new Individual(); + individuals.add(i, newIndividual); + } + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java index 0f640e676a..c7e2a6b381 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java @@ -5,115 +5,113 @@ import lombok.Data; @Data public class SimpleGeneticAlgorithm { - private static final double uniformRate = 0.5; - private static final double mutationRate = 0.025; - private static final int tournamentSize = 5; - private static final boolean elitism = true; - private static byte[] solution = new byte[64]; + private static final double uniformRate = 0.5; + private static final double mutationRate = 0.025; + private static final int tournamentSize = 5; + private static final boolean elitism = true; + private static byte[] solution = new byte[64]; - public static boolean runAlgorithm(int populationSize, String solution) { - if (solution.length() != SimpleGeneticAlgorithm.solution.length) { - throw new RuntimeException( - "The solution needs to have " + SimpleGeneticAlgorithm.solution.length + " bytes"); - } - SimpleGeneticAlgorithm.setSolution(solution); - Population myPop = new Population(populationSize, true); + public static boolean runAlgorithm(int populationSize, String solution) { + if (solution.length() != SimpleGeneticAlgorithm.solution.length) { + throw new RuntimeException("The solution needs to have " + SimpleGeneticAlgorithm.solution.length + " bytes"); + } + SimpleGeneticAlgorithm.setSolution(solution); + Population myPop = new Population(populationSize, true); - int generationCount = 1; - while (myPop.getFittest().getFitness() < SimpleGeneticAlgorithm.getMaxFitness()) { - System.out.println( - "Generation: " + generationCount + " Correct genes found: " + myPop.getFittest().getFitness()); - myPop = SimpleGeneticAlgorithm.evolvePopulation(myPop); - generationCount++; - } - System.out.println("Solution found!"); - System.out.println("Generation: " + generationCount); - System.out.println("Genes: "); - System.out.println(myPop.getFittest()); - return true; - } + int generationCount = 1; + while (myPop.getFittest().getFitness() < SimpleGeneticAlgorithm.getMaxFitness()) { + System.out.println("Generation: " + generationCount + " Correct genes found: " + myPop.getFittest().getFitness()); + myPop = SimpleGeneticAlgorithm.evolvePopulation(myPop); + generationCount++; + } + System.out.println("Solution found!"); + System.out.println("Generation: " + generationCount); + System.out.println("Genes: "); + System.out.println(myPop.getFittest()); + return true; + } - public static Population evolvePopulation(Population pop) { - int elitismOffset; - Population newPopulation = new Population(pop.getIndividuals().size(), false); + public static Population evolvePopulation(Population pop) { + int elitismOffset; + Population newPopulation = new Population(pop.getIndividuals().size(), false); - if (elitism) { - newPopulation.getIndividuals().add(0, pop.getFittest()); - elitismOffset = 1; - } else { - elitismOffset = 0; - } + if (elitism) { + newPopulation.getIndividuals().add(0, pop.getFittest()); + elitismOffset = 1; + } else { + elitismOffset = 0; + } - for (int i = elitismOffset; i < pop.getIndividuals().size(); i++) { - Individual indiv1 = tournamentSelection(pop); - Individual indiv2 = tournamentSelection(pop); - Individual newIndiv = crossover(indiv1, indiv2); - newPopulation.getIndividuals().add(i, newIndiv); - } + for (int i = elitismOffset; i < pop.getIndividuals().size(); i++) { + Individual indiv1 = tournamentSelection(pop); + Individual indiv2 = tournamentSelection(pop); + Individual newIndiv = crossover(indiv1, indiv2); + newPopulation.getIndividuals().add(i, newIndiv); + } - for (int i = elitismOffset; i < newPopulation.getIndividuals().size(); i++) { - mutate(newPopulation.getIndividual(i)); - } + for (int i = elitismOffset; i < newPopulation.getIndividuals().size(); i++) { + mutate(newPopulation.getIndividual(i)); + } - return newPopulation; - } + return newPopulation; + } - private static Individual crossover(Individual indiv1, Individual indiv2) { - Individual newSol = new Individual(); - for (int i = 0; i < newSol.getDefaultGeneLength(); i++) { - if (Math.random() <= uniformRate) { - newSol.setSingleGene(i, indiv1.getSingleGene(i)); - } else { - newSol.setSingleGene(i, indiv2.getSingleGene(i)); - } - } - return newSol; - } + private static Individual crossover(Individual indiv1, Individual indiv2) { + Individual newSol = new Individual(); + for (int i = 0; i < newSol.getDefaultGeneLength(); i++) { + if (Math.random() <= uniformRate) { + newSol.setSingleGene(i, indiv1.getSingleGene(i)); + } else { + newSol.setSingleGene(i, indiv2.getSingleGene(i)); + } + } + return newSol; + } - private static void mutate(Individual indiv) { - for (int i = 0; i < indiv.getDefaultGeneLength(); i++) { - if (Math.random() <= mutationRate) { - byte gene = (byte) Math.round(Math.random()); - indiv.setSingleGene(i, gene); - } - } - } + private static void mutate(Individual indiv) { + for (int i = 0; i < indiv.getDefaultGeneLength(); i++) { + if (Math.random() <= mutationRate) { + byte gene = (byte) Math.round(Math.random()); + indiv.setSingleGene(i, gene); + } + } + } - private static Individual tournamentSelection(Population pop) { - Population tournament = new Population(tournamentSize, false); - for (int i = 0; i < tournamentSize; i++) { - int randomId = (int) (Math.random() * pop.getIndividuals().size()); - tournament.getIndividuals().add(i, pop.getIndividual(randomId)); - } - Individual fittest = tournament.getFittest(); - return fittest; - } + private static Individual tournamentSelection(Population pop) { + Population tournament = new Population(tournamentSize, false); + for (int i = 0; i < tournamentSize; i++) { + int randomId = (int) (Math.random() * pop.getIndividuals().size()); + tournament.getIndividuals().add(i, pop.getIndividual(randomId)); + } + Individual fittest = tournament.getFittest(); + return fittest; + } - protected static int getFitness(Individual individual) { - int fitness = 0; - for (int i = 0; i < individual.getDefaultGeneLength() && i < solution.length; i++) { - if (individual.getSingleGene(i) == solution[i]) { - fitness++; - } - } - return fitness; - } + protected static int getFitness(Individual individual) { + int fitness = 0; + for (int i = 0; i < individual.getDefaultGeneLength() && i < solution.length; i++) { + if (individual.getSingleGene(i) == solution[i]) { + fitness++; + } + } + return fitness; + } - protected static int getMaxFitness() { - int maxFitness = solution.length; - return maxFitness; - } + protected static int getMaxFitness() { + int maxFitness = solution.length; + return maxFitness; + } - protected static void setSolution(String newSolution) { - solution = new byte[newSolution.length()]; - for (int i = 0; i < newSolution.length(); i++) { - String character = newSolution.substring(i, i + 1); - if (character.contains("0") || character.contains("1")) { - solution[i] = Byte.parseByte(character); - } else { - solution[i] = 0; - } - } - } + protected static void setSolution(String newSolution) { + solution = new byte[newSolution.length()]; + for (int i = 0; i < newSolution.length(); i++) { + String character = newSolution.substring(i, i + 1); + if (character.contains("0") || character.contains("1")) { + solution[i] = Byte.parseByte(character); + } else { + solution[i] = 0; + } + } + } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java b/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java index e53a2413d1..bcd559dd3b 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java +++ b/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java @@ -15,6 +15,6 @@ public class SquareCalculator { return executor.submit(() -> { Thread.sleep(1000); return input * input; - }); + }); } } diff --git a/core-java/src/test/java/com/baeldung/CharArrayToStringUnitTest.java b/core-java/src/test/java/com/baeldung/CharArrayToStringUnitTest.java index 2f7830bbf4..3488f8b390 100644 --- a/core-java/src/test/java/com/baeldung/CharArrayToStringUnitTest.java +++ b/core-java/src/test/java/com/baeldung/CharArrayToStringUnitTest.java @@ -8,55 +8,55 @@ public class CharArrayToStringUnitTest { @Test public void givenCharArray_whenCallingStringConstructor_shouldConvertToString() { - char[] charArray = {'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r'}; + char[] charArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r' }; String result = new String(charArray); String expectedValue = "character"; - + assertEquals(expectedValue, result); } - + @Test - public void givenCharArray_whenCallingStringConstructorWithOffsetAndLength_shouldConvertToString(){ - char[] charArray = {'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r'}; + public void givenCharArray_whenCallingStringConstructorWithOffsetAndLength_shouldConvertToString() { + char[] charArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r' }; String result = new String(charArray, 4, 3); String expectedValue = "act"; - + assertEquals(expectedValue, result); } - + @Test - public void givenCharArray_whenCallingStringCopyValueOf_shouldConvertToString(){ - char[] charArray = {'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r'}; + public void givenCharArray_whenCallingStringCopyValueOf_shouldConvertToString() { + char[] charArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r' }; String result = String.copyValueOf(charArray); String expectedValue = "character"; - + assertEquals(expectedValue, result); } - + @Test - public void givenCharArray_whenCallingStringCopyValueOfWithOffsetAndLength_shouldConvertToString(){ - char[] charArray = {'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r'}; + public void givenCharArray_whenCallingStringCopyValueOfWithOffsetAndLength_shouldConvertToString() { + char[] charArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r' }; String result = String.copyValueOf(charArray, 0, 4); String expectedValue = "char"; - + assertEquals(expectedValue, result); } - + @Test - public void givenCharArray_whenCallingStringValueOf_shouldConvertToString(){ - char[] charArray = {'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r'}; + public void givenCharArray_whenCallingStringValueOf_shouldConvertToString() { + char[] charArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r' }; String result = String.valueOf(charArray); String expectedValue = "character"; - + assertEquals(expectedValue, result); } - + @Test - public void givenCharArray_whenCallingStringValueOfWithOffsetAndLength_shouldConvertToString(){ - char[] charArray = {'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r'}; + public void givenCharArray_whenCallingStringValueOfWithOffsetAndLength_shouldConvertToString() { + char[] charArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r' }; String result = String.valueOf(charArray, 3, 4); String expectedValue = "ract"; - + assertEquals(expectedValue, result); } } diff --git a/core-java/src/test/java/com/baeldung/StringToCharArrayUnitTest.java b/core-java/src/test/java/com/baeldung/StringToCharArrayUnitTest.java index 2e7dc24a17..cd996e58e2 100644 --- a/core-java/src/test/java/com/baeldung/StringToCharArrayUnitTest.java +++ b/core-java/src/test/java/com/baeldung/StringToCharArrayUnitTest.java @@ -6,15 +6,15 @@ import org.junit.Test; public class StringToCharArrayUnitTest { -@Test -public void givenString_whenCallingStringToCharArray_shouldConvertToCharArray() { - String givenString = "characters"; + @Test + public void givenString_whenCallingStringToCharArray_shouldConvertToCharArray() { + String givenString = "characters"; - char[] result = givenString.toCharArray(); + char[] result = givenString.toCharArray(); - char[] expectedCharArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r', 's' }; + char[] expectedCharArray = { 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r', 's' }; - assertArrayEquals(expectedCharArray, result); -} + assertArrayEquals(expectedCharArray, result); + } } diff --git a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java deleted file mode 100644 index 8a16311dfb..0000000000 --- a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.algorithms; - -import org.junit.Assert; -import org.junit.Test; - -import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm; - -public class BinaryGeneticAlgorithmTest { - - @Test - public void testGA() { - Assert.assertTrue(SimpleGeneticAlgorithm.runAlgorithm(50, - "1011000100000100010000100000100111001000000100000100000000001111")); - } - -} diff --git a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java new file mode 100644 index 0000000000..6b720898eb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.algorithms; + +import org.junit.Assert; +import org.junit.Test; + +import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm; + +public class BinaryGeneticAlgorithmUnitTest { + + @Test + public void testGA() { + Assert.assertTrue(SimpleGeneticAlgorithm.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111")); + } + +} diff --git a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java b/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java index 5e6855e18a..0272726465 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueUnitTest.java @@ -32,13 +32,14 @@ public class PriorityBlockingQueueUnitTest { PriorityBlockingQueue queue = new PriorityBlockingQueue<>(); final Thread thread = new Thread(() -> { - System.out.println("Polling..."); - while (true) { - try { - Integer poll = queue.take(); - System.out.println("Polled: " + poll); - } catch (InterruptedException e) {} - } + System.out.println("Polling..."); + while (true) { + try { + Integer poll = queue.take(); + System.out.println("Polled: " + poll); + } catch (InterruptedException e) { + } + } }); thread.start(); diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java index 93087626a4..96a8a6bac3 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java @@ -18,9 +18,7 @@ public class ConcurrentNavigableMapTests { updateMapConcurrently(skipListMap, 4); - Iterator skipListIter = skipListMap - .keySet() - .iterator(); + Iterator skipListIter = skipListMap.keySet().iterator(); int previous = skipListIter.next(); while (skipListIter.hasNext()) { int current = skipListIter.next(); diff --git a/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java b/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java index 5fd3fa4cb0..c2eb1cff5d 100644 --- a/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java +++ b/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java @@ -1,5 +1,5 @@ package org.baeldung.java.streams; - + import org.junit.Test; import java.util.ArrayList; @@ -14,28 +14,25 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class ThreadPoolInParallelStreamTest { - + @Test - public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() - throws InterruptedException, ExecutionException { + public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() throws InterruptedException, ExecutionException { long firstNum = 1; long lastNum = 1_000_000; - List aList = LongStream.rangeClosed(firstNum, lastNum).boxed() - .collect(Collectors.toList()); + List aList = LongStream.rangeClosed(firstNum, lastNum).boxed().collect(Collectors.toList()); ForkJoinPool customThreadPool = new ForkJoinPool(4); - long actualTotal = customThreadPool.submit(() -> aList.parallelStream() - .reduce(0L, Long::sum)).get(); - - assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal); + long actualTotal = customThreadPool.submit(() -> aList.parallelStream().reduce(0L, Long::sum)).get(); + + assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal); } - + @Test - public void givenList_whenCallingParallelStream_shouldBeParallelStream(){ + public void givenList_whenCallingParallelStream_shouldBeParallelStream() { List aList = new ArrayList<>(); Stream parallelStream = aList.parallelStream(); - + assertTrue(parallelStream.isParallel()); } } diff --git a/log-mdc/pom.xml b/log-mdc/pom.xml index 28c8bb820e..931e68a178 100644 --- a/log-mdc/pom.xml +++ b/log-mdc/pom.xml @@ -2,9 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - logmdc + log-mdc 0.0.1-SNAPSHOT - logmdc + log-mdc war tutorial on logging with MDC and NDC diff --git a/spring-all/src/test/java/org/baeldung/properties/external/ExternalPropertiesWithXmlIntegrationTest.java b/spring-all/src/test/java/org/baeldung/properties/external/ExternalPropertiesWithXmlManualTest.java similarity index 95% rename from spring-all/src/test/java/org/baeldung/properties/external/ExternalPropertiesWithXmlIntegrationTest.java rename to spring-all/src/test/java/org/baeldung/properties/external/ExternalPropertiesWithXmlManualTest.java index 2ea2822b9a..a8a7bda91c 100644 --- a/spring-all/src/test/java/org/baeldung/properties/external/ExternalPropertiesWithXmlIntegrationTest.java +++ b/spring-all/src/test/java/org/baeldung/properties/external/ExternalPropertiesWithXmlManualTest.java @@ -13,7 +13,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { ExternalPropertiesWithXmlConfig.class }, loader = AnnotationConfigContextLoader.class) @Ignore("manual only") -public class ExternalPropertiesWithXmlIntegrationTest { +public class ExternalPropertiesWithXmlManualTest { @Autowired private Environment env; diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java similarity index 96% rename from spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java rename to spring-all/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java index 2f3411957e..d7d0943e6b 100644 --- a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java +++ b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java @@ -12,7 +12,7 @@ import java.sql.SQLException; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) -public class SpringRetryTest { +public class SpringRetryIntegrationTest { @Autowired private MyService myService; diff --git a/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java b/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java similarity index 90% rename from spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java rename to spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java index cc247cb384..d95857d384 100644 --- a/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java +++ b/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java @@ -8,7 +8,8 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { ThreadPoolTaskSchedulerConfig.class }, loader = AnnotationConfigContextLoader.class) -public class ThreadPoolTaskSchedulerTest { +public class ThreadPoolTaskSchedulerIntegrationTest { + @Test public void testThreadPoolTaskSchedulerAnnotation() throws InterruptedException { Thread.sleep(2550); diff --git a/spring-all/src/test/java/org/baeldung/test/IntegrationTestSuite.java b/spring-all/src/test/java/org/baeldung/test/IntegrationTestSuite.java index f9845f42a7..470ae9e538 100644 --- a/spring-all/src/test/java/org/baeldung/test/IntegrationTestSuite.java +++ b/spring-all/src/test/java/org/baeldung/test/IntegrationTestSuite.java @@ -5,7 +5,7 @@ import org.baeldung.properties.basic.PropertiesWithMultipleXmlsIntegrationTest; import org.baeldung.properties.basic.PropertiesWithXmlIntegrationTest; import org.baeldung.properties.external.ExternalPropertiesWithJavaIntegrationTest; import org.baeldung.properties.external.ExternalPropertiesWithMultipleXmlsIntegrationTest; -import org.baeldung.properties.external.ExternalPropertiesWithXmlIntegrationTest; +import org.baeldung.properties.external.ExternalPropertiesWithXmlManualTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @@ -15,7 +15,7 @@ import org.junit.runners.Suite.SuiteClasses; PropertiesWithXmlIntegrationTest.class, ExternalPropertiesWithJavaIntegrationTest.class, ExternalPropertiesWithMultipleXmlsIntegrationTest.class, - ExternalPropertiesWithXmlIntegrationTest.class, + ExternalPropertiesWithXmlManualTest.class, ExtendedPropertiesWithJavaIntegrationTest.class, PropertiesWithMultipleXmlsIntegrationTest.class, })// @formatter:on diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigIntegrationTest.java similarity index 96% rename from spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigIntegrationTest.java index f58e5cb0a1..f2c2c05f29 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigIntegrationTest.java @@ -22,7 +22,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = BeanNameUrlHandlerMappingConfig.class) -public class BeanNameMappingConfigTest { +public class BeanNameMappingConfigIntegrationTest { @Autowired private WebApplicationContext webAppContext; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingIntegrationTest.java similarity index 96% rename from spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingIntegrationTest.java index 6fdd168d0b..b84998470d 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingIntegrationTest.java @@ -22,7 +22,7 @@ import com.baeldung.config.ControllerClassNameHandlerMappingConfig; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = ControllerClassNameHandlerMappingConfig.class) -public class ControllerClassNameHandlerMappingTest { +public class ControllerClassNameHandlerMappingIntegrationTest { @Autowired private WebApplicationContext webAppContext; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigIntegrationTest.java similarity index 93% rename from spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigIntegrationTest.java index 01be65b829..cb89c01fed 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigIntegrationTest.java @@ -1,7 +1,10 @@ package com.baeldung.handlermappings; -import com.baeldung.config.HandlerMappingDefaultConfig; -import com.baeldung.config.HandlerMappingPrioritiesConfig; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -14,15 +17,12 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +import com.baeldung.config.HandlerMappingDefaultConfig; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = HandlerMappingDefaultConfig.class) -public class HandlerMappingDefaultConfigTest { +public class HandlerMappingDefaultConfigIntegrationTest { @Autowired private WebApplicationContext webAppContext; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigIntegrationTest.java similarity index 96% rename from spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigIntegrationTest.java index d6329ca6c1..55007aec28 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigIntegrationTest.java @@ -21,7 +21,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = HandlerMappingPrioritiesConfig.class) -public class HandlerMappingPriorityConfigTest { +public class HandlerMappingPriorityConfigIntegrationTest { @Autowired private WebApplicationContext webAppContext; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigIntegrationTest.java similarity index 96% rename from spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigIntegrationTest.java index 636339f152..ad35307330 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigIntegrationTest.java @@ -21,7 +21,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = SimpleUrlHandlerMappingConfig.class) -public class SimpleUrlMappingConfigTest { +public class SimpleUrlMappingConfigIntegrationTest { @Autowired private WebApplicationContext webAppContext; From b57cf0cf56b256f8fd27f009c50ace23082c0beb Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sun, 5 Feb 2017 02:46:35 +0530 Subject: [PATCH 017/192] spring requestmapping shortcuts (#1096) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java --- .../main/java/com/baeldung/Application.java | 7 +- .../RequestMappingShortcutsController.java | 47 ++++++++++ .../RequestMapingShortcutsUnitTest.java | 92 +++++++++++++++++++ 3 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/web/controller/RequestMappingShortcutsController.java create mode 100644 spring-mvc-java/src/test/java/com/baeldung/web/controller/RequestMapingShortcutsUnitTest.java diff --git a/spring-mobile/src/main/java/com/baeldung/Application.java b/spring-mobile/src/main/java/com/baeldung/Application.java index d384ab09b3..7275477b8d 100644 --- a/spring-mobile/src/main/java/com/baeldung/Application.java +++ b/spring-mobile/src/main/java/com/baeldung/Application.java @@ -6,9 +6,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + + } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/RequestMappingShortcutsController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/RequestMappingShortcutsController.java new file mode 100644 index 0000000000..5d4cbe9d78 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/RequestMappingShortcutsController.java @@ -0,0 +1,47 @@ +package com.baeldung.web.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class RequestMappingShortcutsController { + + @GetMapping("/get") + public @ResponseBody ResponseEntity get() { + return new ResponseEntity("GET Response", HttpStatus.OK); + } + + @GetMapping("/get/{id}") + public @ResponseBody ResponseEntity getById(@PathVariable String id) { + return new ResponseEntity("GET Response : " + id, HttpStatus.OK); + } + + @PostMapping("/post") + public @ResponseBody ResponseEntity post() { + return new ResponseEntity("POST Response", HttpStatus.OK); + } + + @PutMapping("/put") + public @ResponseBody ResponseEntity put() { + return new ResponseEntity("PUT Response", HttpStatus.OK); + } + + @DeleteMapping("/delete") + public @ResponseBody ResponseEntity delete() { + return new ResponseEntity("DELETE Response", HttpStatus.OK); + } + + @PatchMapping("/patch") + public @ResponseBody ResponseEntity patch() { + return new ResponseEntity("PATCH Response", HttpStatus.OK); + } + +} diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/RequestMapingShortcutsUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/RequestMapingShortcutsUnitTest.java new file mode 100644 index 0000000000..d02a7140b5 --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/web/controller/RequestMapingShortcutsUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.web.controller; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultMatcher; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.spring.web.config.WebConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = WebConfig.class) +public class RequestMapingShortcutsUnitTest { + + @Autowired + private WebApplicationContext ctx; + + private MockMvc mockMvc; + + @Before + public void setup () { + DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.ctx); + this.mockMvc = builder.build(); + } + + @Test + public void giventUrl_whenGetRequest_thenFindGetResponse() throws Exception { + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/get"); + + ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("GET Response"); + + this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk()); + + } + + @Test + public void giventUrl_whenPostRequest_thenFindPostResponse() throws Exception { + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post("/post"); + + ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("POST Response"); + + this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk()); + + } + + @Test + public void giventUrl_whenPutRequest_thenFindPutResponse() throws Exception { + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.put("/put"); + + ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("PUT Response"); + + this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk()); + + } + + @Test + public void giventUrl_whenDeleteRequest_thenFindDeleteResponse() throws Exception { + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.delete("/delete"); + + ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("DELETE Response"); + + this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk()); + + } + + @Test + public void giventUrl_whenPatchRequest_thenFindPatchResponse() throws Exception { + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/patch"); + + ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("PATCH Response"); + + this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk()); + + } + +} From c7203bd564f840f528d5146035f2877b613e742a Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 25 Jan 2017 23:06:22 +0100 Subject: [PATCH 018/192] BAEL-614 base module for cache-control --- spring-security-cache-control/pom.xml | 49 +++++++++++++++++++ .../cachecontrol/ResourceEndpoint.java | 35 +++++++++++++ .../baeldung/cachecontrol/app/AppRunner.java | 12 +++++ .../config/SpringSecurityConfig.java | 22 +++++++++ .../cachecontrol/config/WebConfiguration.java | 21 ++++++++ .../cachecontrol/model/TimestampDto.java | 10 ++++ .../baeldung/cachecontrol/model/UserDto.java | 11 +++++ 7 files changed, 160 insertions(+) create mode 100644 spring-security-cache-control/pom.xml create mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java create mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java create mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java create mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java create mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/TimestampDto.java create mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/UserDto.java diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml new file mode 100644 index 0000000000..787804e3fe --- /dev/null +++ b/spring-security-cache-control/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.baeldung + spring-security-cache-control + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.security + spring-security-core + + + org.springframework.security + spring-security-config + + + org.springframework.security + spring-security-web + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + + + + + 3.1.0 + + + \ No newline at end of file diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java new file mode 100644 index 0000000000..7a9860922c --- /dev/null +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -0,0 +1,35 @@ +package com.baeldung.cachecontrol; + + +import com.baeldung.cachecontrol.model.TimestampDto; +import com.baeldung.cachecontrol.model.UserDto; +import org.springframework.http.CacheControl; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.concurrent.TimeUnit; + +@RestController +public class ResourceEndpoint { + + @RequestMapping(value = "/users/{name}", method = RequestMethod.GET) + public ResponseEntity getUser(@PathVariable(value = "name") String name) { + return ResponseEntity.ok() + .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) + .body(new UserDto(name)); + } + + + @RequestMapping(value = "/timestamp", method = RequestMethod.GET) + public ResponseEntity getServerTimestamp() { + return ResponseEntity.ok() + .cacheControl(CacheControl.noStore()) + .cacheControl(CacheControl.noCache()) + .body(new TimestampDto(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli())); + } +} diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java new file mode 100644 index 0000000000..1da69f40ec --- /dev/null +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java @@ -0,0 +1,12 @@ +package com.baeldung.cachecontrol.app; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppRunner { + public static void main(String[] args) { + SpringApplication.run(AppRunner.class, args); + } +} \ No newline at end of file diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java new file mode 100644 index 0000000000..789d2132f3 --- /dev/null +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.cachecontrol.config; + + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .anyRequest().permitAll() + .and().headers() + .defaultsDisabled() + .cacheControl(); + } +} diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java new file mode 100644 index 0000000000..decc57ec8b --- /dev/null +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java @@ -0,0 +1,21 @@ +package com.baeldung.cachecontrol.config; + +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.util.concurrent.TimeUnit; + +@EnableWebMvc +public class WebConfiguration extends WebMvcConfigurerAdapter { + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry + .addResourceHandler("/resources/**") + .addResourceLocations("/resources/") + .setCacheControl(CacheControl.maxAge(24, TimeUnit.HOURS)); + + } +} + diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/TimestampDto.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/TimestampDto.java new file mode 100644 index 0000000000..cb3befacac --- /dev/null +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/TimestampDto.java @@ -0,0 +1,10 @@ +package com.baeldung.cachecontrol.model; + + +public class TimestampDto { + public final Long timestamp; + + public TimestampDto(Long timestamp) { + this.timestamp = timestamp; + } +} diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/UserDto.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/UserDto.java new file mode 100644 index 0000000000..a41cb31d80 --- /dev/null +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/model/UserDto.java @@ -0,0 +1,11 @@ +package com.baeldung.cachecontrol.model; + + +public class UserDto { + public final String name; + + public UserDto(String name) { + this.name = name; + } + +} From 3fa1b93f87ebf1fe0222aeb388e122ded13aad25 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 26 Jan 2017 18:56:42 +0100 Subject: [PATCH 019/192] BAEL-614 appRunner in proper place --- .../java/com/baeldung/cachecontrol/{app => }/AppRunner.java | 2 +- .../main/java/com/baeldung/cachecontrol/ResourceEndpoint.java | 4 ++-- .../baeldung/cachecontrol/config/SpringSecurityConfig.java | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) rename spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/{app => }/AppRunner.java (87%) diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/AppRunner.java similarity index 87% rename from spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java rename to spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/AppRunner.java index 1da69f40ec..28ff90a570 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/app/AppRunner.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/AppRunner.java @@ -1,4 +1,4 @@ -package com.baeldung.cachecontrol.app; +package com.baeldung.cachecontrol; import org.springframework.boot.SpringApplication; diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java index 7a9860922c..34128e64fa 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -5,16 +5,16 @@ import com.baeldung.cachecontrol.model.TimestampDto; import com.baeldung.cachecontrol.model.UserDto; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.concurrent.TimeUnit; -@RestController +@Controller public class ResourceEndpoint { @RequestMapping(value = "/users/{name}", method = RequestMethod.GET) diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java index 789d2132f3..bd6d1a4aa1 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java @@ -2,12 +2,14 @@ package com.baeldung.cachecontrol.config; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override From 4bac6e057165e891f2e9aad057d86f6e1aa72ca8 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 26 Jan 2017 20:16:31 +0100 Subject: [PATCH 020/192] BAEL-614 endpoint that has default cache-control headers --- .../cachecontrol/ResourceEndpoint.java | 6 ++++++ .../cachecontrol/config/WebConfiguration.java | 21 ------------------- 2 files changed, 6 insertions(+), 21 deletions(-) delete mode 100644 spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java index 34128e64fa..86f9747e1c 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -32,4 +32,10 @@ public class ResourceEndpoint { .cacheControl(CacheControl.noCache()) .body(new TimestampDto(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli())); } + + @RequestMapping(value = "/private/users/{name}", method = RequestMethod.GET) + public ResponseEntity getUserNotCached(@PathVariable("name") String name) { + return ResponseEntity.ok() + .body(new UserDto(name)); + } } diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java deleted file mode 100644 index decc57ec8b..0000000000 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/WebConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.cachecontrol.config; - -import org.springframework.http.CacheControl; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -import java.util.concurrent.TimeUnit; - -@EnableWebMvc -public class WebConfiguration extends WebMvcConfigurerAdapter { - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry - .addResourceHandler("/resources/**") - .addResourceLocations("/resources/") - .setCacheControl(CacheControl.maxAge(24, TimeUnit.HOURS)); - - } -} - From 25111c5b893090f65306af5797883c23ab206cef Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 26 Jan 2017 20:18:23 +0100 Subject: [PATCH 021/192] BAEL-542 use defaults --- .../baeldung/cachecontrol/config/SpringSecurityConfig.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java index bd6d1a4aa1..fbb6399c22 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java @@ -14,10 +14,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .anyRequest().permitAll() - .and().headers() + http.headers() .defaultsDisabled() .cacheControl(); } From c3cc42f458e92afcad3a906513a1358f5ca8fb32 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 26 Jan 2017 20:34:40 +0100 Subject: [PATCH 022/192] BAEL-542 wrote live tests --- spring-security-cache-control/pom.xml | 35 ++++++++++++++ .../cachecontrol/ResourceEndpointTest.java | 47 +++++++++++++++++++ .../com/baeldung/cachecontrol/TestConfig.java | 11 +++++ 3 files changed, 93 insertions(+) create mode 100644 spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java create mode 100644 spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml index 787804e3fe..1d154f333d 100644 --- a/spring-security-cache-control/pom.xml +++ b/spring-security-cache-control/pom.xml @@ -40,10 +40,45 @@ javax.servlet-api ${javax.servlet-api.version} + + + junit + junit + test + + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + + org.mockito + mockito-core + test + + + + org.springframework + spring-test + + + + com.jayway.restassured + rest-assured + ${rest-assured.version} + 3.1.0 + 2.9.0 \ No newline at end of file diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java new file mode 100644 index 0000000000..d0a15efb2b --- /dev/null +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java @@ -0,0 +1,47 @@ +package com.baeldung.cachecontrol; + +import com.jayway.restassured.http.ContentType; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import static com.jayway.restassured.RestAssured.given; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) +public class ResourceEndpointTest { + private static final String URL_PREFIX = "http://localhost:8080"; + + @Test + public void givenServiceEndpoint_whenGetRequestForUser_shouldResponseWithCacheControlMaxAge() { + given() + .when() + .get(URL_PREFIX + "/users/Michael") + .then() + .contentType(ContentType.JSON).and().statusCode(200).and() + .header("Cache-Control", "max-age=60"); + } + + @Test + public void givenServiceEndpoint_whenGetRequestForNotCacheableContent_shouldResponseWithCacheControlNoCache() { + given() + .when() + .get(URL_PREFIX + "/timestamp") + .then() + .contentType(ContentType.JSON).and().statusCode(200).and() + .header("Cache-Control", "no-cache"); + } + + @Test + public void givenServiceEndpoint_whenGetRequestForPrivateUser_shouldResponseWithSecurityDefaultCacheControl() { + given() + .when() + .get(URL_PREFIX + "/private/users/Michael") + .then() + .contentType(ContentType.JSON).and().statusCode(200).and() + .header("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate"); + } + +} \ No newline at end of file diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java new file mode 100644 index 0000000000..af393f4b98 --- /dev/null +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java @@ -0,0 +1,11 @@ +package com.baeldung.cachecontrol; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@ComponentScan({ "com.baeldung" }) +public class TestConfig { + +} From cc70eae896402d889040758824230e37e88bf5cb Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 26 Jan 2017 21:47:52 +0100 Subject: [PATCH 023/192] BAEL-542 test fix --- .../cachecontrol/ResourceEndpoint.java | 1 - .../cachecontrol/ResourceEndpointTest.java | 20 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java index 86f9747e1c..f1c9786c68 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -29,7 +29,6 @@ public class ResourceEndpoint { public ResponseEntity getServerTimestamp() { return ResponseEntity.ok() .cacheControl(CacheControl.noStore()) - .cacheControl(CacheControl.noCache()) .body(new TimestampDto(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli())); } diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java index d0a15efb2b..e85dd11667 100644 --- a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java @@ -14,15 +14,15 @@ import static com.jayway.restassured.RestAssured.given; public class ResourceEndpointTest { private static final String URL_PREFIX = "http://localhost:8080"; - @Test - public void givenServiceEndpoint_whenGetRequestForUser_shouldResponseWithCacheControlMaxAge() { - given() - .when() - .get(URL_PREFIX + "/users/Michael") - .then() - .contentType(ContentType.JSON).and().statusCode(200).and() - .header("Cache-Control", "max-age=60"); - } + @Test + public void givenServiceEndpoint_whenGetRequestForUser_shouldResponseWithCacheControlMaxAge() { + given() + .when() + .get(URL_PREFIX + "/users/Michael") + .then() + .contentType(ContentType.JSON).and().statusCode(200).and() + .header("Cache-Control", "max-age=60"); + } @Test public void givenServiceEndpoint_whenGetRequestForNotCacheableContent_shouldResponseWithCacheControlNoCache() { @@ -31,7 +31,7 @@ public class ResourceEndpointTest { .get(URL_PREFIX + "/timestamp") .then() .contentType(ContentType.JSON).and().statusCode(200).and() - .header("Cache-Control", "no-cache"); + .header("Cache-Control", "no-store"); } @Test From c8f6bed73d1eb778298f70bfb4e898e86056cc38 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 4 Feb 2017 18:02:28 +0100 Subject: [PATCH 024/192] BAEL-542 rename test to LiveTest suffix --- ...{ResourceEndpointTest.java => ResourceEndpointLiveTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/{ResourceEndpointTest.java => ResourceEndpointLiveTest.java} (97%) diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java similarity index 97% rename from spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java rename to spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java index e85dd11667..f6e95779cb 100644 --- a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java @@ -11,7 +11,7 @@ import static com.jayway.restassured.RestAssured.given; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) -public class ResourceEndpointTest { +public class ResourceEndpointLiveTest { private static final String URL_PREFIX = "http://localhost:8080"; @Test From 652def889a147bbfe59d757fb13817d15d953ac0 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 4 Feb 2017 20:44:16 +0100 Subject: [PATCH 025/192] BAEL-542 start application properly when integation test started --- pom.xml | 1 + spring-security-cache-control/pom.xml | 4 ++++ .../baeldung/cachecontrol/ResourceEndpointLiveTest.java | 9 ++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 41235dcc26..a24e3d4667 100644 --- a/pom.xml +++ b/pom.xml @@ -147,6 +147,7 @@ spring-rest-docs spring-rest spring-security-basic-auth + spring-security-cache-control spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize spring-security-client/spring-security-jsp-config diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml index 1d154f333d..c30b0cd1aa 100644 --- a/spring-security-cache-control/pom.xml +++ b/spring-security-cache-control/pom.xml @@ -35,6 +35,10 @@ org.springframework.security spring-security-web + + org.springframework.boot + spring-boot-starter-test + javax.servlet javax.servlet-api diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java index f6e95779cb..0c23b1969d 100644 --- a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java @@ -3,14 +3,13 @@ package com.baeldung.cachecontrol; import com.jayway.restassured.http.ContentType; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import static com.jayway.restassured.RestAssured.given; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, classes = AppRunner.class) public class ResourceEndpointLiveTest { private static final String URL_PREFIX = "http://localhost:8080"; From c9394b216ae01d23917735a140c11226f43bcace Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 4 Feb 2017 20:45:53 +0100 Subject: [PATCH 026/192] BAEL-542 do not need TestConfig class --- .../java/com/baeldung/cachecontrol/TestConfig.java | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java deleted file mode 100644 index af393f4b98..0000000000 --- a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/TestConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.cachecontrol; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - - -@Configuration -@ComponentScan({ "com.baeldung" }) -public class TestConfig { - -} From 3f81460e90f0ec4408ca1e9beb4a9b54aea6d8e9 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sat, 4 Feb 2017 23:46:53 +0000 Subject: [PATCH 027/192] Added extra endpoint for default caching --- .../cachecontrol/ResourceEndpoint.java | 6 +++- .../config/SpringSecurityConfig.java | 6 +--- .../ResourceEndpointLiveTest.java | 36 ++++++++++++++++--- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java index f1c9786c68..9f756b5ab4 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -17,6 +17,11 @@ import java.util.concurrent.TimeUnit; @Controller public class ResourceEndpoint { + @RequestMapping(value = "/default/users/{name}", method = RequestMethod.GET) + public ResponseEntity getUserWithDefaultCaching(@PathVariable(value = "name") String name) { + return ResponseEntity.ok(new UserDto(name)); + } + @RequestMapping(value = "/users/{name}", method = RequestMethod.GET) public ResponseEntity getUser(@PathVariable(value = "name") String name) { return ResponseEntity.ok() @@ -24,7 +29,6 @@ public class ResourceEndpoint { .body(new UserDto(name)); } - @RequestMapping(value = "/timestamp", method = RequestMethod.GET) public ResponseEntity getServerTimestamp() { return ResponseEntity.ok() diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java index fbb6399c22..b4127e9b71 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java @@ -13,9 +13,5 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override - protected void configure(HttpSecurity http) throws Exception { - http.headers() - .defaultsDisabled() - .cacheControl(); - } + protected void configure(HttpSecurity http) throws Exception {} } diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java index 0c23b1969d..94b6052ba4 100644 --- a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java @@ -3,21 +3,43 @@ package com.baeldung.cachecontrol; import com.jayway.restassured.http.ContentType; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import static com.jayway.restassured.RestAssured.given; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, classes = AppRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = AppRunner.class) public class ResourceEndpointLiveTest { - private static final String URL_PREFIX = "http://localhost:8080"; + + @LocalServerPort + private int serverPort; + + @Test + public void whenGetRequestForUser_shouldRespondWithDefaultCacheHeaders() { + given() + .when() + .get(getBaseUrl() + "/default/users/Michael") + .then() + .headers("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate") + .header("Pragma", "no-cache"); + } + + @Test + public void whenGetRequestForUser_shouldRespondMaxAgeCacheControl() { + given() + .when() + .get(getBaseUrl() + "/users/Michael") + .then() + .header("Cache-Control", "max-age=60"); + } @Test public void givenServiceEndpoint_whenGetRequestForUser_shouldResponseWithCacheControlMaxAge() { given() .when() - .get(URL_PREFIX + "/users/Michael") + .get(getBaseUrl() + "/users/Michael") .then() .contentType(ContentType.JSON).and().statusCode(200).and() .header("Cache-Control", "max-age=60"); @@ -27,7 +49,7 @@ public class ResourceEndpointLiveTest { public void givenServiceEndpoint_whenGetRequestForNotCacheableContent_shouldResponseWithCacheControlNoCache() { given() .when() - .get(URL_PREFIX + "/timestamp") + .get(getBaseUrl() + "/timestamp") .then() .contentType(ContentType.JSON).and().statusCode(200).and() .header("Cache-Control", "no-store"); @@ -37,10 +59,14 @@ public class ResourceEndpointLiveTest { public void givenServiceEndpoint_whenGetRequestForPrivateUser_shouldResponseWithSecurityDefaultCacheControl() { given() .when() - .get(URL_PREFIX + "/private/users/Michael") + .get(getBaseUrl() + "/private/users/Michael") .then() .contentType(ContentType.JSON).and().statusCode(200).and() .header("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate"); } + private String getBaseUrl() { + return "http://localhost:" + serverPort; + } + } \ No newline at end of file From 10eb6bfcc0ebaceae2b803bd6cbfc7ef77250fa1 Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 5 Feb 2017 03:03:00 +0200 Subject: [PATCH 028/192] helper classes for excel processing, tests (#1093) * helper classes for excel processing, tests * fix imports * list declaration --- apache-poi/pom.xml | 16 ++ .../com/baeldung/jexcel/JExcelHelper.java | 79 ++++++++++ .../baeldung/poi/excel/ExcelPOIHelper.java | 137 ++++++++++++++++++ .../java/com/baeldung/jexcel/JExcelTest.java | 62 ++++++++ .../com/baeldung/poi/excel/ExcelTest.java | 59 ++++++++ 5 files changed, 353 insertions(+) create mode 100644 apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java create mode 100644 apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java create mode 100644 apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java create mode 100644 apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml index d94b2e2ad1..1b97248ab2 100644 --- a/apache-poi/pom.xml +++ b/apache-poi/pom.xml @@ -9,6 +9,7 @@ 3.6.0 4.12 3.15 + 1.0.6 @@ -37,5 +38,20 @@ poi-ooxml ${poi.version} + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + + + org.jxls + jxls-jexcel + ${jexcel.version} + diff --git a/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java b/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java new file mode 100644 index 0000000000..39076fd709 --- /dev/null +++ b/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java @@ -0,0 +1,79 @@ +package com.baeldung.jexcel; + +import jxl.*; +import java.util.Map; +import java.util.HashMap; +import java.util.ArrayList; +import java.util.List; +import jxl.read.biff.BiffException; +import java.io.File; +import java.io.IOException; +import jxl.write.*; +import jxl.write.Number; +import jxl.format.Colour; + +public class JExcelHelper { + + public Map> readJExcel(String fileLocation) throws IOException, BiffException { + Map> data = new HashMap<>(); + + Workbook workbook = Workbook.getWorkbook(new File(fileLocation)); + Sheet sheet = workbook.getSheet(0); + int rows = sheet.getRows(); + int columns = sheet.getColumns(); + + for (int i = 0; i < rows; i++) { + data.put(i, new ArrayList()); + for (int j = 0; j < columns; j++) { + data.get(i).add(sheet.getCell(j, i).getContents()); + } + } + return data; + } + + public void writeJExcel() throws IOException, WriteException { + WritableWorkbook workbook = null; + try { + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + String fileLocation = path.substring(0, path.length() - 1) + "temp.xls"; + + workbook = Workbook.createWorkbook(new File(fileLocation)); + + WritableSheet sheet = workbook.createSheet("Sheet 1", 0); + + WritableCellFormat headerFormat = new WritableCellFormat(); + WritableFont font = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD); + headerFormat.setFont(font); + headerFormat.setBackground(Colour.LIGHT_BLUE); + headerFormat.setWrap(true); + Label headerLabel = new Label(0, 0, "Name", headerFormat); + sheet.setColumnView(0, 60); + sheet.addCell(headerLabel); + + headerLabel = new Label(1, 0, "Age", headerFormat); + sheet.setColumnView(0, 40); + sheet.addCell(headerLabel); + + WritableCellFormat cellFormat = new WritableCellFormat(); + cellFormat.setWrap(true); + + Label cellLabel = new Label(0, 2, "John Smith", cellFormat); + sheet.addCell(cellLabel); + Number cellNumber = new Number(1, 2, 20, cellFormat); + sheet.addCell(cellNumber); + + cellLabel = new Label(0, 3, "Ana Johnson", cellFormat); + sheet.addCell(cellLabel); + cellNumber = new Number(1, 3, 30, cellFormat); + sheet.addCell(cellNumber); + + workbook.write(); + } finally { + if (workbook != null) { + workbook.close(); + } + } + + } +} \ No newline at end of file diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java new file mode 100644 index 0000000000..841be22d62 --- /dev/null +++ b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java @@ -0,0 +1,137 @@ +package com.baeldung.poi.excel; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.FillPatternType; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.HashMap; +import java.util.ArrayList; +import java.util.List; + +public class ExcelPOIHelper { + + public Map> readExcel(String fileLocation) throws IOException { + + Map> data = new HashMap<>(); + FileInputStream file = new FileInputStream(new File(fileLocation)); + Workbook workbook = new XSSFWorkbook(file); + Sheet sheet = workbook.getSheetAt(0); + int i = 0; + for (Row row : sheet) { + data.put(i, new ArrayList()); + for (Cell cell : row) { + switch (cell.getCellTypeEnum()) { + case STRING: + data.get(i) + .add(cell.getRichStringCellValue() + .getString()); + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + data.get(i) + .add(cell.getDateCellValue() + ""); + } else { + data.get(i) + .add((int)cell.getNumericCellValue() + ""); + } + break; + case BOOLEAN: + data.get(i) + .add(cell.getBooleanCellValue() + ""); + break; + case FORMULA: + data.get(i) + .add(cell.getCellFormula() + ""); + break; + default: + data.get(i) + .add(" "); + } + } + i++; + } + if (workbook != null){ + workbook.close(); + } + return data; + } + + public void writeExcel() throws IOException { + Workbook workbook = new XSSFWorkbook(); + + try { + Sheet sheet = workbook.createSheet("Persons"); + sheet.setColumnWidth(0, 6000); + sheet.setColumnWidth(1, 4000); + + Row header = sheet.createRow(0); + + CellStyle headerStyle = workbook.createCellStyle(); + + headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + XSSFFont font = ((XSSFWorkbook) workbook).createFont(); + font.setFontName("Arial"); + font.setFontHeightInPoints((short) 16); + font.setBold(true); + headerStyle.setFont(font); + + Cell headerCell = header.createCell(0); + headerCell.setCellValue("Name"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(1); + headerCell.setCellValue("Age"); + headerCell.setCellStyle(headerStyle); + + CellStyle style = workbook.createCellStyle(); + style.setWrapText(true); + + Row row = sheet.createRow(2); + Cell cell = row.createCell(0); + cell.setCellValue("John Smith"); + cell.setCellStyle(style); + + cell = row.createCell(1); + cell.setCellValue(20); + cell.setCellStyle(style); + + row = sheet.createRow(3); + cell = row.createCell(0); + cell.setCellValue("Ana Johnson"); + cell.setCellStyle(style); + + cell = row.createCell(1); + cell.setCellValue(30); + cell.setCellStyle(style); + + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + String fileLocation = path.substring(0, path.length() - 1) + "temp.xlsx"; + + FileOutputStream outputStream = new FileOutputStream(fileLocation); + workbook.write(outputStream); + } finally { + if (workbook != null) { + + workbook.close(); + + } + } + } + +} \ No newline at end of file diff --git a/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java b/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java new file mode 100644 index 0000000000..f0c129eb22 --- /dev/null +++ b/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java @@ -0,0 +1,62 @@ +package com.baeldung.jexcel; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import jxl.read.biff.BiffException; +import java.util.Map; +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.jexcel.JExcelHelper; + +import jxl.write.WriteException; +import jxl.read.biff.BiffException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.Before; + +public class JExcelTest { + + private JExcelHelper jExcelHelper; + private static String FILE_NAME = "temp.xls"; + private String fileLocation; + + @Before + public void generateExcelFile() throws IOException, WriteException { + + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + fileLocation = path.substring(0, path.length() - 1) + FILE_NAME; + + jExcelHelper = new JExcelHelper(); + jExcelHelper.writeJExcel(); + + } + + @Test + public void whenParsingJExcelFile_thenCorrect() throws IOException, BiffException { + Map> data = jExcelHelper.readJExcel(fileLocation); + + assertEquals("Name", data.get(0) + .get(0)); + assertEquals("Age", data.get(0) + .get(1)); + + assertEquals("John Smith", data.get(2) + .get(0)); + assertEquals("20", data.get(2) + .get(1)); + + assertEquals("Ana Johnson", data.get(3) + .get(0)); + assertEquals("30", data.get(3) + .get(1)); + + } + +} \ No newline at end of file diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java new file mode 100644 index 0000000000..f58db241b2 --- /dev/null +++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java @@ -0,0 +1,59 @@ +package com.baeldung.poi.excel; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import jxl.read.biff.BiffException; +import java.util.Map; +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.poi.excel.ExcelPOIHelper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.Before; + +public class ExcelTest { + + private ExcelPOIHelper excelPOIHelper; + private static String FILE_NAME = "temp.xlsx"; + private String fileLocation; + + @Before + public void generateExcelFile() throws IOException { + + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + fileLocation = path.substring(0, path.length() - 1) + FILE_NAME; + + excelPOIHelper = new ExcelPOIHelper(); + excelPOIHelper.writeExcel(); + + } + + @Test + public void whenParsingPOIExcelFile_thenCorrect() throws IOException { + Map> data = excelPOIHelper.readExcel(fileLocation); + + assertEquals("Name", data.get(0) + .get(0)); + assertEquals("Age", data.get(0) + .get(1)); + + assertEquals("John Smith", data.get(1) + .get(0)); + assertEquals("20", data.get(1) + .get(1)); + + assertEquals("Ana Johnson", data.get(2) + .get(0)); + assertEquals("30", data.get(2) + .get(1)); + + } + +} \ No newline at end of file From 6d0dcd52fad370d25ea43f96efed043e5cb4be35 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 5 Feb 2017 08:30:32 +0100 Subject: [PATCH 029/192] Reformat Rxjava examples --- .../rxjava/ColdObservableBackpressure.java | 5 ++++- .../HotObservableBackpressureBatching.java | 7 +++++-- .../HotObservableBackpressureBuffering.java | 7 +++++-- .../HotObservableBackpressureSkipping.java | 7 ++++--- .../rxjava/HotObservableOnBackpressure.java | 19 ++++++++++++++----- .../HotObservableWithoutBackpressure.java | 9 ++++----- 6 files changed, 36 insertions(+), 18 deletions(-) diff --git a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java index 9855123a3b..4d3d09da7e 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java +++ b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java @@ -5,7 +5,10 @@ import rx.schedulers.Schedulers; public class ColdObservableBackpressure { public static void main(String[] args) throws InterruptedException { - Observable.range(1, 1_000_000).observeOn(Schedulers.computation()).subscribe(v -> ComputeFunction.compute(v), Throwable::printStackTrace); + Observable + .range(1, 1_000_000) + .observeOn(Schedulers.computation()) + .subscribe(ComputeFunction::compute, Throwable::printStackTrace); Thread.sleep(10_000); diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java index 6acda7eaad..9f7b8c107a 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java +++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java @@ -5,9 +5,12 @@ import rx.subjects.PublishSubject; public class HotObservableBackpressureBatching { public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); - source.window(500).observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace); + source + .window(500) + .observeOn(Schedulers.computation()) + .subscribe(ComputeFunction::compute, Throwable::printStackTrace); for (int i = 0; i < 1_000_000; i++) { source.onNext(i); diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java index 50638f4c8a..720918878f 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java +++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java @@ -5,9 +5,12 @@ import rx.subjects.PublishSubject; public class HotObservableBackpressureBuffering { public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); - source.buffer(1024).observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace); + source + .buffer(1024) + .observeOn(Schedulers.computation()) + .subscribe(ComputeFunction::compute, Throwable::printStackTrace); for (int i = 0; i < 1_000_000; i++) { source.onNext(i); diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java index f6f8b9f563..5b0a7f3a68 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java +++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java @@ -7,11 +7,12 @@ import java.util.concurrent.TimeUnit; public class HotObservableBackpressureSkipping { public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); source.sample(100, TimeUnit.MILLISECONDS) - // .throttleFirst(100, TimeUnit.MILLISECONDS) - .observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace); + //.throttleFirst(100, TimeUnit.MILLISECONDS) + .observeOn(Schedulers.computation()) + .subscribe(ComputeFunction::compute, Throwable::printStackTrace); for (int i = 0; i < 1_000_000; i++) { source.onNext(i); diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java index afef8027bf..8ccd38beb6 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java +++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java @@ -6,12 +6,21 @@ import rx.schedulers.Schedulers; public class HotObservableOnBackpressure { public static void main(String[] args) throws InterruptedException { - Observable.range(1, 1_000_000).onBackpressureBuffer(16, () -> { - }, BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST).observeOn(Schedulers.computation()).subscribe(e -> { - }, Throwable::printStackTrace); + Observable + .range(1, 1_000_000) + .onBackpressureBuffer(16, () -> { + }, BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST) + .observeOn(Schedulers.computation()) + .subscribe(e -> { + }, Throwable::printStackTrace); - Observable.range(1, 1_000_000).onBackpressureDrop().observeOn(Schedulers.io()).doOnNext(ComputeFunction::compute).subscribe(v -> { - }, Throwable::printStackTrace); + Observable + .range(1, 1_000_000) + .onBackpressureDrop() + .observeOn(Schedulers.io()) + .doOnNext(ComputeFunction::compute) + .subscribe(v -> { + }, Throwable::printStackTrace); Thread.sleep(10_000); } diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java index 7745dbe5c4..439db51695 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java +++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java @@ -1,16 +1,15 @@ package com.baelding.rxjava; - import rx.schedulers.Schedulers; import rx.subjects.PublishSubject; public class HotObservableWithoutBackpressure { public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); - - source.observeOn(Schedulers.computation()) - .subscribe(ComputeFunction::compute, Throwable::printStackTrace); + PublishSubject source = PublishSubject. create(); + source + .observeOn(Schedulers.computation()) + .subscribe(ComputeFunction::compute, Throwable::printStackTrace); for (int i = 0; i < 1_000_000; i++) { source.onNext(i); From 14bee159bdfa977e35e264268867d615cabdd081 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 5 Feb 2017 08:55:35 +0100 Subject: [PATCH 030/192] Fix JavaRandomUnitTest --- .../test/java/org/baeldung/java/JavaRandomUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java/src/test/java/org/baeldung/java/JavaRandomUnitTest.java b/core-java/src/test/java/org/baeldung/java/JavaRandomUnitTest.java index 4febe7c9fc..08f98025c3 100644 --- a/core-java/src/test/java/org/baeldung/java/JavaRandomUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/JavaRandomUnitTest.java @@ -1,12 +1,12 @@ package org.baeldung.java; -import java.nio.charset.Charset; -import java.util.Random; - import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.math3.random.RandomDataGenerator; import org.junit.Test; +import java.nio.charset.Charset; +import java.util.Random; + public class JavaRandomUnitTest { // tests - random long @@ -164,7 +164,7 @@ public class JavaRandomUnitTest { final int targetStringLength = 10; final StringBuilder buffer = new StringBuilder(targetStringLength); for (int i = 0; i < targetStringLength; i++) { - final int randomLimitedInt = leftLimit + (int) (new Random().nextFloat() * (rightLimit - leftLimit)); + final int randomLimitedInt = leftLimit + (int) (new Random().nextFloat() * (rightLimit - leftLimit + 1)); buffer.append((char) randomLimitedInt); } final String generatedString = buffer.toString(); From d4cb92250d036680bafa5a4ee322b7388d0c85b1 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 5 Feb 2017 10:20:12 +0100 Subject: [PATCH 031/192] LiveTest -> Test --- ...esourceEndpointLiveTest.java => ResourceEndpointTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/{ResourceEndpointLiveTest.java => ResourceEndpointTest.java} (95%) diff --git a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java similarity index 95% rename from spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java rename to spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java index 94b6052ba4..6d532f98fc 100644 --- a/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointLiveTest.java +++ b/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointTest.java @@ -11,7 +11,7 @@ import static com.jayway.restassured.RestAssured.given; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = AppRunner.class) -public class ResourceEndpointLiveTest { +public class ResourceEndpointTest { @LocalServerPort private int serverPort; @@ -66,7 +66,7 @@ public class ResourceEndpointLiveTest { } private String getBaseUrl() { - return "http://localhost:" + serverPort; + return String.format("http://localhost:%d", serverPort); } } \ No newline at end of file From 4b0249410c4334427e1bc6ba2a580b2dde9a05f3 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 5 Feb 2017 10:27:13 +0100 Subject: [PATCH 032/192] Update README.md --- spring-core/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-core/README.md b/spring-core/README.md index f6aaaf44a0..a32d30939f 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -3,4 +3,4 @@ - [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory) - [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) - [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) -- [Constructor Injection in Spring with Lombok](http://inprogress.baeldung.com/constructor-injection-in-spring-with-lombok) +- [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) From 0e78d76f2291836c319f1b707e4ad553935fe501 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sun, 5 Feb 2017 10:27:44 +0100 Subject: [PATCH 033/192] BAEL-572 move code to tests --- rxjava/pom.xml | 6 + .../rxjava/ColdObservableBackpressure.java | 16 -- .../HotObservableBackpressureBatching.java | 18 -- .../HotObservableBackpressureBuffering.java | 17 -- .../HotObservableBackpressureSkipping.java | 21 --- .../HotObservableWithoutBackpressure.java | 20 --- .../rxjava/RxJavaBackpressureTest.java | 155 ++++++++++++++++++ 7 files changed, 161 insertions(+), 92 deletions(-) delete mode 100644 rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java delete mode 100644 rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java delete mode 100644 rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java delete mode 100644 rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java delete mode 100644 rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java diff --git a/rxjava/pom.xml b/rxjava/pom.xml index 63aa1f127e..6a351d98bd 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -26,9 +26,15 @@ rxjava ${rx.java.version} + + junit + junit + ${junit.version} + + 4.12 1.2.5 diff --git a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java deleted file mode 100644 index abb0b99100..0000000000 --- a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baelding.rxjava; - -import rx.Observable; -import rx.schedulers.Schedulers; - -public class ColdObservableBackpressure { - public static void main(String[] args) throws InterruptedException { - - Observable.range(1, 1_000_000) - .observeOn(Schedulers.computation()) - .subscribe(ComputeFunction::compute); - - Thread.sleep(10_000); - } - -} diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java deleted file mode 100644 index 6acda7eaad..0000000000 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baelding.rxjava; - -import rx.schedulers.Schedulers; -import rx.subjects.PublishSubject; - -public class HotObservableBackpressureBatching { - public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); - - source.window(500).observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace); - - for (int i = 0; i < 1_000_000; i++) { - source.onNext(i); - } - Thread.sleep(10_000); - } - -} diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java deleted file mode 100644 index 50638f4c8a..0000000000 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baelding.rxjava; - -import rx.schedulers.Schedulers; -import rx.subjects.PublishSubject; - -public class HotObservableBackpressureBuffering { - public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); - - source.buffer(1024).observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace); - - for (int i = 0; i < 1_000_000; i++) { - source.onNext(i); - } - Thread.sleep(10_000); - } -} diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java deleted file mode 100644 index f6f8b9f563..0000000000 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baelding.rxjava; - -import rx.schedulers.Schedulers; -import rx.subjects.PublishSubject; - -import java.util.concurrent.TimeUnit; - -public class HotObservableBackpressureSkipping { - public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); - - source.sample(100, TimeUnit.MILLISECONDS) - // .throttleFirst(100, TimeUnit.MILLISECONDS) - .observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace); - - for (int i = 0; i < 1_000_000; i++) { - source.onNext(i); - } - Thread.sleep(10_000); - } -} diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java deleted file mode 100644 index 7745dbe5c4..0000000000 --- a/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baelding.rxjava; - - -import rx.schedulers.Schedulers; -import rx.subjects.PublishSubject; - -public class HotObservableWithoutBackpressure { - public static void main(String[] args) throws InterruptedException { - PublishSubject source = PublishSubject.create(); - - source.observeOn(Schedulers.computation()) - .subscribe(ComputeFunction::compute, Throwable::printStackTrace); - - - for (int i = 0; i < 1_000_000; i++) { - source.onNext(i); - } - Thread.sleep(10_000); - } -} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java new file mode 100644 index 0000000000..30357e7a27 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java @@ -0,0 +1,155 @@ +package com.baeldung.rxjava; + +import org.junit.Test; +import rx.BackpressureOverflow; +import rx.Observable; +import rx.exceptions.MissingBackpressureException; +import rx.observers.TestSubscriber; +import rx.schedulers.Schedulers; +import rx.subjects.PublishSubject; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertTrue; + +public class RxJavaBackpressureTest { + + @Test + public void givenColdObservable_shouldNotThrowException() { + //given + TestSubscriber testSubscriber = new TestSubscriber<>(); + + //when + Observable.range(1, 1_000_000) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + //then + testSubscriber.awaitTerminalEvent(); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + + } + + @Test + public void givenHotObservable_whenBackpressureNotDefined_shouldTrowException() { + //given + TestSubscriber testSubscriber = new TestSubscriber<>(); + PublishSubject source = PublishSubject.create(); + + source.observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + //when + for (int i = 0; i < 1_000_000; i++) { + source.onNext(i); + + } + + //then + testSubscriber.awaitTerminalEvent(); + testSubscriber.assertError(MissingBackpressureException.class); + } + + @Test + public void givenHotObservable_whenWindowIsDefined_shouldNotThrowException() { + //given + TestSubscriber> testSubscriber = new TestSubscriber<>(); + PublishSubject source = PublishSubject.create(); + + //when + source.window(500) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + for (int i = 0; i < 1_000; i++) { + source.onNext(i); + } + + //then + testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + + } + + @Test + public void givenHotObservable_whenBufferIsDefined_shouldNotThrowException() { + //given + TestSubscriber> testSubscriber = new TestSubscriber<>(); + PublishSubject source = PublishSubject.create(); + + //when + source.buffer(1024) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + for (int i = 0; i < 1_000; i++) { + source.onNext(i); + } + + //then + testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + + } + + + @Test + public void givenHotObservable_whenSkippingOperationIsDefined_shouldNotThrowException() { + //given + TestSubscriber testSubscriber = new TestSubscriber<>(); + PublishSubject source = PublishSubject.create(); + + //when + source.sample(100, TimeUnit.MILLISECONDS) +// .throttleFirst(100, TimeUnit.MILLISECONDS) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + for (int i = 0; i < 1_000; i++) { + source.onNext(i); + } + + //then + testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + + } + + @Test + public void givenHotObservable_whenOnBackpressureBufferDefined_shouldNotThrowException() { + //given + TestSubscriber testSubscriber = new TestSubscriber<>(); + + //when + Observable.range(1, 1_000_000) + .onBackpressureBuffer(16, () -> { + }, + BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + //then + testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + + } + + + @Test + public void givenHotObservable_whenOnBackpressureDropDefined_shouldNotThrowException() { + //given + TestSubscriber testSubscriber = new TestSubscriber<>(); + + //when + Observable.range(1, 1_000_000) + .onBackpressureDrop() + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + //then + testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + + } +} From 99bb4104f86040ad22889dbb02055f33b228bf54 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Sun, 5 Feb 2017 16:02:59 +0530 Subject: [PATCH 034/192] BAEL-248_Update_deprecated_API Changes --- spring-security-rest-basic-auth/pom.xml | 6 +-- .../baeldung/client/RestTemplateFactory.java | 22 +++-------- ...entsClientHttpRequestFactoryBasicAuth.java | 39 +++++++++++++++++++ 3 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java diff --git a/spring-security-rest-basic-auth/pom.xml b/spring-security-rest-basic-auth/pom.xml index 7987eebb66..953cfd6b6b 100644 --- a/spring-security-rest-basic-auth/pom.xml +++ b/spring-security-rest-basic-auth/pom.xml @@ -342,8 +342,8 @@ - 4.3.4.RELEASE - 4.2.0.RELEASE + 4.3.6.RELEASE + 4.2.1.RELEASE 5.2.5.Final @@ -351,7 +351,7 @@ 4.4.5 - 4.5.2 + 4.5.3 1.7.21 diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java index 0cec0dc5c3..061f9b3022 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java @@ -1,15 +1,11 @@ package org.baeldung.client; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.HttpHost; +import org.baeldung.http.client.HttpComponentsClientHttpRequestFactoryBasicAuth; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.client.support.BasicAuthorizationInterceptor; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -40,16 +36,10 @@ public class RestTemplateFactory implements FactoryBean, Initializ @Override public void afterPropertiesSet() { - final int timeout = 5; - - final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); - - final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials(new AuthScope("localhost", 8082, AuthScope.ANY_REALM), new UsernamePasswordCredentials("user1", "user1Pass")); - final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).setDefaultCredentialsProvider(credentialsProvider).build(); - - final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(client); + HttpHost host = new HttpHost("localhost", 8082, "http"); + final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host); restTemplate = new RestTemplate(requestFactory); + restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user1", "user1Pass")); } } \ No newline at end of file diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java new file mode 100644 index 0000000000..4a7b4869bc --- /dev/null +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -0,0 +1,39 @@ +package org.baeldung.http.client; + +import java.net.URI; + +import org.apache.http.HttpHost; +import org.apache.http.client.AuthCache; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; + +public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory { + + HttpHost host; + + public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) { + super(); + this.host = host; + } + + protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { + return createHttpContext(); + } + + private HttpContext createHttpContext() { + + AuthCache authCache = new BasicAuthCache(); + + BasicScheme basicAuth = new BasicScheme(); + authCache.put(host, basicAuth); + + BasicHttpContext localcontext = new BasicHttpContext(); + localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); + return localcontext; + } +} \ No newline at end of file From c2ed9afc2dbcd178b9c1172ff4cd4401ccb37f6d Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sun, 5 Feb 2017 10:39:29 +0100 Subject: [PATCH 035/192] BAEL-542 use @GetMapping annotation --- .../baeldung/cachecontrol/ResourceEndpoint.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java index 9f756b5ab4..bd129cbdfa 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -6,9 +6,8 @@ import com.baeldung.cachecontrol.model.UserDto; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import java.time.LocalDateTime; import java.time.ZoneOffset; @@ -17,27 +16,27 @@ import java.util.concurrent.TimeUnit; @Controller public class ResourceEndpoint { - @RequestMapping(value = "/default/users/{name}", method = RequestMethod.GET) - public ResponseEntity getUserWithDefaultCaching(@PathVariable(value = "name") String name) { + @GetMapping(value = "/default/users/{name}") + public ResponseEntity getUserWithDefaultCaching(@PathVariable String name) { return ResponseEntity.ok(new UserDto(name)); } - @RequestMapping(value = "/users/{name}", method = RequestMethod.GET) - public ResponseEntity getUser(@PathVariable(value = "name") String name) { + @GetMapping(value = "/users/{name}") + public ResponseEntity getUser(@PathVariable String name) { return ResponseEntity.ok() .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) .body(new UserDto(name)); } - @RequestMapping(value = "/timestamp", method = RequestMethod.GET) + @GetMapping(value = "/timestamp") public ResponseEntity getServerTimestamp() { return ResponseEntity.ok() .cacheControl(CacheControl.noStore()) .body(new TimestampDto(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli())); } - @RequestMapping(value = "/private/users/{name}", method = RequestMethod.GET) - public ResponseEntity getUserNotCached(@PathVariable("name") String name) { + @GetMapping(value = "/private/users/{name}") + public ResponseEntity getUserNotCached(@PathVariable String name) { return ResponseEntity.ok() .body(new UserDto(name)); } From c791bdf1dca3a17ecee3872a4fa2c30762229ea6 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sun, 5 Feb 2017 12:56:09 +0100 Subject: [PATCH 036/192] BAEL-672 test for weakHashMap --- core-java/pom.xml | 7 +++ .../baeldung/weakhashmap/WeakHashMapTest.java | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 85afee2968..5c91150941 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -154,6 +154,12 @@ ${mockito.version} test + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + commons-codec @@ -371,6 +377,7 @@ 1.10.19 6.10 3.6.1 + 1.7.0 3.6.0 diff --git a/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java new file mode 100644 index 0000000000..fbeb364ab6 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java @@ -0,0 +1,48 @@ +package com.baeldung.weakhashmap; + + +import org.junit.Test; + +import java.util.WeakHashMap; +import java.util.concurrent.TimeUnit; + +import static com.jayway.awaitility.Awaitility.await; +import static org.junit.Assert.assertTrue; + +public class WeakHashMapTest { + + @Test + public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObject() { + //given + WeakHashMap map = new WeakHashMap<>(); + BigImage bigImage = new BigImage("foo"); + UniqueImageName imageName = new UniqueImageName("name_of_big_image"); + + map.put(imageName, bigImage); + assertTrue(map.containsKey(imageName)); + + //when big image is not in use anymore + imageName = null; + System.gc(); + + //then GC will finally reclaim that object + await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty); + } + + + class BigImage { + public final String imageId; + + BigImage(String imageId) { + this.imageId = imageId; + } + } + + class UniqueImageName { + public final String imageName; + + UniqueImageName(String imageName) { + this.imageName = imageName; + } + } +} From 0f59b0d5335bba974afb4915b961e859546b32c2 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sun, 5 Feb 2017 14:13:45 +0100 Subject: [PATCH 037/192] BAEL-672 proper image id --- .../test/java/com/baeldung/weakhashmap/WeakHashMapTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java index fbeb364ab6..7b34c6b316 100644 --- a/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java +++ b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java @@ -15,13 +15,13 @@ public class WeakHashMapTest { public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObject() { //given WeakHashMap map = new WeakHashMap<>(); - BigImage bigImage = new BigImage("foo"); + BigImage bigImage = new BigImage("image_id"); UniqueImageName imageName = new UniqueImageName("name_of_big_image"); map.put(imageName, bigImage); assertTrue(map.containsKey(imageName)); - //when big image is not in use anymore + //when big image key is not reference anywhere imageName = null; System.gc(); From 5b79f605a4f85309970abd2fee67ed6d0b1cae20 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 5 Feb 2017 17:06:12 +0100 Subject: [PATCH 038/192] Refactor ResourceEndpoint --- spring-security-cache-control/pom.xml | 5 ++++ .../cachecontrol/ResourceEndpoint.java | 29 +++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml index c30b0cd1aa..da363a75af 100644 --- a/spring-security-cache-control/pom.xml +++ b/spring-security-cache-control/pom.xml @@ -14,6 +14,11 @@ 1.4.3.RELEASE + + 1.8 + + + org.springframework.boot diff --git a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java index bd129cbdfa..038df43165 100644 --- a/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java +++ b/spring-security-cache-control/src/main/java/com/baeldung/cachecontrol/ResourceEndpoint.java @@ -1,6 +1,5 @@ package com.baeldung.cachecontrol; - import com.baeldung.cachecontrol.model.TimestampDto; import com.baeldung.cachecontrol.model.UserDto; import org.springframework.http.CacheControl; @@ -21,23 +20,29 @@ public class ResourceEndpoint { return ResponseEntity.ok(new UserDto(name)); } - @GetMapping(value = "/users/{name}") + @GetMapping("/users/{name}") public ResponseEntity getUser(@PathVariable String name) { - return ResponseEntity.ok() - .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) - .body(new UserDto(name)); + return ResponseEntity + .ok() + .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) + .body(new UserDto(name)); } - @GetMapping(value = "/timestamp") + @GetMapping("/timestamp") public ResponseEntity getServerTimestamp() { - return ResponseEntity.ok() - .cacheControl(CacheControl.noStore()) - .body(new TimestampDto(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli())); + return ResponseEntity + .ok() + .cacheControl(CacheControl.noStore()) + .body(new TimestampDto(LocalDateTime + .now() + .toInstant(ZoneOffset.UTC) + .toEpochMilli())); } - @GetMapping(value = "/private/users/{name}") + @GetMapping("/private/users/{name}") public ResponseEntity getUserNotCached(@PathVariable String name) { - return ResponseEntity.ok() - .body(new UserDto(name)); + return ResponseEntity + .ok() + .body(new UserDto(name)); } } From 4e91a6388cce55ebe0274a48043895a971085ccc Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 5 Feb 2017 17:16:27 +0100 Subject: [PATCH 039/192] Refactor BackpressureTest --- .../rxjava/RxJavaBackpressureTest.java | 114 ++++++++++-------- 1 file changed, 65 insertions(+), 49 deletions(-) diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java index 30357e7a27..33f94a9c6f 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java @@ -10,6 +10,7 @@ import rx.subjects.PublishSubject; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; import static org.junit.Assert.assertTrue; @@ -21,13 +22,16 @@ public class RxJavaBackpressureTest { TestSubscriber testSubscriber = new TestSubscriber<>(); //when - Observable.range(1, 1_000_000) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + Observable + .range(1, 1_000_000) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); //then testSubscriber.awaitTerminalEvent(); - assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + assertTrue(testSubscriber + .getOnErrorEvents() + .size() == 0); } @@ -35,16 +39,16 @@ public class RxJavaBackpressureTest { public void givenHotObservable_whenBackpressureNotDefined_shouldTrowException() { //given TestSubscriber testSubscriber = new TestSubscriber<>(); - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); - source.observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + source + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); //when - for (int i = 0; i < 1_000_000; i++) { - source.onNext(i); - - } + IntStream + .range(0, 1_000_000) + .forEach(source::onNext); //then testSubscriber.awaitTerminalEvent(); @@ -55,20 +59,23 @@ public class RxJavaBackpressureTest { public void givenHotObservable_whenWindowIsDefined_shouldNotThrowException() { //given TestSubscriber> testSubscriber = new TestSubscriber<>(); - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); //when - source.window(500) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + source + .window(500) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); - for (int i = 0; i < 1_000; i++) { - source.onNext(i); - } + IntStream + .range(0, 1_000) + .forEach(source::onNext); //then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + assertTrue(testSubscriber + .getOnErrorEvents() + .size() == 0); } @@ -76,43 +83,49 @@ public class RxJavaBackpressureTest { public void givenHotObservable_whenBufferIsDefined_shouldNotThrowException() { //given TestSubscriber> testSubscriber = new TestSubscriber<>(); - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); //when - source.buffer(1024) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + source + .buffer(1024) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + IntStream + .range(0, 1_000) + .forEach(source::onNext); - for (int i = 0; i < 1_000; i++) { - source.onNext(i); - } //then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + assertTrue(testSubscriber + .getOnErrorEvents() + .size() == 0); } - @Test public void givenHotObservable_whenSkippingOperationIsDefined_shouldNotThrowException() { //given TestSubscriber testSubscriber = new TestSubscriber<>(); - PublishSubject source = PublishSubject.create(); + PublishSubject source = PublishSubject. create(); //when source.sample(100, TimeUnit.MILLISECONDS) -// .throttleFirst(100, TimeUnit.MILLISECONDS) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // .throttleFirst(100, TimeUnit.MILLISECONDS) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); + + IntStream + .range(0, 1_000) + .forEach(source::onNext); - for (int i = 0; i < 1_000; i++) { - source.onNext(i); - } //then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + assertTrue(testSubscriber + .getOnErrorEvents() + .size() == 0); } @@ -122,34 +135,37 @@ public class RxJavaBackpressureTest { TestSubscriber testSubscriber = new TestSubscriber<>(); //when - Observable.range(1, 1_000_000) - .onBackpressureBuffer(16, () -> { - }, - BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + Observable + .range(1, 1_000_000) + .onBackpressureBuffer(16, () -> {}, BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST) + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); //then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + assertTrue(testSubscriber + .getOnErrorEvents() + .size() == 0); } - @Test public void givenHotObservable_whenOnBackpressureDropDefined_shouldNotThrowException() { //given TestSubscriber testSubscriber = new TestSubscriber<>(); //when - Observable.range(1, 1_000_000) - .onBackpressureDrop() - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + Observable + .range(1, 1_000_000) + .onBackpressureDrop() + .observeOn(Schedulers.computation()) + .subscribe(testSubscriber); //then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber.getOnErrorEvents().size() == 0); + assertTrue(testSubscriber + .getOnErrorEvents() + .size() == 0); } } From 4cbb0edafa6a9b5c0584a036d42b43e5e5880db7 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 5 Feb 2017 17:51:33 +0100 Subject: [PATCH 040/192] remove java.version from properties --- spring-security-cache-control/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml index da363a75af..c30b0cd1aa 100644 --- a/spring-security-cache-control/pom.xml +++ b/spring-security-cache-control/pom.xml @@ -14,11 +14,6 @@ 1.4.3.RELEASE - - 1.8 - - - org.springframework.boot From 15659388032ded6c832a3c44a95560dcc78b0d53 Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Mon, 6 Feb 2017 02:36:31 +0530 Subject: [PATCH 041/192] Pre conditions (#1116) * BAL-36 File size api in java and apache commons IO * BAEL-282 grep in java - fixes after code review * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved asserts and test classes in test folder. * BAEL-519 moved test related producer and consumer to src. * BAEL-586 Guide to Guava BiMap. * BAEL-587 formatted code. * BAEL-519 LMAX Disruptor * BAEL-587 resolved merge * BAEL-587 Resolved merge * BAEL-519 Removed disruptor link. * BAEL-519 Reverted Guava changes * RFQ-587 Added disruptor as a separate module. * BAEL-519 Disruptor changes. * BAEL-519 Removed disruptor from core-java module. * BAEL-637 Guide to PreConditions * BAEL-637 Used assertJ for exception assertion. * BAEL-637 updated tests to use assertJ. * BAEL-637 Removed redundant tests. --- .../guava/GuavaPreConditionsTest.java | 83 ++++--------------- 1 file changed, 15 insertions(+), 68 deletions(-) diff --git a/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java b/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java index 55e3c7db00..aff42ea6e2 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java @@ -3,7 +3,7 @@ package org.baeldung.guava; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.Arrays; import org.junit.Test; -import static com.google.common.base.Preconditions.*; +import com.google.common.base.*; public class GuavaPreConditionsTest { @@ -11,10 +11,7 @@ public class GuavaPreConditionsTest { public void whenCheckArgumentEvaluatesFalse_throwsException() { int age = -18; - assertThatThrownBy(() -> checkArgument(age > 0)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage(null) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkArgument(age > 0)).isInstanceOf(IllegalArgumentException.class).hasMessage(null).hasNoCause(); } @Test @@ -22,10 +19,7 @@ public class GuavaPreConditionsTest { final int age = -18; final String message = "Age can't be zero or less than zero"; - assertThatThrownBy(() -> checkArgument(age > 0, message)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage(message) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkArgument(age > 0, message)).isInstanceOf(IllegalArgumentException.class).hasMessage(message).hasNoCause(); } @Test @@ -33,19 +27,14 @@ public class GuavaPreConditionsTest { final int age = -18; final String message = "Age can't be zero or less than zero, you supplied %s."; - assertThatThrownBy(() -> checkArgument(age > 0, message, age)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage(message, age) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkArgument(age > 0, message, age)).isInstanceOf(IllegalArgumentException.class).hasMessage(message, age).hasNoCause(); } @Test public void givenArrayOfIntegers_whenCheckElementIndexEvaluatesFalse_throwsException() { final int[] numbers = { 1, 2, 3, 4, 5 }; - assertThatThrownBy(() -> checkElementIndex(6, numbers.length - 1)) - .isInstanceOf(IndexOutOfBoundsException.class) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkElementIndex(6, numbers.length - 1)).isInstanceOf(IndexOutOfBoundsException.class).hasNoCause(); } @Test @@ -53,20 +42,7 @@ public class GuavaPreConditionsTest { final int[] numbers = { 1, 2, 3, 4, 5 }; final String message = "Please check the bound of an array and retry"; - assertThatThrownBy(() -> checkElementIndex(6, numbers.length - 1, message)) - .isInstanceOf(IndexOutOfBoundsException.class) - .hasMessageStartingWith(message) - .hasNoCause(); - } - - @Test - public void givenNullString_whenCheckNotNullCalled_throwsException() { - final String nullObject = null; - - assertThatThrownBy(() -> checkNotNull(nullObject)) - .isInstanceOf(NullPointerException.class) - .hasMessage(null) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkElementIndex(6, numbers.length - 1, message)).isInstanceOf(IndexOutOfBoundsException.class).hasMessageStartingWith(message).hasNoCause(); } @Test @@ -74,10 +50,7 @@ public class GuavaPreConditionsTest { final String nullObject = null; final String message = "Please check the Object supplied, its null!"; - assertThatThrownBy(() -> checkNotNull(nullObject, message)) - .isInstanceOf(NullPointerException.class) - .hasMessage(message) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkNotNull(nullObject, message)).isInstanceOf(NullPointerException.class).hasMessage(message).hasNoCause(); } @Test @@ -85,19 +58,14 @@ public class GuavaPreConditionsTest { final String nullObject = null; final String message = "Please check the Object supplied, its %s!"; - assertThatThrownBy(() -> checkNotNull(nullObject, message, nullObject)) - .isInstanceOf(NullPointerException.class) - .hasMessage(message, nullObject) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkNotNull(nullObject, message, nullObject)).isInstanceOf(NullPointerException.class).hasMessage(message, nullObject).hasNoCause(); } @Test public void givenArrayOfIntegers_whenCheckPositionIndexEvaluatesFalse_throwsException() { final int[] numbers = { 1, 2, 3, 4, 5 }; - assertThatThrownBy(() -> checkPositionIndex(6, numbers.length - 1)) - .isInstanceOf(IndexOutOfBoundsException.class) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkPositionIndex(6, numbers.length - 1)).isInstanceOf(IndexOutOfBoundsException.class).hasNoCause(); } @Test @@ -105,30 +73,14 @@ public class GuavaPreConditionsTest { final int[] numbers = { 1, 2, 3, 4, 5 }; final String message = "Please check the bound of an array and retry"; - assertThatThrownBy(() -> checkPositionIndex(6, numbers.length - 1, message)) - .isInstanceOf(IndexOutOfBoundsException.class) - .hasMessageStartingWith(message) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkPositionIndex(6, numbers.length - 1, message)).isInstanceOf(IndexOutOfBoundsException.class).hasMessageStartingWith(message).hasNoCause(); } @Test public void givenArrayOfIntegers_whenCheckPositionIndexesEvaluatesFalse_throwsException() { final int[] numbers = { 1, 2, 3, 4, 5 }; - assertThatThrownBy(() -> checkPositionIndexes(6, 0, numbers.length - 1)) - .isInstanceOf(IndexOutOfBoundsException.class) - .hasNoCause(); - } - - @Test - public void givenValidStates_whenCheckStateEvaluatesFalse_throwsException() { - final int[] validStates = { -1, 0, 1 }; - final int givenState = 10; - - assertThatThrownBy(() -> checkState(Arrays.binarySearch(validStates, givenState) > 0)) - .isInstanceOf(IllegalStateException.class) - .hasMessage(null) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkPositionIndexes(6, 0, numbers.length - 1)).isInstanceOf(IndexOutOfBoundsException.class).hasNoCause(); } @Test @@ -137,10 +89,7 @@ public class GuavaPreConditionsTest { final int givenState = 10; final String message = "You have entered an invalid state"; - assertThatThrownBy(() -> checkState(Arrays.binarySearch(validStates, givenState) > 0, message)) - .isInstanceOf(IllegalStateException.class) - .hasMessageStartingWith(message) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkState(Arrays.binarySearch(validStates, givenState) > 0, message)).isInstanceOf(IllegalStateException.class).hasMessageStartingWith(message).hasNoCause(); } @Test @@ -149,9 +98,7 @@ public class GuavaPreConditionsTest { final int givenState = 10; final String message = "State can't be %s, It can be one of %s."; - assertThatThrownBy(() -> checkState(Arrays.binarySearch(validStates, givenState) > 0, message, givenState, Arrays.toString(validStates))) - .isInstanceOf(IllegalStateException.class) - .hasMessage(message, givenState, Arrays.toString(validStates)) - .hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkState(Arrays.binarySearch(validStates, givenState) > 0, message, givenState, Arrays.toString(validStates))).isInstanceOf(IllegalStateException.class) + .hasMessage(message, givenState, Arrays.toString(validStates)).hasNoCause(); } -} +} \ No newline at end of file From 24ccec2a2080afb0a24da5f9564916594d7fe007 Mon Sep 17 00:00:00 2001 From: eugenp Date: Mon, 6 Feb 2017 00:37:53 +0200 Subject: [PATCH 042/192] minof formatting work --- .../test/java/org/baeldung/guava/GuavaPreConditionsTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java b/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java index aff42ea6e2..f231fdda9d 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java @@ -1,9 +1,12 @@ package org.baeldung.guava; import static org.assertj.core.api.Assertions.assertThatThrownBy; + import java.util.Arrays; + import org.junit.Test; -import com.google.common.base.*; + +import com.google.common.base.Preconditions; public class GuavaPreConditionsTest { From 3b82dd6b3b1cb8c224fc5f1820cbcd3ccddf02dc Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Mon, 6 Feb 2017 04:59:03 +0100 Subject: [PATCH 043/192] BAEL-248 Moved HttpComponentsClientHttpRequestFactoryBasicAuth to an existing package --- .../client/HttpComponentsClientHttpRequestFactoryBasicAuth.java | 2 +- .../src/main/java/org/baeldung/client/RestTemplateFactory.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) rename spring-security-rest-basic-auth/src/main/java/org/baeldung/{http => }/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java (97%) diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java similarity index 97% rename from spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java rename to spring-security-rest-basic-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java index 4a7b4869bc..a2f51d343b 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/http/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -1,4 +1,4 @@ -package org.baeldung.http.client; +package org.baeldung.client; import java.net.URI; diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java index 061f9b3022..5e15648e9b 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java @@ -1,7 +1,6 @@ package org.baeldung.client; import org.apache.http.HttpHost; -import org.baeldung.http.client.HttpComponentsClientHttpRequestFactoryBasicAuth; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.http.client.ClientHttpRequestFactory; From daf7af813cfae915907e8a71d946445679f1018e Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Mon, 6 Feb 2017 06:51:56 +0000 Subject: [PATCH 044/192] Implemented strategy pattern tutorial (#1110) --- .../strategy/ChristmasDiscounter.java | 10 ++++ .../com/baeldung/strategy/Discounter.java | 7 +++ .../baeldung/strategy/EasterDiscounter.java | 10 ++++ .../StrategyDesignPatternUnitTest.java | 58 +++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java create mode 100644 core-java/src/main/java/com/baeldung/strategy/Discounter.java create mode 100644 core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java create mode 100644 core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java b/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java new file mode 100644 index 0000000000..644c57aa26 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java @@ -0,0 +1,10 @@ +package com.baeldung.strategy; + +import java.math.BigDecimal; + +public class ChristmasDiscounter implements Discounter { + @Override + public BigDecimal applyDiscount(final BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.9)); + } +} diff --git a/core-java/src/main/java/com/baeldung/strategy/Discounter.java b/core-java/src/main/java/com/baeldung/strategy/Discounter.java new file mode 100644 index 0000000000..ed6a00cba4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/strategy/Discounter.java @@ -0,0 +1,7 @@ +package com.baeldung.strategy; + +import java.math.BigDecimal; + +public interface Discounter { + BigDecimal applyDiscount(BigDecimal amount); +} diff --git a/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java b/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java new file mode 100644 index 0000000000..fd70255482 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java @@ -0,0 +1,10 @@ +package com.baeldung.strategy; + +import java.math.BigDecimal; + +public class EasterDiscounter implements Discounter { + @Override + public BigDecimal applyDiscount(final BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.5)); + } +} diff --git a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java new file mode 100644 index 0000000000..b1881091d9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.strategy; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +public class StrategyDesignPatternUnitTest { + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounter() { + Discounter staffDiscounter = new EasterDiscounter(); + + final BigDecimal discountedValue = staffDiscounter + .applyDiscount(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithAnonyousTypes() { + Discounter staffDiscounter = new Discounter() { + @Override + public BigDecimal applyDiscount(final BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.5)); + } + }; + + final BigDecimal discountedValue = staffDiscounter + .applyDiscount(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithLamda() { + Discounter staffDiscounter = amount -> amount.multiply(BigDecimal.valueOf(0.5)); + + final BigDecimal discountedValue = staffDiscounter + .applyDiscount(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldApplyListOfDiscounts() { + List discounters = newArrayList(); + + BigDecimal amount = BigDecimal.valueOf(100); + + discounters.forEach((d) -> d.applyDiscount(amount)); + } +} From 77f1a97e8fb3cbbbb10d2bf9bcbc12a957495cdc Mon Sep 17 00:00:00 2001 From: pivovarit Date: Mon, 6 Feb 2017 08:07:05 +0100 Subject: [PATCH 045/192] Refactor Discounter examples --- .../strategy/ChristmasDiscounter.java | 3 +- .../com/baeldung/strategy/Discounter.java | 16 ++++++++-- .../baeldung/strategy/EasterDiscounter.java | 3 +- .../StrategyDesignPatternUnitTest.java | 31 ++++++++++++++----- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java b/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java index 644c57aa26..a0c36bb63e 100644 --- a/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java +++ b/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java @@ -3,8 +3,9 @@ package com.baeldung.strategy; import java.math.BigDecimal; public class ChristmasDiscounter implements Discounter { + @Override - public BigDecimal applyDiscount(final BigDecimal amount) { + public BigDecimal apply(BigDecimal amount) { return amount.multiply(BigDecimal.valueOf(0.9)); } } diff --git a/core-java/src/main/java/com/baeldung/strategy/Discounter.java b/core-java/src/main/java/com/baeldung/strategy/Discounter.java index ed6a00cba4..4701287946 100644 --- a/core-java/src/main/java/com/baeldung/strategy/Discounter.java +++ b/core-java/src/main/java/com/baeldung/strategy/Discounter.java @@ -1,7 +1,19 @@ package com.baeldung.strategy; import java.math.BigDecimal; +import java.util.function.UnaryOperator; -public interface Discounter { - BigDecimal applyDiscount(BigDecimal amount); +public interface Discounter extends UnaryOperator { + + static Discounter christmas() { + return (amount) -> amount.multiply(BigDecimal.valueOf(0.9)); + } + + static Discounter newYear() { + return (amount) -> amount.multiply(BigDecimal.valueOf(0.8)); + } + + static Discounter easter() { + return (amount) -> amount.multiply(BigDecimal.valueOf(0.5)); + } } diff --git a/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java b/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java index fd70255482..990d10073b 100644 --- a/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java +++ b/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java @@ -3,8 +3,9 @@ package com.baeldung.strategy; import java.math.BigDecimal; public class EasterDiscounter implements Discounter { + @Override - public BigDecimal applyDiscount(final BigDecimal amount) { + public BigDecimal apply(BigDecimal amount) { return amount.multiply(BigDecimal.valueOf(0.5)); } } diff --git a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java index b1881091d9..2c1c166b9c 100644 --- a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java +++ b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java @@ -3,10 +3,12 @@ package com.baeldung.strategy; import org.junit.Test; import java.math.BigDecimal; +import java.util.Arrays; import java.util.List; +import java.util.function.Function; +import static com.baeldung.strategy.Discounter.*; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.util.Lists.newArrayList; public class StrategyDesignPatternUnitTest { @Test @@ -14,7 +16,7 @@ public class StrategyDesignPatternUnitTest { Discounter staffDiscounter = new EasterDiscounter(); final BigDecimal discountedValue = staffDiscounter - .applyDiscount(BigDecimal.valueOf(100)); + .apply(BigDecimal.valueOf(100)); assertThat(discountedValue) .isEqualByComparingTo(BigDecimal.valueOf(50)); @@ -24,13 +26,13 @@ public class StrategyDesignPatternUnitTest { public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithAnonyousTypes() { Discounter staffDiscounter = new Discounter() { @Override - public BigDecimal applyDiscount(final BigDecimal amount) { + public BigDecimal apply( BigDecimal amount) { return amount.multiply(BigDecimal.valueOf(0.5)); } }; final BigDecimal discountedValue = staffDiscounter - .applyDiscount(BigDecimal.valueOf(100)); + .apply(BigDecimal.valueOf(100)); assertThat(discountedValue) .isEqualByComparingTo(BigDecimal.valueOf(50)); @@ -41,18 +43,31 @@ public class StrategyDesignPatternUnitTest { Discounter staffDiscounter = amount -> amount.multiply(BigDecimal.valueOf(0.5)); final BigDecimal discountedValue = staffDiscounter - .applyDiscount(BigDecimal.valueOf(100)); + .apply(BigDecimal.valueOf(100)); assertThat(discountedValue) .isEqualByComparingTo(BigDecimal.valueOf(50)); } @Test - public void shouldApplyListOfDiscounts() { - List discounters = newArrayList(); + public void shouldApplyAllDiscounts() { + List discounters = Arrays.asList(christmas(), newYear(), easter()); BigDecimal amount = BigDecimal.valueOf(100); - discounters.forEach((d) -> d.applyDiscount(amount)); + final Discounter combinedDiscounter = discounters + .stream() + .reduce(v -> v, (d1, d2) -> (Discounter) d1.andThen(d2)); + + combinedDiscounter.apply(amount); + } + + @Test + public void shouldChainDiscounters() { + final Function combinedDiscounters = Discounter + .christmas() + .andThen(newYear()); + + combinedDiscounters.apply(BigDecimal.valueOf(100)); } } From 13f2eef879859dab437d6199ce717ecc75096536 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Mon, 6 Feb 2017 09:05:55 +0100 Subject: [PATCH 046/192] Fix Discounter examples --- core-java/src/main/java/com/baeldung/strategy/Discounter.java | 4 ++++ .../com/baeldung/strategy/StrategyDesignPatternUnitTest.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/strategy/Discounter.java b/core-java/src/main/java/com/baeldung/strategy/Discounter.java index 4701287946..00bf4855d1 100644 --- a/core-java/src/main/java/com/baeldung/strategy/Discounter.java +++ b/core-java/src/main/java/com/baeldung/strategy/Discounter.java @@ -5,6 +5,10 @@ import java.util.function.UnaryOperator; public interface Discounter extends UnaryOperator { + default Discounter combine(Discounter after) { + return value -> after.apply(this.apply(value)); + } + static Discounter christmas() { return (amount) -> amount.multiply(BigDecimal.valueOf(0.9)); } diff --git a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java index 2c1c166b9c..7ca1d000be 100644 --- a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java +++ b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java @@ -57,7 +57,7 @@ public class StrategyDesignPatternUnitTest { final Discounter combinedDiscounter = discounters .stream() - .reduce(v -> v, (d1, d2) -> (Discounter) d1.andThen(d2)); + .reduce(v -> v, Discounter::combine); combinedDiscounter.apply(amount); } From 9f77fecd1589c0a53281f8486847c9a092fcc247 Mon Sep 17 00:00:00 2001 From: Diane Duan Date: Mon, 6 Feb 2017 17:47:57 +0800 Subject: [PATCH 047/192] fix --- .../test/java/com/baeldung/metrics/core/MetricsTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java index f670acfaef..e876de6e65 100644 --- a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java @@ -138,15 +138,15 @@ public class MetricsTest { long elapsed1 = context1.stop(); - assertEquals(5000000000L, elapsed1, 10000000); + assertEquals(5000000000L, elapsed1, 1000000000); assertThat(timer.getCount(), equalTo(1L)); - assertEquals(0.2, timer.getMeanRate(), 0.1); + assertEquals(0.2, timer.getMeanRate(), 0.2); Timer.Context context2 = timer.time(); TimeUnit.SECONDS.sleep(2); context2.close(); assertThat(timer.getCount(), equalTo(2L)); - assertEquals(0.3, timer.getMeanRate(), 0.1); + assertEquals(0.3, timer.getMeanRate(), 0.2); } } From 071790b1d8ad197c12cf80d17fdd90245ca49cb2 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Mon, 6 Feb 2017 14:05:00 +0100 Subject: [PATCH 048/192] Rename ConcurrentMap tests --- ...tusTest.java => ConcurrentMapAggregateStatusManualTest.java} | 2 +- ...yValueTest.java => ConcurrentMapNullKeyValueManualTest.java} | 2 +- ...ormanceTest.java => ConcurrentMapPerformanceManualTest.java} | 2 +- ...ableMapTests.java => ConcurrentNavigableMapManualTests.java} | 2 +- ...cyTest.java => ConcurretMapMemoryConsistencyManualTest.java} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename core-java/src/test/java/com/baeldung/java/concurrentmap/{ConcurrentMapAggregateStatusTest.java => ConcurrentMapAggregateStatusManualTest.java} (97%) rename core-java/src/test/java/com/baeldung/java/concurrentmap/{ConcurrentMapNullKeyValueTest.java => ConcurrentMapNullKeyValueManualTest.java} (99%) rename core-java/src/test/java/com/baeldung/java/concurrentmap/{ConcurrentMapPerformanceTest.java => ConcurrentMapPerformanceManualTest.java} (98%) rename core-java/src/test/java/com/baeldung/java/concurrentmap/{ConcurrentNavigableMapTests.java => ConcurrentNavigableMapManualTests.java} (98%) rename core-java/src/test/java/com/baeldung/java/concurrentmap/{ConcurretMapMemoryConsistencyTest.java => ConcurretMapMemoryConsistencyManualTest.java} (97%) diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusTest.java rename to core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java index 73a4cdc0cd..ec865f71c4 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java @@ -14,7 +14,7 @@ import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -public class ConcurrentMapAggregateStatusTest { +public class ConcurrentMapAggregateStatusManualTest { private ExecutorService executorService; private Map concurrentMap; diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueTest.java rename to core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java index 62a3d10add..33e3326427 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java @@ -10,7 +10,7 @@ import java.util.concurrent.ConcurrentMap; import static org.junit.Assert.assertNull; -public class ConcurrentMapNullKeyValueTest { +public class ConcurrentMapNullKeyValueManualTest { ConcurrentMap concurrentMap; diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceTest.java rename to core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java index a0efa89351..5c1612ca60 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java @@ -11,7 +11,7 @@ import java.util.concurrent.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class ConcurrentMapPerformanceTest { +public class ConcurrentMapPerformanceManualTest { @Test public void givenMaps_whenGetPut500KTimes_thenConcurrentMapFaster() throws Exception { diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapManualTests.java similarity index 98% rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java rename to core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapManualTests.java index 96a8a6bac3..d102680aa4 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapTests.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentNavigableMapManualTests.java @@ -10,7 +10,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.testng.Assert.*; -public class ConcurrentNavigableMapTests { +public class ConcurrentNavigableMapManualTests { @Test public void givenSkipListMap_whenAccessInMultiThreads_thenOrderingStable() throws InterruptedException { diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurretMapMemoryConsistencyTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurretMapMemoryConsistencyManualTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurretMapMemoryConsistencyTest.java rename to core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurretMapMemoryConsistencyManualTest.java index 63a96dd5ee..43cbb2d293 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurretMapMemoryConsistencyTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurretMapMemoryConsistencyManualTest.java @@ -10,7 +10,7 @@ import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; -public class ConcurretMapMemoryConsistencyTest { +public class ConcurretMapMemoryConsistencyManualTest { @Test public void givenConcurrentMap_whenSumParallel_thenCorrect() throws Exception { From c198a96ec51dd9fd1010f44f208bc93a4c035930 Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Tue, 7 Feb 2017 02:33:47 +0530 Subject: [PATCH 049/192] Pre conditions (#1128) * BAL-36 File size api in java and apache commons IO * BAEL-282 grep in java - fixes after code review * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved asserts and test classes in test folder. * BAEL-519 moved test related producer and consumer to src. * BAEL-586 Guide to Guava BiMap. * BAEL-587 formatted code. * BAEL-519 LMAX Disruptor * BAEL-587 resolved merge * BAEL-587 Resolved merge * BAEL-519 Removed disruptor link. * BAEL-519 Reverted Guava changes * RFQ-587 Added disruptor as a separate module. * BAEL-519 Disruptor changes. * BAEL-519 Removed disruptor from core-java module. * BAEL-637 Guide to PreConditions * BAEL-637 Used assertJ for exception assertion. * BAEL-637 updated tests to use assertJ. * BAEL-637 Removed redundant tests. * BAEL-637 explicitely specify the null varargs. * BAEL-637 explicitely specify the null varargs. --- .../java/org/baeldung/guava/GuavaPreConditionsTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java b/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java index f231fdda9d..2d98418d48 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaPreConditionsTest.java @@ -1,12 +1,9 @@ package org.baeldung.guava; import static org.assertj.core.api.Assertions.assertThatThrownBy; - import java.util.Arrays; - import org.junit.Test; - -import com.google.common.base.Preconditions; +import com.google.common.base.*; public class GuavaPreConditionsTest { @@ -61,7 +58,7 @@ public class GuavaPreConditionsTest { final String nullObject = null; final String message = "Please check the Object supplied, its %s!"; - assertThatThrownBy(() -> Preconditions.checkNotNull(nullObject, message, nullObject)).isInstanceOf(NullPointerException.class).hasMessage(message, nullObject).hasNoCause(); + assertThatThrownBy(() -> Preconditions.checkNotNull(nullObject, message, new Object[] { null })).isInstanceOf(NullPointerException.class).hasMessage(message, nullObject).hasNoCause(); } @Test From c40d6962dd5c630b7079297e7ba8ae90a55073e6 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sat, 4 Feb 2017 13:45:39 +0000 Subject: [PATCH 050/192] Added ConcurrentModificationException test --- .../ConcurrentModificationUnitTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java new file mode 100644 index 0000000000..9db460abbd --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.java.concurrentmodificationexception; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.ConcurrentModificationException; +import java.util.Iterator; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +public class ConcurrentModificationUnitTest { + @Test(expected = ConcurrentModificationException.class) + public void whilstRemovingDuringIteration_shouldThrowException() throws InterruptedException { + + ArrayList integers = newArrayList(1, 2, 3); + + for (Integer integer : integers) { + integers.remove(1); + } + } + + @Test + public void whilstRemovingDuringIteration_shouldNotThrowException() throws InterruptedException { + + ArrayList integers = newArrayList(1, 2, 3); + + for (Iterator iterator = integers.iterator(); iterator.hasNext();) { + Integer integer = iterator.next(); + if(integer == 2) { + iterator.remove(); + } + } + + assertThat(integers).containsExactly(1, 3); + } + + @Test + public void whilstRemovingDuringForEach_shouldNotThrowException() throws InterruptedException { + + ArrayList integers = newArrayList(1, 2, 3); + ArrayList toRemove = newArrayList(); + + for (Integer integer : integers) { + if(integer == 2) { + toRemove.add(integer); + } + } + integers.removeAll(toRemove); + + assertThat(integers).containsExactly(1, 3); + } +} From 0a444d32cf1d9bb9225a0e28d54e2576fe718775 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Mon, 6 Feb 2017 21:55:24 +0000 Subject: [PATCH 051/192] Renamed unit tests for ConcurrentModificationUnit --- .../ConcurrentModificationUnitTest.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java index 9db460abbd..11c6012ecd 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java @@ -12,7 +12,7 @@ import static org.assertj.core.util.Lists.newArrayList; public class ConcurrentModificationUnitTest { @Test(expected = ConcurrentModificationException.class) - public void whilstRemovingDuringIteration_shouldThrowException() throws InterruptedException { + public void givenIterating_whenRemoving_thenThrowException() throws InterruptedException { ArrayList integers = newArrayList(1, 2, 3); @@ -22,7 +22,7 @@ public class ConcurrentModificationUnitTest { } @Test - public void whilstRemovingDuringIteration_shouldNotThrowException() throws InterruptedException { + public void givenIterating_whenUsingIteratorRemove_thenDontError() throws InterruptedException { ArrayList integers = newArrayList(1, 2, 3); @@ -37,7 +37,7 @@ public class ConcurrentModificationUnitTest { } @Test - public void whilstRemovingDuringForEach_shouldNotThrowException() throws InterruptedException { + public void givenIterating_whenUsingRemovalList_thenDontError() throws InterruptedException { ArrayList integers = newArrayList(1, 2, 3); ArrayList toRemove = newArrayList(); @@ -51,4 +51,14 @@ public class ConcurrentModificationUnitTest { assertThat(integers).containsExactly(1, 3); } + + @Test + public void whenUsingRemoveIf_thenRemoveElements() throws InterruptedException { + + ArrayList integers = newArrayList(1, 2, 3); + + integers.removeIf((i) -> i == 2); + + assertThat(integers).containsExactly(1, 3); + } } From 47889bc227fda24d141a1b601377d8eed826e021 Mon Sep 17 00:00:00 2001 From: lor6 Date: Tue, 7 Feb 2017 01:03:00 +0200 Subject: [PATCH 052/192] Bael 623 v2 (#1119) * helper classes for excel processing, tests * fix imports * list declaration * shorten examples, add excel files --- apache-poi/pom.xml | 10 ---------- .../java/com/baeldung/jexcel/JExcelHelper.java | 7 +------ .../com/baeldung/poi/excel/ExcelPOIHelper.java | 9 --------- .../java/com/baeldung/jexcel/JExcelTest.java | 6 ------ .../java/com/baeldung/poi/excel/ExcelTest.java | 6 ------ apache-poi/temp.xls | Bin 0 -> 13824 bytes apache-poi/temp.xlsx | Bin 0 -> 3510 bytes 7 files changed, 1 insertion(+), 37 deletions(-) create mode 100644 apache-poi/temp.xls create mode 100644 apache-poi/temp.xlsx diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml index 1b97248ab2..d8a2cc72e0 100644 --- a/apache-poi/pom.xml +++ b/apache-poi/pom.xml @@ -37,16 +37,6 @@ org.apache.poi poi-ooxml ${poi.version} - - - org.apache.poi - poi - ${poi.version} - - - org.apache.poi - poi-ooxml-schemas - ${poi.version} org.jxls diff --git a/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java b/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java index 39076fd709..4ad3fc766c 100644 --- a/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java +++ b/apache-poi/src/main/java/com/baeldung/jexcel/JExcelHelper.java @@ -62,12 +62,7 @@ public class JExcelHelper { sheet.addCell(cellLabel); Number cellNumber = new Number(1, 2, 20, cellFormat); sheet.addCell(cellNumber); - - cellLabel = new Label(0, 3, "Ana Johnson", cellFormat); - sheet.addCell(cellLabel); - cellNumber = new Number(1, 3, 30, cellFormat); - sheet.addCell(cellNumber); - + workbook.write(); } finally { if (workbook != null) { diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java index 841be22d62..b6b0cbef20 100644 --- a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java +++ b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelPOIHelper.java @@ -110,15 +110,6 @@ public class ExcelPOIHelper { cell.setCellValue(20); cell.setCellStyle(style); - row = sheet.createRow(3); - cell = row.createCell(0); - cell.setCellValue("Ana Johnson"); - cell.setCellStyle(style); - - cell = row.createCell(1); - cell.setCellValue(30); - cell.setCellStyle(style); - File currDir = new File("."); String path = currDir.getAbsolutePath(); String fileLocation = path.substring(0, path.length() - 1) + "temp.xlsx"; diff --git a/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java b/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java index f0c129eb22..8ee465be34 100644 --- a/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java +++ b/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java @@ -51,12 +51,6 @@ public class JExcelTest { .get(0)); assertEquals("20", data.get(2) .get(1)); - - assertEquals("Ana Johnson", data.get(3) - .get(0)); - assertEquals("30", data.get(3) - .get(1)); - } } \ No newline at end of file diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java index f58db241b2..34fa64dd94 100644 --- a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java +++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java @@ -48,12 +48,6 @@ public class ExcelTest { .get(0)); assertEquals("20", data.get(1) .get(1)); - - assertEquals("Ana Johnson", data.get(2) - .get(0)); - assertEquals("30", data.get(2) - .get(1)); - } } \ No newline at end of file diff --git a/apache-poi/temp.xls b/apache-poi/temp.xls new file mode 100644 index 0000000000000000000000000000000000000000..1fad76d88d4842cfa56a936fc6b33786ade3291f GIT binary patch literal 13824 zcmeHOOG{Nz6#n*o==F8IULTbdT#CR{M6*Jod_)cu3Q3{{Lis91%@DJK!rN)X+;>{y#nO@hC8;m1@{TC-}B@)&|BFiWMvaEP!Qun=0)+f@=d<1rL6Z7LUMc^D>W6b8@6 zc{U2+x-rS27dWh!eWQH92s|Dphgv?mn1lCIZ=r6bPEi-K`mdeDn%7QI$lvVjR)@`G z;3aE`9@b*YA(U#nOpj~=F)Tm&^8VOBPum&AYZb3kc~g-zZAy7LUb{&S4;pT;XCWfK zDp_x-^=*}N*ogvSehH)A)jPkv*cNDqleCTDy3UPgO{xEp48_$%=z=~i7UHW_+xnH1 zRfAx1;6jW;3$Ybt#E&MpbBs+~OP|uh?EPxebz!)$Fi~(c77%&Em0b{@zFb0ePW55_N28;n?z!)$Fi~(c7 z7%&Em0b{@zFb0ePW55_N28;n?z!)$Fi~(c77%&Emfz8Q)B$-NrsicTXdaPs}OAe|0 z3?Tn?NIIHPD NgSqGGUtRz7{{s%gg0TPq literal 0 HcmV?d00001 diff --git a/apache-poi/temp.xlsx b/apache-poi/temp.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..da67ca9e9e71409c744feca69821a8a39282d024 GIT binary patch literal 3510 zcmaJ@dpwhU8%LN^jCh@e`+tVcI5#P)2hor=c*XgeRgz%0qf6 zPYy{~2ZvA*5%!LS2=7+!``F`s>U)3gd-osr_1o|IUfuhuq7i9G+}QN2fO2i9mhvpzC;H-muWy$frQcG1Z1e-n zEzGRdn>@J&wSLfKXg6~SN0-}KMfsOF>{(CyXv_Hf;831QKFfq%R)>Jn=M1L&h5>oV z8GGrdeU%no+MvWzO!Z}X^)qPjv8v2eyjcZmKGed<3lT}Ze+_a0)uMf3t|0bd7zPRG zHc5(&=)aTSt~PnM;vFR1mO*ivhhV3#&f$yI)%w%iFS^$bMh$`QFXw*NEN6^CbOm8n z!Px;^D7xd-0!@3ca}UFy;v@Bw8Bv%AdJ~$(c<=|(h=#NU@O>~ZnVn*0e}apH1Nl>a zb}_$jIgAY^pn?e=ju9a!yqjitP+2s%)EcKv%8uJ@wO90lS&-i# zDW*&wxY11I@jhY=il-75MjtLi&{pHwb+5!6^ji%AI{;N&cZm8iuWOd4@zKvJuk>Tk zaS5caEl-!PN#2--Slsp>m?DKH((MzgAR&hqfvvmxNfRm#6klZ)+hGQsY&nLOqLvat=?;XP%b4zy-|iBze{wN%z$q}N4!>lMzP{TeD4A4yrRjC zW;qElIh1pvTIBp&a67ldlrTrZ$KNyg8M3O8P8YnZs#aiNjF{`N2}NBra^j&&aaVzE zOwp#F^@>Ayt;Uu!z2ghL4qDVviW|R!NV#*sdrqC87BwFA?{xl0LUzW57rxr z!-n9sJVQcQ?88%A1s;QdM`*-NAP)N=5}2V|rbtvf-z&m5{hBuqZhdlkijo#NI7TPuTf*<%d?td+dH5}dODA5Zpl)49{$Ae;5emB=5`yH_sZa4#@ zYpQs=1jbmGxQ&h8YjQDf&d=3J$i3rAdzl_ZTx{->D3Lbj_xJRm%b)QA3}nBRKt6zbg7Y<`hxPym{vRv!{-!nNuHD%Lj`gYJ_aE@!l!8 zy>rad%1%~{WhJ{g_zoCWZplgQk+R; zc%T;E-xG)OIZnW#gZ=O=uf9^z!H#V4J)||hHLYu+ zDtk;8YfdD~i1hUt@4Q&{)*&@jaMHdny|sRV6TB4Qd;%lkW`@?|xiwhm%3VDW@MSV> zIP}6yj&U+xX!Zgu`|{Fv<(Ic~E9Eoy-up|T?EG(bgor@Y_q58g;D~V$kVLay+kIe6 z@&S)hJXtZ`@t$8}zxzly`SgJIvvY&-9%)c98DYM2zqgGWESeVDsa6C7sylSRT0378 zq92uT*XUVzc~Hli=3ZbThrfYuMM+5*D{ycn2{ZIe;?H2E7Uwv1m#3a`JvAygo0rfK zYO?s6Q_?i|o)_iSOfp(CLtjGS%Siy@G`mQ zI-}{aln~6T9Ej2LF_j$0LF4qXo3|@Iv{P^J3QgP@KL>ci)lCYXu@4q9S_kHxVhNZd z5k^c)@?(|gk~ z<$cBP*h;!C!!WHrtCKOIT|I7nJ+QGu0iO{?M*CP$B1>igUyEO6GCpy=l?&KNvzmqY zebUQAAe6@Ja(KJTf@Vf?ir3Ni{XDgge<@MWBY;)72KA|vPx|!MiJ9X5wN1U8X)-U{ zI-&30M&v3NtLNQ&GDGjESy9&MQ) z%>1w>?EL(&DH$(pc9;t#Fl`EGV!kJsM|67NGGB8*^hHnAraFRwj@^f%N6p8~UGBcS z{#$x{)E^?XuFcOgBU-z>RRL~PqPc)!sxCNu=&grqoF`p;J&Ru+NqRN+b#Q@GO)K&V z`aqz##jIjdmMq3lCEvv0cg5-Q7okffLGpog&(DB+m+v>%h8A)DQQ<2u|1xy8B```J zDHpOJF@D3be%!LJaY*7DB4mC|`<nE82N9FL1l# zM{pKdBIgf|RJc9b@rW?n`X+Qin8nb|tG}fTG4qH1(wRtYX$S9*LJ{!HKFIvhW{D`2 z?1qQ~iIZsXZz6D7nb2EZUMF4OKEYk%Q=tHWzokq6IdA9~^$`DAI%z3uIpT#Cr8=#4 z4*+!1Kbr~@Kh9P8G8+lEheGvFJs`Nby8FcG8x3=Ti5F`Pg9<*=r0P(DcloLC&g743sqe2<{3Zq(7%W_Q=u#bK8h#s> z{KfE5bb_!AK+32NfT+`n+GP`=S4zyI87-G5r~%=hYo702N&CEXdPosMK3haH8H2}9j;rX$`U*m9lD0^dJHP$V} z0KSK^w~_6^>}QVEd$y3n_dWP0ooM?y?4n?u&@D9b|Fwz#JFiGv9$wa${LG7W>OH?} F=0A|CZn^*f literal 0 HcmV?d00001 From 24760595fac8755287f7f540e7a118294cadfb3d Mon Sep 17 00:00:00 2001 From: lor6 Date: Tue, 7 Feb 2017 06:13:18 +0200 Subject: [PATCH 053/192] 2 login pages config (#1081) * 2 login pages config * fix links * small fix * fix formatting --- spring-mvc-forms/pom.xml | 18 +++ .../configuration/SecurityConfig.java | 122 ++++++++++++++++++ .../configuration/WebInitializer.java | 4 + .../controller/UsersController.java | 38 ++++++ .../src/main/webapp/WEB-INF/views/403.jsp | 12 ++ .../main/webapp/WEB-INF/views/adminPage.jsp | 16 +++ .../main/webapp/WEB-INF/views/loginAdmin.jsp | 38 ++++++ .../main/webapp/WEB-INF/views/loginUser.jsp | 37 ++++++ .../webapp/WEB-INF/views/protectedLinks.jsp | 16 +++ .../main/webapp/WEB-INF/views/userPage.jsp | 15 +++ 10 files changed, 316 insertions(+) create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms/pom.xml index 31a0c38791..f17d695c35 100644 --- a/spring-mvc-forms/pom.xml +++ b/spring-mvc-forms/pom.xml @@ -46,6 +46,23 @@ commons-fileupload ${fileupload.version} + + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + org.springframework.security + spring-security-taglibs + ${org.springframework.security.version} + + @@ -98,6 +115,7 @@ 5.3.3.Final enter-location-of-server 1.3.2 + 4.2.1.RELEASE diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java new file mode 100644 index 0000000000..e35844138d --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java @@ -0,0 +1,122 @@ +package com.baeldung.springmvcforms.configuration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.TestingAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + + @Bean + public UserDetailsService userDetailsService() throws Exception { + InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); + manager.createUser(User.withUsername("user") + .password("userPass") + .roles("USER") + .build()); + manager.createUser(User.withUsername("admin") + .password("adminPass") + .roles("ADMIN") + .build()); + return manager; + } + + @Configuration + @Order(1) + public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App1ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin") + .password("admin") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/admin*") + .authorizeRequests() + .anyRequest() + .hasRole("ADMIN") + // log in + .and() + .formLogin() + .loginPage("/loginAdmin") + .loginProcessingUrl("/admin_login") + .failureUrl("/loginAdmin?error=loginError") + .defaultSuccessUrl("/adminPage") + // logout + .and() + .logout() + .logoutUrl("/admin_logout") + .logoutSuccessUrl("/protectedLinks") + .deleteCookies("JSESSIONID") + .and() + .exceptionHandling() + .accessDeniedPage("/403") + .and() + .csrf() + .disable(); + } + } + + @Configuration + @Order(2) + public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App2ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password("user") + .roles("USER"); + } + + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/user*") + .authorizeRequests() + .anyRequest() + .hasRole("USER") + // log in + .and() + .formLogin() + .loginPage("/loginUser") + .loginProcessingUrl("/user_login") + .failureUrl("/loginUser?error=loginError") + .defaultSuccessUrl("/userPage") + // logout + .and() + .logout() + .logoutUrl("/user_logout") + .logoutSuccessUrl("/protectedLinks") + .deleteCookies("JSESSIONID") + .and() + .exceptionHandling() + .accessDeniedPage("/403") + .and() + .csrf() + .disable(); + } + } + +} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java index c602ea6454..fdc155e101 100644 --- a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java @@ -3,6 +3,7 @@ package com.baeldung.springmvcforms.configuration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.ServletContext; @@ -24,6 +25,9 @@ public class WebInitializer implements WebApplicationInitializer { servlet.setLoadOnStartup(1); servlet.addMapping("/"); + + container.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain")) + .addMappingForUrlPatterns(null, false, "/*"); } // @Override // public void onStartup(ServletContext container) { diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java new file mode 100644 index 0000000000..c0858d427f --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java @@ -0,0 +1,38 @@ +package com.baeldung.springmvcforms.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UsersController { + + @RequestMapping("/protectedLinks") + public String getAnonymousPage() { + return "protectedLinks"; + } + + @RequestMapping("/userPage") + public String getUserPage() { + return "userPage"; + } + + @RequestMapping("/adminPage") + public String getAdminPage() { + return "adminPage"; + } + + @RequestMapping("/loginAdmin") + public String getAdminLoginPage() { + return "loginAdmin"; + } + + @RequestMapping("/loginUser") + public String getUserLoginPage() { + return "loginUser"; + } + + @RequestMapping("/403") + public String getAccessDeniedPage() { + return "403"; + } +} diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp new file mode 100644 index 0000000000..e665793e10 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + + + + +Your do not have permission to view this page. + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp new file mode 100644 index 0000000000..a210b690b0 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + +Insert title here + + +Welcome admin! Logout + +

+Back to links + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp new file mode 100644 index 0000000000..a6b2ee7914 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp @@ -0,0 +1,38 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> + + + + +Insert title here + + + +

Admin login page

+
+ + + + + + + + + + + + + +
User:
Password:
+ +
+ + <% + if (request.getParameter("error") != null) { + out.println("Login failed!"); + } + %> + + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp new file mode 100644 index 0000000000..e65c11edaf --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp @@ -0,0 +1,37 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> + + + + +Login + + + +

User login page

+ +
+ + + + + + + + + + + + +
User:
Password:
+ +
+ <% + if (request.getParameter("error") != null) { + out.println("Login failed!"); + } + %> + + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp new file mode 100644 index 0000000000..b8453903ba --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + +Insert title here + + + +">User page +
+">Admin page + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp new file mode 100644 index 0000000000..4c1bd47502 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + +Insert title here + + +Welcome user! Logout +

+Back to links + + \ No newline at end of file From 4077ee29c50eebdecde96808ee97bbbdf8bd967e Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Tue, 7 Feb 2017 06:44:59 +0100 Subject: [PATCH 054/192] BAEL-639 - moving from test to main source tree --- guava/src/{test => main}/java/org/baeldung/guava/CustomEvent.java | 0 .../{test => main}/java/org/baeldung/guava/EventBusWrapper.java | 0 .../src/{test => main}/java/org/baeldung/guava/EventListener.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename guava/src/{test => main}/java/org/baeldung/guava/CustomEvent.java (100%) rename guava/src/{test => main}/java/org/baeldung/guava/EventBusWrapper.java (100%) rename guava/src/{test => main}/java/org/baeldung/guava/EventListener.java (100%) diff --git a/guava/src/test/java/org/baeldung/guava/CustomEvent.java b/guava/src/main/java/org/baeldung/guava/CustomEvent.java similarity index 100% rename from guava/src/test/java/org/baeldung/guava/CustomEvent.java rename to guava/src/main/java/org/baeldung/guava/CustomEvent.java diff --git a/guava/src/test/java/org/baeldung/guava/EventBusWrapper.java b/guava/src/main/java/org/baeldung/guava/EventBusWrapper.java similarity index 100% rename from guava/src/test/java/org/baeldung/guava/EventBusWrapper.java rename to guava/src/main/java/org/baeldung/guava/EventBusWrapper.java diff --git a/guava/src/test/java/org/baeldung/guava/EventListener.java b/guava/src/main/java/org/baeldung/guava/EventListener.java similarity index 100% rename from guava/src/test/java/org/baeldung/guava/EventListener.java rename to guava/src/main/java/org/baeldung/guava/EventListener.java From 178f49e4857a41f426330b29e155546904801852 Mon Sep 17 00:00:00 2001 From: Saptarshi Basu Date: Tue, 7 Feb 2017 15:27:52 +0530 Subject: [PATCH 055/192] BAEL-595 : Review comments incorporated (#1125) * WatchService vs. Apache Commons IO Mnitoring * Indentation fixed * Indentation fixed * JAX-RS API using Jersey [BAEL-558] * JAX-RS API using Jersey [BAEL-558] * Modifications made to remove xml * applicationContext.xml removed * All try catch moved to ExceptionMapper * fixes * review comments incorporated * module renamed * JAX-RS client [BAEL-595] * jersey-core dependency removed * assert changed to assertEquals * messagebody readers and writers removed * pom dependency corrected and other minor changes * Jersey version changed and toString() changed to valueOf() --- spring-jersey/pom.xml | 2 +- .../src/main/java/com/baeldung/client/rest/RestClient.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index 293850d41e..41ebb9a6b5 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -9,7 +9,7 @@ war - 2.25 + 2.25.1 1.7.22 1.1.8 4.12 diff --git a/spring-jersey/src/main/java/com/baeldung/client/rest/RestClient.java b/spring-jersey/src/main/java/com/baeldung/client/rest/RestClient.java index 0e45b68b14..34f7d45601 100644 --- a/spring-jersey/src/main/java/com/baeldung/client/rest/RestClient.java +++ b/spring-jersey/src/main/java/com/baeldung/client/rest/RestClient.java @@ -18,7 +18,7 @@ public class RestClient { } public Employee getJsonEmployee(int id) { - return client.target(REST_URI).path(new Integer(id).toString()).request(MediaType.APPLICATION_JSON).get(Employee.class); + return client.target(REST_URI).path(String.valueOf(id)).request(MediaType.APPLICATION_JSON).get(Employee.class); } public Response createXmlEmployee(Employee emp) { @@ -26,6 +26,6 @@ public class RestClient { } public Employee getXmlEmployee(int id) { - return client.target(REST_URI).path(new Integer(id).toString()).request(MediaType.APPLICATION_XML).get(Employee.class); + return client.target(REST_URI).path(String.valueOf(id)).request(MediaType.APPLICATION_XML).get(Employee.class); } } From c13453d77229fb18475d591ead7fe03e4484f642 Mon Sep 17 00:00:00 2001 From: Tryfon Date: Tue, 7 Feb 2017 12:36:06 +0200 Subject: [PATCH 056/192] Java 8 grouping by collector pull request (#1102) * Char array to string and string to char array test cases added * Minor code renames * Added groupingBy collector unit tests * Added test case for int summary calculation on grouped results * Added the grouping by classes to the main source path * Reverting char array to string test class * Reverting char array to string test class * Reverting char array to string test class * Reverting char array to string test class --- .../java_8_features/groupingby/BlogPost.java | 36 +++++ .../groupingby/BlogPostType.java | 5 + .../Java8GroupingByCollectorUnitTest.java | 132 ++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java create mode 100644 core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java create mode 100644 core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java b/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java new file mode 100644 index 0000000000..afc05e356a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java @@ -0,0 +1,36 @@ +package com.baeldung.java_8_features.groupingby; + +public class BlogPost { + private String title; + private String author; + private BlogPostType type; + private int likes; + + public BlogPost(String title, String author, BlogPostType type, int likes) { + this.title = title; + this.author = author; + this.type = type; + this.likes = likes; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } + + public BlogPostType getType() { + return type; + } + + public int getLikes() { + return likes; + } + + @Override + public String toString() { + return "BlogPost{" + "title='" + title + '\'' + ", type=" + type + ", likes=" + likes + '}'; + } +} diff --git a/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java b/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java new file mode 100644 index 0000000000..2029784e91 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java @@ -0,0 +1,5 @@ +package com.baeldung.java_8_features.groupingby; + +public enum BlogPostType { + NEWS, REVIEW, GUIDE +} diff --git a/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java new file mode 100644 index 0000000000..544db90b73 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java @@ -0,0 +1,132 @@ +package com.baeldung.java8; + +import org.junit.Test; + +import com.baeldung.java_8_features.groupingby.BlogPost; +import com.baeldung.java_8_features.groupingby.BlogPostType; + +import java.util.*; +import java.util.concurrent.ConcurrentMap; + +import static java.util.Comparator.comparingInt; +import static java.util.stream.Collectors.*; +import static org.junit.Assert.*; + +public class Java8GroupingByCollectorUnitTest { + + private static final List POSTS = Arrays.asList(new BlogPost("News item 1", "Author 1", BlogPostType.NEWS, 15), new BlogPost("Tech review 1", "Author 2", BlogPostType.REVIEW, 5), + new BlogPost("Programming guide", "Author 1", BlogPostType.GUIDE, 20), new BlogPost("News item 2", "Author 2", BlogPostType.NEWS, 35), new BlogPost("Tech review 2", "Author 1", BlogPostType.REVIEW, 15)); + + @Test + public void givenAListOfPosts_whenGroupedByType_thenGetAMapBetweenTypeAndPosts() { + Map> postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType)); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndTheirTitlesAreJoinedInAString_thenGetAMapBetweenTypeAndCsvTitles() { + Map postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, mapping(BlogPost::getTitle, joining(", ", "Post titles: [", "]")))); + + assertEquals("Post titles: [News item 1, News item 2]", postsPerType.get(BlogPostType.NEWS)); + assertEquals("Post titles: [Programming guide]", postsPerType.get(BlogPostType.GUIDE)); + assertEquals("Post titles: [Tech review 1, Tech review 2]", postsPerType.get(BlogPostType.REVIEW)); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndSumTheLikes_thenGetAMapBetweenTypeAndPostLikes() { + Map likesPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, summingInt(BlogPost::getLikes))); + + assertEquals(50, likesPerType.get(BlogPostType.NEWS).intValue()); + assertEquals(20, likesPerType.get(BlogPostType.REVIEW).intValue()); + assertEquals(20, likesPerType.get(BlogPostType.GUIDE).intValue()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeInAnEnumMap_thenGetAnEnumMapBetweenTypeAndPosts() { + EnumMap> postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, () -> new EnumMap<>(BlogPostType.class), toList())); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeInSets_thenGetAMapBetweenTypesAndSetsOfPosts() { + Map> postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, toSet())); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeConcurrently_thenGetAMapBetweenTypeAndPosts() { + ConcurrentMap> postsPerType = POSTS.parallelStream().collect(groupingByConcurrent(BlogPost::getType)); + + assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); + assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); + assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndAveragingLikes_thenGetAMapBetweenTypeAndAverageNumberOfLikes() { + Map averageLikesPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, averagingInt(BlogPost::getLikes))); + + assertEquals(25, averageLikesPerType.get(BlogPostType.NEWS).intValue()); + assertEquals(20, averageLikesPerType.get(BlogPostType.GUIDE).intValue()); + assertEquals(10, averageLikesPerType.get(BlogPostType.REVIEW).intValue()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndCounted_thenGetAMapBetweenTypeAndNumberOfPosts() { + Map numberOfPostsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, counting())); + + assertEquals(2, numberOfPostsPerType.get(BlogPostType.NEWS).intValue()); + assertEquals(1, numberOfPostsPerType.get(BlogPostType.GUIDE).intValue()); + assertEquals(2, numberOfPostsPerType.get(BlogPostType.REVIEW).intValue()); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndMaxingLikes_thenGetAMapBetweenTypeAndMaximumNumberOfLikes() { + Map> maxLikesPerPostType = POSTS.stream().collect(groupingBy(BlogPost::getType, maxBy(comparingInt(BlogPost::getLikes)))); + + assertTrue(maxLikesPerPostType.get(BlogPostType.NEWS).isPresent()); + assertEquals(35, maxLikesPerPostType.get(BlogPostType.NEWS).get().getLikes()); + + assertTrue(maxLikesPerPostType.get(BlogPostType.GUIDE).isPresent()); + assertEquals(20, maxLikesPerPostType.get(BlogPostType.GUIDE).get().getLikes()); + + assertTrue(maxLikesPerPostType.get(BlogPostType.REVIEW).isPresent()); + assertEquals(15, maxLikesPerPostType.get(BlogPostType.REVIEW).get().getLikes()); + } + + @Test + public void givenAListOfPosts_whenGroupedByAuthorAndThenByType_thenGetAMapBetweenAuthorAndMapsBetweenTypeAndBlogPosts() { + Map>> map = POSTS.stream().collect(groupingBy(BlogPost::getAuthor, groupingBy(BlogPost::getType))); + + assertEquals(1, map.get("Author 1").get(BlogPostType.NEWS).size()); + assertEquals(1, map.get("Author 1").get(BlogPostType.GUIDE).size()); + assertEquals(1, map.get("Author 1").get(BlogPostType.REVIEW).size()); + + assertEquals(1, map.get("Author 2").get(BlogPostType.NEWS).size()); + assertEquals(1, map.get("Author 2").get(BlogPostType.REVIEW).size()); + assertNull(map.get("Author 2").get(BlogPostType.GUIDE)); + } + + @Test + public void givenAListOfPosts_whenGroupedByTypeAndSummarizingLikes_thenGetAMapBetweenTypeAndSummary() { + Map likeStatisticsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, summarizingInt(BlogPost::getLikes))); + + IntSummaryStatistics newsLikeStatistics = likeStatisticsPerType.get(BlogPostType.NEWS); + + assertEquals(2, newsLikeStatistics.getCount()); + assertEquals(50, newsLikeStatistics.getSum()); + assertEquals(25.0, newsLikeStatistics.getAverage(), 0.001); + assertEquals(35, newsLikeStatistics.getMax()); + assertEquals(15, newsLikeStatistics.getMin()); + } + +} From fc233b4be7950b0df7f1a1dd88a515581519621f Mon Sep 17 00:00:00 2001 From: Sunil Mogadati Date: Tue, 7 Feb 2017 03:44:17 -0700 Subject: [PATCH 057/192] Formatting change using Baeldung formatter --- .../Java8GroupingByCollectorUnitTest.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java index 544db90b73..178cd72542 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java @@ -1,17 +1,35 @@ package com.baeldung.java8; +import static java.util.Comparator.comparingInt; +import static java.util.stream.Collectors.averagingInt; +import static java.util.stream.Collectors.counting; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.groupingByConcurrent; +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.mapping; +import static java.util.stream.Collectors.maxBy; +import static java.util.stream.Collectors.summarizingInt; +import static java.util.stream.Collectors.summingInt; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.EnumMap; +import java.util.IntSummaryStatistics; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; + import org.junit.Test; import com.baeldung.java_8_features.groupingby.BlogPost; import com.baeldung.java_8_features.groupingby.BlogPostType; -import java.util.*; -import java.util.concurrent.ConcurrentMap; - -import static java.util.Comparator.comparingInt; -import static java.util.stream.Collectors.*; -import static org.junit.Assert.*; - public class Java8GroupingByCollectorUnitTest { private static final List POSTS = Arrays.asList(new BlogPost("News item 1", "Author 1", BlogPostType.NEWS, 15), new BlogPost("Tech review 1", "Author 2", BlogPostType.REVIEW, 5), @@ -119,9 +137,9 @@ public class Java8GroupingByCollectorUnitTest { @Test public void givenAListOfPosts_whenGroupedByTypeAndSummarizingLikes_thenGetAMapBetweenTypeAndSummary() { Map likeStatisticsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, summarizingInt(BlogPost::getLikes))); - + IntSummaryStatistics newsLikeStatistics = likeStatisticsPerType.get(BlogPostType.NEWS); - + assertEquals(2, newsLikeStatistics.getCount()); assertEquals(50, newsLikeStatistics.getSum()); assertEquals(25.0, newsLikeStatistics.getAverage(), 0.001); From 3559789573f612be3911eb983bf51abed125c5c0 Mon Sep 17 00:00:00 2001 From: Pedja Date: Tue, 7 Feb 2017 11:54:48 +0100 Subject: [PATCH 058/192] BAEL-677 Small refactoring --- .../ConcurrentModificationUnitTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) rename core-java/src/test/java/com/baeldung/java/{concurrentmodificationexception => concurrentmodification}/ConcurrentModificationUnitTest.java (81%) diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java similarity index 81% rename from core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java rename to core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java index 11c6012ecd..d16a1fcdf4 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmodificationexception/ConcurrentModificationUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java @@ -1,6 +1,5 @@ -package com.baeldung.java.concurrentmodificationexception; +package com.baeldung.java.concurrentmodification; -import org.assertj.core.api.Assertions; import org.junit.Test; import java.util.ArrayList; @@ -22,7 +21,7 @@ public class ConcurrentModificationUnitTest { } @Test - public void givenIterating_whenUsingIteratorRemove_thenDontError() throws InterruptedException { + public void givenIterating_whenUsingIteratorRemove_thenNoError() throws InterruptedException { ArrayList integers = newArrayList(1, 2, 3); @@ -37,7 +36,7 @@ public class ConcurrentModificationUnitTest { } @Test - public void givenIterating_whenUsingRemovalList_thenDontError() throws InterruptedException { + public void givenIterating_whenUsingRemovalList_thenNoError() throws InterruptedException { ArrayList integers = newArrayList(1, 2, 3); ArrayList toRemove = newArrayList(); @@ -57,7 +56,7 @@ public class ConcurrentModificationUnitTest { ArrayList integers = newArrayList(1, 2, 3); - integers.removeIf((i) -> i == 2); + integers.removeIf(i -> i == 2); assertThat(integers).containsExactly(1, 3); } From 69bfaa557a654c0c66391cd79a61e988fd9b5147 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 7 Feb 2017 17:50:11 +0100 Subject: [PATCH 059/192] BAEL-672 test case when one object is still referenced --- .../baeldung/weakhashmap/WeakHashMapTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java index 7b34c6b316..1c5a261eea 100644 --- a/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java +++ b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java @@ -29,6 +29,30 @@ public class WeakHashMapTest { await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty); } + @Test + public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObjectButLeaveReferencedObject() { + //given + WeakHashMap map = new WeakHashMap<>(); + BigImage bigImageFirst = new BigImage("foo"); + UniqueImageName imageNameFirst = new UniqueImageName("name_of_big_image"); + + BigImage bigImageSecond = new BigImage("foo_2"); + UniqueImageName imageNameSecond = new UniqueImageName("name_of_big_image_2"); + + map.put(imageNameFirst, bigImageFirst); + map.put(imageNameSecond, bigImageSecond); + assertTrue(map.containsKey(imageNameFirst)); + assertTrue(map.containsKey(imageNameSecond)); + + //when + imageNameFirst = null; + System.gc(); + + //then + await().atMost(10, TimeUnit.SECONDS).until(() -> map.size() == 1); + await().atMost(10, TimeUnit.SECONDS).until(() -> map.containsKey(imageNameSecond)); + } + class BigImage { public final String imageId; From 92ad8123f1288f051fe20b4cbd331a4a41867ba6 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 7 Feb 2017 19:32:09 +0100 Subject: [PATCH 060/192] Refactor Java8GroupingByCollectorUnitTest --- .../Java8GroupingByCollectorUnitTest.java | 227 ++++++++++++------ 1 file changed, 154 insertions(+), 73 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java index 178cd72542..4452b4db9a 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java @@ -1,52 +1,47 @@ package com.baeldung.java8; -import static java.util.Comparator.comparingInt; -import static java.util.stream.Collectors.averagingInt; -import static java.util.stream.Collectors.counting; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.groupingByConcurrent; -import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.mapping; -import static java.util.stream.Collectors.maxBy; -import static java.util.stream.Collectors.summarizingInt; -import static java.util.stream.Collectors.summingInt; -import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toSet; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.Arrays; -import java.util.EnumMap; -import java.util.IntSummaryStatistics; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.ConcurrentMap; - -import org.junit.Test; - import com.baeldung.java_8_features.groupingby.BlogPost; import com.baeldung.java_8_features.groupingby.BlogPostType; +import org.junit.Test; + +import java.util.*; +import java.util.concurrent.ConcurrentMap; + +import static java.util.Comparator.comparingInt; +import static java.util.stream.Collectors.*; +import static org.junit.Assert.*; public class Java8GroupingByCollectorUnitTest { - private static final List POSTS = Arrays.asList(new BlogPost("News item 1", "Author 1", BlogPostType.NEWS, 15), new BlogPost("Tech review 1", "Author 2", BlogPostType.REVIEW, 5), - new BlogPost("Programming guide", "Author 1", BlogPostType.GUIDE, 20), new BlogPost("News item 2", "Author 2", BlogPostType.NEWS, 35), new BlogPost("Tech review 2", "Author 1", BlogPostType.REVIEW, 15)); + private static final List posts = Arrays.asList( + new BlogPost("News item 1", "Author 1", BlogPostType.NEWS, 15), + new BlogPost("Tech review 1", "Author 2", BlogPostType.REVIEW, 5), + new BlogPost("Programming guide", "Author 1", BlogPostType.GUIDE, 20), + new BlogPost("News item 2", "Author 2", BlogPostType.NEWS, 35), + new BlogPost("Tech review 2", "Author 1", BlogPostType.REVIEW, 15)); @Test public void givenAListOfPosts_whenGroupedByType_thenGetAMapBetweenTypeAndPosts() { - Map> postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType)); + Map> postsPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType)); - assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); - assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); - assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + assertEquals(2, postsPerType + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType + .get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType + .get(BlogPostType.REVIEW) + .size()); } @Test public void givenAListOfPosts_whenGroupedByTypeAndTheirTitlesAreJoinedInAString_thenGetAMapBetweenTypeAndCsvTitles() { - Map postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, mapping(BlogPost::getTitle, joining(", ", "Post titles: [", "]")))); + Map postsPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, mapping(BlogPost::getTitle, joining(", ", "Post titles: [", "]")))); assertEquals("Post titles: [News item 1, News item 2]", postsPerType.get(BlogPostType.NEWS)); assertEquals("Post titles: [Programming guide]", postsPerType.get(BlogPostType.GUIDE)); @@ -55,88 +50,174 @@ public class Java8GroupingByCollectorUnitTest { @Test public void givenAListOfPosts_whenGroupedByTypeAndSumTheLikes_thenGetAMapBetweenTypeAndPostLikes() { - Map likesPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, summingInt(BlogPost::getLikes))); + Map likesPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, summingInt(BlogPost::getLikes))); - assertEquals(50, likesPerType.get(BlogPostType.NEWS).intValue()); - assertEquals(20, likesPerType.get(BlogPostType.REVIEW).intValue()); - assertEquals(20, likesPerType.get(BlogPostType.GUIDE).intValue()); + assertEquals(50, likesPerType + .get(BlogPostType.NEWS) + .intValue()); + assertEquals(20, likesPerType + .get(BlogPostType.REVIEW) + .intValue()); + assertEquals(20, likesPerType + .get(BlogPostType.GUIDE) + .intValue()); } @Test public void givenAListOfPosts_whenGroupedByTypeInAnEnumMap_thenGetAnEnumMapBetweenTypeAndPosts() { - EnumMap> postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, () -> new EnumMap<>(BlogPostType.class), toList())); + EnumMap> postsPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, () -> new EnumMap<>(BlogPostType.class), toList())); - assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); - assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); - assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + assertEquals(2, postsPerType + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType + .get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType + .get(BlogPostType.REVIEW) + .size()); } @Test public void givenAListOfPosts_whenGroupedByTypeInSets_thenGetAMapBetweenTypesAndSetsOfPosts() { - Map> postsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, toSet())); + Map> postsPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, toSet())); - assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); - assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); - assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + assertEquals(2, postsPerType + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType + .get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType + .get(BlogPostType.REVIEW) + .size()); } @Test public void givenAListOfPosts_whenGroupedByTypeConcurrently_thenGetAMapBetweenTypeAndPosts() { - ConcurrentMap> postsPerType = POSTS.parallelStream().collect(groupingByConcurrent(BlogPost::getType)); + ConcurrentMap> postsPerType = posts + .parallelStream() + .collect(groupingByConcurrent(BlogPost::getType)); - assertEquals(2, postsPerType.get(BlogPostType.NEWS).size()); - assertEquals(1, postsPerType.get(BlogPostType.GUIDE).size()); - assertEquals(2, postsPerType.get(BlogPostType.REVIEW).size()); + assertEquals(2, postsPerType + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, postsPerType + .get(BlogPostType.GUIDE) + .size()); + assertEquals(2, postsPerType + .get(BlogPostType.REVIEW) + .size()); } @Test public void givenAListOfPosts_whenGroupedByTypeAndAveragingLikes_thenGetAMapBetweenTypeAndAverageNumberOfLikes() { - Map averageLikesPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, averagingInt(BlogPost::getLikes))); + Map averageLikesPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, averagingInt(BlogPost::getLikes))); - assertEquals(25, averageLikesPerType.get(BlogPostType.NEWS).intValue()); - assertEquals(20, averageLikesPerType.get(BlogPostType.GUIDE).intValue()); - assertEquals(10, averageLikesPerType.get(BlogPostType.REVIEW).intValue()); + assertEquals(25, averageLikesPerType + .get(BlogPostType.NEWS) + .intValue()); + assertEquals(20, averageLikesPerType + .get(BlogPostType.GUIDE) + .intValue()); + assertEquals(10, averageLikesPerType + .get(BlogPostType.REVIEW) + .intValue()); } @Test public void givenAListOfPosts_whenGroupedByTypeAndCounted_thenGetAMapBetweenTypeAndNumberOfPosts() { - Map numberOfPostsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, counting())); + Map numberOfPostsPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, counting())); - assertEquals(2, numberOfPostsPerType.get(BlogPostType.NEWS).intValue()); - assertEquals(1, numberOfPostsPerType.get(BlogPostType.GUIDE).intValue()); - assertEquals(2, numberOfPostsPerType.get(BlogPostType.REVIEW).intValue()); + assertEquals(2, numberOfPostsPerType + .get(BlogPostType.NEWS) + .intValue()); + assertEquals(1, numberOfPostsPerType + .get(BlogPostType.GUIDE) + .intValue()); + assertEquals(2, numberOfPostsPerType + .get(BlogPostType.REVIEW) + .intValue()); } @Test public void givenAListOfPosts_whenGroupedByTypeAndMaxingLikes_thenGetAMapBetweenTypeAndMaximumNumberOfLikes() { - Map> maxLikesPerPostType = POSTS.stream().collect(groupingBy(BlogPost::getType, maxBy(comparingInt(BlogPost::getLikes)))); + Map> maxLikesPerPostType = posts + .stream() + .collect(groupingBy(BlogPost::getType, maxBy(comparingInt(BlogPost::getLikes)))); - assertTrue(maxLikesPerPostType.get(BlogPostType.NEWS).isPresent()); - assertEquals(35, maxLikesPerPostType.get(BlogPostType.NEWS).get().getLikes()); + assertTrue(maxLikesPerPostType + .get(BlogPostType.NEWS) + .isPresent()); + assertEquals(35, maxLikesPerPostType + .get(BlogPostType.NEWS) + .get() + .getLikes()); - assertTrue(maxLikesPerPostType.get(BlogPostType.GUIDE).isPresent()); - assertEquals(20, maxLikesPerPostType.get(BlogPostType.GUIDE).get().getLikes()); + assertTrue(maxLikesPerPostType + .get(BlogPostType.GUIDE) + .isPresent()); + assertEquals(20, maxLikesPerPostType + .get(BlogPostType.GUIDE) + .get() + .getLikes()); - assertTrue(maxLikesPerPostType.get(BlogPostType.REVIEW).isPresent()); - assertEquals(15, maxLikesPerPostType.get(BlogPostType.REVIEW).get().getLikes()); + assertTrue(maxLikesPerPostType + .get(BlogPostType.REVIEW) + .isPresent()); + assertEquals(15, maxLikesPerPostType + .get(BlogPostType.REVIEW) + .get() + .getLikes()); } @Test public void givenAListOfPosts_whenGroupedByAuthorAndThenByType_thenGetAMapBetweenAuthorAndMapsBetweenTypeAndBlogPosts() { - Map>> map = POSTS.stream().collect(groupingBy(BlogPost::getAuthor, groupingBy(BlogPost::getType))); + Map>> map = posts + .stream() + .collect(groupingBy(BlogPost::getAuthor, groupingBy(BlogPost::getType))); - assertEquals(1, map.get("Author 1").get(BlogPostType.NEWS).size()); - assertEquals(1, map.get("Author 1").get(BlogPostType.GUIDE).size()); - assertEquals(1, map.get("Author 1").get(BlogPostType.REVIEW).size()); + assertEquals(1, map + .get("Author 1") + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, map + .get("Author 1") + .get(BlogPostType.GUIDE) + .size()); + assertEquals(1, map + .get("Author 1") + .get(BlogPostType.REVIEW) + .size()); - assertEquals(1, map.get("Author 2").get(BlogPostType.NEWS).size()); - assertEquals(1, map.get("Author 2").get(BlogPostType.REVIEW).size()); - assertNull(map.get("Author 2").get(BlogPostType.GUIDE)); + assertEquals(1, map + .get("Author 2") + .get(BlogPostType.NEWS) + .size()); + assertEquals(1, map + .get("Author 2") + .get(BlogPostType.REVIEW) + .size()); + assertNull(map + .get("Author 2") + .get(BlogPostType.GUIDE)); } @Test public void givenAListOfPosts_whenGroupedByTypeAndSummarizingLikes_thenGetAMapBetweenTypeAndSummary() { - Map likeStatisticsPerType = POSTS.stream().collect(groupingBy(BlogPost::getType, summarizingInt(BlogPost::getLikes))); + Map likeStatisticsPerType = posts + .stream() + .collect(groupingBy(BlogPost::getType, summarizingInt(BlogPost::getLikes))); IntSummaryStatistics newsLikeStatistics = likeStatisticsPerType.get(BlogPostType.NEWS); From a9d8c5f3a3154125cf90eef0541963a8ce0c2b4b Mon Sep 17 00:00:00 2001 From: Danil Kornishev Date: Tue, 7 Feb 2017 14:34:10 -0500 Subject: [PATCH 061/192] Introduction to Neo4j (#1098) * Nashorn * Nashorn x2 * Nashorn added trailing newlines * Cleanup * Formatted script lines * Change system outs to asserts * Change Nashorn to be Junit tests * Remove empty test * Added Neo4j section * Revert NashornTest --- core-java/pom.xml | 44 ++++- .../src/main/java/com/baeldung/graph/Car.java | 50 ++++++ .../main/java/com/baeldung/graph/Company.java | 45 +++++ .../com/baeldung/graph/Neo4JServerTest.java | 60 +++++++ .../java/com/baeldung/graph/Neo4jOgmTest.java | 46 +++++ .../java/com/baeldung/graph/Neo4jTest.java | 167 ++++++++++++++++++ 6 files changed, 409 insertions(+), 3 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/graph/Car.java create mode 100644 core-java/src/main/java/com/baeldung/graph/Company.java create mode 100644 core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java create mode 100644 core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java create mode 100644 core-java/src/test/java/com/baeldung/graph/Neo4jTest.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 85afee2968..1a3034b860 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung core-java @@ -10,6 +10,44 @@ + + org.neo4j + neo4j + 3.1.0 + + + + org.neo4j.driver + neo4j-java-driver + 1.1.1 + + + + org.neo4j + neo4j-jdbc-driver + 3.0.1 + + + + org.neo4j + neo4j-ogm-core + 2.1.1 + + + + org.neo4j + neo4j-ogm-embedded-driver + 2.1.1 + + + + com.google.inject + guice + 4.1.0 + no_aop + test + + net.sourceforge.collections @@ -63,7 +101,6 @@ grep4j ${grep4j.version} - @@ -263,7 +300,8 @@ true - + org.baeldung.executable.ExecutableMavenJar diff --git a/core-java/src/main/java/com/baeldung/graph/Car.java b/core-java/src/main/java/com/baeldung/graph/Car.java new file mode 100644 index 0000000000..1dc65a0d4b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/graph/Car.java @@ -0,0 +1,50 @@ +package com.baeldung.graph; + +import org.neo4j.ogm.annotation.GraphId; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +/** + * @author Danil Kornishev (danil.kornishev@mastercard.com) + */ +@NodeEntity +public class Car { + @GraphId + private Long id; + + private String make; + + @Relationship(direction = "INCOMING") + private Company company; + + public Car(String make, String model) { + this.make = make; + this.model = model; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + private String model; +} diff --git a/core-java/src/main/java/com/baeldung/graph/Company.java b/core-java/src/main/java/com/baeldung/graph/Company.java new file mode 100644 index 0000000000..1fe892b331 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/graph/Company.java @@ -0,0 +1,45 @@ +package com.baeldung.graph; + +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +/** + * @author Danil Kornishev (danil.kornishev@mastercard.com) + */ +@NodeEntity +public class Company { + private Long id; + + private String name; + + @Relationship(type="owns") + private Car car; + + public Company(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Car getCar() { + return car; + } + + public void setCar(Car car) { + this.car = car; + } +} diff --git a/core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java b/core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java new file mode 100644 index 0000000000..b41588b71e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java @@ -0,0 +1,60 @@ +package com.baeldung.graph; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; + +import org.junit.Ignore; +import org.junit.Test; +import org.neo4j.driver.v1.AuthTokens; +import org.neo4j.driver.v1.Driver; +import org.neo4j.driver.v1.GraphDatabase; +import org.neo4j.driver.v1.Session; +import org.neo4j.driver.v1.StatementResult; +import org.testng.Assert; + +@Ignore +public class Neo4JServerTest { + + @Test + public void standAloneDriver() { + Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "12345")); + Session session = driver.session(); + + session.run("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + StatementResult result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + + "WHERE car.make='tesla' and car.model='modelX'" + + "RETURN company.name"); + + Assert.assertTrue(result.hasNext()); + Assert.assertEquals(result.next().get("company.name").asString(), "Baeldung"); + + session.close(); + driver.close(); + } + + @Test + public void standAloneJdbc() throws Exception { + Connection con = DriverManager.getConnection("jdbc:neo4j:bolt://localhost/?user=neo4j,password=12345,scheme=basic"); + + // Querying + try (Statement stmt = con.createStatement()) { + stmt.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + ResultSet rs = stmt.executeQuery("MATCH (company:Company)-[:owns]-> (car:Car)" + + "WHERE car.make='tesla' and car.model='modelX'" + + "RETURN company.name"); + + while (rs.next()) { + Assert.assertEquals(rs.getString("company.name"), "Baeldung"); + } + } + con.close(); + } +} diff --git a/core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java b/core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java new file mode 100644 index 0000000000..00bd47d029 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java @@ -0,0 +1,46 @@ +package com.baeldung.graph; + +import org.junit.Test; +import org.neo4j.ogm.config.Configuration; +import org.neo4j.ogm.model.Result; +import org.neo4j.ogm.session.Session; +import org.neo4j.ogm.session.SessionFactory; +import org.testng.Assert; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Danil Kornishev (danil.kornishev@mastercard.com) + */ +public class Neo4jOgmTest { + + @Test + public void testOgm() { + Configuration conf = new Configuration(); + conf.driverConfiguration().setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver"); + + SessionFactory factory = new SessionFactory(conf, "com.baeldung.graph"); + Session session = factory.openSession(); + + Car tesla = new Car("tesla", "modelS"); + Company baeldung = new Company("baeldung"); + + baeldung.setCar(tesla); + + session.save(baeldung); + + Map params = new HashMap<>(); + params.put("make", "tesla"); + Result result = session.query("MATCH (car:Car) <-[:owns]- (company:Company)" + + " WHERE car.make=$make" + + " RETURN company", params); + + Map firstResult = result.iterator().next(); + + Assert.assertEquals(firstResult.size(), 1); + + Company actual = (Company) firstResult.get("company"); + Assert.assertEquals(actual.getName(), baeldung.getName()); + } +} diff --git a/core-java/src/test/java/com/baeldung/graph/Neo4jTest.java b/core-java/src/test/java/com/baeldung/graph/Neo4jTest.java new file mode 100644 index 0000000000..6956c2c39f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/graph/Neo4jTest.java @@ -0,0 +1,167 @@ +package com.baeldung.graph; + + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.neo4j.graphdb.GraphDatabaseService; +import org.neo4j.graphdb.Label; +import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.NotFoundException; +import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.Result; +import org.neo4j.graphdb.factory.GraphDatabaseFactory; +import org.testng.Assert; + +public class Neo4jTest { + + private static GraphDatabaseService graphDb; + + @Before + public void setUp() { + GraphDatabaseFactory graphDbFactory = new GraphDatabaseFactory(); + graphDb = graphDbFactory.newEmbeddedDatabase(new File("data/cars")); + } + + @After + public void tearDown() { + graphDb.shutdown(); + } + + @Test + public void testPersonCar() { + graphDb.beginTx(); + Node car = graphDb.createNode(Label.label("Car")); + car.setProperty("make", "tesla"); + car.setProperty("model", "model3"); + + Node owner = graphDb.createNode(Label.label("Person")); + owner.setProperty("firstName", "baeldung"); + owner.setProperty("lastName", "baeldung"); + + owner.createRelationshipTo(car, RelationshipType.withName("owner")); + + Result result = graphDb.execute("MATCH (c:Car) <-[owner]- (p:Person) " + + "WHERE c.make = 'tesla'" + + "RETURN p.firstName, p.lastName"); + + Map firstResult = result.next(); + Assert.assertEquals("baeldung", firstResult.get("p.firstName")); + } + + @Test + public void testCreateNode() { + + graphDb.beginTx(); + + Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + + "RETURN baeldung"); + + Map firstResult = result.next(); + Node firstNode = (Node) firstResult.get("baeldung"); + Assert.assertEquals(firstNode.getProperty("name"), "Baeldung"); + } + + @Test + public void testCreateNodeAndLink() { + graphDb.beginTx(); + + Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Map firstResult = result.next(); + Assert.assertTrue(firstResult.containsKey("baeldung")); + Assert.assertTrue(firstResult.containsKey("tesla")); + } + + @Test + public void testFindAndReturn() { + graphDb.beginTx(); + + graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Result result = graphDb.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + + "WHERE car.make='tesla' and car.model='modelX'" + + "RETURN company.name"); + + Map firstResult = result.next(); + Assert.assertEquals(firstResult.get("company.name"), "Baeldung"); + } + + @Test + public void testUpdate() { + graphDb.beginTx(); + + graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Result result = graphDb.execute("MATCH (car:Car)" + + "WHERE car.make='tesla'" + + " SET car.milage=120" + + " SET car :Car:Electro" + + " SET car.model=NULL" + + " RETURN car"); + + Map firstResult = result.next(); + Node car = (Node) firstResult.get("car"); + + Assert.assertEquals(car.getProperty("milage"), 120L); + Assert.assertEquals(car.getLabels(), Arrays.asList(Label.label("Car"), Label.label("Electro"))); + + try { + car.getProperty("model"); + Assert.fail(); + } catch (NotFoundException e) { + // expected + } + } + + @Test + public void testDelete() { + graphDb.beginTx(); + + graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + graphDb.execute("MATCH (company:Company)" + + " WHERE company.name='Baeldung'" + + " DELETE company"); + + Result result = graphDb.execute("MATCH (company:Company)" + + " WHERE company.name='Baeldung'" + + " RETURN company"); + + Assert.assertFalse(result.hasNext()); + } + + @Test + public void testBindings() { + graphDb.beginTx(); + + Map params = new HashMap<>(); + params.put("name", "baeldung"); + params.put("make", "tesla"); + params.put("model", "modelS"); + + Result result = graphDb.execute("CREATE (baeldung:Company {name:$name}) " + + "-[:owns]-> (tesla:Car {make: $make, model: $model})" + + "RETURN baeldung, tesla", params); + + Map firstResult = result.next(); + Assert.assertTrue(firstResult.containsKey("baeldung")); + Assert.assertTrue(firstResult.containsKey("tesla")); + + Node car = (Node) firstResult.get("tesla"); + Assert.assertEquals(car.getProperty("model"), "modelS"); + } +} From 5c8acbac57c08b2217d36c64abfea4cde4a8ac63 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 7 Feb 2017 21:12:14 +0000 Subject: [PATCH 062/192] Added stream removal from collection (#1131) --- .../ConcurrentModificationUnitTest.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java b/core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java index d16a1fcdf4..f7a7bd5fe0 100644 --- a/core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java/concurrentmodification/ConcurrentModificationUnitTest.java @@ -3,9 +3,12 @@ package com.baeldung.java.concurrentmodification; import org.junit.Test; import java.util.ArrayList; +import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Iterator; +import java.util.List; +import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.util.Lists.newArrayList; @@ -13,7 +16,7 @@ public class ConcurrentModificationUnitTest { @Test(expected = ConcurrentModificationException.class) public void givenIterating_whenRemoving_thenThrowException() throws InterruptedException { - ArrayList integers = newArrayList(1, 2, 3); + List integers = newArrayList(1, 2, 3); for (Integer integer : integers) { integers.remove(1); @@ -23,7 +26,7 @@ public class ConcurrentModificationUnitTest { @Test public void givenIterating_whenUsingIteratorRemove_thenNoError() throws InterruptedException { - ArrayList integers = newArrayList(1, 2, 3); + List integers = newArrayList(1, 2, 3); for (Iterator iterator = integers.iterator(); iterator.hasNext();) { Integer integer = iterator.next(); @@ -38,8 +41,8 @@ public class ConcurrentModificationUnitTest { @Test public void givenIterating_whenUsingRemovalList_thenNoError() throws InterruptedException { - ArrayList integers = newArrayList(1, 2, 3); - ArrayList toRemove = newArrayList(); + List integers = newArrayList(1, 2, 3); + List toRemove = newArrayList(); for (Integer integer : integers) { if(integer == 2) { @@ -54,10 +57,24 @@ public class ConcurrentModificationUnitTest { @Test public void whenUsingRemoveIf_thenRemoveElements() throws InterruptedException { - ArrayList integers = newArrayList(1, 2, 3); + Collection integers = newArrayList(1, 2, 3); integers.removeIf(i -> i == 2); assertThat(integers).containsExactly(1, 3); } + + @Test + public void whenUsingStream_thenRemoveElements() { + Collection integers = newArrayList(1, 2, 3); + + List collected = integers + .stream() + .filter(i -> i != 2) + .map(Object::toString) + .collect(toList()); + + assertThat(collected).containsExactly("1", "3"); + } + } From 40a22badfce648940016a90d6668fa2ee8458298 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Tue, 7 Feb 2017 19:39:27 -0600 Subject: [PATCH 063/192] Update README.md --- apache-poi/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-poi/README.md b/apache-poi/README.md index cef6810c97..10fe8ba2e7 100644 --- a/apache-poi/README.md +++ b/apache-poi/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi) +- [Working with Microsoft Excel in Java](http://www.baeldung.com/java-microsoft-excel) From 9d46c8f3d1bece80f1292f4247d72863c1d74bf1 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 8 Feb 2017 12:05:02 +0100 Subject: [PATCH 064/192] BAEL-685 test for rx java --- rxjava/pom.xml | 17 +++ .../com/baeldung/rxjava/RxJavaTesting.java | 113 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java diff --git a/rxjava/pom.xml b/rxjava/pom.xml index 6a351d98bd..f22e6a000a 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -31,11 +31,28 @@ junit ${junit.version} + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + org.hamcrest + hamcrest-all + ${hamcrest.version} + test + + + 4.12 1.2.5 + 1.7.0 + 1.3 \ No newline at end of file diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java new file mode 100644 index 0000000000..67f6e1c2b8 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java @@ -0,0 +1,113 @@ +package com.baeldung.rxjava; + +import org.junit.Test; +import rx.Observable; +import rx.observers.TestSubscriber; +import rx.schedulers.TestScheduler; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; + + +public class RxJavaTesting { + @Test + public void givenObservable_whenZip_shouldAssertBlockingInASameThread() { + //given + List letters = Arrays.asList("A", "B", "C", "D", "E"); + List results = new ArrayList<>(); + Observable observable = Observable + .from(letters) + .zipWith(Observable.range(1, Integer.MAX_VALUE), + (string, index) -> index + "-" + string); + + //when + observable.subscribe(results::add); + + //then + assertThat(results, notNullValue()); + assertThat(results, hasSize(5)); + assertThat(results, hasItems("1-A", "2-B", "3-C", "4-D", "5-E")); + } + + @Test + public void givenObservable_whenZip_shouldAssertOnTestSubscriber() { + //given + List letters = Arrays.asList("A", "B", "C", "D", "E"); + TestSubscriber subscriber = new TestSubscriber<>(); + + Observable observable = Observable + .from(letters) + .zipWith(Observable.range(1, Integer.MAX_VALUE), + ((string, index) -> index + "-" + string)); + + //when + observable.subscribe(subscriber); + + //then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(5); + assertThat(subscriber.getOnNextEvents(), hasItems("1-A", "2-B", "3-C", "4-D", "5-E")); + } + + @Test + public void givenTestObserver_whenExceptionWasThrowsOnObservable_observerShouldGetError() { + //given + List letters = Arrays.asList("A", "B", "C", "D", "E"); + TestSubscriber subscriber = new TestSubscriber<>(); + + + Observable observable = Observable + .from(letters) + .zipWith(Observable.range(1, Integer.MAX_VALUE), + ((string, index) -> index + "-" + string)) + .concatWith(Observable.error(new RuntimeException("error in Observable"))); + + //when + observable.subscribe(subscriber); + + //then + subscriber.assertError(RuntimeException.class); + subscriber.assertNotCompleted(); + } + + @Test + public void givenObservableThatEmitsEventPerSecond_whenUseAdvanceByTime_shouldEmitEventPerSecond() { + //given + List letters = Arrays.asList("A", "B", "C", "D", "E"); + TestScheduler scheduler = new TestScheduler(); + TestSubscriber subscriber = new TestSubscriber<>(); + Observable tick = Observable.interval(1, TimeUnit.SECONDS, scheduler); + + Observable observable = Observable.from(letters) + .zipWith(tick, (string, index) -> index + "-" + string); + + observable.subscribeOn(scheduler) + .subscribe(subscriber); + + //expect + subscriber.assertNoValues(); + subscriber.assertNotCompleted(); + + //when + scheduler.advanceTimeBy(1, TimeUnit.SECONDS); + + //then + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValues("0-A"); + + //when + scheduler.advanceTimeTo(6, TimeUnit.SECONDS); + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(5); + assertThat(subscriber.getOnNextEvents(), hasItems("0-A", "1-B", "2-C", "3-D", "4-E")); + } +} + From 7d9c4b5bb9cc123d0479a73a218554bc7311e999 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 8 Feb 2017 13:43:23 +0100 Subject: [PATCH 065/192] BAEL-685 do not need avaitility lib --- rxjava/pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/rxjava/pom.xml b/rxjava/pom.xml index f22e6a000a..b3936bf78d 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -31,13 +31,6 @@ junit ${junit.version} - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - - org.hamcrest hamcrest-all @@ -51,7 +44,6 @@ 4.12 1.2.5 - 1.7.0 1.3 From 0bbfa1e10b446deef15dfc8aafa561334a3748f6 Mon Sep 17 00:00:00 2001 From: Chima Ejiofor Date: Wed, 8 Feb 2017 16:35:33 +0100 Subject: [PATCH 066/192] Modification to Model Hibernate One to Many Tutorial (#1132) * Modifications to model on Hibernate One to manyTutorial * Modifications to model on Hibernate One to manyTutorial * Modifications to model on Hibernate One to manyTutorial --- .../HibernateOneToManyAnnotationMain.java | 7 ++-- .../hibernate/oneToMany/model/Cart.java | 20 ---------- .../hibernate/oneToMany/model/Items.java | 37 +------------------ .../src/main/resources/one_to_many.sql | 5 --- .../HibernateOneToManyAnnotationMainTest.java | 3 -- 5 files changed, 4 insertions(+), 68 deletions(-) diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java index 63b6450bf4..2bc5e514f7 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java @@ -16,16 +16,15 @@ public class HibernateOneToManyAnnotationMain { public static void main(String[] args) { Cart cart = new Cart(); - cart.setName("MyCart"); - Items item1 = new Items("I10", 10, 1, cart); - Items item2 = new Items("I20", 20, 2, cart); + Items item1 = new Items(cart); + Items item2 = new Items(cart); Set itemsSet = new HashSet(); itemsSet.add(item1); itemsSet.add(item2); cart.setItems(itemsSet); - cart.setTotal(10 * 1 + 20 * 2); + SessionFactory sessionFactory = null; Session session = null; diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java index 61a32ba43f..b8b991831e 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java @@ -19,11 +19,6 @@ public class Cart { @Column(name = "cart_id") private long id; - @Column(name = "total") - private double total; - - @Column(name = "name") - private String name; @OneToMany(mappedBy = "cart") private Set items; @@ -36,21 +31,6 @@ public class Cart { this.id = id; } - public double getTotal() { - return total; - } - - public void setTotal(double total) { - this.total = total; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } public Set getItems() { return items; diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java index 40ee6fdea1..f63a4855b5 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java @@ -18,14 +18,6 @@ public class Items { @Column(name = "id") private long id; - @Column(name = "item_id") - private String itemId; - - @Column(name = "item_total") - private double itemTotal; - - @Column(name = "quantity") - private int quantity; @ManyToOne @JoinColumn(name = "cart_id", nullable = false) @@ -35,37 +27,10 @@ public class Items { public Items() { } - public Items(String itemId, double total, int qty, Cart c) { - this.itemId = itemId; - this.itemTotal = total; - this.quantity = qty; + public Items(Cart c) { this.cart = c; } - public String getItemId() { - return itemId; - } - - public void setItemId(String itemId) { - this.itemId = itemId; - } - - public double getItemTotal() { - return itemTotal; - } - - public void setItemTotal(double itemTotal) { - this.itemTotal = itemTotal; - } - - public int getQuantity() { - return quantity; - } - - public void setQuantity(int quantity) { - this.quantity = quantity; - } - public Cart getCart() { return cart; } diff --git a/spring-hibernate4/src/main/resources/one_to_many.sql b/spring-hibernate4/src/main/resources/one_to_many.sql index 7887ff7d9c..2eb48fc262 100644 --- a/spring-hibernate4/src/main/resources/one_to_many.sql +++ b/spring-hibernate4/src/main/resources/one_to_many.sql @@ -1,16 +1,11 @@ CREATE TABLE `Cart` ( `cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `total` decimal(10,0) NOT NULL, - `name` varchar(10) DEFAULT NULL, PRIMARY KEY (`cart_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; CREATE TABLE `Items` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `cart_id` int(11) unsigned NOT NULL, - `item_id` varchar(10) NOT NULL, - `item_total` decimal(10,0) NOT NULL, - `quantity` int(3) NOT NULL, PRIMARY KEY (`id`), KEY `cart_id` (`cart_id`), CONSTRAINT `items_ibfk_1` FOREIGN KEY (`cart_id`) REFERENCES `Cart` (`cart_id`) diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java index 688329e329..e2d2bf9143 100644 --- a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java +++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainTest.java @@ -63,9 +63,6 @@ public class HibernateOneToManyAnnotationMainTest { cartItems = cart.getItems(); Assert.assertNull(cartItems); Items item1 = new Items(); - item1.setItemId("I10"); - item1.setItemTotal(10); - item1.setQuantity(1); item1.setCart(cart); assertNotNull(item1); Set itemsSet = new HashSet(); From 7aa774352de97555217eb9e18c0db27e633fbe66 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Wed, 8 Feb 2017 21:16:10 +0530 Subject: [PATCH 067/192] Joining/Splitting Strings with Java and Stream API (#1130) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API --- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.9799201796740292 | 0 .../baeldung/streamApi/JoinerSplitter.java | 23 +++++++++++ .../baeldung/stream/JoinerSplitterTest.java | 38 +++++++++++++++++++ 7 files changed, 61 insertions(+) create mode 100644 core-java/0.004102810554955205 create mode 100644 core-java/0.04832801936270381 create mode 100644 core-java/0.5633433244738808 create mode 100644 core-java/0.6256429734439612 create mode 100644 core-java/0.9799201796740292 create mode 100644 core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java create mode 100644 core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java new file mode 100644 index 0000000000..5183921dea --- /dev/null +++ b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java @@ -0,0 +1,23 @@ +package com.baeldung.streamApi; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class JoinerSplitter { + + public static String join ( String[] arrayOfString ) { + return Arrays.asList(arrayOfString) + .stream() + .map(x -> x) + .collect(Collectors.joining(",")); + } + + public static List split ( String str ) { + return Stream.of(str.split(",")) + .map (elem -> new String(elem)) + .collect(Collectors.toList()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java b/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java new file mode 100644 index 0000000000..19d945f836 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java @@ -0,0 +1,38 @@ +package com.baeldung.stream; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import com.baeldung.streamApi.JoinerSplitter; + +public class JoinerSplitterTest { + + @Test + public void provided_array_convert_to_stream_and_convert_to_string() { + String[] programming_languages = {"java", "python", "nodejs", "ruby"}; + String expectation = "java,python,nodejs,ruby"; + + String result = JoinerSplitter.join(programming_languages); + assertEquals(result, expectation); + } + + @Test + public void provided_list_convert_to_stream_and_convert_to_list() { + String programming_languages = "java,python,nodejs,ruby"; + + List expectation = new ArrayList(); + expectation.add("java"); + expectation.add("python"); + expectation.add("nodejs"); + expectation.add("ruby"); + + List result = JoinerSplitter.split(programming_languages); + + assertEquals(result, expectation); + } + +} From 2c8e3c91799113f755215c2f52f98b9beb4a9670 Mon Sep 17 00:00:00 2001 From: Tian Baoqiang Date: Thu, 9 Feb 2017 02:51:21 +0800 Subject: [PATCH 068/192] #BAEL-100 tests and update spring boot to 1.5.1.RELEASE (#1135) * add tests for #BAEL-100 and upgrade spring boot to 1.5.1.RELEASE * uncomment integration test configurations --- spring-boot/pom.xml | 44 +++++++++- .../servletcomponentscan/JavaEEApp.java | 28 ++++++ .../SpringBootAnnotatedApp.java | 25 ++++++ .../SpringBootPlainApp.java | 13 +++ .../javaee/AttrListener.java | 23 +++++ .../javaee/EchoServlet.java | 30 +++++++ .../javaee/HelloFilter.java | 32 +++++++ .../javaee/HelloServlet.java | 33 +++++++ .../baeldung/{ => webjar}/TestController.java | 2 +- .../{ => webjar}/WebjarsdemoApplication.java | 3 +- .../SpringHelloServletRegistrationBean.java | 4 +- .../MyServletContainerCustomizationBean.java | 2 +- .../servletcomponentscan/JavaEEAppTest.java | 88 +++++++++++++++++++ .../SpringBootWithServletComponentTest.java | 65 ++++++++++++++ ...SpringBootWithoutServletComponentTest.java | 50 +++++++++++ .../java/com/baeldung/intro/AppLiveTest.java | 2 + ...WebjarsdemoApplicationIntegrationTest.java | 6 +- .../SpringBootApplicationIntegrationTest.java | 4 +- .../SpringBootJPAIntegrationTest.java | 4 +- .../SpringBootMailIntegrationTest.java | 4 +- 20 files changed, 444 insertions(+), 18 deletions(-) create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java create mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java rename spring-boot/src/main/java/com/baeldung/{ => webjar}/TestController.java (91%) rename spring-boot/src/main/java/com/baeldung/{ => webjar}/WebjarsdemoApplication.java (77%) create mode 100644 spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java create mode 100644 spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java create mode 100644 spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java rename spring-boot/src/test/java/com/baeldung/{ => webjar}/WebjarsdemoApplicationIntegrationTest.java (68%) diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 68a5857865..b6a24b6cb7 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung spring-boot @@ -12,8 +12,8 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE - + 1.5.1.RELEASE + @@ -24,6 +24,26 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.apache.geronimo.specs + geronimo-osgi-locator + 1.1 + test + + + + org.apache.geronimo.components + geronimo-jaspi + 2.0.0 + test @@ -87,6 +107,20 @@ jquery ${jquery.version} + + + org.apache.tomee + arquillian-tomee-embedded + ${arquillian-tomee-embedded.version} + test + + + + org.apache.tomee + javaee-api + ${tomee-javaee-api.version} + provided + @@ -166,7 +200,7 @@ - json + json @@ -186,6 +220,8 @@ 3.1.1 3.3.7-1 3.1.7 + 7.0.2 + 7.0-1 diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java new file mode 100644 index 0000000000..773503c5af --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java @@ -0,0 +1,28 @@ +package com.baeldung.annotation.servletcomponentscan; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.Initialized; +import javax.enterprise.event.Observes; +import javax.servlet.ServletContext; + +@ApplicationScoped +public class JavaEEApp { + + private ServletContext context; + + /** + * act as a servletContext provider + */ + private void setContext(@Observes @Initialized(ApplicationScoped.class) final ServletContext context) { + if (this.context != null) { + throw new IllegalStateException("app context started twice"); + } + + this.context = context; + } + + public ServletContext getContext() { + return context; + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java new file mode 100644 index 0000000000..9fd66ee12a --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java @@ -0,0 +1,25 @@ +package com.baeldung.annotation.servletcomponentscan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; + +/** + * using the following annotations are equivalent: + *
  • + * @ServletComponentScan + *
  • + * @ServletComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.javaee") + *
  • + * @ServletComponentScan(basePackageClasses = {AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class}) + *
+ */ +@SpringBootApplication +@ServletComponentScan("com.baeldung.annotation.servletcomponentscan.javaee") +public class SpringBootAnnotatedApp { + + public static void main(String[] args) { + SpringApplication.run(SpringBootAnnotatedApp.class, args); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java new file mode 100644 index 0000000000..9ce1c296e6 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java @@ -0,0 +1,13 @@ +package com.baeldung.annotation.servletcomponentscan; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.javaee") +public class SpringBootPlainApp { + + public static void main(String[] args) { + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java new file mode 100644 index 0000000000..321ddd59d1 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java @@ -0,0 +1,23 @@ +package com.baeldung.annotation.servletcomponentscan.javaee; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +@WebListener +public class AttrListener implements ServletContextListener { + + @Override + public void contextInitialized(ServletContextEvent servletContextEvent) { + servletContextEvent + .getServletContext() + .setAttribute("servlet-context-attr", "test"); + System.out.println("context init"); + } + + @Override + public void contextDestroyed(ServletContextEvent servletContextEvent) { + System.out.println("context destroy"); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java new file mode 100644 index 0000000000..b9fed314c7 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java @@ -0,0 +1,30 @@ +package com.baeldung.annotation.servletcomponentscan.javaee; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.nio.file.CopyOption; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +@WebServlet(name = "echo servlet", urlPatterns = "/echo") +public class EchoServlet extends HttpServlet { + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) { + try { + Path path = File + .createTempFile("echo", "tmp") + .toPath(); + Files.copy(request.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); + Files.copy(path, response.getOutputStream()); + Files.delete(path); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java new file mode 100644 index 0000000000..81e90d69ad --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java @@ -0,0 +1,32 @@ +package com.baeldung.annotation.servletcomponentscan.javaee; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.annotation.WebInitParam; +import java.io.IOException; + +@WebFilter(urlPatterns = "/hello", description = "a filter for hello servlet", initParams = { @WebInitParam(name = "msg", value = "filtering ") }, filterName = "hello filter", servletNames = { "echo servlet" }) +public class HelloFilter implements Filter { + + private FilterConfig filterConfig; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + System.out.println("filter init"); + this.filterConfig = filterConfig; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + servletResponse + .getOutputStream() + .print(filterConfig.getInitParameter("msg")); + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + System.out.println("filter destroy"); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java new file mode 100644 index 0000000000..4a46a56107 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java @@ -0,0 +1,33 @@ +package com.baeldung.annotation.servletcomponentscan.javaee; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(urlPatterns = "/hello", initParams = { @WebInitParam(name = "msg", value = "hello")}) +public class HelloServlet extends HttpServlet { + + private ServletConfig servletConfig; + + @Override + public void init(ServletConfig servletConfig){ + this.servletConfig = servletConfig; + } + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) { + try { + response + .getOutputStream() + .write(servletConfig.getInitParameter("msg").getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/TestController.java b/spring-boot/src/main/java/com/baeldung/webjar/TestController.java similarity index 91% rename from spring-boot/src/main/java/com/baeldung/TestController.java rename to spring-boot/src/main/java/com/baeldung/webjar/TestController.java index 0e28ca67f8..e8e7fd5ce9 100644 --- a/spring-boot/src/main/java/com/baeldung/TestController.java +++ b/spring-boot/src/main/java/com/baeldung/webjar/TestController.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.webjar; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/spring-boot/src/main/java/com/baeldung/WebjarsdemoApplication.java b/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java similarity index 77% rename from spring-boot/src/main/java/com/baeldung/WebjarsdemoApplication.java rename to spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java index 35490131c6..d2135754c9 100644 --- a/spring-boot/src/main/java/com/baeldung/WebjarsdemoApplication.java +++ b/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java @@ -1,7 +1,8 @@ -package com.baeldung; +package com.baeldung.webjar; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication public class WebjarsdemoApplication { diff --git a/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java b/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java index 78680baf7d..723afddd06 100644 --- a/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java +++ b/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java @@ -1,8 +1,8 @@ package org.baeldung.common.error; -import javax.servlet.Servlet; +import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.boot.context.embedded.ServletRegistrationBean; +import javax.servlet.Servlet; public class SpringHelloServletRegistrationBean extends ServletRegistrationBean { diff --git a/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java b/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java index 97130bed6a..9b5a0aa948 100644 --- a/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java +++ b/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java @@ -2,7 +2,7 @@ package org.baeldung.common.properties; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; -import org.springframework.boot.context.embedded.ErrorPage; +import org.springframework.boot.web.servlet.ErrorPage; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java new file mode 100644 index 0000000000..00705be307 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java @@ -0,0 +1,88 @@ +package com.baeldung.annotation.servletcomponentscan; + +import com.baeldung.annotation.servletcomponentscan.javaee.AttrListener; +import com.baeldung.annotation.servletcomponentscan.javaee.EchoServlet; +import com.baeldung.annotation.servletcomponentscan.javaee.HelloFilter; +import com.baeldung.annotation.servletcomponentscan.javaee.HelloServlet; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.inject.Inject; +import javax.servlet.FilterRegistration; +import javax.servlet.ServletContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; + +import static org.junit.Assert.*; + +@RunWith(Arquillian.class) +public class JavaEEAppTest { + + @Deployment + public static WebArchive createDeployment() { + return ShrinkWrap + .create(WebArchive.class) + .addClass(JavaEEApp.class) + .addClasses(AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class); + } + + @Inject private ServletContext servletContext; + + @Test + public void givenServletContextListener_whenAccessSpecialAttrs_thenFound() throws MalformedURLException { + assertNotNull(servletContext); + assertNotNull(servletContext.getAttribute("servlet-context-attr")); + assertEquals("test", servletContext.getAttribute("servlet-context-attr")); + } + + @Test + public void givenServletContext_whenCheckHelloFilterMappings_thenCorrect() throws MalformedURLException { + assertNotNull(servletContext); + FilterRegistration filterRegistration = servletContext.getFilterRegistration("hello filter"); + + assertNotNull(filterRegistration); + assertTrue(filterRegistration + .getServletNameMappings() + .contains("echo servlet")); + } + + @ArquillianResource private URL base; + + @Test + @RunAsClient + public void givenFilterAndServlet_whenGetHello_thenRespondFilteringHello() throws MalformedURLException { + Client client = ClientBuilder.newClient(); + WebTarget target = client.target(URI.create(new URL(base, "hello").toExternalForm())); + Response response = target + .request() + .get(); + + assertEquals("filtering hello", response.readEntity(String.class)); + } + + @Test + @RunAsClient + public void givenFilterAndServlet_whenPostEcho_thenEchoFiltered() throws MalformedURLException { + Client client = ClientBuilder.newClient(); + WebTarget target = client.target(URI.create(new URL(base, "echo").toExternalForm())); + Response response = target + .request() + .post(Entity.entity("echo", MediaType.TEXT_PLAIN_TYPE)); + + assertEquals("filtering echo", response.readEntity(String.class)); + } + +} diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java new file mode 100644 index 0000000000..524a4df480 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java @@ -0,0 +1,65 @@ +package com.baeldung.annotation.servletcomponentscan; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.servlet.FilterRegistration; +import javax.servlet.ServletContext; + +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootAnnotatedApp.class) +@AutoConfigureMockMvc +@TestPropertySource(properties = { "security.basic.enabled=false", "server.tomcat.additional-tld-skip-patterns=tomee-*.jar,tomcat-*.jar,openejb-*.jar,cxf-*.jar,activemq-*.jar" }) +public class SpringBootWithServletComponentTest { + + @Autowired private ServletContext servletContext; + + @Test + public void givenServletContext_whenAccessAttrs_thenFoundAttrsPutInServletListner() { + assertNotNull(servletContext); + assertNotNull(servletContext.getAttribute("servlet-context-attr")); + assertEquals("test", servletContext.getAttribute("servlet-context-attr")); + } + + @Test + public void givenServletContext_whenCheckHelloFilterMappings_thenCorrect() { + assertNotNull(servletContext); + FilterRegistration filterRegistration = servletContext.getFilterRegistration("hello filter"); + + assertNotNull(filterRegistration); + assertTrue(filterRegistration + .getServletNameMappings() + .contains("echo servlet")); + } + + @Autowired private TestRestTemplate restTemplate; + + @Test + public void givenServletFilter_whenGetHello_thenRequestFiltered() { + ResponseEntity responseEntity = this.restTemplate.getForEntity("/hello", String.class); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertEquals("filtering hello", responseEntity.getBody()); + } + + @Test + public void givenFilterAndServlet_whenPostEcho_thenEchoFiltered() { + ResponseEntity responseEntity = this.restTemplate.postForEntity("/echo", "echo", String.class); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertEquals("filtering echo", responseEntity.getBody()); + } + + + +} + + diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java new file mode 100644 index 0000000000..811323826b --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java @@ -0,0 +1,50 @@ +package com.baeldung.annotation.servletcomponentscan; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.servlet.FilterRegistration; +import javax.servlet.ServletContext; + +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootPlainApp.class) +@AutoConfigureMockMvc +@TestPropertySource(properties = { "security.basic.enabled=false", "server.tomcat.additional-tld-skip-patterns=tomee-*.jar,tomcat-*.jar,openejb-*.jar,cxf-*.jar,activemq-*.jar" }) +public class SpringBootWithoutServletComponentTest { + + @Autowired private ServletContext servletContext; + + @Autowired private TestRestTemplate restTemplate; + + @Test + public void givenServletContext_whenAccessAttrs_thenNotFound() { + assertNull(servletContext.getAttribute("servlet-context-attr")); + } + + @Test + public void givenServletFilter_whenGetHello_thenEndpointNotFound() { + ResponseEntity responseEntity = this.restTemplate.getForEntity("/hello", String.class); + assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); + } + + @Test + public void givenServletContext_whenCheckFilterMappings_thenEmpty() { + assertNotNull(servletContext); + FilterRegistration filterRegistration = servletContext.getFilterRegistration("hello filter"); + + assertNull(filterRegistration); + } + +} + + diff --git a/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java index 772709dc30..af46fe0423 100644 --- a/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java +++ b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -17,6 +18,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc +@TestPropertySource(properties = { "security.basic.enabled=false" }) public class AppLiveTest { @Autowired diff --git a/spring-boot/src/test/java/com/baeldung/WebjarsdemoApplicationIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java similarity index 68% rename from spring-boot/src/test/java/com/baeldung/WebjarsdemoApplicationIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java index 3558682b97..d6e71dcf6b 100644 --- a/spring-boot/src/test/java/com/baeldung/WebjarsdemoApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java @@ -1,13 +1,13 @@ -package com.baeldung; +package com.baeldung.webjar; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = WebjarsdemoApplication.class) +@SpringBootTest(classes = WebjarsdemoApplication.class) @WebAppConfiguration public class WebjarsdemoApplicationIntegrationTest { diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 8cdcdb2216..3499952ab4 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -9,7 +9,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @@ -22,7 +22,7 @@ import org.springframework.web.context.WebApplicationContext; import java.nio.charset.Charset; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) +@SpringBootTest(classes = Application.class) @WebAppConfiguration public class SpringBootApplicationIntegrationTest { @Autowired diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java index 233684bc24..d4b19e6a1d 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java @@ -5,14 +5,14 @@ import org.baeldung.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) +@SpringBootTest(classes = Application.class) public class SpringBootJPAIntegrationTest { @Autowired private GenericEntityRepository genericEntityRepository; diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java index cec25f20f9..10e3d6d60b 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java @@ -5,7 +5,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -23,7 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) +@SpringBootTest(classes = Application.class) public class SpringBootMailIntegrationTest { @Autowired private JavaMailSender javaMailSender; From 6e114b6fb0ebda58c9d0ee3bf2cdfd1ad3ac1b9e Mon Sep 17 00:00:00 2001 From: DOHA Date: Thu, 9 Feb 2017 01:34:42 +0200 Subject: [PATCH 069/192] add simple java config --- .../baeldung/config/SimpleMongoConfig.java | 25 +++++++++++++++++++ .../MongoTemplateProjectionLiveTest.java | 14 ++++++----- 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 spring-data-mongodb/src/main/java/org/baeldung/config/SimpleMongoConfig.java diff --git a/spring-data-mongodb/src/main/java/org/baeldung/config/SimpleMongoConfig.java b/spring-data-mongodb/src/main/java/org/baeldung/config/SimpleMongoConfig.java new file mode 100644 index 0000000000..6140382f82 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/baeldung/config/SimpleMongoConfig.java @@ -0,0 +1,25 @@ +package org.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +import com.mongodb.Mongo; +import com.mongodb.MongoClient; + +@Configuration +@EnableMongoRepositories(basePackages = "org.baeldung.repository") +public class SimpleMongoConfig { + + @Bean + public Mongo mongo() throws Exception { + return new MongoClient("localhost"); + } + + @Bean + public MongoTemplate mongoTemplate() throws Exception { + return new MongoTemplate(mongo(), "test"); + } + +} diff --git a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java index 04e474f71b..61115faede 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java @@ -1,8 +1,10 @@ package org.baeldung.mongotemplate; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; -import org.baeldung.config.MongoConfig; +import org.baeldung.config.SimpleMongoConfig; import org.baeldung.model.User; import org.junit.After; import org.junit.Before; @@ -15,7 +17,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = MongoConfig.class) +@ContextConfiguration(classes = SimpleMongoConfig.class) public class MongoTemplateProjectionLiveTest { @Autowired @@ -38,7 +40,7 @@ public class MongoTemplateProjectionLiveTest { mongoTemplate.insert(new User("John", 30)); mongoTemplate.insert(new User("Ringo", 35)); - Query query = new Query(); + final Query query = new Query(); query.fields() .include("name"); @@ -55,7 +57,7 @@ public class MongoTemplateProjectionLiveTest { mongoTemplate.insert(new User("John", 30)); mongoTemplate.insert(new User("Ringo", 35)); - Query query = new Query(); + final Query query = new Query(); query.fields() .exclude("_id"); @@ -64,7 +66,7 @@ public class MongoTemplateProjectionLiveTest { assertNull(user.getId()); assertNotNull(user.getAge()); }); - + } } From bdc59432a6719a11f516119b2bfce6ab2a1b4948 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 09:58:12 +0100 Subject: [PATCH 070/192] Configure Travis --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..a58410dc56 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: java + +install: mvn clean install + +jdk: + - oraclejdk8 \ No newline at end of file From b18f2a58c885091587597b65512627316b7bef8d Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 9 Feb 2017 11:53:06 +0200 Subject: [PATCH 071/192] minor formatting cleanup --- .../controller/GenericEntityController.java | 4 +--- .../SpringBootApplicationIntegrationTest.java | 17 +++++------------ .../ProductInfoRepositoryIntegrationTest.java | 6 +++--- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java index 7d6293056a..7d1ad7d899 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java +++ b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java @@ -54,8 +54,6 @@ public class GenericEntityController { @GetMapping("/entity/findbyversion") public ResponseEntity findByVersion(@Version String version) { - return version != null - ? new ResponseEntity(entityList.stream().findFirst().get(), HttpStatus.OK) - : new ResponseEntity(HttpStatus.NOT_FOUND); + return version != null ? new ResponseEntity(entityList.stream().findFirst().get(), HttpStatus.OK) : new ResponseEntity(HttpStatus.NOT_FOUND); } } diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 3499952ab4..87c59a4662 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -45,29 +45,22 @@ public class SpringBootApplicationIntegrationTest { public void givenRequestHasBeenMade_whenMeetsFindByDateOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbydate/{date}", "2011-12-03T10:15:30")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.content().contentType(contentType)) - .andExpect(jsonPath("$.id", equalTo(1))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbydate/{date}", "2011-12-03T10:15:30")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); } @Test public void givenRequestHasBeenMade_whenMeetsFindByModeOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", Modes.ALPHA.name())) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.content().contentType(contentType)) - .andExpect(jsonPath("$.id", equalTo(1))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", Modes.ALPHA.name())).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)).andExpect(jsonPath("$.id", equalTo(1))); } @Test public void givenRequestHasBeenMade_whenMeetsFindByVersionOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbyversion").header("Version", "1.0.0")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.content().contentType(contentType)) - .andExpect(jsonPath("$.id", equalTo(1))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbyversion").header("Version", "1.0.0")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); } } diff --git a/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java b/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java index 8fe3e96940..05badc74b4 100644 --- a/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java +++ b/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java @@ -44,8 +44,8 @@ public class ProductInfoRepositoryIntegrationTest { private static final String EXPECTED_PRICE = "50"; @Before - @Ignore //TODO Remove Ignore annotations when running locally with Local DynamoDB instance - public void setup() throws Exception { + @Ignore // TODO Remove Ignore annotations when running locally with Local DynamoDB instance + public void setup() throws Exception { try { dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB); @@ -64,7 +64,7 @@ public class ProductInfoRepositoryIntegrationTest { } @Test - @Ignore //TODO Remove Ignore annotations when running locally with Local DynamoDB instance + @Ignore // TODO Remove Ignore annotations when running locally with Local DynamoDB instance public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() { ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE); From bfb364769cf1c86da4053683185361e2fad15a4b Mon Sep 17 00:00:00 2001 From: lor6 Date: Thu, 9 Feb 2017 11:56:34 +0200 Subject: [PATCH 072/192] move multiple login project (#1140) --- spring-security-custom-permission/pom.xml | 12 +- .../main/java/org/baeldung/Application.java | 2 +- .../MultipleLoginApplication.java | 22 ++++ .../multiplelogin/MultipleLoginMvcConfig.java | 45 +++++++ .../MultipleLoginSecurityConfig.java | 122 ++++++++++++++++++ .../multiplelogin/UsersController.java | 38 ++++++ .../src/main/resources/templates/403.html | 10 ++ .../main/resources/templates/adminPage.html | 13 ++ .../src/main/resources/templates/login.html | 27 ++++ .../main/resources/templates/loginAdmin.html | 31 +++++ .../main/resources/templates/loginUser.html | 30 +++++ .../resources/templates/protectedLinks.html | 13 ++ .../main/resources/templates/userPage.html | 12 ++ 13 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java create mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java create mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java create mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java create mode 100644 spring-security-custom-permission/src/main/resources/templates/403.html create mode 100644 spring-security-custom-permission/src/main/resources/templates/adminPage.html create mode 100644 spring-security-custom-permission/src/main/resources/templates/login.html create mode 100644 spring-security-custom-permission/src/main/resources/templates/loginAdmin.html create mode 100644 spring-security-custom-permission/src/main/resources/templates/loginUser.html create mode 100644 spring-security-custom-permission/src/main/resources/templates/protectedLinks.html create mode 100644 spring-security-custom-permission/src/main/resources/templates/userPage.html diff --git a/spring-security-custom-permission/pom.xml b/spring-security-custom-permission/pom.xml index 39dec2805f..a2925189e4 100644 --- a/spring-security-custom-permission/pom.xml +++ b/spring-security-custom-permission/pom.xml @@ -128,6 +128,12 @@ spring-security-taglibs ${spring-security-taglibs.version} + + + org.springframework.security + spring-security-core + ${spring-security-core.version} + javax.servlet.jsp.jstl @@ -280,11 +286,15 @@ org.baeldung.Application - UTF-8 + + + UTF-8 1.8 10.13.1.1 1.1.2 4.2.0.RELEASE + 4.2.0.RELEASE + 1.2 2.4.0 1.6.1 diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/Application.java b/spring-security-custom-permission/src/main/java/org/baeldung/Application.java index 71d503e678..072a6ca4fe 100644 --- a/spring-security-custom-permission/src/main/java/org/baeldung/Application.java +++ b/spring-security-custom-permission/src/main/java/org/baeldung/Application.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.FilterType; @Configuration @EnableAutoConfiguration -@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*")) +@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*")}) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java new file mode 100644 index 0000000000..23fda0547f --- /dev/null +++ b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java @@ -0,0 +1,22 @@ +package org.baeldung.multiplelogin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; + +@SpringBootApplication +@ComponentScan("org.baeldung.multiplelogin") +public class MultipleLoginApplication extends SpringBootServletInitializer { + public static void main(String[] args) { + SpringApplication.run(MultipleLoginApplication.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(MultipleLoginApplication.class); + } +} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java new file mode 100644 index 0000000000..ec76be1909 --- /dev/null +++ b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java @@ -0,0 +1,45 @@ +package org.baeldung.multiplelogin; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.context.annotation.ComponentScan; + +@EnableWebMvc +@Configuration +@ComponentScan("org.baeldung.controller") +public class MultipleLoginMvcConfig extends WebMvcConfigurerAdapter { + + public MultipleLoginMvcConfig() { + super(); + } + + // API + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + super.addViewControllers(registry); + + registry.addViewController("/anonymous.html"); + + registry.addViewController("/login.html"); + registry.addViewController("/homepage.html"); + registry.addViewController("/console.html"); + } + + @Bean + public ViewResolver viewResolver() { + final InternalResourceViewResolver bean = new InternalResourceViewResolver(); + + bean.setViewClass(JstlView.class); + bean.setPrefix("/WEB-INF/view/"); + bean.setSuffix(".jsp"); + + return bean; + } +} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java new file mode 100644 index 0000000000..d7dbf17723 --- /dev/null +++ b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java @@ -0,0 +1,122 @@ +package org.baeldung.multiplelogin; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.TestingAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; + +@Configuration +@EnableWebSecurity +public class MultipleLoginSecurityConfig { + + @Bean + public UserDetailsService userDetailsService() throws Exception { + InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); + manager.createUser(User.withUsername("user") + .password("userPass") + .roles("USER") + .build()); + manager.createUser(User.withUsername("admin") + .password("adminPass") + .roles("ADMIN") + .build()); + return manager; + } + + @Configuration + @Order(1) + public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App1ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin") + .password("admin") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/admin*") + .authorizeRequests() + .anyRequest() + .hasRole("ADMIN") + // log in + .and() + .formLogin() + .loginPage("/loginAdmin") + .loginProcessingUrl("/admin_login") + .failureUrl("/loginAdmin?error=loginError") + .defaultSuccessUrl("/adminPage") + // logout + .and() + .logout() + .logoutUrl("/admin_logout") + .logoutSuccessUrl("/protectedLinks") + .deleteCookies("JSESSIONID") + .and() + .exceptionHandling() + .accessDeniedPage("/403") + .and() + .csrf() + .disable(); + } + } + + @Configuration + @Order(2) + public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App2ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password("user") + .roles("USER"); + } + + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/user*") + .authorizeRequests() + .anyRequest() + .hasRole("USER") + // log in + .and() + .formLogin() + .loginPage("/loginUser") + .loginProcessingUrl("/user_login") + .failureUrl("/loginUser?error=loginError") + .defaultSuccessUrl("/userPage") + // logout + .and() + .logout() + .logoutUrl("/user_logout") + .logoutSuccessUrl("/protectedLinks") + .deleteCookies("JSESSIONID") + .and() + .exceptionHandling() + .accessDeniedPage("/403") + .and() + .csrf() + .disable(); + } + } + +} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java new file mode 100644 index 0000000000..0672a760af --- /dev/null +++ b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java @@ -0,0 +1,38 @@ +package org.baeldung.multiplelogin; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UsersController { + + @RequestMapping("/protectedLinks") + public String getAnonymousPage() { + return "protectedLinks"; + } + + @RequestMapping("/userPage") + public String getUserPage() { + return "userPage"; + } + + @RequestMapping("/adminPage") + public String getAdminPage() { + return "adminPage"; + } + + @RequestMapping("/loginAdmin") + public String getAdminLoginPage() { + return "loginAdmin"; + } + + @RequestMapping("/loginUser") + public String getUserLoginPage() { + return "loginUser"; + } + + @RequestMapping("/403") + public String getAccessDeniedPage() { + return "403"; + } +} diff --git a/spring-security-custom-permission/src/main/resources/templates/403.html b/spring-security-custom-permission/src/main/resources/templates/403.html new file mode 100644 index 0000000000..20550768cf --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/403.html @@ -0,0 +1,10 @@ + + + + + + + +You do not have permission to view this page. + + \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/adminPage.html b/spring-security-custom-permission/src/main/resources/templates/adminPage.html new file mode 100644 index 0000000000..13aff9b15a --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/adminPage.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + +Welcome admin! Logout + +

+Back to links + + \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/login.html b/spring-security-custom-permission/src/main/resources/templates/login.html new file mode 100644 index 0000000000..dd6bd04767 --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/login.html @@ -0,0 +1,27 @@ + + + + +

Login

+ +
+ + + + + + + + + + + + + + +
User:
Password:
+ +
+ + + \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/loginAdmin.html b/spring-security-custom-permission/src/main/resources/templates/loginAdmin.html new file mode 100644 index 0000000000..43d0e73233 --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/loginAdmin.html @@ -0,0 +1,31 @@ + + + + +Insert title here + + + +

Admin login page

+
+ + + + + + + + + + + + + +
User:
Password:
+ +
+ +

Login failed!

+ + + \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/loginUser.html b/spring-security-custom-permission/src/main/resources/templates/loginUser.html new file mode 100644 index 0000000000..bf4ddd48bc --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/loginUser.html @@ -0,0 +1,30 @@ + + + + +Login + + + +

User login page

+ +
+ + + + + + + + + + + + +
User:
Password:
+ +
+

Login failed!

+ + + \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/protectedLinks.html b/spring-security-custom-permission/src/main/resources/templates/protectedLinks.html new file mode 100644 index 0000000000..1877464fe5 --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/protectedLinks.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + + +User page +
+Admin page + + \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/userPage.html b/spring-security-custom-permission/src/main/resources/templates/userPage.html new file mode 100644 index 0000000000..894a225871 --- /dev/null +++ b/spring-security-custom-permission/src/main/resources/templates/userPage.html @@ -0,0 +1,12 @@ + + + + +Insert title here + + +Welcome user! Logout +

+Back to links + + \ No newline at end of file From 3a1505ad29bc864fa9487eebbbe8c97f7f1b9848 Mon Sep 17 00:00:00 2001 From: lor6 Date: Thu, 9 Feb 2017 11:56:53 +0200 Subject: [PATCH 073/192] clean project of security config (#1141) --- spring-mvc-forms/pom.xml | 17 --- .../configuration/SecurityConfig.java | 122 ------------------ .../configuration/WebInitializer.java | 5 +- .../controller/UsersController.java | 38 ------ .../src/main/webapp/WEB-INF/views/403.jsp | 12 -- .../main/webapp/WEB-INF/views/adminPage.jsp | 16 --- .../main/webapp/WEB-INF/views/loginAdmin.jsp | 38 ------ .../main/webapp/WEB-INF/views/loginUser.jsp | 37 ------ .../webapp/WEB-INF/views/protectedLinks.jsp | 16 --- .../main/webapp/WEB-INF/views/userPage.jsp | 15 --- 10 files changed, 1 insertion(+), 315 deletions(-) delete mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java delete mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java delete mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp delete mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp delete mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp delete mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp delete mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp delete mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms/pom.xml index f17d695c35..35ed00c0e9 100644 --- a/spring-mvc-forms/pom.xml +++ b/spring-mvc-forms/pom.xml @@ -47,22 +47,6 @@ ${fileupload.version}
- - org.springframework.security - spring-security-web - ${org.springframework.security.version} - - - org.springframework.security - spring-security-config - ${org.springframework.security.version} - - - org.springframework.security - spring-security-taglibs - ${org.springframework.security.version} - - @@ -115,7 +99,6 @@ 5.3.3.Final enter-location-of-server 1.3.2 - 4.2.1.RELEASE diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java deleted file mode 100644 index e35844138d..0000000000 --- a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/SecurityConfig.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.baeldung.springmvcforms.configuration; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.TestingAuthenticationProvider; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; - -@Configuration -@EnableWebSecurity -public class SecurityConfig { - - @Bean - public UserDetailsService userDetailsService() throws Exception { - InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); - manager.createUser(User.withUsername("user") - .password("userPass") - .roles("USER") - .build()); - manager.createUser(User.withUsername("admin") - .password("adminPass") - .roles("ADMIN") - .build()); - return manager; - } - - @Configuration - @Order(1) - public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { - - public App1ConfigurationAdapter() { - super(); - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("admin") - .password("admin") - .roles("ADMIN"); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/admin*") - .authorizeRequests() - .anyRequest() - .hasRole("ADMIN") - // log in - .and() - .formLogin() - .loginPage("/loginAdmin") - .loginProcessingUrl("/admin_login") - .failureUrl("/loginAdmin?error=loginError") - .defaultSuccessUrl("/adminPage") - // logout - .and() - .logout() - .logoutUrl("/admin_logout") - .logoutSuccessUrl("/protectedLinks") - .deleteCookies("JSESSIONID") - .and() - .exceptionHandling() - .accessDeniedPage("/403") - .and() - .csrf() - .disable(); - } - } - - @Configuration - @Order(2) - public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { - - public App2ConfigurationAdapter() { - super(); - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("user") - .password("user") - .roles("USER"); - } - - protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/user*") - .authorizeRequests() - .anyRequest() - .hasRole("USER") - // log in - .and() - .formLogin() - .loginPage("/loginUser") - .loginProcessingUrl("/user_login") - .failureUrl("/loginUser?error=loginError") - .defaultSuccessUrl("/userPage") - // logout - .and() - .logout() - .logoutUrl("/user_logout") - .logoutSuccessUrl("/protectedLinks") - .deleteCookies("JSESSIONID") - .and() - .exceptionHandling() - .accessDeniedPage("/403") - .and() - .csrf() - .disable(); - } - } - -} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java index fdc155e101..2eb669da2c 100644 --- a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java @@ -3,7 +3,6 @@ package com.baeldung.springmvcforms.configuration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.ServletContext; @@ -25,9 +24,7 @@ public class WebInitializer implements WebApplicationInitializer { servlet.setLoadOnStartup(1); servlet.addMapping("/"); - - container.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain")) - .addMappingForUrlPatterns(null, false, "/*"); + } // @Override // public void onStartup(ServletContext container) { diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java deleted file mode 100644 index c0858d427f..0000000000 --- a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UsersController.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.springmvcforms.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -public class UsersController { - - @RequestMapping("/protectedLinks") - public String getAnonymousPage() { - return "protectedLinks"; - } - - @RequestMapping("/userPage") - public String getUserPage() { - return "userPage"; - } - - @RequestMapping("/adminPage") - public String getAdminPage() { - return "adminPage"; - } - - @RequestMapping("/loginAdmin") - public String getAdminLoginPage() { - return "loginAdmin"; - } - - @RequestMapping("/loginUser") - public String getUserLoginPage() { - return "loginUser"; - } - - @RequestMapping("/403") - public String getAccessDeniedPage() { - return "403"; - } -} diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp deleted file mode 100644 index e665793e10..0000000000 --- a/spring-mvc-forms/src/main/webapp/WEB-INF/views/403.jsp +++ /dev/null @@ -1,12 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - - - - - - - -Your do not have permission to view this page. - - \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp deleted file mode 100644 index a210b690b0..0000000000 --- a/spring-mvc-forms/src/main/webapp/WEB-INF/views/adminPage.jsp +++ /dev/null @@ -1,16 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - -Insert title here - - -Welcome admin! Logout - -

-Back to links - - \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp deleted file mode 100644 index a6b2ee7914..0000000000 --- a/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginAdmin.jsp +++ /dev/null @@ -1,38 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> - - - - -Insert title here - - - -

Admin login page

-
- - - - - - - - - - - - - -
User:
Password:
- -
- - <% - if (request.getParameter("error") != null) { - out.println("Login failed!"); - } - %> - - - \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp deleted file mode 100644 index e65c11edaf..0000000000 --- a/spring-mvc-forms/src/main/webapp/WEB-INF/views/loginUser.jsp +++ /dev/null @@ -1,37 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> - - - - -Login - - - -

User login page

- -
- - - - - - - - - - - - -
User:
Password:
- -
- <% - if (request.getParameter("error") != null) { - out.println("Login failed!"); - } - %> - - - \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp deleted file mode 100644 index b8453903ba..0000000000 --- a/spring-mvc-forms/src/main/webapp/WEB-INF/views/protectedLinks.jsp +++ /dev/null @@ -1,16 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - -Insert title here - - - -">User page -
-">Admin page - - \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp deleted file mode 100644 index 4c1bd47502..0000000000 --- a/spring-mvc-forms/src/main/webapp/WEB-INF/views/userPage.jsp +++ /dev/null @@ -1,15 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - -Insert title here - - -Welcome user! Logout -

-Back to links - - \ No newline at end of file From 22241a412645b474c3668407eb58087840fe3afa Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 9 Feb 2017 12:15:55 +0200 Subject: [PATCH 074/192] testing fix --- ...est.java => JavaEEAppIntegrationTest.java} | 61 +++++++++---------- 1 file changed, 29 insertions(+), 32 deletions(-) rename spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/{JavaEEAppTest.java => JavaEEAppIntegrationTest.java} (79%) diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java similarity index 79% rename from spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java rename to spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java index 00705be307..95106d2dc8 100644 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppTest.java +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java @@ -1,17 +1,12 @@ package com.baeldung.annotation.servletcomponentscan; -import com.baeldung.annotation.servletcomponentscan.javaee.AttrListener; -import com.baeldung.annotation.servletcomponentscan.javaee.EchoServlet; -import com.baeldung.annotation.servletcomponentscan.javaee.HelloFilter; -import com.baeldung.annotation.servletcomponentscan.javaee.HelloServlet; -import org.jboss.arquillian.container.test.api.Deployment; -import org.jboss.arquillian.container.test.api.RunAsClient; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.test.api.ArquillianResource; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Test; -import org.junit.runner.RunWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; import javax.inject.Inject; import javax.servlet.FilterRegistration; @@ -22,24 +17,31 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import static org.junit.Assert.*; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.baeldung.annotation.servletcomponentscan.javaee.AttrListener; +import com.baeldung.annotation.servletcomponentscan.javaee.EchoServlet; +import com.baeldung.annotation.servletcomponentscan.javaee.HelloFilter; +import com.baeldung.annotation.servletcomponentscan.javaee.HelloServlet; @RunWith(Arquillian.class) -public class JavaEEAppTest { +public class JavaEEAppIntegrationTest { @Deployment public static WebArchive createDeployment() { - return ShrinkWrap - .create(WebArchive.class) - .addClass(JavaEEApp.class) - .addClasses(AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class); + return ShrinkWrap.create(WebArchive.class).addClass(JavaEEApp.class).addClasses(AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class); } - @Inject private ServletContext servletContext; + @Inject + private ServletContext servletContext; @Test public void givenServletContextListener_whenAccessSpecialAttrs_thenFound() throws MalformedURLException { @@ -54,21 +56,18 @@ public class JavaEEAppTest { FilterRegistration filterRegistration = servletContext.getFilterRegistration("hello filter"); assertNotNull(filterRegistration); - assertTrue(filterRegistration - .getServletNameMappings() - .contains("echo servlet")); + assertTrue(filterRegistration.getServletNameMappings().contains("echo servlet")); } - @ArquillianResource private URL base; + @ArquillianResource + private URL base; @Test @RunAsClient public void givenFilterAndServlet_whenGetHello_thenRespondFilteringHello() throws MalformedURLException { Client client = ClientBuilder.newClient(); WebTarget target = client.target(URI.create(new URL(base, "hello").toExternalForm())); - Response response = target - .request() - .get(); + Response response = target.request().get(); assertEquals("filtering hello", response.readEntity(String.class)); } @@ -78,9 +77,7 @@ public class JavaEEAppTest { public void givenFilterAndServlet_whenPostEcho_thenEchoFiltered() throws MalformedURLException { Client client = ClientBuilder.newClient(); WebTarget target = client.target(URI.create(new URL(base, "echo").toExternalForm())); - Response response = target - .request() - .post(Entity.entity("echo", MediaType.TEXT_PLAIN_TYPE)); + Response response = target.request().post(Entity.entity("echo", MediaType.TEXT_PLAIN_TYPE)); assertEquals("filtering echo", response.readEntity(String.class)); } From 9fc0aed6a49267bf73fb9fd0df3aa2c38a6c1765 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 11:36:18 +0100 Subject: [PATCH 075/192] Update .travis.yml --- .travis.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a58410dc56..b1f83ea1f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,10 @@ language: java install: mvn clean install jdk: - - oraclejdk8 \ No newline at end of file + - oraclejdk8 + +sudo: false +addons: + apt: + packages: + - oracle-java8-installer \ No newline at end of file From 6cd3bc37c8ef3e722aed5db593960345e4c4f12c Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 11:45:00 +0100 Subject: [PATCH 076/192] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b1f83ea1f5..620067a080 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: mvn clean install +install: mvn -q clean install jdk: - oraclejdk8 From f54c9d8ead9632f9328f203f09cee3ece35b401c Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 11:48:45 +0100 Subject: [PATCH 077/192] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 620067a080..54fc85a292 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: mvn -q clean install +install: travis_wait 30 mvn -q clean install jdk: - oraclejdk8 From 158fd42be1b4791be3cbbb81f7f4b0668dabd79f Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 12:15:41 +0100 Subject: [PATCH 078/192] Update .travis.yml --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 54fc85a292..5e115f8808 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,9 @@ sudo: false addons: apt: packages: - - oracle-java8-installer \ No newline at end of file + - oracle-java8-installer + +cache: + directories: + - .autoconf + - $HOME/.m2 \ No newline at end of file From 8c88e79fed9c6fc722902d8d52af7340fa707f37 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 13:01:44 +0100 Subject: [PATCH 079/192] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5e115f8808..256180a240 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 30 mvn -q clean install +install: travis_wait 40 mvn -q clean install jdk: - oraclejdk8 From 58da4867bcf6df90beaf2fa0a4c32d328796e52f Mon Sep 17 00:00:00 2001 From: Tian Baoqiang Date: Thu, 9 Feb 2017 20:26:49 +0800 Subject: [PATCH 080/192] rename #BAEL-100 tests to follow the standard naming convention (#1145) --- ....java => SpringBootWithServletComponentIntegrationTest.java} | 2 +- ...va => SpringBootWithoutServletComponentIntegrationTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/{SpringBootWithServletComponentTest.java => SpringBootWithServletComponentIntegrationTest.java} (97%) rename spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/{SpringBootWithoutServletComponentTest.java => SpringBootWithoutServletComponentIntegrationTest.java} (96%) diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java similarity index 97% rename from spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java rename to spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java index 524a4df480..81ac3c9841 100644 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentTest.java +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java @@ -20,7 +20,7 @@ import static org.junit.Assert.*; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootAnnotatedApp.class) @AutoConfigureMockMvc @TestPropertySource(properties = { "security.basic.enabled=false", "server.tomcat.additional-tld-skip-patterns=tomee-*.jar,tomcat-*.jar,openejb-*.jar,cxf-*.jar,activemq-*.jar" }) -public class SpringBootWithServletComponentTest { +public class SpringBootWithServletComponentIntegrationTest { @Autowired private ServletContext servletContext; diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java similarity index 96% rename from spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java rename to spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java index 811323826b..b2dea25864 100644 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentTest.java +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java @@ -20,7 +20,7 @@ import static org.junit.Assert.*; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootPlainApp.class) @AutoConfigureMockMvc @TestPropertySource(properties = { "security.basic.enabled=false", "server.tomcat.additional-tld-skip-patterns=tomee-*.jar,tomcat-*.jar,openejb-*.jar,cxf-*.jar,activemq-*.jar" }) -public class SpringBootWithoutServletComponentTest { +public class SpringBootWithoutServletComponentIntegrationTest { @Autowired private ServletContext servletContext; From 949e0005d83433365da0815b54c291a68d7d9370 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 20:43:33 +0100 Subject: [PATCH 081/192] Enable incremental build --- pom.xml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a24e3d4667..7282d6a0d3 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ UTF-8 + refs/heads/master @@ -190,6 +191,17 @@ struts2 - + + + + + + com.vackosar.gitflowincrementalbuilder + gitflow-incremental-builder + 3.1 + + + + From b6155df1301078e13cbd1d8c4fa46600cf2f8db3 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 20:58:30 +0100 Subject: [PATCH 082/192] Disable incremental build by default --- .travis.yml | 2 +- pom.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 256180a240..c2a369a1b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 40 mvn -q clean install +install: travis_wait 40 mvn -q clean install -Dgib.enabled=true jdk: - oraclejdk8 diff --git a/pom.xml b/pom.xml index 7282d6a0d3..737a470649 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ UTF-8 refs/heads/master + false From 57d5278707d32022bcb951968d56e810f4e9ea52 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 21:09:20 +0100 Subject: [PATCH 083/192] Disable incremental build by default --- .travis.yml | 2 +- pom.xml | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index c2a369a1b3..ed61f462f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 40 mvn -q clean install -Dgib.enabled=true +install: travis_wait 40 mvn -q clean install --activate-profiles incremental jdk: - oraclejdk8 diff --git a/pom.xml b/pom.xml index 737a470649..fb88c48f5b 100644 --- a/pom.xml +++ b/pom.xml @@ -195,14 +195,17 @@ - - - com.vackosar.gitflowincrementalbuilder - gitflow-incremental-builder - 3.1 - - + + + + incremental + + true + + + + From ae3ee2150f02ba5172e58b086384b75b4479cbf5 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 21:17:29 +0100 Subject: [PATCH 084/192] Disable incremental build by default --- .travis.yml | 2 +- pom.xml | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index ed61f462f9..c3557f0328 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 40 mvn -q clean install --activate-profiles incremental +install: travis_wait 40 mvn -q clean install --activate-profiles incremental-enabled jdk: - oraclejdk8 diff --git a/pom.xml b/pom.xml index fb88c48f5b..2a9eb67d18 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,6 @@ UTF-8 refs/heads/master - false @@ -200,11 +199,20 @@ - incremental + incremental-enabled true + + incremental-disabled + + true + + + false + + From d6911adc5da82d1cb3cef588ebb63afa0684f694 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 21:25:34 +0100 Subject: [PATCH 085/192] Disable incremental build by default --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c3557f0328..ea49692e03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 40 mvn -q clean install --activate-profiles incremental-enabled +install: travis_wait 40 mvn -q clean install -P incremental-enabled jdk: - oraclejdk8 From 234cdb16b2fd9e7e20261230b14eb9b4b4d50fd0 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 21:40:31 +0100 Subject: [PATCH 086/192] Enable incremental --- .travis.yml | 2 +- pom.xml | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ea49692e03..73a4607a97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 40 mvn -q clean install -P incremental-enabled +install: travis_wait 40 mvn -q clean install -Pincremental-enabled jdk: - oraclejdk8 diff --git a/pom.xml b/pom.xml index 2a9eb67d18..dd077dbd4a 100644 --- a/pom.xml +++ b/pom.xml @@ -194,9 +194,16 @@ - + + + com.vackosar.gitflowincrementalbuilder + gitflow-incremental-builder + 3.1 + + + incremental-enabled From 30ed03aea1c84d2fec157c7281d0aec761569dcb Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 9 Feb 2017 21:45:17 +0100 Subject: [PATCH 087/192] Enable incremental --- .travis.yml | 2 +- pom.xml | 22 +--------------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73a4607a97..c2a369a1b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java -install: travis_wait 40 mvn -q clean install -Pincremental-enabled +install: travis_wait 40 mvn -q clean install -Dgib.enabled=true jdk: - oraclejdk8 diff --git a/pom.xml b/pom.xml index dd077dbd4a..764b8c6416 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ UTF-8 refs/heads/master + false @@ -202,25 +203,4 @@ - - - - - incremental-enabled - - true - - - - incremental-disabled - - true - - - false - - - - - From c95097e294e48b8200798829ff9a16b6ba6b7082 Mon Sep 17 00:00:00 2001 From: maibin Date: Fri, 10 Feb 2017 01:25:40 +0100 Subject: [PATCH 088/192] Simple Genetic Algorithms improvements (#1146) * Modifications to model on Hibernate One to manyTutorial * Modifications to model on Hibernate One to manyTutorial * Modifications to model on Hibernate One to manyTutorial * Simple Genetic Algorithm improvements --- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.9799201796740292 | 0 .../com/baeldung/algorithms/RunAlgorithm.java | 48 ++++++++++--------- .../ga/binary/SimpleGeneticAlgorithm.java | 20 ++++---- .../BinaryGeneticAlgorithmUnitTest.java | 9 ++-- spring-hibernate4/.gitignore | 1 + 9 files changed, 41 insertions(+), 37 deletions(-) delete mode 100644 core-java/0.004102810554955205 delete mode 100644 core-java/0.04832801936270381 delete mode 100644 core-java/0.5633433244738808 delete mode 100644 core-java/0.6256429734439612 delete mode 100644 core-java/0.9799201796740292 diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java index 476e873f90..3f7c8bf4b3 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java +++ b/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java @@ -8,28 +8,30 @@ import com.baeldung.algorithms.slope_one.SlopeOne; public class RunAlgorithm { - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - System.out.println("Run algorithm:"); - System.out.println("1 - Simulated Annealing"); - System.out.println("2 - Slope One"); - System.out.println("3 - Simple Genetic Algorithm"); - int decision = in.nextInt(); - switch (decision) { - case 1: - System.out.println("Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995)); - break; - case 2: - SlopeOne.slopeOne(3); - break; - case 3: - SimpleGeneticAlgorithm.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111"); - break; - default: - System.out.println("Unknown option"); - break; - } - in.close(); - } + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.println("Run algorithm:"); + System.out.println("1 - Simulated Annealing"); + System.out.println("2 - Slope One"); + System.out.println("3 - Simple Genetic Algorithm"); + int decision = in.nextInt(); + switch (decision) { + case 1: + System.out.println( + "Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995)); + break; + case 2: + SlopeOne.slopeOne(3); + break; + case 3: + SimpleGeneticAlgorithm ga = new SimpleGeneticAlgorithm(); + ga.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111"); + break; + default: + System.out.println("Unknown option"); + break; + } + in.close(); + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java index c7e2a6b381..e62eab0d57 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java @@ -11,17 +11,17 @@ public class SimpleGeneticAlgorithm { private static final boolean elitism = true; private static byte[] solution = new byte[64]; - public static boolean runAlgorithm(int populationSize, String solution) { + public boolean runAlgorithm(int populationSize, String solution) { if (solution.length() != SimpleGeneticAlgorithm.solution.length) { throw new RuntimeException("The solution needs to have " + SimpleGeneticAlgorithm.solution.length + " bytes"); } - SimpleGeneticAlgorithm.setSolution(solution); + setSolution(solution); Population myPop = new Population(populationSize, true); int generationCount = 1; - while (myPop.getFittest().getFitness() < SimpleGeneticAlgorithm.getMaxFitness()) { + while (myPop.getFittest().getFitness() < getMaxFitness()) { System.out.println("Generation: " + generationCount + " Correct genes found: " + myPop.getFittest().getFitness()); - myPop = SimpleGeneticAlgorithm.evolvePopulation(myPop); + myPop = evolvePopulation(myPop); generationCount++; } System.out.println("Solution found!"); @@ -31,7 +31,7 @@ public class SimpleGeneticAlgorithm { return true; } - public static Population evolvePopulation(Population pop) { + public Population evolvePopulation(Population pop) { int elitismOffset; Population newPopulation = new Population(pop.getIndividuals().size(), false); @@ -56,7 +56,7 @@ public class SimpleGeneticAlgorithm { return newPopulation; } - private static Individual crossover(Individual indiv1, Individual indiv2) { + private Individual crossover(Individual indiv1, Individual indiv2) { Individual newSol = new Individual(); for (int i = 0; i < newSol.getDefaultGeneLength(); i++) { if (Math.random() <= uniformRate) { @@ -68,7 +68,7 @@ public class SimpleGeneticAlgorithm { return newSol; } - private static void mutate(Individual indiv) { + private void mutate(Individual indiv) { for (int i = 0; i < indiv.getDefaultGeneLength(); i++) { if (Math.random() <= mutationRate) { byte gene = (byte) Math.round(Math.random()); @@ -77,7 +77,7 @@ public class SimpleGeneticAlgorithm { } } - private static Individual tournamentSelection(Population pop) { + private Individual tournamentSelection(Population pop) { Population tournament = new Population(tournamentSize, false); for (int i = 0; i < tournamentSize; i++) { int randomId = (int) (Math.random() * pop.getIndividuals().size()); @@ -97,12 +97,12 @@ public class SimpleGeneticAlgorithm { return fitness; } - protected static int getMaxFitness() { + protected int getMaxFitness() { int maxFitness = solution.length; return maxFitness; } - protected static void setSolution(String newSolution) { + protected void setSolution(String newSolution) { solution = new byte[newSolution.length()]; for (int i = 0; i < newSolution.length(); i++) { String character = newSolution.substring(i, i + 1); diff --git a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java index 6b720898eb..2e92177c8c 100644 --- a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java +++ b/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java @@ -7,9 +7,10 @@ import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm; public class BinaryGeneticAlgorithmUnitTest { - @Test - public void testGA() { - Assert.assertTrue(SimpleGeneticAlgorithm.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111")); - } + @Test + public void testGA() { + SimpleGeneticAlgorithm ga = new SimpleGeneticAlgorithm(); + Assert.assertTrue(ga.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111")); + } } diff --git a/spring-hibernate4/.gitignore b/spring-hibernate4/.gitignore index 478cca6dac..d31cc4c619 100644 --- a/spring-hibernate4/.gitignore +++ b/spring-hibernate4/.gitignore @@ -12,3 +12,4 @@ *.war *.ear /target/ +/target/ From 426944f72bc9d129a6989a59af75256629fb0b71 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Fri, 10 Feb 2017 07:38:21 +0100 Subject: [PATCH 089/192] Enable GIB --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 764b8c6416..2778f0574f 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,6 @@ UTF-8 refs/heads/master - false From 27190ae11951beeb430b9cc479171861fb102510 Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 10 Feb 2017 10:08:54 +0200 Subject: [PATCH 090/192] temporary change --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 2778f0574f..764b8c6416 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ UTF-8 refs/heads/master + false From 84ecb92f450c5a87a7ee3d8fcf2370b104ff69cb Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 10 Feb 2017 10:13:14 +0200 Subject: [PATCH 091/192] minor boot upgrade --- apache-poi/temp.xlsx | Bin 3510 -> 3508 bytes hystrix/pom.xml | 2 +- jjwt/pom.xml | 2 +- spring-all/pom.xml | 2 +- spring-cloud-data-flow/batch-job/pom.xml | 2 +- .../data-flow-server/pom.xml | 2 +- .../data-flow-shell/pom.xml | 2 +- spring-cloud-data-flow/log-sink/pom.xml | 2 +- spring-cloud-data-flow/time-processor/pom.xml | 2 +- spring-cloud-data-flow/time-source/pom.xml | 2 +- .../spring-cloud-bootstrap/config/pom.xml | 2 +- .../spring-cloud-bootstrap/discovery/pom.xml | 2 +- .../spring-cloud-bootstrap/gateway/pom.xml | 2 +- .../spring-cloud-bootstrap/svc-book/pom.xml | 2 +- .../spring-cloud-bootstrap/svc-rating/pom.xml | 2 +- spring-cloud/spring-cloud-config/pom.xml | 2 +- .../spring-cloud-ribbon-client/pom.xml | 2 +- spring-cucumber/pom.xml | 2 +- spring-data-dynamodb/pom.xml | 2 +- spring-data-rest/pom.xml | 2 +- spring-jooq/pom.xml | 424 +++++++++--------- spring-katharsis/pom.xml | 2 +- spring-mockito/pom.xml | 2 +- spring-mvc-email/pom.xml | 2 +- spring-mvc-web-vs-initializer/pom.xml | 2 +- spring-protobuf/pom.xml | 2 +- spring-quartz/pom.xml | 2 +- spring-rest-angular/pom.xml | 2 +- spring-rest-docs/pom.xml | 2 +- .../pom.xml | 2 +- .../spring-security-jsp-authorize/pom.xml | 2 +- .../spring-security-jsp-config/pom.xml | 2 +- .../spring-security-mvc/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../spring-security-thymeleaf-config/pom.xml | 2 +- spring-security-core/pom.xml | 2 +- spring-security-custom-permission/pom.xml | 2 +- spring-security-mvc-ldap/pom.xml | 2 +- spring-security-openid/pom.xml | 2 +- spring-security-rest-custom/pom.xml | 2 +- spring-security-rest-full/pom.xml | 2 +- spring-security-x509/pom.xml | 2 +- spring-session/pom.xml | 2 +- spring-social-login/pom.xml | 2 +- spring-zuul/pom.xml | 2 +- 46 files changed, 256 insertions(+), 256 deletions(-) diff --git a/apache-poi/temp.xlsx b/apache-poi/temp.xlsx index da67ca9e9e71409c744feca69821a8a39282d024..5281b2c4de3e395676c86da7df086c5019b7fa52 100644 GIT binary patch delta 555 zcmdlcy+xWgz?+#xgn@&DgP|?ZYa_2LBQucRtjkyjW=vkkbPgmixt>|KUh&C3-%G5q zPPbjBusRkVJk?dMD0w^Sv$N3KU*DG9-P%-TX`Iey9KX}@1!HXk|6WtkG|QtLJzG|p z=eEwDmAmbjhD+iUi8YN}(%t4?e@1G`PQP~eTr|7gH-P}5nFp4xE)ZY*xP|3rqnM(9 zi|66+*IPSQe$g#-+Se)O;rNpEqCkDCP~Zg589R@5_Mp2;rp+5W^$`dOWnd_g=damJ+ri1qH^E<>N)-AtBh^+8U5|&KZ&Ul5ESv^lCzKX zdRo0HKK8yzbd30v*t9JtBywNO+T3LPEof5wZ}+DgH|^W!wXme2jDNfE&Mm?&|61nm zl8X=UX6KMS*0Ym~k%3_s5Tk_Mq>4rF#U?#niCkzUSQKF>+zV$gLumhoKc*^z`$?;h(&-H0d`Mr=23>2z$0xlla+y? zB1gZtq%tS9Sg#^CC%~JLNd%|`8m(TLcY9^-0(Hj&9nFt01<0zI#486jN0C>WaoS{C VUQIAB6Uf^!xs_L&EuI^s9somV#f<;} delta 602 zcmdlYy-k`oz?+#xgn@&DgF$Gw>qcH#MrI(rS(mX6%$U56=^RL4ay_$d{lX{vd@rri zUien&RMUbT39cXYRFb1}>O2<3-oLkHceLZ)IWvvhXReQVe`P{V)91YxMHfjra%Lo^ ztiR1=YdZUjkg8pQ?#~315D)1s>-_z_5@#ClZ95lHu#kPe%fxR!H@Hd_Bic5K%WAya z?D4{)#@O$pfcN#J(?_lI8K1YrB(T;uddpeNYgrlF^J2l2q`+JJ=4Y5R4R{tfu=i)W zedL!up!xs(A)Ck(bKi?+$sEtoNz;pS`FQ&8-N!XGw_d-jWX$;WQz88jBfrAr6$uYd z9}DT5{QS|cWj7aCsh3QhWTX1r*Dtc}Sl89;&ic3Sr~W>*>TO;BQ$sz85ni}F-qu7KEZMu9D2)GA3%b!lU*FbSj-_0VI1XL1_{_a zZZmMeF6Xub(=WKKIe`J~1vY)M4v(2Uh_~#(8O1pa3=9{5SOka>VDIEc9_1*I8itP4 zNh^SEab;m(;6*3^vSza~FjVB|7nfA#q!#N{ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/jjwt/pom.xml b/jjwt/pom.xml index c1332fa2d7..982b24987b 100644 --- a/jjwt/pom.xml +++ b/jjwt/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-all/pom.xml b/spring-all/pom.xml index deb6bd6f6a..f28fe1f10d 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud-data-flow/batch-job/pom.xml b/spring-cloud-data-flow/batch-job/pom.xml index 3d05732027..5e519e9a35 100644 --- a/spring-cloud-data-flow/batch-job/pom.xml +++ b/spring-cloud-data-flow/batch-job/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud-data-flow/data-flow-server/pom.xml b/spring-cloud-data-flow/data-flow-server/pom.xml index b1f920c94e..1ed2d4fb74 100644 --- a/spring-cloud-data-flow/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/data-flow-server/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud-data-flow/data-flow-shell/pom.xml b/spring-cloud-data-flow/data-flow-shell/pom.xml index 55fa995052..d3bd297152 100644 --- a/spring-cloud-data-flow/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/data-flow-shell/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud-data-flow/log-sink/pom.xml b/spring-cloud-data-flow/log-sink/pom.xml index 6443ed88c8..dc21132b9f 100644 --- a/spring-cloud-data-flow/log-sink/pom.xml +++ b/spring-cloud-data-flow/log-sink/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud-data-flow/time-processor/pom.xml b/spring-cloud-data-flow/time-processor/pom.xml index d7553b110f..51a66014e0 100644 --- a/spring-cloud-data-flow/time-processor/pom.xml +++ b/spring-cloud-data-flow/time-processor/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud-data-flow/time-source/pom.xml b/spring-cloud-data-flow/time-source/pom.xml index 2523dfabea..57933c2833 100644 --- a/spring-cloud-data-flow/time-source/pom.xml +++ b/spring-cloud-data-flow/time-source/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-bootstrap/config/pom.xml b/spring-cloud/spring-cloud-bootstrap/config/pom.xml index 24d054a87b..2c8ad65102 100644 --- a/spring-cloud/spring-cloud-bootstrap/config/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/config/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml index be3bfbb0be..40a186350c 100644 --- a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml index 9186f12226..044730ba22 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml index ac7cd30dbf..9a99054ed5 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml index 36a29708a6..35da8beba8 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml index d25037a49f..56ff377956 100644 --- a/spring-cloud/spring-cloud-config/pom.xml +++ b/spring-cloud/spring-cloud-config/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml index 8aee41f5c4..d70de51a58 100644 --- a/spring-cloud/spring-cloud-ribbon-client/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-client/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index 644ddff1d8..55c0af670a 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-data-dynamodb/pom.xml b/spring-data-dynamodb/pom.xml index 0ce9b3a399..8b06c0b36f 100644 --- a/spring-data-dynamodb/pom.xml +++ b/spring-data-dynamodb/pom.xml @@ -11,7 +11,7 @@ spring-boot-starter-parent org.springframework.boot - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml index da5d844211..4e8001ae7b 100644 --- a/spring-data-rest/pom.xml +++ b/spring-data-rest/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index bf0dffd68c..195c0b8514 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -1,215 +1,215 @@ - 4.0.0 - com.baeldung - jooq-spring - 0.0.1-SNAPSHOT + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + jooq-spring + 0.0.1-SNAPSHOT - - - - - org.springframework.boot - spring-boot-dependencies - 1.4.2.RELEASE - pom - import - - - + + + + + org.springframework.boot + spring-boot-dependencies + 1.4.4.RELEASE + pom + import + + + - - - - org.jooq - jooq - + + + + org.jooq + jooq + - - - com.h2database - h2 - + + + com.h2database + h2 + - - - org.springframework - spring-context - - - org.springframework - spring-jdbc - - - org.springframework.boot - spring-boot-starter-jooq - + + + org.springframework + spring-context + + + org.springframework + spring-jdbc + + + org.springframework.boot + spring-boot-starter-jooq + - - - org.slf4j - slf4j-api - runtime - - - ch.qos.logback - logback-classic - runtime - + + + org.slf4j + slf4j-api + runtime + + + ch.qos.logback + logback-classic + runtime + - - - junit - junit - test - - - org.springframework - spring-test - test - - - org.springframework.boot - spring-boot-starter-test - - - + + + junit + junit + test + + + org.springframework + spring-test + test + + + org.springframework.boot + spring-boot-starter-test + - - - - org.codehaus.mojo - properties-maven-plugin - ${properties-maven-plugin.version} - - - initialize - - read-project-properties - - - - src/main/resources/intro_config.properties - - - - - + - - org.codehaus.mojo - sql-maven-plugin - ${sql-maven-plugin.version} - - - initialize - - execute - - - ${db.driver} - ${db.url} - ${db.username} - ${db.password} - - src/main/resources/intro_schema.sql - - - - - - - com.h2database - h2 - ${com.h2database.version} - - - + + + + org.codehaus.mojo + properties-maven-plugin + ${properties-maven-plugin.version} + + + initialize + + read-project-properties + + + + src/main/resources/intro_config.properties + + + + + - - org.jooq - jooq-codegen-maven - ${org.jooq.version} - - - generate-sources - - generate - - - - ${db.driver} - ${db.url} - ${db.username} - ${db.password} - - - - com.baeldung.jooq.introduction.db - src/main/java - - - - - - + + org.codehaus.mojo + sql-maven-plugin + ${sql-maven-plugin.version} + + + initialize + + execute + + + ${db.driver} + ${db.url} + ${db.username} + ${db.password} + + src/main/resources/intro_schema.sql + + + + + + + com.h2database + h2 + ${com.h2database.version} + + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - + + org.jooq + jooq-codegen-maven + ${org.jooq.version} + + + generate-sources + + generate + + + + ${db.driver} + ${db.url} + ${db.username} + ${db.password} + + + + com.baeldung.jooq.introduction.db + src/main/java + + + + + + - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*LiveTest.java - - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + - - - - - - org.eclipse.m2e - lifecycle-mapping - ${lifecycle-mapping.version} - - - - - - org.jooq - - jooq-codegen-maven - - - [3.7.3,) - - - generate - - - - - - - - - - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + ${lifecycle-mapping.version} + + + + + + org.jooq + + jooq-codegen-maven + + + [3.7.3,) + + + generate + + + + + + + + + + + + + @@ -245,21 +245,21 @@ - - - 3.8.6 - 1.4.193 - 4.3.4.RELEASE - 1.7.21 - 1.1.7 - 4.12 - - 3.6.0 + + + 3.8.6 + 1.4.193 + 4.3.4.RELEASE + 1.7.21 + 1.1.7 + 4.12 + + 3.6.0 2.19.1 1.0.0 1.5 - 1.0.0 - - + 1.0.0 + + \ No newline at end of file diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index 32f24231a9..25a1c13f6b 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -8,7 +8,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index ca9bad2bc0..3231faf197 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-mvc-email/pom.xml b/spring-mvc-email/pom.xml index 5d72bb4a1c..4a3ef5f83b 100644 --- a/spring-mvc-email/pom.xml +++ b/spring-mvc-email/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-mvc-web-vs-initializer/pom.xml b/spring-mvc-web-vs-initializer/pom.xml index c8bb08cb38..8fe8893903 100644 --- a/spring-mvc-web-vs-initializer/pom.xml +++ b/spring-mvc-web-vs-initializer/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index 84ebeff9ae..566d11132c 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -9,7 +9,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index 2fb4ab0e47..85b5734ecc 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-rest-angular/pom.xml b/spring-rest-angular/pom.xml index e838e2d5e6..099867d19b 100644 --- a/spring-rest-angular/pom.xml +++ b/spring-rest-angular/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-rest-docs/pom.xml b/spring-rest-docs/pom.xml index 2acb6b4071..f8945ff922 100644 --- a/spring-rest-docs/pom.xml +++ b/spring-rest-docs/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-jsp-authentication/pom.xml b/spring-security-client/spring-security-jsp-authentication/pom.xml index fc5f0cb86a..c021a46c82 100644 --- a/spring-security-client/spring-security-jsp-authentication/pom.xml +++ b/spring-security-client/spring-security-jsp-authentication/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-jsp-authorize/pom.xml b/spring-security-client/spring-security-jsp-authorize/pom.xml index 8cedbeb713..e3611aba93 100644 --- a/spring-security-client/spring-security-jsp-authorize/pom.xml +++ b/spring-security-client/spring-security-jsp-authorize/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-jsp-config/pom.xml b/spring-security-client/spring-security-jsp-config/pom.xml index 067e6dff60..94511a2785 100644 --- a/spring-security-client/spring-security-jsp-config/pom.xml +++ b/spring-security-client/spring-security-jsp-config/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-mvc/pom.xml b/spring-security-client/spring-security-mvc/pom.xml index b6a67d9c2c..f91a186897 100644 --- a/spring-security-client/spring-security-mvc/pom.xml +++ b/spring-security-client/spring-security-mvc/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-thymeleaf-authentication/pom.xml b/spring-security-client/spring-security-thymeleaf-authentication/pom.xml index 9f819d11c5..1a5e9e61d4 100644 --- a/spring-security-client/spring-security-thymeleaf-authentication/pom.xml +++ b/spring-security-client/spring-security-thymeleaf-authentication/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-thymeleaf-authorize/pom.xml b/spring-security-client/spring-security-thymeleaf-authorize/pom.xml index 5c13c34dea..964c57b71e 100644 --- a/spring-security-client/spring-security-thymeleaf-authorize/pom.xml +++ b/spring-security-client/spring-security-thymeleaf-authorize/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-client/spring-security-thymeleaf-config/pom.xml b/spring-security-client/spring-security-thymeleaf-config/pom.xml index cc43b2ffb1..42c6ee4f0f 100644 --- a/spring-security-client/spring-security-thymeleaf-config/pom.xml +++ b/spring-security-client/spring-security-thymeleaf-config/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-core/pom.xml b/spring-security-core/pom.xml index 519ee73296..a8ffce84b7 100644 --- a/spring-security-core/pom.xml +++ b/spring-security-core/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-custom-permission/pom.xml b/spring-security-custom-permission/pom.xml index a2925189e4..5e1648ebd7 100644 --- a/spring-security-custom-permission/pom.xml +++ b/spring-security-custom-permission/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-mvc-ldap/pom.xml b/spring-security-mvc-ldap/pom.xml index 242cc527ac..fc7941863e 100644 --- a/spring-security-mvc-ldap/pom.xml +++ b/spring-security-mvc-ldap/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-openid/pom.xml b/spring-security-openid/pom.xml index 6e5db533d7..ff0b030bd2 100644 --- a/spring-security-openid/pom.xml +++ b/spring-security-openid/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-rest-custom/pom.xml b/spring-security-rest-custom/pom.xml index 4c2fdb4709..d421f8d7b4 100644 --- a/spring-security-rest-custom/pom.xml +++ b/spring-security-rest-custom/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-rest-full/pom.xml b/spring-security-rest-full/pom.xml index e9580d357d..43d14af5ea 100644 --- a/spring-security-rest-full/pom.xml +++ b/spring-security-rest-full/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-x509/pom.xml b/spring-security-x509/pom.xml index 8596223cf4..b76bf4a23f 100644 --- a/spring-security-x509/pom.xml +++ b/spring-security-x509/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-session/pom.xml b/spring-session/pom.xml index c247d8a065..2c8b15a6eb 100644 --- a/spring-session/pom.xml +++ b/spring-session/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-social-login/pom.xml b/spring-social-login/pom.xml index 4369ec4e7c..1462611cfc 100644 --- a/spring-social-login/pom.xml +++ b/spring-social-login/pom.xml @@ -9,7 +9,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-zuul/pom.xml b/spring-zuul/pom.xml index 2107892667..50b20b8791 100644 --- a/spring-zuul/pom.xml +++ b/spring-zuul/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE From 88deec0162ebdd30698331052525bb9a5bcd23b6 Mon Sep 17 00:00:00 2001 From: lor6 Date: Fri, 10 Feb 2017 10:49:01 +0200 Subject: [PATCH 092/192] rename project (#1144) --- spring-security-mvc-boot/README.MD | 7 + .../WebContent/META-INF/MANIFEST.MF | 3 + spring-security-mvc-boot/pom.xml | 303 ++++++++++++++++++ .../main/java/org/baeldung/Application.java | 17 + .../baeldung/config/MethodSecurityConfig.java | 21 ++ .../java/org/baeldung/config/MvcConfig.java | 42 +++ .../baeldung/config/PersistenceConfig.java | 82 +++++ .../org/baeldung/config/SecurityConfig.java | 60 ++++ .../MultipleLoginApplication.java | 22 ++ .../multiplelogin/MultipleLoginMvcConfig.java | 45 +++ .../MultipleLoginSecurityConfig.java | 122 +++++++ .../multiplelogin/UsersController.java | 38 +++ .../org/baeldung/persistence/SetupData.java | 69 ++++ .../dao/OrganizationRepository.java | 10 + .../persistence/dao/PrivilegeRepository.java | 10 + .../persistence/dao/UserRepository.java | 14 + .../org/baeldung/persistence/model/Foo.java | 94 ++++++ .../persistence/model/Organization.java | 95 ++++++ .../baeldung/persistence/model/Privilege.java | 95 ++++++ .../org/baeldung/persistence/model/User.java | 155 +++++++++ ...CustomMethodSecurityExpressionHandler.java | 22 ++ .../CustomMethodSecurityExpressionRoot.java | 50 +++ .../security/CustomPermissionEvaluator.java | 40 +++ .../security/MySecurityExpressionRoot.java | 203 ++++++++++++ .../security/MyUserDetailsService.java | 31 ++ .../baeldung/security/MyUserPrincipal.java | 72 +++++ .../org/baeldung/voter/MinuteBasedVoter.java | 26 ++ .../org/baeldung/voter/VoterApplication.java | 17 + .../org/baeldung/voter/VoterMvcConfig.java | 18 ++ .../org/baeldung/voter/WebSecurityConfig.java | 48 +++ .../org/baeldung/voter/XmlSecurityConfig.java | 15 + .../java/org/baeldung/web/MainController.java | 58 ++++ .../src/main/resources/application.properties | 10 + .../resources/persistence-derby.properties | 12 + .../src/main/resources/spring-security.xml | 40 +++ .../src/main/resources/templates/403.html | 10 + .../main/resources/templates/adminPage.html | 13 + .../src/main/resources/templates/index.html | 21 ++ .../src/main/resources/templates/login.html | 27 ++ .../main/resources/templates/loginAdmin.html | 31 ++ .../main/resources/templates/loginUser.html | 30 ++ .../src/main/resources/templates/private.html | 10 + .../resources/templates/protectedLinks.html | 13 + .../main/resources/templates/userPage.html | 12 + ...stomUserDetailsServiceIntegrationTest.java | 76 +++++ .../test/java/org/baeldung/web/LiveTest.java | 67 ++++ 46 files changed, 2276 insertions(+) create mode 100644 spring-security-mvc-boot/README.MD create mode 100644 spring-security-mvc-boot/WebContent/META-INF/MANIFEST.MF create mode 100644 spring-security-mvc-boot/pom.xml create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/Application.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/config/MethodSecurityConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/config/MvcConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/config/PersistenceConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/UsersController.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/UserRepository.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Foo.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Organization.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Privilege.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/User.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserDetailsService.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserPrincipal.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/voter/MinuteBasedVoter.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterMvcConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/web/MainController.java create mode 100644 spring-security-mvc-boot/src/main/resources/application.properties create mode 100644 spring-security-mvc-boot/src/main/resources/persistence-derby.properties create mode 100644 spring-security-mvc-boot/src/main/resources/spring-security.xml create mode 100644 spring-security-mvc-boot/src/main/resources/templates/403.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/adminPage.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/index.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/login.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/loginAdmin.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/loginUser.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/private.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/protectedLinks.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/userPage.html create mode 100644 spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java create mode 100644 spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD new file mode 100644 index 0000000000..d59aea97b4 --- /dev/null +++ b/spring-security-mvc-boot/README.MD @@ -0,0 +1,7 @@ +###The Course +The "REST With Spring" Classes: http://github.learnspringsecurity.com + +###Relevant Articles: +- [A Custom Security Expression with Spring Security](http://www.baeldung.com/spring-security-create-new-custom-security-expression) +- [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) +- [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) diff --git a/spring-security-mvc-boot/WebContent/META-INF/MANIFEST.MF b/spring-security-mvc-boot/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/spring-security-mvc-boot/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml new file mode 100644 index 0000000000..b8563880b3 --- /dev/null +++ b/spring-security-mvc-boot/pom.xml @@ -0,0 +1,303 @@ + + + 4.0.0 + + com.baeldung + spring-security-mvc-boot + 0.0.1-SNAPSHOT + war + + spring-security-mvc-boot + Spring Security MVC Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity4 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + junit + junit + test + + + + org.hamcrest + hamcrest-core + test + + + + org.hamcrest + hamcrest-library + test + + + + com.jayway.restassured + rest-assured + ${rest-assured.version} + test + + + commons-logging + commons-logging + + + + + + org.springframework + spring-test + test + + + + org.apache.derby + derby + ${derby.version} + + + org.apache.derby + derbyclient + ${derby.version} + + + org.apache.derby + derbynet + ${derby.version} + + + org.apache.derby + derbytools + ${derby.version} + + + taglibs + standard + ${taglibs-standard.version} + + + org.springframework.security + spring-security-taglibs + ${spring-security-taglibs.version} + + + + org.springframework.security + spring-security-core + ${spring-security-core.version} + + + + javax.servlet.jsp.jstl + jstl-api + ${jstl.version} + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + tomcat8x + embedded + + + + + + + 8082 + + + + + + + + + + + + integration + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + + + + + + + + + + org.baeldung.Application + + + + + UTF-8 + 1.8 + 10.13.1.1 + 1.1.2 + 4.2.0.RELEASE + 4.2.0.RELEASE + + 1.2 + 2.4.0 + 1.6.1 + + + diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java new file mode 100644 index 0000000000..072a6ca4fe --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java @@ -0,0 +1,17 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@EnableAutoConfiguration +@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*")}) +public class Application extends SpringBootServletInitializer { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/config/MethodSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/config/MethodSecurityConfig.java new file mode 100644 index 0000000000..c4624e85e0 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/config/MethodSecurityConfig.java @@ -0,0 +1,21 @@ +package org.baeldung.config; + +import org.baeldung.security.CustomMethodSecurityExpressionHandler; +import org.baeldung.security.CustomPermissionEvaluator; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + // final DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + final CustomMethodSecurityExpressionHandler expressionHandler = new CustomMethodSecurityExpressionHandler(); + expressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator()); + return expressionHandler; + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/config/MvcConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/config/MvcConfig.java new file mode 100644 index 0000000000..9ade60e54c --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/config/MvcConfig.java @@ -0,0 +1,42 @@ +package org.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@EnableWebMvc +public class MvcConfig extends WebMvcConfigurerAdapter { + + public MvcConfig() { + super(); + } + + // + @Bean + public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } + + @Override + public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + super.addViewControllers(registry); + registry.addViewController("/").setViewName("forward:/index"); + registry.addViewController("/index"); + } + + @Override + public void addResourceHandlers(final ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/config/PersistenceConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/config/PersistenceConfig.java new file mode 100644 index 0000000000..1c4cb0124a --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/config/PersistenceConfig.java @@ -0,0 +1,82 @@ +package org.baeldung.config; + +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@PropertySource({ "classpath:persistence-derby.properties" }) +@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao") +public class PersistenceConfig { + + @Autowired + private Environment env; + + public PersistenceConfig() { + super(); + } + + // beans + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" }); + + final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + + return em; + } + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); + dataSource.setUrl(env.getProperty("jdbc.url")); + dataSource.setUsername(env.getProperty("jdbc.user")); + dataSource.setPassword(env.getProperty("jdbc.pass")); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); + hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache")); + // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); + return hibernateProperties; + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java new file mode 100644 index 0000000000..8cc9d45823 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java @@ -0,0 +1,60 @@ +package org.baeldung.config; + +import org.baeldung.security.MyUserDetailsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +@EnableWebSecurity +@ComponentScan("org.baeldung.security") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private MyUserDetailsService userDetailsService; + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService); + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring().antMatchers("/resources/**"); + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + // @formatter:off + http.authorizeRequests() + .antMatchers("/login").permitAll() + .antMatchers("/admin").hasRole("ADMIN") + .anyRequest().authenticated() + .and().formLogin().permitAll() + .and().csrf().disable(); + ; + // @formatter:on + } + + @Bean + public DaoAuthenticationProvider authenticationProvider() { + final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + authProvider.setUserDetailsService(userDetailsService); + authProvider.setPasswordEncoder(encoder()); + return authProvider; + } + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(11); + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java new file mode 100644 index 0000000000..23fda0547f --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java @@ -0,0 +1,22 @@ +package org.baeldung.multiplelogin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; + +@SpringBootApplication +@ComponentScan("org.baeldung.multiplelogin") +public class MultipleLoginApplication extends SpringBootServletInitializer { + public static void main(String[] args) { + SpringApplication.run(MultipleLoginApplication.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(MultipleLoginApplication.class); + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java new file mode 100644 index 0000000000..ec76be1909 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java @@ -0,0 +1,45 @@ +package org.baeldung.multiplelogin; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.context.annotation.ComponentScan; + +@EnableWebMvc +@Configuration +@ComponentScan("org.baeldung.controller") +public class MultipleLoginMvcConfig extends WebMvcConfigurerAdapter { + + public MultipleLoginMvcConfig() { + super(); + } + + // API + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + super.addViewControllers(registry); + + registry.addViewController("/anonymous.html"); + + registry.addViewController("/login.html"); + registry.addViewController("/homepage.html"); + registry.addViewController("/console.html"); + } + + @Bean + public ViewResolver viewResolver() { + final InternalResourceViewResolver bean = new InternalResourceViewResolver(); + + bean.setViewClass(JstlView.class); + bean.setPrefix("/WEB-INF/view/"); + bean.setSuffix(".jsp"); + + return bean; + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java new file mode 100644 index 0000000000..d7dbf17723 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java @@ -0,0 +1,122 @@ +package org.baeldung.multiplelogin; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.TestingAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; + +@Configuration +@EnableWebSecurity +public class MultipleLoginSecurityConfig { + + @Bean + public UserDetailsService userDetailsService() throws Exception { + InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); + manager.createUser(User.withUsername("user") + .password("userPass") + .roles("USER") + .build()); + manager.createUser(User.withUsername("admin") + .password("adminPass") + .roles("ADMIN") + .build()); + return manager; + } + + @Configuration + @Order(1) + public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App1ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin") + .password("admin") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/admin*") + .authorizeRequests() + .anyRequest() + .hasRole("ADMIN") + // log in + .and() + .formLogin() + .loginPage("/loginAdmin") + .loginProcessingUrl("/admin_login") + .failureUrl("/loginAdmin?error=loginError") + .defaultSuccessUrl("/adminPage") + // logout + .and() + .logout() + .logoutUrl("/admin_logout") + .logoutSuccessUrl("/protectedLinks") + .deleteCookies("JSESSIONID") + .and() + .exceptionHandling() + .accessDeniedPage("/403") + .and() + .csrf() + .disable(); + } + } + + @Configuration + @Order(2) + public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App2ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password("user") + .roles("USER"); + } + + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/user*") + .authorizeRequests() + .anyRequest() + .hasRole("USER") + // log in + .and() + .formLogin() + .loginPage("/loginUser") + .loginProcessingUrl("/user_login") + .failureUrl("/loginUser?error=loginError") + .defaultSuccessUrl("/userPage") + // logout + .and() + .logout() + .logoutUrl("/user_logout") + .logoutSuccessUrl("/protectedLinks") + .deleteCookies("JSESSIONID") + .and() + .exceptionHandling() + .accessDeniedPage("/403") + .and() + .csrf() + .disable(); + } + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/UsersController.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/UsersController.java new file mode 100644 index 0000000000..0672a760af --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/UsersController.java @@ -0,0 +1,38 @@ +package org.baeldung.multiplelogin; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UsersController { + + @RequestMapping("/protectedLinks") + public String getAnonymousPage() { + return "protectedLinks"; + } + + @RequestMapping("/userPage") + public String getUserPage() { + return "userPage"; + } + + @RequestMapping("/adminPage") + public String getAdminPage() { + return "adminPage"; + } + + @RequestMapping("/loginAdmin") + public String getAdminLoginPage() { + return "loginAdmin"; + } + + @RequestMapping("/loginUser") + public String getUserLoginPage() { + return "loginUser"; + } + + @RequestMapping("/403") + public String getAccessDeniedPage() { + return "403"; + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java new file mode 100644 index 0000000000..631c8dfc58 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java @@ -0,0 +1,69 @@ +package org.baeldung.persistence; + +import java.util.Arrays; +import java.util.HashSet; + +import javax.annotation.PostConstruct; + +import org.baeldung.persistence.dao.OrganizationRepository; +import org.baeldung.persistence.dao.PrivilegeRepository; +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.model.Organization; +import org.baeldung.persistence.model.Privilege; +import org.baeldung.persistence.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SetupData { + @Autowired + private UserRepository userRepository; + + @Autowired + private PrivilegeRepository privilegeRepository; + + @Autowired + private OrganizationRepository organizationRepository; + + @PostConstruct + public void init() { + initOrganizations(); + initPrivileges(); + initUsers(); + } + + private void initUsers() { + final Privilege privilege1 = privilegeRepository.findByName("FOO_READ_PRIVILEGE"); + final Privilege privilege2 = privilegeRepository.findByName("FOO_WRITE_PRIVILEGE"); + // + final User user1 = new User(); + user1.setUsername("john"); + user1.setPassword("123"); + user1.setPrivileges(new HashSet(Arrays.asList(privilege1))); + user1.setOrganization(organizationRepository.findByName("FirstOrg")); + userRepository.save(user1); + // + final User user2 = new User(); + user2.setUsername("tom"); + user2.setPassword("111"); + user2.setPrivileges(new HashSet(Arrays.asList(privilege1, privilege2))); + user2.setOrganization(organizationRepository.findByName("SecondOrg")); + userRepository.save(user2); + } + + private void initOrganizations() { + final Organization org1 = new Organization("FirstOrg"); + organizationRepository.save(org1); + // + final Organization org2 = new Organization("SecondOrg"); + organizationRepository.save(org2); + } + + private void initPrivileges() { + final Privilege privilege1 = new Privilege("FOO_READ_PRIVILEGE"); + privilegeRepository.save(privilege1); + // + final Privilege privilege2 = new Privilege("FOO_WRITE_PRIVILEGE"); + privilegeRepository.save(privilege2); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java new file mode 100644 index 0000000000..a20d24057b --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.Organization; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrganizationRepository extends JpaRepository { + + public Organization findByName(String name); + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java new file mode 100644 index 0000000000..edf9002c3d --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.Privilege; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PrivilegeRepository extends JpaRepository { + + public Privilege findByName(String name); + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/UserRepository.java new file mode 100644 index 0000000000..337106a187 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/dao/UserRepository.java @@ -0,0 +1,14 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.transaction.annotation.Transactional; + +public interface UserRepository extends JpaRepository { + + User findByUsername(final String username); + + @Transactional + void removeUserByUsername(String username); + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Foo.java new file mode 100644 index 0000000000..29c19cf22e --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Foo.java @@ -0,0 +1,94 @@ +package org.baeldung.persistence.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Foo { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false) + private String name; + + // + + public Foo() { + super(); + } + + public Foo(String name) { + super(); + this.name = name; + } + + // + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + // + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [id=").append(id).append(", name=").append(name).append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + ((id == null) ? 0 : id.hashCode()); + result = (prime * result) + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Foo other = (Foo) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Organization.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Organization.java new file mode 100644 index 0000000000..645285b5e9 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Organization.java @@ -0,0 +1,95 @@ +package org.baeldung.persistence.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Organization { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false, unique = true) + private String name; + + // + + public Organization() { + super(); + } + + public Organization(String name) { + super(); + this.name = name; + } + + // + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + // + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Organization [id=").append(id).append(", name=").append(name).append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + ((id == null) ? 0 : id.hashCode()); + result = (prime * result) + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Organization other = (Organization) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Privilege.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Privilege.java new file mode 100644 index 0000000000..ff3ae62c25 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/Privilege.java @@ -0,0 +1,95 @@ +package org.baeldung.persistence.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Privilege { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false, unique = true) + private String name; + + // + + public Privilege() { + super(); + } + + public Privilege(String name) { + super(); + this.name = name; + } + + // + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + // + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Privilege [id=").append(id).append(", name=").append(name).append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + ((id == null) ? 0 : id.hashCode()); + result = (prime * result) + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Privilege other = (Privilege) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/User.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/User.java new file mode 100644 index 0000000000..2ff8beebf0 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/model/User.java @@ -0,0 +1,155 @@ +package org.baeldung.persistence.model; + +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "user_table") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false, unique = true) + private String username; + + private String password; + + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = "users_privileges", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id")) + private Set privileges; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "organization_id", referencedColumnName = "id") + private Organization organization; + + // + + public User() { + super(); + } + + // + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Set getPrivileges() { + return privileges; + } + + public void setPrivileges(Set privileges) { + this.privileges = privileges; + } + + public Organization getOrganization() { + return organization; + } + + public void setOrganization(Organization organization) { + this.organization = organization; + } + + // + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("User [id=").append(id).append(", username=").append(username).append(", password=").append(password).append(", privileges=").append(privileges).append(", organization=").append(organization).append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + ((id == null) ? 0 : id.hashCode()); + result = (prime * result) + ((organization == null) ? 0 : organization.hashCode()); + result = (prime * result) + ((password == null) ? 0 : password.hashCode()); + result = (prime * result) + ((privileges == null) ? 0 : privileges.hashCode()); + result = (prime * result) + ((username == null) ? 0 : username.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final User other = (User) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + if (organization == null) { + if (other.organization != null) { + return false; + } + } else if (!organization.equals(other.organization)) { + return false; + } + if (password == null) { + if (other.password != null) { + return false; + } + } else if (!password.equals(other.password)) { + return false; + } + if (privileges == null) { + if (other.privileges != null) { + return false; + } + } else if (!privileges.equals(other.privileges)) { + return false; + } + if (username == null) { + if (other.username != null) { + return false; + } + } else if (!username.equals(other.username)) { + return false; + } + return true; + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java b/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java new file mode 100644 index 0000000000..e040a0b109 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java @@ -0,0 +1,22 @@ +package org.baeldung.security; + +import org.aopalliance.intercept.MethodInvocation; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; +import org.springframework.security.authentication.AuthenticationTrustResolver; +import org.springframework.security.authentication.AuthenticationTrustResolverImpl; +import org.springframework.security.core.Authentication; + +public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler { + private final AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl(); + + @Override + protected MethodSecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, MethodInvocation invocation) { + // final CustomMethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication); + final MySecurityExpressionRoot root = new MySecurityExpressionRoot(authentication); + root.setPermissionEvaluator(getPermissionEvaluator()); + root.setTrustResolver(this.trustResolver); + root.setRoleHierarchy(getRoleHierarchy()); + return root; + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java b/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java new file mode 100644 index 0000000000..2d84536a14 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java @@ -0,0 +1,50 @@ +package org.baeldung.security; + +import org.baeldung.persistence.model.User; +import org.springframework.security.access.expression.SecurityExpressionRoot; +import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; +import org.springframework.security.core.Authentication; + +public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations { + + private Object filterObject; + private Object returnObject; + + public CustomMethodSecurityExpressionRoot(Authentication authentication) { + super(authentication); + } + + // + public boolean isMember(Long OrganizationId) { + final User user = ((MyUserPrincipal) this.getPrincipal()).getUser(); + return user.getOrganization().getId().longValue() == OrganizationId.longValue(); + } + + // + + @Override + public Object getFilterObject() { + return this.filterObject; + } + + @Override + public Object getReturnObject() { + return this.returnObject; + } + + @Override + public Object getThis() { + return this; + } + + @Override + public void setFilterObject(Object obj) { + this.filterObject = obj; + } + + @Override + public void setReturnObject(Object obj) { + this.returnObject = obj; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java b/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java new file mode 100644 index 0000000000..5d96673a8f --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java @@ -0,0 +1,40 @@ +package org.baeldung.security; + +import java.io.Serializable; + +import org.springframework.security.access.PermissionEvaluator; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +public class CustomPermissionEvaluator implements PermissionEvaluator { + + @Override + public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) { + if ((auth == null) || (targetDomainObject == null) || !(permission instanceof String)) { + return false; + } + final String targetType = targetDomainObject.getClass().getSimpleName().toUpperCase(); + return hasPrivilege(auth, targetType, permission.toString().toUpperCase()); + } + + @Override + public boolean hasPermission(Authentication auth, Serializable targetId, String targetType, Object permission) { + if ((auth == null) || (targetType == null) || !(permission instanceof String)) { + return false; + } + return hasPrivilege(auth, targetType.toUpperCase(), permission.toString().toUpperCase()); + } + + private boolean hasPrivilege(Authentication auth, String targetType, String permission) { + for (final GrantedAuthority grantedAuth : auth.getAuthorities()) { + System.out.println("here " + grantedAuth); + if (grantedAuth.getAuthority().startsWith(targetType)) { + if (grantedAuth.getAuthority().contains(permission)) { + return true; + } + } + } + return false; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java b/spring-security-mvc-boot/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java new file mode 100644 index 0000000000..4d3561b325 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java @@ -0,0 +1,203 @@ +package org.baeldung.security; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.baeldung.persistence.model.User; +import org.springframework.security.access.PermissionEvaluator; +import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; +import org.springframework.security.access.hierarchicalroles.RoleHierarchy; +import org.springframework.security.authentication.AuthenticationTrustResolver; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; + +public class MySecurityExpressionRoot implements MethodSecurityExpressionOperations { + protected final Authentication authentication; + private AuthenticationTrustResolver trustResolver; + private RoleHierarchy roleHierarchy; + private Set roles; + private String defaultRolePrefix = "ROLE_"; + + public final boolean permitAll = true; + public final boolean denyAll = false; + private PermissionEvaluator permissionEvaluator; + public final String read = "read"; + public final String write = "write"; + public final String create = "create"; + public final String delete = "delete"; + public final String admin = "administration"; + + // + + private Object filterObject; + private Object returnObject; + + public MySecurityExpressionRoot(Authentication authentication) { + if (authentication == null) { + throw new IllegalArgumentException("Authentication object cannot be null"); + } + this.authentication = authentication; + } + + @Override + public final boolean hasAuthority(String authority) { + throw new RuntimeException("method hasAuthority() not allowed"); + } + + // + public boolean isMember(Long OrganizationId) { + final User user = ((MyUserPrincipal) this.getPrincipal()).getUser(); + return user.getOrganization().getId().longValue() == OrganizationId.longValue(); + } + + // + + @Override + public final boolean hasAnyAuthority(String... authorities) { + return hasAnyAuthorityName(null, authorities); + } + + @Override + public final boolean hasRole(String role) { + return hasAnyRole(role); + } + + @Override + public final boolean hasAnyRole(String... roles) { + return hasAnyAuthorityName(defaultRolePrefix, roles); + } + + private boolean hasAnyAuthorityName(String prefix, String... roles) { + final Set roleSet = getAuthoritySet(); + + for (final String role : roles) { + final String defaultedRole = getRoleWithDefaultPrefix(prefix, role); + if (roleSet.contains(defaultedRole)) { + return true; + } + } + + return false; + } + + @Override + public final Authentication getAuthentication() { + return authentication; + } + + @Override + public final boolean permitAll() { + return true; + } + + @Override + public final boolean denyAll() { + return false; + } + + @Override + public final boolean isAnonymous() { + return trustResolver.isAnonymous(authentication); + } + + @Override + public final boolean isAuthenticated() { + return !isAnonymous(); + } + + @Override + public final boolean isRememberMe() { + return trustResolver.isRememberMe(authentication); + } + + @Override + public final boolean isFullyAuthenticated() { + return !trustResolver.isAnonymous(authentication) && !trustResolver.isRememberMe(authentication); + } + + public Object getPrincipal() { + return authentication.getPrincipal(); + } + + public void setTrustResolver(AuthenticationTrustResolver trustResolver) { + this.trustResolver = trustResolver; + } + + public void setRoleHierarchy(RoleHierarchy roleHierarchy) { + this.roleHierarchy = roleHierarchy; + } + + public void setDefaultRolePrefix(String defaultRolePrefix) { + this.defaultRolePrefix = defaultRolePrefix; + } + + private Set getAuthoritySet() { + if (roles == null) { + roles = new HashSet(); + Collection userAuthorities = authentication.getAuthorities(); + + if (roleHierarchy != null) { + userAuthorities = roleHierarchy.getReachableGrantedAuthorities(userAuthorities); + } + + roles = AuthorityUtils.authorityListToSet(userAuthorities); + } + + return roles; + } + + @Override + public boolean hasPermission(Object target, Object permission) { + return permissionEvaluator.hasPermission(authentication, target, permission); + } + + @Override + public boolean hasPermission(Object targetId, String targetType, Object permission) { + return permissionEvaluator.hasPermission(authentication, (Serializable) targetId, targetType, permission); + } + + public void setPermissionEvaluator(PermissionEvaluator permissionEvaluator) { + this.permissionEvaluator = permissionEvaluator; + } + + private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) { + if (role == null) { + return role; + } + if ((defaultRolePrefix == null) || (defaultRolePrefix.length() == 0)) { + return role; + } + if (role.startsWith(defaultRolePrefix)) { + return role; + } + return defaultRolePrefix + role; + } + + @Override + public Object getFilterObject() { + return this.filterObject; + } + + @Override + public Object getReturnObject() { + return this.returnObject; + } + + @Override + public Object getThis() { + return this; + } + + @Override + public void setFilterObject(Object obj) { + this.filterObject = obj; + } + + @Override + public void setReturnObject(Object obj) { + this.returnObject = obj; + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserDetailsService.java b/spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserDetailsService.java new file mode 100644 index 0000000000..685219728f --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserDetailsService.java @@ -0,0 +1,31 @@ +package org.baeldung.security; + +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class MyUserDetailsService implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + public MyUserDetailsService() { + super(); + } + + // API + + @Override + public UserDetails loadUserByUsername(final String username) { + final User user = userRepository.findByUsername(username); + if (user == null) { + throw new UsernameNotFoundException(username); + } + return new MyUserPrincipal(user); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserPrincipal.java b/spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserPrincipal.java new file mode 100644 index 0000000000..437bb02cdb --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/security/MyUserPrincipal.java @@ -0,0 +1,72 @@ +package org.baeldung.security; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.baeldung.persistence.model.Privilege; +import org.baeldung.persistence.model.User; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +public class MyUserPrincipal implements UserDetails { + + private static final long serialVersionUID = 1L; + + private final User user; + + // + + public MyUserPrincipal(User user) { + this.user = user; + } + + // + + @Override + public String getUsername() { + return user.getUsername(); + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public Collection getAuthorities() { + final List authorities = new ArrayList(); + for (final Privilege privilege : user.getPrivileges()) { + authorities.add(new SimpleGrantedAuthority(privilege.getName())); + } + return authorities; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + // + + public User getUser() { + return user; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/MinuteBasedVoter.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/MinuteBasedVoter.java new file mode 100644 index 0000000000..2beda1e557 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/MinuteBasedVoter.java @@ -0,0 +1,26 @@ +package org.baeldung.voter; + +import java.time.LocalDateTime; +import java.util.Collection; + +import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +public class MinuteBasedVoter implements AccessDecisionVoter { + @Override + public boolean supports(ConfigAttribute attribute) { + return true; + } + + @Override + public boolean supports(Class clazz) { + return true; + } + + @Override + public int vote(Authentication authentication, Object object, Collection collection) { + return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).filter(r -> "ROLE_USER".equals(r) && LocalDateTime.now().getMinute() % 2 != 0).findAny().map(s -> ACCESS_DENIED).orElseGet(() -> ACCESS_ABSTAIN); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java new file mode 100644 index 0000000000..c032a9634e --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java @@ -0,0 +1,17 @@ +package org.baeldung.voter; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@EnableAutoConfiguration +@ComponentScan(basePackages = { "org.baeldung.voter" }) +public class VoterApplication { + + public static void main(String[] args) { + SpringApplication.run(VoterApplication.class, args); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterMvcConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterMvcConfig.java new file mode 100644 index 0000000000..e282c794d0 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterMvcConfig.java @@ -0,0 +1,18 @@ +package org.baeldung.voter; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + * Created by ambrusadrianz on 30/09/2016. + */ + +@Configuration +public class VoterMvcConfig extends WebMvcConfigurerAdapter { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("private"); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java new file mode 100644 index 0000000000..495567c7b2 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java @@ -0,0 +1,48 @@ +package org.baeldung.voter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDecisionManager; +import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.vote.AuthenticatedVoter; +import org.springframework.security.access.vote.RoleVoter; +import org.springframework.security.access.vote.UnanimousBased; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.access.expression.WebExpressionVoter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import java.util.Arrays; +import java.util.List; + +//@Configuration +//@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + // @formatter: off + auth.inMemoryAuthentication().withUser("user").password("pass").roles("USER").and().withUser("admin").password("pass").roles("ADMIN"); + // @formatter: on + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + // @formatter: off + http + // needed so our login could work + .csrf().disable().authorizeRequests().anyRequest().authenticated().accessDecisionManager(accessDecisionManager()).antMatchers("/").hasAnyRole("ROLE_ADMIN", "ROLE_USER").and().formLogin().permitAll().and().logout().permitAll() + .deleteCookies("JSESSIONID").logoutSuccessUrl("/login"); + // @formatter: on + } + + @Bean + public AccessDecisionManager accessDecisionManager() { + // @formatter: off + List> decisionVoters = Arrays.asList(new WebExpressionVoter(), new RoleVoter(), new AuthenticatedVoter(), new MinuteBasedVoter()); + // @formatter: on + return new UnanimousBased(decisionVoters); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java new file mode 100644 index 0000000000..124513d317 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java @@ -0,0 +1,15 @@ +package org.baeldung.voter; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; + +/** + * Created by ambrusadrianz on 09/10/2016. + */ +@Configuration +@ImportResource({ "classpath:spring-security.xml" }) +public class XmlSecurityConfig { + public XmlSecurityConfig() { + super(); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/web/MainController.java b/spring-security-mvc-boot/src/main/java/org/baeldung/web/MainController.java new file mode 100644 index 0000000000..4752f7bdd9 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/web/MainController.java @@ -0,0 +1,58 @@ +package org.baeldung.web; + +import org.baeldung.persistence.dao.OrganizationRepository; +import org.baeldung.persistence.model.Foo; +import org.baeldung.persistence.model.Organization; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +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; + +@Controller +public class MainController { + + @Autowired + private OrganizationRepository organizationRepository; + + // @PostAuthorize("hasPermission(returnObject, 'read')") + @PreAuthorize("hasPermission(#id, 'Foo', 'read')") + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") + @ResponseBody + public Foo findById(@PathVariable final long id) { + return new Foo("Sample"); + } + + @PreAuthorize("hasPermission(#foo, 'write')") + @RequestMapping(method = RequestMethod.POST, value = "/foos") + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public Foo create(@RequestBody final Foo foo) { + return foo; + } + + // + + @PreAuthorize("hasAuthority('FOO_READ_PRIVILEGE')") + @RequestMapping(method = RequestMethod.GET, value = "/foos") + @ResponseBody + public Foo findFooByName(@RequestParam final String name) { + return new Foo(name); + } + + // + + @PreAuthorize("isMember(#id)") + @RequestMapping(method = RequestMethod.GET, value = "/organizations/{id}") + @ResponseBody + public Organization findOrgById(@PathVariable final long id) { + return organizationRepository.findOne(id); + } + +} diff --git a/spring-security-mvc-boot/src/main/resources/application.properties b/spring-security-mvc-boot/src/main/resources/application.properties new file mode 100644 index 0000000000..d29b5f6bf1 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/application.properties @@ -0,0 +1,10 @@ +server.port=8082 +server.context-path=/spring-security-mvc-boot +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:security_permission;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.database=H2 +spring.jpa.show-sql=false +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/persistence-derby.properties b/spring-security-mvc-boot/src/main/resources/persistence-derby.properties new file mode 100644 index 0000000000..e808fdc288 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/persistence-derby.properties @@ -0,0 +1,12 @@ +# jdbc.X +jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver +jdbc.url=jdbc:derby:memory:spring_custom_user_service;create=true +jdbc.user=tutorialuser +jdbc.pass=tutorialpass + +# hibernate.X +hibernate.dialect=org.hibernate.dialect.DerbyDialect +hibernate.show_sql=false +hibernate.hbm2ddl.auto=create +hibernate.cache.use_second_level_cache=false +hibernate.cache.use_query_cache=false \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/spring-security.xml b/spring-security-mvc-boot/src/main/resources/spring-security.xml new file mode 100644 index 0000000000..83bc14dda7 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/spring-security.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/403.html b/spring-security-mvc-boot/src/main/resources/templates/403.html new file mode 100644 index 0000000000..20550768cf --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/403.html @@ -0,0 +1,10 @@ + + + + + + + +You do not have permission to view this page. + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/adminPage.html b/spring-security-mvc-boot/src/main/resources/templates/adminPage.html new file mode 100644 index 0000000000..13aff9b15a --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/adminPage.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + +Welcome admin! Logout + +

+Back to links + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/index.html b/spring-security-mvc-boot/src/main/resources/templates/index.html new file mode 100644 index 0000000000..8e7394ad6a --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/index.html @@ -0,0 +1,21 @@ + + + + +Spring Security Thymeleaf + + + + + +
+ Welcome +
+ + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/login.html b/spring-security-mvc-boot/src/main/resources/templates/login.html new file mode 100644 index 0000000000..dd6bd04767 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/login.html @@ -0,0 +1,27 @@ + + + + +

Login

+ +
+ + + + + + + + + + + + + + +
User:
Password:
+ +
+ + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/loginAdmin.html b/spring-security-mvc-boot/src/main/resources/templates/loginAdmin.html new file mode 100644 index 0000000000..43d0e73233 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/loginAdmin.html @@ -0,0 +1,31 @@ + + + + +Insert title here + + + +

Admin login page

+
+ + + + + + + + + + + + + +
User:
Password:
+ +
+ +

Login failed!

+ + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/loginUser.html b/spring-security-mvc-boot/src/main/resources/templates/loginUser.html new file mode 100644 index 0000000000..bf4ddd48bc --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/loginUser.html @@ -0,0 +1,30 @@ + + + + +Login + + + +

User login page

+ +
+ + + + + + + + + + + + +
User:
Password:
+ +
+

Login failed!

+ + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/private.html b/spring-security-mvc-boot/src/main/resources/templates/private.html new file mode 100644 index 0000000000..5af8c7a13e --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/private.html @@ -0,0 +1,10 @@ + + + + Private + + +

Congrats!

+ + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/protectedLinks.html b/spring-security-mvc-boot/src/main/resources/templates/protectedLinks.html new file mode 100644 index 0000000000..1877464fe5 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/protectedLinks.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + + +User page +
+Admin page + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/userPage.html b/spring-security-mvc-boot/src/main/resources/templates/userPage.html new file mode 100644 index 0000000000..894a225871 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/userPage.html @@ -0,0 +1,12 @@ + + + + +Insert title here + + +Welcome user! Logout +

+Back to links + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java new file mode 100644 index 0000000000..616e80e6e9 --- /dev/null +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java @@ -0,0 +1,76 @@ +package org.baeldung.web; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.config.MvcConfig; +import org.baeldung.config.PersistenceConfig; +import org.baeldung.config.SecurityConfig; +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.model.User; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = { MvcConfig.class, SecurityConfig.class, PersistenceConfig.class }) +@WebAppConfiguration +public class CustomUserDetailsServiceIntegrationTest { + + public static final String USERNAME = "user"; + public static final String PASSWORD = "pass"; + public static final String USERNAME2 = "user2"; + + @Autowired + UserRepository myUserRepository; + + @Autowired + AuthenticationProvider authenticationProvider; + + @Autowired + PasswordEncoder passwordEncoder; + + // + + @Test + public void givenExistingUser_whenAuthenticate_thenRetrieveFromDb() { + User user = new User(); + user.setUsername(USERNAME); + user.setPassword(passwordEncoder.encode(PASSWORD)); + + myUserRepository.save(user); + + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME, PASSWORD); + Authentication authentication = authenticationProvider.authenticate(auth); + + assertEquals(authentication.getName(), USERNAME); + } + + @Test(expected = BadCredentialsException.class) + public void givenIncorrectUser_whenAuthenticate_thenBadCredentialsException() { + User user = new User(); + user.setUsername(USERNAME); + user.setPassword(passwordEncoder.encode(PASSWORD)); + + myUserRepository.save(user); + + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME2, PASSWORD); + authenticationProvider.authenticate(auth); + } + + // + + @After + public void tearDown() { + myUserRepository.removeUserByUsername(USERNAME); + } + +} diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java new file mode 100644 index 0000000000..47626b814a --- /dev/null +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java @@ -0,0 +1,67 @@ +package org.baeldung.web; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.baeldung.persistence.model.Foo; +import org.junit.Test; +import org.springframework.http.MediaType; + +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.authentication.FormAuthConfig; +import com.jayway.restassured.response.Response; +import com.jayway.restassured.specification.RequestSpecification; + +public class LiveTest { + + private final FormAuthConfig formAuthConfig = new FormAuthConfig("http://localhost:8082/spring-security-custom-permission/login", "username", "password"); + + @Test + public void givenUserWithReadPrivilegeAndHasPermission_whenGetFooById_thenOK() { + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/foos/1"); + assertEquals(200, response.getStatusCode()); + assertTrue(response.asString().contains("id")); + } + + @Test + public void givenUserWithNoWritePrivilegeAndHasPermission_whenPostFoo_thenForbidden() { + final Response response = givenAuth("john", "123").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-custom-permission/foos"); + assertEquals(403, response.getStatusCode()); + } + + @Test + public void givenUserWithWritePrivilegeAndHasPermission_whenPostFoo_thenOk() { + final Response response = givenAuth("tom", "111").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-custom-permission/foos"); + assertEquals(201, response.getStatusCode()); + assertTrue(response.asString().contains("id")); + } + + // + + @Test + public void givenUserMemberInOrganization_whenGetOrganization_thenOK() { + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/organizations/1"); + assertEquals(200, response.getStatusCode()); + assertTrue(response.asString().contains("id")); + } + + @Test + public void givenUserMemberNotInOrganization_whenGetOrganization_thenForbidden() { + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/organizations/2"); + assertEquals(403, response.getStatusCode()); + } + + // + + @Test + public void givenDisabledSecurityExpression_whenGetFooByName_thenError() { + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/foos?name=sample"); + assertEquals(500, response.getStatusCode()); + assertTrue(response.asString().contains("method hasAuthority() not allowed")); + } + + // + private RequestSpecification givenAuth(String username, String password) { + return RestAssured.given().auth().form(username, password, formAuthConfig); + } +} \ No newline at end of file From 7a54fce404f6e3a0fbe51667a31deba65f895d22 Mon Sep 17 00:00:00 2001 From: lor6 Date: Fri, 10 Feb 2017 11:32:43 +0200 Subject: [PATCH 093/192] Rename project (#1149) * rename project * remove old project --- spring-security-custom-permission/README.MD | 7 - .../WebContent/META-INF/MANIFEST.MF | 3 - spring-security-custom-permission/pom.xml | 303 ------------------ .../main/java/org/baeldung/Application.java | 17 - .../baeldung/config/MethodSecurityConfig.java | 21 -- .../java/org/baeldung/config/MvcConfig.java | 42 --- .../baeldung/config/PersistenceConfig.java | 82 ----- .../org/baeldung/config/SecurityConfig.java | 60 ---- .../MultipleLoginApplication.java | 22 -- .../multiplelogin/MultipleLoginMvcConfig.java | 45 --- .../MultipleLoginSecurityConfig.java | 122 ------- .../multiplelogin/UsersController.java | 38 --- .../org/baeldung/persistence/SetupData.java | 69 ---- .../dao/OrganizationRepository.java | 10 - .../persistence/dao/PrivilegeRepository.java | 10 - .../persistence/dao/UserRepository.java | 14 - .../org/baeldung/persistence/model/Foo.java | 94 ------ .../persistence/model/Organization.java | 95 ------ .../baeldung/persistence/model/Privilege.java | 95 ------ .../org/baeldung/persistence/model/User.java | 155 --------- ...CustomMethodSecurityExpressionHandler.java | 22 -- .../CustomMethodSecurityExpressionRoot.java | 50 --- .../security/CustomPermissionEvaluator.java | 40 --- .../security/MySecurityExpressionRoot.java | 203 ------------ .../security/MyUserDetailsService.java | 31 -- .../baeldung/security/MyUserPrincipal.java | 72 ----- .../org/baeldung/voter/MinuteBasedVoter.java | 26 -- .../org/baeldung/voter/VoterApplication.java | 17 - .../org/baeldung/voter/VoterMvcConfig.java | 18 -- .../org/baeldung/voter/WebSecurityConfig.java | 48 --- .../org/baeldung/voter/XmlSecurityConfig.java | 15 - .../java/org/baeldung/web/MainController.java | 58 ---- .../src/main/resources/application.properties | 10 - .../resources/persistence-derby.properties | 12 - .../src/main/resources/spring-security.xml | 40 --- .../src/main/resources/templates/403.html | 10 - .../main/resources/templates/adminPage.html | 13 - .../src/main/resources/templates/index.html | 21 -- .../src/main/resources/templates/login.html | 27 -- .../main/resources/templates/loginAdmin.html | 31 -- .../main/resources/templates/loginUser.html | 30 -- .../src/main/resources/templates/private.html | 10 - .../resources/templates/protectedLinks.html | 13 - .../main/resources/templates/userPage.html | 12 - ...stomUserDetailsServiceIntegrationTest.java | 76 ----- .../test/java/org/baeldung/web/LiveTest.java | 67 ---- 46 files changed, 2276 deletions(-) delete mode 100644 spring-security-custom-permission/README.MD delete mode 100644 spring-security-custom-permission/WebContent/META-INF/MANIFEST.MF delete mode 100644 spring-security-custom-permission/pom.xml delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/Application.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/config/MethodSecurityConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/config/MvcConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/config/PersistenceConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/config/SecurityConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/SetupData.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/UserRepository.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Foo.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Organization.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Privilege.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/voter/MinuteBasedVoter.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterApplication.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterMvcConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/voter/WebSecurityConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/voter/XmlSecurityConfig.java delete mode 100644 spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java delete mode 100644 spring-security-custom-permission/src/main/resources/application.properties delete mode 100644 spring-security-custom-permission/src/main/resources/persistence-derby.properties delete mode 100644 spring-security-custom-permission/src/main/resources/spring-security.xml delete mode 100644 spring-security-custom-permission/src/main/resources/templates/403.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/adminPage.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/index.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/login.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/loginAdmin.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/loginUser.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/private.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/protectedLinks.html delete mode 100644 spring-security-custom-permission/src/main/resources/templates/userPage.html delete mode 100644 spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java delete mode 100644 spring-security-custom-permission/src/test/java/org/baeldung/web/LiveTest.java diff --git a/spring-security-custom-permission/README.MD b/spring-security-custom-permission/README.MD deleted file mode 100644 index d59aea97b4..0000000000 --- a/spring-security-custom-permission/README.MD +++ /dev/null @@ -1,7 +0,0 @@ -###The Course -The "REST With Spring" Classes: http://github.learnspringsecurity.com - -###Relevant Articles: -- [A Custom Security Expression with Spring Security](http://www.baeldung.com/spring-security-create-new-custom-security-expression) -- [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) -- [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) diff --git a/spring-security-custom-permission/WebContent/META-INF/MANIFEST.MF b/spring-security-custom-permission/WebContent/META-INF/MANIFEST.MF deleted file mode 100644 index 254272e1c0..0000000000 --- a/spring-security-custom-permission/WebContent/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - diff --git a/spring-security-custom-permission/pom.xml b/spring-security-custom-permission/pom.xml deleted file mode 100644 index 5e1648ebd7..0000000000 --- a/spring-security-custom-permission/pom.xml +++ /dev/null @@ -1,303 +0,0 @@ - - - 4.0.0 - - com.baeldung - spring-security-custom-permission - 0.0.1-SNAPSHOT - war - - spring-security-custom-permission - Spring Security custom permission - - - org.springframework.boot - spring-boot-starter-parent - 1.4.4.RELEASE - - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity4 - - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - com.h2database - h2 - - - - org.springframework.boot - spring-boot-starter-test - test - - - - junit - junit - test - - - - org.hamcrest - hamcrest-core - test - - - - org.hamcrest - hamcrest-library - test - - - - com.jayway.restassured - rest-assured - ${rest-assured.version} - test - - - commons-logging - commons-logging - - - - - - org.springframework - spring-test - test - - - - org.apache.derby - derby - ${derby.version} - - - org.apache.derby - derbyclient - ${derby.version} - - - org.apache.derby - derbynet - ${derby.version} - - - org.apache.derby - derbytools - ${derby.version} - - - taglibs - standard - ${taglibs-standard.version} - - - org.springframework.security - spring-security-taglibs - ${spring-security-taglibs.version} - - - - org.springframework.security - spring-security-core - ${spring-security-core.version} - - - - javax.servlet.jsp.jstl - jstl-api - ${jstl.version} - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*LiveTest.java - - - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - true - - tomcat8x - embedded - - - - - - - 8082 - - - - - - - - - - - - integration - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - live - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*LiveTest.java - - - cargo - - - - - - - - - - - - - - org.baeldung.Application - - - - - UTF-8 - 1.8 - 10.13.1.1 - 1.1.2 - 4.2.0.RELEASE - 4.2.0.RELEASE - - 1.2 - 2.4.0 - 1.6.1 - - - diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/Application.java b/spring-security-custom-permission/src/main/java/org/baeldung/Application.java deleted file mode 100644 index 072a6ca4fe..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/Application.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.web.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; - -@Configuration -@EnableAutoConfiguration -@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*")}) -public class Application extends SpringBootServletInitializer { - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/config/MethodSecurityConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/config/MethodSecurityConfig.java deleted file mode 100644 index c4624e85e0..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/config/MethodSecurityConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.baeldung.config; - -import org.baeldung.security.CustomMethodSecurityExpressionHandler; -import org.baeldung.security.CustomPermissionEvaluator; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; - -@Configuration -@EnableGlobalMethodSecurity(prePostEnabled = true) -public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { - - @Override - protected MethodSecurityExpressionHandler createExpressionHandler() { - // final DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); - final CustomMethodSecurityExpressionHandler expressionHandler = new CustomMethodSecurityExpressionHandler(); - expressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator()); - return expressionHandler; - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/config/MvcConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/config/MvcConfig.java deleted file mode 100644 index 9ade60e54c..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/config/MvcConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.baeldung.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -@Configuration -@EnableWebMvc -public class MvcConfig extends WebMvcConfigurerAdapter { - - public MvcConfig() { - super(); - } - - // - @Bean - public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { - return new PropertySourcesPlaceholderConfigurer(); - } - - @Override - public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { - configurer.enable(); - } - - @Override - public void addViewControllers(final ViewControllerRegistry registry) { - super.addViewControllers(registry); - registry.addViewController("/").setViewName("forward:/index"); - registry.addViewController("/index"); - } - - @Override - public void addResourceHandlers(final ResourceHandlerRegistry registry) { - registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); - } -} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/config/PersistenceConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/config/PersistenceConfig.java deleted file mode 100644 index 1c4cb0124a..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/config/PersistenceConfig.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.baeldung.config; - -import java.util.Properties; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableTransactionManagement -@PropertySource({ "classpath:persistence-derby.properties" }) -@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao") -public class PersistenceConfig { - - @Autowired - private Environment env; - - public PersistenceConfig() { - super(); - } - - // beans - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" }); - - final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - em.setJpaVendorAdapter(vendorAdapter); - em.setJpaProperties(additionalProperties()); - - return em; - } - - @Bean - public DataSource dataSource() { - final DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); - dataSource.setUrl(env.getProperty("jdbc.url")); - dataSource.setUsername(env.getProperty("jdbc.user")); - dataSource.setPassword(env.getProperty("jdbc.pass")); - - return dataSource; - } - - @Bean - public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) { - final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(emf); - return transactionManager; - } - - @Bean - public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { - return new PersistenceExceptionTranslationPostProcessor(); - } - - final Properties additionalProperties() { - final Properties hibernateProperties = new Properties(); - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); - hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache")); - // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); - return hibernateProperties; - } -} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/config/SecurityConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/config/SecurityConfig.java deleted file mode 100644 index 8cc9d45823..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/config/SecurityConfig.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.baeldung.config; - -import org.baeldung.security.MyUserDetailsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.dao.DaoAuthenticationProvider; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -@Configuration -@EnableWebSecurity -@ComponentScan("org.baeldung.security") -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private MyUserDetailsService userDetailsService; - - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService); - } - - @Override - public void configure(WebSecurity web) throws Exception { - web.ignoring().antMatchers("/resources/**"); - } - - @Override - protected void configure(final HttpSecurity http) throws Exception { - // @formatter:off - http.authorizeRequests() - .antMatchers("/login").permitAll() - .antMatchers("/admin").hasRole("ADMIN") - .anyRequest().authenticated() - .and().formLogin().permitAll() - .and().csrf().disable(); - ; - // @formatter:on - } - - @Bean - public DaoAuthenticationProvider authenticationProvider() { - final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); - authProvider.setUserDetailsService(userDetailsService); - authProvider.setPasswordEncoder(encoder()); - return authProvider; - } - - @Bean - public PasswordEncoder encoder() { - return new BCryptPasswordEncoder(11); - } -} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java deleted file mode 100644 index 23fda0547f..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.baeldung.multiplelogin; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.web.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; - -@SpringBootApplication -@ComponentScan("org.baeldung.multiplelogin") -public class MultipleLoginApplication extends SpringBootServletInitializer { - public static void main(String[] args) { - SpringApplication.run(MultipleLoginApplication.class, args); - } - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(MultipleLoginApplication.class); - } -} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java deleted file mode 100644 index ec76be1909..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.baeldung.multiplelogin; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import org.springframework.web.servlet.view.InternalResourceViewResolver; -import org.springframework.web.servlet.view.JstlView; -import org.springframework.context.annotation.ComponentScan; - -@EnableWebMvc -@Configuration -@ComponentScan("org.baeldung.controller") -public class MultipleLoginMvcConfig extends WebMvcConfigurerAdapter { - - public MultipleLoginMvcConfig() { - super(); - } - - // API - - @Override - public void addViewControllers(final ViewControllerRegistry registry) { - super.addViewControllers(registry); - - registry.addViewController("/anonymous.html"); - - registry.addViewController("/login.html"); - registry.addViewController("/homepage.html"); - registry.addViewController("/console.html"); - } - - @Bean - public ViewResolver viewResolver() { - final InternalResourceViewResolver bean = new InternalResourceViewResolver(); - - bean.setViewClass(JstlView.class); - bean.setPrefix("/WEB-INF/view/"); - bean.setSuffix(".jsp"); - - return bean; - } -} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java deleted file mode 100644 index d7dbf17723..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.baeldung.multiplelogin; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.TestingAuthenticationProvider; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; - -@Configuration -@EnableWebSecurity -public class MultipleLoginSecurityConfig { - - @Bean - public UserDetailsService userDetailsService() throws Exception { - InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); - manager.createUser(User.withUsername("user") - .password("userPass") - .roles("USER") - .build()); - manager.createUser(User.withUsername("admin") - .password("adminPass") - .roles("ADMIN") - .build()); - return manager; - } - - @Configuration - @Order(1) - public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { - - public App1ConfigurationAdapter() { - super(); - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("admin") - .password("admin") - .roles("ADMIN"); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/admin*") - .authorizeRequests() - .anyRequest() - .hasRole("ADMIN") - // log in - .and() - .formLogin() - .loginPage("/loginAdmin") - .loginProcessingUrl("/admin_login") - .failureUrl("/loginAdmin?error=loginError") - .defaultSuccessUrl("/adminPage") - // logout - .and() - .logout() - .logoutUrl("/admin_logout") - .logoutSuccessUrl("/protectedLinks") - .deleteCookies("JSESSIONID") - .and() - .exceptionHandling() - .accessDeniedPage("/403") - .and() - .csrf() - .disable(); - } - } - - @Configuration - @Order(2) - public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { - - public App2ConfigurationAdapter() { - super(); - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("user") - .password("user") - .roles("USER"); - } - - protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/user*") - .authorizeRequests() - .anyRequest() - .hasRole("USER") - // log in - .and() - .formLogin() - .loginPage("/loginUser") - .loginProcessingUrl("/user_login") - .failureUrl("/loginUser?error=loginError") - .defaultSuccessUrl("/userPage") - // logout - .and() - .logout() - .logoutUrl("/user_logout") - .logoutSuccessUrl("/protectedLinks") - .deleteCookies("JSESSIONID") - .and() - .exceptionHandling() - .accessDeniedPage("/403") - .and() - .csrf() - .disable(); - } - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java b/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java deleted file mode 100644 index 0672a760af..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/multiplelogin/UsersController.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.baeldung.multiplelogin; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -public class UsersController { - - @RequestMapping("/protectedLinks") - public String getAnonymousPage() { - return "protectedLinks"; - } - - @RequestMapping("/userPage") - public String getUserPage() { - return "userPage"; - } - - @RequestMapping("/adminPage") - public String getAdminPage() { - return "adminPage"; - } - - @RequestMapping("/loginAdmin") - public String getAdminLoginPage() { - return "loginAdmin"; - } - - @RequestMapping("/loginUser") - public String getUserLoginPage() { - return "loginUser"; - } - - @RequestMapping("/403") - public String getAccessDeniedPage() { - return "403"; - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/SetupData.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/SetupData.java deleted file mode 100644 index 631c8dfc58..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/SetupData.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.baeldung.persistence; - -import java.util.Arrays; -import java.util.HashSet; - -import javax.annotation.PostConstruct; - -import org.baeldung.persistence.dao.OrganizationRepository; -import org.baeldung.persistence.dao.PrivilegeRepository; -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.model.Organization; -import org.baeldung.persistence.model.Privilege; -import org.baeldung.persistence.model.User; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class SetupData { - @Autowired - private UserRepository userRepository; - - @Autowired - private PrivilegeRepository privilegeRepository; - - @Autowired - private OrganizationRepository organizationRepository; - - @PostConstruct - public void init() { - initOrganizations(); - initPrivileges(); - initUsers(); - } - - private void initUsers() { - final Privilege privilege1 = privilegeRepository.findByName("FOO_READ_PRIVILEGE"); - final Privilege privilege2 = privilegeRepository.findByName("FOO_WRITE_PRIVILEGE"); - // - final User user1 = new User(); - user1.setUsername("john"); - user1.setPassword("123"); - user1.setPrivileges(new HashSet(Arrays.asList(privilege1))); - user1.setOrganization(organizationRepository.findByName("FirstOrg")); - userRepository.save(user1); - // - final User user2 = new User(); - user2.setUsername("tom"); - user2.setPassword("111"); - user2.setPrivileges(new HashSet(Arrays.asList(privilege1, privilege2))); - user2.setOrganization(organizationRepository.findByName("SecondOrg")); - userRepository.save(user2); - } - - private void initOrganizations() { - final Organization org1 = new Organization("FirstOrg"); - organizationRepository.save(org1); - // - final Organization org2 = new Organization("SecondOrg"); - organizationRepository.save(org2); - } - - private void initPrivileges() { - final Privilege privilege1 = new Privilege("FOO_READ_PRIVILEGE"); - privilegeRepository.save(privilege1); - // - final Privilege privilege2 = new Privilege("FOO_WRITE_PRIVILEGE"); - privilegeRepository.save(privilege2); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java deleted file mode 100644 index a20d24057b..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/OrganizationRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.baeldung.persistence.dao; - -import org.baeldung.persistence.model.Organization; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface OrganizationRepository extends JpaRepository { - - public Organization findByName(String name); - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java deleted file mode 100644 index edf9002c3d..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/PrivilegeRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.baeldung.persistence.dao; - -import org.baeldung.persistence.model.Privilege; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface PrivilegeRepository extends JpaRepository { - - public Privilege findByName(String name); - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/UserRepository.java deleted file mode 100644 index 337106a187..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/dao/UserRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.baeldung.persistence.dao; - -import org.baeldung.persistence.model.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.transaction.annotation.Transactional; - -public interface UserRepository extends JpaRepository { - - User findByUsername(final String username); - - @Transactional - void removeUserByUsername(String username); - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Foo.java deleted file mode 100644 index 29c19cf22e..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Foo.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.baeldung.persistence.model; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class Foo { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column(nullable = false) - private String name; - - // - - public Foo() { - super(); - } - - public Foo(String name) { - super(); - this.name = name; - } - - // - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - // - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("Foo [id=").append(id).append(", name=").append(name).append("]"); - return builder.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + ((id == null) ? 0 : id.hashCode()); - result = (prime * result) + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Foo other = (Foo) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Organization.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Organization.java deleted file mode 100644 index 645285b5e9..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Organization.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.baeldung.persistence.model; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class Organization { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column(nullable = false, unique = true) - private String name; - - // - - public Organization() { - super(); - } - - public Organization(String name) { - super(); - this.name = name; - } - - // - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - // - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("Organization [id=").append(id).append(", name=").append(name).append("]"); - return builder.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + ((id == null) ? 0 : id.hashCode()); - result = (prime * result) + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Organization other = (Organization) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Privilege.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Privilege.java deleted file mode 100644 index ff3ae62c25..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/Privilege.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.baeldung.persistence.model; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class Privilege { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column(nullable = false, unique = true) - private String name; - - // - - public Privilege() { - super(); - } - - public Privilege(String name) { - super(); - this.name = name; - } - - // - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - // - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("Privilege [id=").append(id).append(", name=").append(name).append("]"); - return builder.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + ((id == null) ? 0 : id.hashCode()); - result = (prime * result) + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Privilege other = (Privilege) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java deleted file mode 100644 index 2ff8beebf0..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java +++ /dev/null @@ -1,155 +0,0 @@ -package org.baeldung.persistence.model; - -import java.util.Set; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "user_table") -public class User { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column(nullable = false, unique = true) - private String username; - - private String password; - - @ManyToMany(fetch = FetchType.EAGER) - @JoinTable(name = "users_privileges", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id")) - private Set privileges; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "organization_id", referencedColumnName = "id") - private Organization organization; - - // - - public User() { - super(); - } - - // - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Set getPrivileges() { - return privileges; - } - - public void setPrivileges(Set privileges) { - this.privileges = privileges; - } - - public Organization getOrganization() { - return organization; - } - - public void setOrganization(Organization organization) { - this.organization = organization; - } - - // - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("User [id=").append(id).append(", username=").append(username).append(", password=").append(password).append(", privileges=").append(privileges).append(", organization=").append(organization).append("]"); - return builder.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + ((id == null) ? 0 : id.hashCode()); - result = (prime * result) + ((organization == null) ? 0 : organization.hashCode()); - result = (prime * result) + ((password == null) ? 0 : password.hashCode()); - result = (prime * result) + ((privileges == null) ? 0 : privileges.hashCode()); - result = (prime * result) + ((username == null) ? 0 : username.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final User other = (User) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (organization == null) { - if (other.organization != null) { - return false; - } - } else if (!organization.equals(other.organization)) { - return false; - } - if (password == null) { - if (other.password != null) { - return false; - } - } else if (!password.equals(other.password)) { - return false; - } - if (privileges == null) { - if (other.privileges != null) { - return false; - } - } else if (!privileges.equals(other.privileges)) { - return false; - } - if (username == null) { - if (other.username != null) { - return false; - } - } else if (!username.equals(other.username)) { - return false; - } - return true; - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java deleted file mode 100644 index e040a0b109..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.baeldung.security; - -import org.aopalliance.intercept.MethodInvocation; -import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; -import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; -import org.springframework.security.authentication.AuthenticationTrustResolver; -import org.springframework.security.authentication.AuthenticationTrustResolverImpl; -import org.springframework.security.core.Authentication; - -public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler { - private final AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl(); - - @Override - protected MethodSecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, MethodInvocation invocation) { - // final CustomMethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication); - final MySecurityExpressionRoot root = new MySecurityExpressionRoot(authentication); - root.setPermissionEvaluator(getPermissionEvaluator()); - root.setTrustResolver(this.trustResolver); - root.setRoleHierarchy(getRoleHierarchy()); - return root; - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java deleted file mode 100644 index 2d84536a14..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.baeldung.security; - -import org.baeldung.persistence.model.User; -import org.springframework.security.access.expression.SecurityExpressionRoot; -import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; -import org.springframework.security.core.Authentication; - -public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations { - - private Object filterObject; - private Object returnObject; - - public CustomMethodSecurityExpressionRoot(Authentication authentication) { - super(authentication); - } - - // - public boolean isMember(Long OrganizationId) { - final User user = ((MyUserPrincipal) this.getPrincipal()).getUser(); - return user.getOrganization().getId().longValue() == OrganizationId.longValue(); - } - - // - - @Override - public Object getFilterObject() { - return this.filterObject; - } - - @Override - public Object getReturnObject() { - return this.returnObject; - } - - @Override - public Object getThis() { - return this; - } - - @Override - public void setFilterObject(Object obj) { - this.filterObject = obj; - } - - @Override - public void setReturnObject(Object obj) { - this.returnObject = obj; - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java deleted file mode 100644 index 5d96673a8f..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.baeldung.security; - -import java.io.Serializable; - -import org.springframework.security.access.PermissionEvaluator; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; - -public class CustomPermissionEvaluator implements PermissionEvaluator { - - @Override - public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) { - if ((auth == null) || (targetDomainObject == null) || !(permission instanceof String)) { - return false; - } - final String targetType = targetDomainObject.getClass().getSimpleName().toUpperCase(); - return hasPrivilege(auth, targetType, permission.toString().toUpperCase()); - } - - @Override - public boolean hasPermission(Authentication auth, Serializable targetId, String targetType, Object permission) { - if ((auth == null) || (targetType == null) || !(permission instanceof String)) { - return false; - } - return hasPrivilege(auth, targetType.toUpperCase(), permission.toString().toUpperCase()); - } - - private boolean hasPrivilege(Authentication auth, String targetType, String permission) { - for (final GrantedAuthority grantedAuth : auth.getAuthorities()) { - System.out.println("here " + grantedAuth); - if (grantedAuth.getAuthority().startsWith(targetType)) { - if (grantedAuth.getAuthority().contains(permission)) { - return true; - } - } - } - return false; - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java deleted file mode 100644 index 4d3561b325..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java +++ /dev/null @@ -1,203 +0,0 @@ -package org.baeldung.security; - -import java.io.Serializable; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import org.baeldung.persistence.model.User; -import org.springframework.security.access.PermissionEvaluator; -import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; -import org.springframework.security.access.hierarchicalroles.RoleHierarchy; -import org.springframework.security.authentication.AuthenticationTrustResolver; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.AuthorityUtils; - -public class MySecurityExpressionRoot implements MethodSecurityExpressionOperations { - protected final Authentication authentication; - private AuthenticationTrustResolver trustResolver; - private RoleHierarchy roleHierarchy; - private Set roles; - private String defaultRolePrefix = "ROLE_"; - - public final boolean permitAll = true; - public final boolean denyAll = false; - private PermissionEvaluator permissionEvaluator; - public final String read = "read"; - public final String write = "write"; - public final String create = "create"; - public final String delete = "delete"; - public final String admin = "administration"; - - // - - private Object filterObject; - private Object returnObject; - - public MySecurityExpressionRoot(Authentication authentication) { - if (authentication == null) { - throw new IllegalArgumentException("Authentication object cannot be null"); - } - this.authentication = authentication; - } - - @Override - public final boolean hasAuthority(String authority) { - throw new RuntimeException("method hasAuthority() not allowed"); - } - - // - public boolean isMember(Long OrganizationId) { - final User user = ((MyUserPrincipal) this.getPrincipal()).getUser(); - return user.getOrganization().getId().longValue() == OrganizationId.longValue(); - } - - // - - @Override - public final boolean hasAnyAuthority(String... authorities) { - return hasAnyAuthorityName(null, authorities); - } - - @Override - public final boolean hasRole(String role) { - return hasAnyRole(role); - } - - @Override - public final boolean hasAnyRole(String... roles) { - return hasAnyAuthorityName(defaultRolePrefix, roles); - } - - private boolean hasAnyAuthorityName(String prefix, String... roles) { - final Set roleSet = getAuthoritySet(); - - for (final String role : roles) { - final String defaultedRole = getRoleWithDefaultPrefix(prefix, role); - if (roleSet.contains(defaultedRole)) { - return true; - } - } - - return false; - } - - @Override - public final Authentication getAuthentication() { - return authentication; - } - - @Override - public final boolean permitAll() { - return true; - } - - @Override - public final boolean denyAll() { - return false; - } - - @Override - public final boolean isAnonymous() { - return trustResolver.isAnonymous(authentication); - } - - @Override - public final boolean isAuthenticated() { - return !isAnonymous(); - } - - @Override - public final boolean isRememberMe() { - return trustResolver.isRememberMe(authentication); - } - - @Override - public final boolean isFullyAuthenticated() { - return !trustResolver.isAnonymous(authentication) && !trustResolver.isRememberMe(authentication); - } - - public Object getPrincipal() { - return authentication.getPrincipal(); - } - - public void setTrustResolver(AuthenticationTrustResolver trustResolver) { - this.trustResolver = trustResolver; - } - - public void setRoleHierarchy(RoleHierarchy roleHierarchy) { - this.roleHierarchy = roleHierarchy; - } - - public void setDefaultRolePrefix(String defaultRolePrefix) { - this.defaultRolePrefix = defaultRolePrefix; - } - - private Set getAuthoritySet() { - if (roles == null) { - roles = new HashSet(); - Collection userAuthorities = authentication.getAuthorities(); - - if (roleHierarchy != null) { - userAuthorities = roleHierarchy.getReachableGrantedAuthorities(userAuthorities); - } - - roles = AuthorityUtils.authorityListToSet(userAuthorities); - } - - return roles; - } - - @Override - public boolean hasPermission(Object target, Object permission) { - return permissionEvaluator.hasPermission(authentication, target, permission); - } - - @Override - public boolean hasPermission(Object targetId, String targetType, Object permission) { - return permissionEvaluator.hasPermission(authentication, (Serializable) targetId, targetType, permission); - } - - public void setPermissionEvaluator(PermissionEvaluator permissionEvaluator) { - this.permissionEvaluator = permissionEvaluator; - } - - private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) { - if (role == null) { - return role; - } - if ((defaultRolePrefix == null) || (defaultRolePrefix.length() == 0)) { - return role; - } - if (role.startsWith(defaultRolePrefix)) { - return role; - } - return defaultRolePrefix + role; - } - - @Override - public Object getFilterObject() { - return this.filterObject; - } - - @Override - public Object getReturnObject() { - return this.returnObject; - } - - @Override - public Object getThis() { - return this; - } - - @Override - public void setFilterObject(Object obj) { - this.filterObject = obj; - } - - @Override - public void setReturnObject(Object obj) { - this.returnObject = obj; - } -} \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java deleted file mode 100644 index 685219728f..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.baeldung.security; - -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.model.User; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -@Service -public class MyUserDetailsService implements UserDetailsService { - - @Autowired - private UserRepository userRepository; - - public MyUserDetailsService() { - super(); - } - - // API - - @Override - public UserDetails loadUserByUsername(final String username) { - final User user = userRepository.findByUsername(username); - if (user == null) { - throw new UsernameNotFoundException(username); - } - return new MyUserPrincipal(user); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java deleted file mode 100644 index 437bb02cdb..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.baeldung.security; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.baeldung.persistence.model.Privilege; -import org.baeldung.persistence.model.User; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -public class MyUserPrincipal implements UserDetails { - - private static final long serialVersionUID = 1L; - - private final User user; - - // - - public MyUserPrincipal(User user) { - this.user = user; - } - - // - - @Override - public String getUsername() { - return user.getUsername(); - } - - @Override - public String getPassword() { - return user.getPassword(); - } - - @Override - public Collection getAuthorities() { - final List authorities = new ArrayList(); - for (final Privilege privilege : user.getPrivileges()) { - authorities.add(new SimpleGrantedAuthority(privilege.getName())); - } - return authorities; - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return true; - } - - // - - public User getUser() { - return user; - } - -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/voter/MinuteBasedVoter.java b/spring-security-custom-permission/src/main/java/org/baeldung/voter/MinuteBasedVoter.java deleted file mode 100644 index 2beda1e557..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/voter/MinuteBasedVoter.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.baeldung.voter; - -import java.time.LocalDateTime; -import java.util.Collection; - -import org.springframework.security.access.AccessDecisionVoter; -import org.springframework.security.access.ConfigAttribute; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; - -public class MinuteBasedVoter implements AccessDecisionVoter { - @Override - public boolean supports(ConfigAttribute attribute) { - return true; - } - - @Override - public boolean supports(Class clazz) { - return true; - } - - @Override - public int vote(Authentication authentication, Object object, Collection collection) { - return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).filter(r -> "ROLE_USER".equals(r) && LocalDateTime.now().getMinute() % 2 != 0).findAny().map(s -> ACCESS_DENIED).orElseGet(() -> ACCESS_ABSTAIN); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterApplication.java b/spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterApplication.java deleted file mode 100644 index c032a9634e..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung.voter; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; - -@Configuration -@EnableAutoConfiguration -@ComponentScan(basePackages = { "org.baeldung.voter" }) -public class VoterApplication { - - public static void main(String[] args) { - SpringApplication.run(VoterApplication.class, args); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterMvcConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterMvcConfig.java deleted file mode 100644 index e282c794d0..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/voter/VoterMvcConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung.voter; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -/** - * Created by ambrusadrianz on 30/09/2016. - */ - -@Configuration -public class VoterMvcConfig extends WebMvcConfigurerAdapter { - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/").setViewName("private"); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/voter/WebSecurityConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/voter/WebSecurityConfig.java deleted file mode 100644 index 495567c7b2..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/voter/WebSecurityConfig.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.baeldung.voter; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.AccessDecisionManager; -import org.springframework.security.access.AccessDecisionVoter; -import org.springframework.security.access.vote.AuthenticatedVoter; -import org.springframework.security.access.vote.RoleVoter; -import org.springframework.security.access.vote.UnanimousBased; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.web.access.expression.WebExpressionVoter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; - -import java.util.Arrays; -import java.util.List; - -//@Configuration -//@EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - // @formatter: off - auth.inMemoryAuthentication().withUser("user").password("pass").roles("USER").and().withUser("admin").password("pass").roles("ADMIN"); - // @formatter: on - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - // @formatter: off - http - // needed so our login could work - .csrf().disable().authorizeRequests().anyRequest().authenticated().accessDecisionManager(accessDecisionManager()).antMatchers("/").hasAnyRole("ROLE_ADMIN", "ROLE_USER").and().formLogin().permitAll().and().logout().permitAll() - .deleteCookies("JSESSIONID").logoutSuccessUrl("/login"); - // @formatter: on - } - - @Bean - public AccessDecisionManager accessDecisionManager() { - // @formatter: off - List> decisionVoters = Arrays.asList(new WebExpressionVoter(), new RoleVoter(), new AuthenticatedVoter(), new MinuteBasedVoter()); - // @formatter: on - return new UnanimousBased(decisionVoters); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/voter/XmlSecurityConfig.java b/spring-security-custom-permission/src/main/java/org/baeldung/voter/XmlSecurityConfig.java deleted file mode 100644 index 124513d317..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/voter/XmlSecurityConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.voter; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.ImportResource; - -/** - * Created by ambrusadrianz on 09/10/2016. - */ -@Configuration -@ImportResource({ "classpath:spring-security.xml" }) -public class XmlSecurityConfig { - public XmlSecurityConfig() { - super(); - } -} diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java b/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java deleted file mode 100644 index 4752f7bdd9..0000000000 --- a/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.baeldung.web; - -import org.baeldung.persistence.dao.OrganizationRepository; -import org.baeldung.persistence.model.Foo; -import org.baeldung.persistence.model.Organization; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -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; - -@Controller -public class MainController { - - @Autowired - private OrganizationRepository organizationRepository; - - // @PostAuthorize("hasPermission(returnObject, 'read')") - @PreAuthorize("hasPermission(#id, 'Foo', 'read')") - @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") - @ResponseBody - public Foo findById(@PathVariable final long id) { - return new Foo("Sample"); - } - - @PreAuthorize("hasPermission(#foo, 'write')") - @RequestMapping(method = RequestMethod.POST, value = "/foos") - @ResponseStatus(HttpStatus.CREATED) - @ResponseBody - public Foo create(@RequestBody final Foo foo) { - return foo; - } - - // - - @PreAuthorize("hasAuthority('FOO_READ_PRIVILEGE')") - @RequestMapping(method = RequestMethod.GET, value = "/foos") - @ResponseBody - public Foo findFooByName(@RequestParam final String name) { - return new Foo(name); - } - - // - - @PreAuthorize("isMember(#id)") - @RequestMapping(method = RequestMethod.GET, value = "/organizations/{id}") - @ResponseBody - public Organization findOrgById(@PathVariable final long id) { - return organizationRepository.findOne(id); - } - -} diff --git a/spring-security-custom-permission/src/main/resources/application.properties b/spring-security-custom-permission/src/main/resources/application.properties deleted file mode 100644 index 9b140b3c69..0000000000 --- a/spring-security-custom-permission/src/main/resources/application.properties +++ /dev/null @@ -1,10 +0,0 @@ -server.port=8082 -server.context-path=/spring-security-custom-permission -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:security_permission;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.username=sa -spring.datasource.password= -spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.database=H2 -spring.jpa.show-sql=false -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/persistence-derby.properties b/spring-security-custom-permission/src/main/resources/persistence-derby.properties deleted file mode 100644 index e808fdc288..0000000000 --- a/spring-security-custom-permission/src/main/resources/persistence-derby.properties +++ /dev/null @@ -1,12 +0,0 @@ -# jdbc.X -jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver -jdbc.url=jdbc:derby:memory:spring_custom_user_service;create=true -jdbc.user=tutorialuser -jdbc.pass=tutorialpass - -# hibernate.X -hibernate.dialect=org.hibernate.dialect.DerbyDialect -hibernate.show_sql=false -hibernate.hbm2ddl.auto=create -hibernate.cache.use_second_level_cache=false -hibernate.cache.use_query_cache=false \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/spring-security.xml b/spring-security-custom-permission/src/main/resources/spring-security.xml deleted file mode 100644 index 83bc14dda7..0000000000 --- a/spring-security-custom-permission/src/main/resources/spring-security.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/403.html b/spring-security-custom-permission/src/main/resources/templates/403.html deleted file mode 100644 index 20550768cf..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/403.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - -You do not have permission to view this page. - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/adminPage.html b/spring-security-custom-permission/src/main/resources/templates/adminPage.html deleted file mode 100644 index 13aff9b15a..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/adminPage.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - -Insert title here - - -Welcome admin! Logout - -

-Back to links - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/index.html b/spring-security-custom-permission/src/main/resources/templates/index.html deleted file mode 100644 index 8e7394ad6a..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -Spring Security Thymeleaf - - - - - -
- Welcome -
- - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/login.html b/spring-security-custom-permission/src/main/resources/templates/login.html deleted file mode 100644 index dd6bd04767..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/login.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -

Login

- -
- - - - - - - - - - - - - - -
User:
Password:
- -
- - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/loginAdmin.html b/spring-security-custom-permission/src/main/resources/templates/loginAdmin.html deleted file mode 100644 index 43d0e73233..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/loginAdmin.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - -Insert title here - - - -

Admin login page

-
- - - - - - - - - - - - - -
User:
Password:
- -
- -

Login failed!

- - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/loginUser.html b/spring-security-custom-permission/src/main/resources/templates/loginUser.html deleted file mode 100644 index bf4ddd48bc..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/loginUser.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - -Login - - - -

User login page

- -
- - - - - - - - - - - - -
User:
Password:
- -
-

Login failed!

- - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/private.html b/spring-security-custom-permission/src/main/resources/templates/private.html deleted file mode 100644 index 5af8c7a13e..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/private.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - Private - - -

Congrats!

- - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/protectedLinks.html b/spring-security-custom-permission/src/main/resources/templates/protectedLinks.html deleted file mode 100644 index 1877464fe5..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/protectedLinks.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - -Insert title here - - - -User page -
-Admin page - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/main/resources/templates/userPage.html b/spring-security-custom-permission/src/main/resources/templates/userPage.html deleted file mode 100644 index 894a225871..0000000000 --- a/spring-security-custom-permission/src/main/resources/templates/userPage.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - -Insert title here - - -Welcome user! Logout -

-Back to links - - \ No newline at end of file diff --git a/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java deleted file mode 100644 index 616e80e6e9..0000000000 --- a/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.baeldung.web; - -import static org.junit.Assert.assertEquals; - -import org.baeldung.config.MvcConfig; -import org.baeldung.config.PersistenceConfig; -import org.baeldung.config.SecurityConfig; -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.model.User; -import org.junit.After; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = { MvcConfig.class, SecurityConfig.class, PersistenceConfig.class }) -@WebAppConfiguration -public class CustomUserDetailsServiceIntegrationTest { - - public static final String USERNAME = "user"; - public static final String PASSWORD = "pass"; - public static final String USERNAME2 = "user2"; - - @Autowired - UserRepository myUserRepository; - - @Autowired - AuthenticationProvider authenticationProvider; - - @Autowired - PasswordEncoder passwordEncoder; - - // - - @Test - public void givenExistingUser_whenAuthenticate_thenRetrieveFromDb() { - User user = new User(); - user.setUsername(USERNAME); - user.setPassword(passwordEncoder.encode(PASSWORD)); - - myUserRepository.save(user); - - UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME, PASSWORD); - Authentication authentication = authenticationProvider.authenticate(auth); - - assertEquals(authentication.getName(), USERNAME); - } - - @Test(expected = BadCredentialsException.class) - public void givenIncorrectUser_whenAuthenticate_thenBadCredentialsException() { - User user = new User(); - user.setUsername(USERNAME); - user.setPassword(passwordEncoder.encode(PASSWORD)); - - myUserRepository.save(user); - - UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME2, PASSWORD); - authenticationProvider.authenticate(auth); - } - - // - - @After - public void tearDown() { - myUserRepository.removeUserByUsername(USERNAME); - } - -} diff --git a/spring-security-custom-permission/src/test/java/org/baeldung/web/LiveTest.java b/spring-security-custom-permission/src/test/java/org/baeldung/web/LiveTest.java deleted file mode 100644 index 47626b814a..0000000000 --- a/spring-security-custom-permission/src/test/java/org/baeldung/web/LiveTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.baeldung.web; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.baeldung.persistence.model.Foo; -import org.junit.Test; -import org.springframework.http.MediaType; - -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.authentication.FormAuthConfig; -import com.jayway.restassured.response.Response; -import com.jayway.restassured.specification.RequestSpecification; - -public class LiveTest { - - private final FormAuthConfig formAuthConfig = new FormAuthConfig("http://localhost:8082/spring-security-custom-permission/login", "username", "password"); - - @Test - public void givenUserWithReadPrivilegeAndHasPermission_whenGetFooById_thenOK() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/foos/1"); - assertEquals(200, response.getStatusCode()); - assertTrue(response.asString().contains("id")); - } - - @Test - public void givenUserWithNoWritePrivilegeAndHasPermission_whenPostFoo_thenForbidden() { - final Response response = givenAuth("john", "123").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-custom-permission/foos"); - assertEquals(403, response.getStatusCode()); - } - - @Test - public void givenUserWithWritePrivilegeAndHasPermission_whenPostFoo_thenOk() { - final Response response = givenAuth("tom", "111").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-custom-permission/foos"); - assertEquals(201, response.getStatusCode()); - assertTrue(response.asString().contains("id")); - } - - // - - @Test - public void givenUserMemberInOrganization_whenGetOrganization_thenOK() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/organizations/1"); - assertEquals(200, response.getStatusCode()); - assertTrue(response.asString().contains("id")); - } - - @Test - public void givenUserMemberNotInOrganization_whenGetOrganization_thenForbidden() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/organizations/2"); - assertEquals(403, response.getStatusCode()); - } - - // - - @Test - public void givenDisabledSecurityExpression_whenGetFooByName_thenError() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/foos?name=sample"); - assertEquals(500, response.getStatusCode()); - assertTrue(response.asString().contains("method hasAuthority() not allowed")); - } - - // - private RequestSpecification givenAuth(String username, String password) { - return RestAssured.given().auth().form(username, password, formAuthConfig); - } -} \ No newline at end of file From 22d26048b6910a11c34aa84293c0313dc6579fb7 Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 10 Feb 2017 11:35:01 +0200 Subject: [PATCH 094/192] fixes after project move --- pom.xml | 2 +- .../src/test/java/org/baeldung/web/LiveTest.java | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 764b8c6416..2392e2c594 100644 --- a/pom.xml +++ b/pom.xml @@ -158,7 +158,7 @@ spring-security-client/spring-security-thymeleaf-authorize spring-security-client/spring-security-thymeleaf-config spring-security-core - spring-security-custom-permission + spring-security-mvc-boot spring-security-mvc-custom spring-security-mvc-digest-auth spring-security-mvc-ldap diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java index 47626b814a..d237ff2ec5 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java @@ -14,24 +14,24 @@ import com.jayway.restassured.specification.RequestSpecification; public class LiveTest { - private final FormAuthConfig formAuthConfig = new FormAuthConfig("http://localhost:8082/spring-security-custom-permission/login", "username", "password"); + private final FormAuthConfig formAuthConfig = new FormAuthConfig("http://localhost:8082/spring-security-mvc-boot/login", "username", "password"); @Test public void givenUserWithReadPrivilegeAndHasPermission_whenGetFooById_thenOK() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/foos/1"); + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-mvc-boot/foos/1"); assertEquals(200, response.getStatusCode()); assertTrue(response.asString().contains("id")); } @Test public void givenUserWithNoWritePrivilegeAndHasPermission_whenPostFoo_thenForbidden() { - final Response response = givenAuth("john", "123").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-custom-permission/foos"); + final Response response = givenAuth("john", "123").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-mvc-boot/foos"); assertEquals(403, response.getStatusCode()); } @Test public void givenUserWithWritePrivilegeAndHasPermission_whenPostFoo_thenOk() { - final Response response = givenAuth("tom", "111").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-custom-permission/foos"); + final Response response = givenAuth("tom", "111").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-mvc-boot/foos"); assertEquals(201, response.getStatusCode()); assertTrue(response.asString().contains("id")); } @@ -40,14 +40,14 @@ public class LiveTest { @Test public void givenUserMemberInOrganization_whenGetOrganization_thenOK() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/organizations/1"); + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-mvc-boot/organizations/1"); assertEquals(200, response.getStatusCode()); assertTrue(response.asString().contains("id")); } @Test public void givenUserMemberNotInOrganization_whenGetOrganization_thenForbidden() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/organizations/2"); + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-mvc-boot/organizations/2"); assertEquals(403, response.getStatusCode()); } @@ -55,7 +55,7 @@ public class LiveTest { @Test public void givenDisabledSecurityExpression_whenGetFooByName_thenError() { - final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-custom-permission/foos?name=sample"); + final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-mvc-boot/foos?name=sample"); assertEquals(500, response.getStatusCode()); assertTrue(response.asString().contains("method hasAuthority() not allowed")); } From 672be6c7ff62bf3aa0c23c2ab63eaa1c75bbb35b Mon Sep 17 00:00:00 2001 From: Sunil Gulabani Date: Fri, 10 Feb 2017 17:54:00 +0530 Subject: [PATCH 095/192] BAEL-650: Lambda and DynamoDB --- aws/pom.xml | 24 ++++++- .../lambda/dynamodb/SavePersonHandler.java | 57 +++++++++++++++ .../lambda/dynamodb/bean/PersonRequest.java | 71 +++++++++++++++++++ .../lambda/dynamodb/bean/PersonResponse.java | 25 +++++++ 4 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java create mode 100644 aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java create mode 100644 aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java diff --git a/aws/pom.xml b/aws/pom.xml index f3ae672a2f..4ea6b8786c 100644 --- a/aws/pom.xml +++ b/aws/pom.xml @@ -14,11 +14,23 @@ 1.1.0 + + com.amazonaws + aws-lambda-java-events + 1.3.0 + + commons-io commons-io 2.5 + + + com.google.code.gson + gson + 2.8.0 +
@@ -26,7 +38,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.0.0 false @@ -41,4 +53,14 @@ + + + artifactory-isg-release + https://repository.deere.com/artifactory/isg-release + + + axiom-nexus + http://isgnexus.deere.com/nexus/content/groups/public + + \ No newline at end of file diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java new file mode 100644 index 0000000000..47d3569d27 --- /dev/null +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java @@ -0,0 +1,57 @@ +/** + * "Unpublished Work © 2017 Deere & Company. All Worldwide Rights Reserved. THIS MATERIAL IS THE PROPERTY OF DEERE & + * COMPANY. ALL USE, ALTERATIONS, DISCLOSURE, DISSEMINATION AND/OR REPRODUCTION NOT SPECIFICALLY AUTHORIZED BY DEERE & + * COMPANY IS PROHIBITED." + */ +package com.baeldung.lambda.dynamodb; + +import com.amazonaws.regions.Region; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; +import com.amazonaws.services.dynamodbv2.document.DynamoDB; +import com.amazonaws.services.dynamodbv2.document.Item; +import com.amazonaws.services.dynamodbv2.document.PutItemOutcome; +import com.amazonaws.services.dynamodbv2.document.spec.PutItemSpec; +import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.baeldung.lambda.dynamodb.bean.PersonRequest; +import com.baeldung.lambda.dynamodb.bean.PersonResponse; + +public class SavePersonHandler implements RequestHandler { + + private DynamoDB dynamoDb; + + private final String DYNAMODB_TABLE_NAME = "Person"; + private final Regions REGION = Regions.US_WEST_2; + + public PersonResponse handleRequest(PersonRequest personRequest, Context context) { + context.getLogger().log("personRequest: " + personRequest); + this.initDynamoDbClient(); + + persistData(personRequest); + + PersonResponse personResponse = new PersonResponse(); + personResponse.setMessage("Saved Successfully!!!"); + context.getLogger().log("personResponse: " + personResponse); + return personResponse; + } + + private PutItemOutcome persistData(PersonRequest personRequest) throws ConditionalCheckFailedException { + return this.dynamoDb.getTable(DYNAMODB_TABLE_NAME) + .putItem( + new PutItemSpec().withItem(new Item() + .withNumber("id", personRequest.getId()) + .withString("firstName", personRequest.getFirstName()) + .withString("lastName", personRequest.getLastName()) + .withNumber("age", personRequest.getAge()) + .withString("address", personRequest.getAddress()) + )); + } + + private void initDynamoDbClient() { + final AmazonDynamoDBClient client = new AmazonDynamoDBClient(); + client.setRegion(Region.getRegion(REGION)); + this.dynamoDb = new DynamoDB(client); + } +} diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java new file mode 100644 index 0000000000..1f699d7ee3 --- /dev/null +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java @@ -0,0 +1,71 @@ +/** + * "Unpublished Work © 2017 Deere & Company. All Worldwide Rights Reserved. THIS MATERIAL IS THE PROPERTY OF DEERE & + * COMPANY. ALL USE, ALTERATIONS, DISCLOSURE, DISSEMINATION AND/OR REPRODUCTION NOT SPECIFICALLY AUTHORIZED BY DEERE & + * COMPANY IS PROHIBITED." + */ +package com.baeldung.lambda.dynamodb.bean; + +import com.google.gson.Gson; + +public class PersonRequest { + private int id; + private String firstName; + private String lastName; + private int age; + private String address; + + public static void main(String[] args) { + PersonRequest personRequest = new PersonRequest(); + personRequest.setId(1); + personRequest.setFirstName("John"); + personRequest.setLastName("Doe"); + personRequest.setAge(30); + personRequest.setAddress("United States"); + System.out.println(personRequest); + } + + public String toString() { + final Gson gson = new Gson(); + return gson.toJson(this); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java new file mode 100644 index 0000000000..19724adbfa --- /dev/null +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java @@ -0,0 +1,25 @@ +/** + * "Unpublished Work © 2017 Deere & Company. All Worldwide Rights Reserved. THIS MATERIAL IS THE PROPERTY OF DEERE & + * COMPANY. ALL USE, ALTERATIONS, DISCLOSURE, DISSEMINATION AND/OR REPRODUCTION NOT SPECIFICALLY AUTHORIZED BY DEERE & + * COMPANY IS PROHIBITED." + */ +package com.baeldung.lambda.dynamodb.bean; + +import com.google.gson.Gson; + +public class PersonResponse { + private String message; + + public String toString() { + final Gson gson = new Gson(); + return gson.toJson(this); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} From a04c4213054150d5691d66e5aacb52a04f8f5041 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Date: Fri, 10 Feb 2017 18:13:32 +0530 Subject: [PATCH 096/192] BAEL - 326 - Add section about file upload with additional form data (#1105) --- .../com/baeldung/model/FormDataWithFile.java | 35 +++++++++++++ .../web/controller/FileUploadController.java | 20 +++++++ .../webapp/WEB-INF/view/fileUploadForm.jsp | 52 +++++++++++++++++++ .../webapp/WEB-INF/view/fileUploadView.jsp | 43 +++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/model/FormDataWithFile.java diff --git a/spring-mvc-java/src/main/java/com/baeldung/model/FormDataWithFile.java b/spring-mvc-java/src/main/java/com/baeldung/model/FormDataWithFile.java new file mode 100644 index 0000000000..29925a592d --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/model/FormDataWithFile.java @@ -0,0 +1,35 @@ +package com.baeldung.model; + +import org.springframework.web.multipart.MultipartFile; + +public class FormDataWithFile { + + private String name; + private String email; + private MultipartFile file; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public MultipartFile getFile() { + return file; + } + + public void setFile(MultipartFile file) { + this.file = file; + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java index 61bccb21aa..b357b9270f 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/FileUploadController.java @@ -2,11 +2,14 @@ package com.baeldung.web.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.ModelAttribute; 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.multipart.MultipartFile; +import com.baeldung.model.FormDataWithFile; + @Controller public class FileUploadController { @@ -29,4 +32,21 @@ public class FileUploadController { modelMap.addAttribute("files", files); return "fileUploadView"; } + + @RequestMapping(value = "/uploadFileWithAddtionalData", method = RequestMethod.POST) + public String submit(@RequestParam final MultipartFile file, @RequestParam final String name, @RequestParam final String email, final ModelMap modelMap) { + + modelMap.addAttribute("name", name); + modelMap.addAttribute("email", email); + modelMap.addAttribute("file", file); + return "fileUploadView"; + } + + @RequestMapping(value = "/uploadFileModelAttribute", method = RequestMethod.POST) + public String submit(@ModelAttribute final FormDataWithFile formDataWithFile, final ModelMap modelMap) { + + modelMap.addAttribute("formDataWithFile", formDataWithFile); + return "fileUploadView"; + } + } diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp index 1414b824ff..41b7c09629 100644 --- a/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp +++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadForm.jsp @@ -49,6 +49,58 @@ + +
+ +

Fill the Form and Select a File (@RequestParam)

+ + + + + + + + + + + + + + + + + + + +
Name
Email
Select a file to upload
+ +
+ +
+ +

Fill the Form and Select a File (@ModelAttribute)

+ + + + + + + + + + + + + + + + + + + +
Name
Email
Select a file to upload
+ +
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp index d6f748c6af..696af4c4aa 100644 --- a/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp +++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/fileUploadView.jsp @@ -32,5 +32,48 @@ +
+ +

Submitted File with Data (@RequestParam)

+ + + + + + + + + + + + + + + + + +
Name :${name}
Email :${email}
OriginalFileName :${file.originalFilename}
Type :${file.contentType}
+ +
+ +

Submitted File with Data (@ModelAttribute)

+ + + + + + + + + + + + + + + + + +
Name :${formDataWithFile.name}
Email :${formDataWithFile.email}
OriginalFileName :${formDataWithFile.file.originalFilename}
Type :${formDataWithFile.file.contentType}
\ No newline at end of file From 67fcde1009182c85ae1efb074e4d8353acfbd06a Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Fri, 10 Feb 2017 20:26:18 -0600 Subject: [PATCH 097/192] BAEL-651: Fixed the custom voter application --- .../src/main/java/org/baeldung/voter/WebSecurityConfig.java | 4 ++-- .../src/main/java/org/baeldung/voter/XmlSecurityConfig.java | 4 ++-- .../{spring-security.xml => spring-security-custom-voter.xml} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename spring-security-mvc-boot/src/main/resources/{spring-security.xml => spring-security-custom-voter.xml} (98%) diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java index 495567c7b2..06fb4d2316 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java @@ -18,8 +18,8 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import java.util.Arrays; import java.util.List; -//@Configuration -//@EnableWebSecurity +@Configuration +@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java index 124513d317..bee1381778 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java @@ -6,8 +6,8 @@ import org.springframework.context.annotation.ImportResource; /** * Created by ambrusadrianz on 09/10/2016. */ -@Configuration -@ImportResource({ "classpath:spring-security.xml" }) +//@Configuration +//@ImportResource({ "classpath:spring-security-custom-voter.xml" }) public class XmlSecurityConfig { public XmlSecurityConfig() { super(); diff --git a/spring-security-mvc-boot/src/main/resources/spring-security.xml b/spring-security-mvc-boot/src/main/resources/spring-security-custom-voter.xml similarity index 98% rename from spring-security-mvc-boot/src/main/resources/spring-security.xml rename to spring-security-mvc-boot/src/main/resources/spring-security-custom-voter.xml index 83bc14dda7..0b334a3694 100644 --- a/spring-security-mvc-boot/src/main/resources/spring-security.xml +++ b/spring-security-mvc-boot/src/main/resources/spring-security-custom-voter.xml @@ -4,7 +4,7 @@ xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation=" http://www.springframework.org/schema/security - http://www.springframework.org/schema/security/spring-security-4.2.xsd + http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> From 29c0fd837133da0c32dcdb3aba0ece6afefc7161 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 11 Feb 2017 14:00:52 +0200 Subject: [PATCH 098/192] minor formatting work --- .../com/baeldung/mdc/TransactionFactory.java | 22 ++-- .../java/com/baeldung/mdc/TransferDemo.java | 8 +- .../controller/JBossLoggingController.java | 1 - .../java/com/baeldung/mdc/log4j/Demo.java | 2 +- .../java/com/baeldung/mdc/log4j2/Demo.java | 2 +- .../java/com/baeldung/mdc/slf4j/Demo.java | 2 +- .../rxjava/RxJavaBackpressureTest.java | 121 ++++++------------ .../com/baeldung/rxjava/RxJavaTesting.java | 53 +++----- .../main/java/org/baeldung/Application.java | 2 +- .../MultipleLoginApplication.java | 10 +- .../MultipleLoginSecurityConfig.java | 76 ++--------- .../org/baeldung/voter/XmlSecurityConfig.java | 4 +- 12 files changed, 99 insertions(+), 204 deletions(-) diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java index ec1887eea6..0904e4603f 100644 --- a/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java +++ b/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java @@ -7,15 +7,15 @@ import java.util.UUID; public class TransactionFactory { - private static final String[] NAMES = {"John", "Susan", "Marc", "Samantha"}; - private static long nextId = 1; - - public Transfer newInstance() { - String transactionId = String.valueOf( nextId++ ); - String owner = NAMES[ (int) floor(random()*NAMES.length) ]; - long amount = (long) (random()*1500 + 500); - Transfer tx = new Transfer(transactionId, owner, amount); - return tx; - } - + private static final String[] NAMES = { "John", "Susan", "Marc", "Samantha" }; + private static long nextId = 1; + + public Transfer newInstance() { + String transactionId = String.valueOf(nextId++); + String owner = NAMES[(int) floor(random() * NAMES.length)]; + long amount = (long) (random() * 1500 + 500); + Transfer tx = new Transfer(transactionId, owner, amount); + return tx; + } + } diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java b/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java index daf256007c..259e9a8c5c 100644 --- a/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java +++ b/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java @@ -18,11 +18,11 @@ public class TransferDemo { for (int i = 0; i < 10; i++) { Transfer tx = transactionFactory.newInstance(); - - //Runnable task = new Log4JRunnable(tx); - //Runnable task = new Log4J2Runnable(tx); + + // Runnable task = new Log4JRunnable(tx); + // Runnable task = new Log4J2Runnable(tx); Runnable task = new Slf4jRunnable(tx); - + executor.submit(task); } diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java b/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java index b024f3ec81..e581c45cd3 100644 --- a/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java +++ b/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java @@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.RestController; import com.baeldung.ndc.Investment; import com.baeldung.ndc.service.InvestmentService; - @RestController public class JBossLoggingController { @Autowired diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java b/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java index f9a210606f..665168452a 100644 --- a/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java +++ b/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java @@ -17,7 +17,7 @@ public class Demo { TransactionFactory transactionFactory = new TransactionFactory(); for (int i = 0; i < 10; i++) { Transfer tx = transactionFactory.newInstance(); - Runnable task = new Log4JRunnable(tx); + Runnable task = new Log4JRunnable(tx); executor.submit(task); } executor.shutdown(); diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java b/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java index 3f7c1d37d5..78c48c2a83 100644 --- a/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java +++ b/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java @@ -21,7 +21,7 @@ public class Demo { TransactionFactory transactionFactory = new TransactionFactory(); for (int i = 0; i < 10; i++) { Transfer tx = transactionFactory.newInstance(); - Runnable task = new Log4J2Runnable(tx); + Runnable task = new Log4J2Runnable(tx); executor.submit(task); } executor.shutdown(); diff --git a/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java b/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java index 98db698f47..de890f9f5d 100644 --- a/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java +++ b/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java @@ -21,7 +21,7 @@ public class Demo { TransactionFactory transactionFactory = new TransactionFactory(); for (int i = 0; i < 10; i++) { Transfer tx = transactionFactory.newInstance(); - Runnable task = new Slf4jRunnable(tx); + Runnable task = new Slf4jRunnable(tx); executor.submit(task); } executor.shutdown(); diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java index 33f94a9c6f..8a495650b3 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureTest.java @@ -18,154 +18,113 @@ public class RxJavaBackpressureTest { @Test public void givenColdObservable_shouldNotThrowException() { - //given + // given TestSubscriber testSubscriber = new TestSubscriber<>(); - //when - Observable - .range(1, 1_000_000) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // when + Observable.range(1, 1_000_000).observeOn(Schedulers.computation()).subscribe(testSubscriber); - //then + // then testSubscriber.awaitTerminalEvent(); - assertTrue(testSubscriber - .getOnErrorEvents() - .size() == 0); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); } @Test public void givenHotObservable_whenBackpressureNotDefined_shouldTrowException() { - //given + // given TestSubscriber testSubscriber = new TestSubscriber<>(); PublishSubject source = PublishSubject. create(); - source - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + source.observeOn(Schedulers.computation()).subscribe(testSubscriber); - //when - IntStream - .range(0, 1_000_000) - .forEach(source::onNext); + // when + IntStream.range(0, 1_000_000).forEach(source::onNext); - //then + // then testSubscriber.awaitTerminalEvent(); testSubscriber.assertError(MissingBackpressureException.class); } @Test public void givenHotObservable_whenWindowIsDefined_shouldNotThrowException() { - //given + // given TestSubscriber> testSubscriber = new TestSubscriber<>(); PublishSubject source = PublishSubject. create(); - //when - source - .window(500) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // when + source.window(500).observeOn(Schedulers.computation()).subscribe(testSubscriber); - IntStream - .range(0, 1_000) - .forEach(source::onNext); + IntStream.range(0, 1_000).forEach(source::onNext); - //then + // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber - .getOnErrorEvents() - .size() == 0); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); } @Test public void givenHotObservable_whenBufferIsDefined_shouldNotThrowException() { - //given + // given TestSubscriber> testSubscriber = new TestSubscriber<>(); PublishSubject source = PublishSubject. create(); - //when - source - .buffer(1024) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // when + source.buffer(1024).observeOn(Schedulers.computation()).subscribe(testSubscriber); - IntStream - .range(0, 1_000) - .forEach(source::onNext); + IntStream.range(0, 1_000).forEach(source::onNext); - - //then + // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber - .getOnErrorEvents() - .size() == 0); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); } @Test public void givenHotObservable_whenSkippingOperationIsDefined_shouldNotThrowException() { - //given + // given TestSubscriber testSubscriber = new TestSubscriber<>(); PublishSubject source = PublishSubject. create(); - //when + // when source.sample(100, TimeUnit.MILLISECONDS) - // .throttleFirst(100, TimeUnit.MILLISECONDS) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // .throttleFirst(100, TimeUnit.MILLISECONDS) + .observeOn(Schedulers.computation()).subscribe(testSubscriber); - IntStream - .range(0, 1_000) - .forEach(source::onNext); + IntStream.range(0, 1_000).forEach(source::onNext); - - //then + // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber - .getOnErrorEvents() - .size() == 0); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); } @Test public void givenHotObservable_whenOnBackpressureBufferDefined_shouldNotThrowException() { - //given + // given TestSubscriber testSubscriber = new TestSubscriber<>(); - //when - Observable - .range(1, 1_000_000) - .onBackpressureBuffer(16, () -> {}, BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST) - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // when + Observable.range(1, 1_000_000).onBackpressureBuffer(16, () -> { + }, BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST).observeOn(Schedulers.computation()).subscribe(testSubscriber); - //then + // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber - .getOnErrorEvents() - .size() == 0); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); } @Test public void givenHotObservable_whenOnBackpressureDropDefined_shouldNotThrowException() { - //given + // given TestSubscriber testSubscriber = new TestSubscriber<>(); - //when - Observable - .range(1, 1_000_000) - .onBackpressureDrop() - .observeOn(Schedulers.computation()) - .subscribe(testSubscriber); + // when + Observable.range(1, 1_000_000).onBackpressureDrop().observeOn(Schedulers.computation()).subscribe(testSubscriber); - //then + // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); - assertTrue(testSubscriber - .getOnErrorEvents() - .size() == 0); + assertTrue(testSubscriber.getOnErrorEvents().size() == 0); } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java index 67f6e1c2b8..91c8ed540e 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaTesting.java @@ -13,22 +13,18 @@ import java.util.concurrent.TimeUnit; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; - public class RxJavaTesting { @Test public void givenObservable_whenZip_shouldAssertBlockingInASameThread() { - //given + // given List letters = Arrays.asList("A", "B", "C", "D", "E"); List results = new ArrayList<>(); - Observable observable = Observable - .from(letters) - .zipWith(Observable.range(1, Integer.MAX_VALUE), - (string, index) -> index + "-" + string); + Observable observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), (string, index) -> index + "-" + string); - //when + // when observable.subscribe(results::add); - //then + // then assertThat(results, notNullValue()); assertThat(results, hasSize(5)); assertThat(results, hasItems("1-A", "2-B", "3-C", "4-D", "5-E")); @@ -36,19 +32,16 @@ public class RxJavaTesting { @Test public void givenObservable_whenZip_shouldAssertOnTestSubscriber() { - //given + // given List letters = Arrays.asList("A", "B", "C", "D", "E"); TestSubscriber subscriber = new TestSubscriber<>(); - Observable observable = Observable - .from(letters) - .zipWith(Observable.range(1, Integer.MAX_VALUE), - ((string, index) -> index + "-" + string)); + Observable observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)); - //when + // when observable.subscribe(subscriber); - //then + // then subscriber.assertCompleted(); subscriber.assertNoErrors(); subscriber.assertValueCount(5); @@ -57,52 +50,45 @@ public class RxJavaTesting { @Test public void givenTestObserver_whenExceptionWasThrowsOnObservable_observerShouldGetError() { - //given + // given List letters = Arrays.asList("A", "B", "C", "D", "E"); TestSubscriber subscriber = new TestSubscriber<>(); + Observable observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)).concatWith(Observable.error(new RuntimeException("error in Observable"))); - Observable observable = Observable - .from(letters) - .zipWith(Observable.range(1, Integer.MAX_VALUE), - ((string, index) -> index + "-" + string)) - .concatWith(Observable.error(new RuntimeException("error in Observable"))); - - //when + // when observable.subscribe(subscriber); - //then + // then subscriber.assertError(RuntimeException.class); subscriber.assertNotCompleted(); } @Test public void givenObservableThatEmitsEventPerSecond_whenUseAdvanceByTime_shouldEmitEventPerSecond() { - //given + // given List letters = Arrays.asList("A", "B", "C", "D", "E"); TestScheduler scheduler = new TestScheduler(); TestSubscriber subscriber = new TestSubscriber<>(); Observable tick = Observable.interval(1, TimeUnit.SECONDS, scheduler); - Observable observable = Observable.from(letters) - .zipWith(tick, (string, index) -> index + "-" + string); + Observable observable = Observable.from(letters).zipWith(tick, (string, index) -> index + "-" + string); - observable.subscribeOn(scheduler) - .subscribe(subscriber); + observable.subscribeOn(scheduler).subscribe(subscriber); - //expect + // expect subscriber.assertNoValues(); subscriber.assertNotCompleted(); - //when + // when scheduler.advanceTimeBy(1, TimeUnit.SECONDS); - //then + // then subscriber.assertNoErrors(); subscriber.assertValueCount(1); subscriber.assertValues("0-A"); - //when + // when scheduler.advanceTimeTo(6, TimeUnit.SECONDS); subscriber.assertCompleted(); subscriber.assertNoErrors(); @@ -110,4 +96,3 @@ public class RxJavaTesting { assertThat(subscriber.getOnNextEvents(), hasItems("0-A", "1-B", "2-C", "3-D", "4-E")); } } - diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java index 072a6ca4fe..03de5897f5 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.FilterType; @Configuration @EnableAutoConfiguration -@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*")}) +@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*") }) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java index 23fda0547f..836336eb71 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java @@ -14,9 +14,9 @@ public class MultipleLoginApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(MultipleLoginApplication.class, args); } - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(MultipleLoginApplication.class); - } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(MultipleLoginApplication.class); + } } \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java index d7dbf17723..8327e7e5d3 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java @@ -21,14 +21,8 @@ public class MultipleLoginSecurityConfig { @Bean public UserDetailsService userDetailsService() throws Exception { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); - manager.createUser(User.withUsername("user") - .password("userPass") - .roles("USER") - .build()); - manager.createUser(User.withUsername("admin") - .password("adminPass") - .roles("ADMIN") - .build()); + manager.createUser(User.withUsername("user").password("userPass").roles("USER").build()); + manager.createUser(User.withUsername("admin").password("adminPass").roles("ADMIN").build()); return manager; } @@ -42,37 +36,16 @@ public class MultipleLoginSecurityConfig { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("admin") - .password("admin") - .roles("ADMIN"); + auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/admin*") - .authorizeRequests() - .anyRequest() - .hasRole("ADMIN") - // log in - .and() - .formLogin() - .loginPage("/loginAdmin") - .loginProcessingUrl("/admin_login") - .failureUrl("/loginAdmin?error=loginError") - .defaultSuccessUrl("/adminPage") - // logout - .and() - .logout() - .logoutUrl("/admin_logout") - .logoutSuccessUrl("/protectedLinks") - .deleteCookies("JSESSIONID") - .and() - .exceptionHandling() - .accessDeniedPage("/403") - .and() - .csrf() - .disable(); + http.antMatcher("/admin*").authorizeRequests().anyRequest().hasRole("ADMIN") + // log in + .and().formLogin().loginPage("/loginAdmin").loginProcessingUrl("/admin_login").failureUrl("/loginAdmin?error=loginError").defaultSuccessUrl("/adminPage") + // logout + .and().logout().logoutUrl("/admin_logout").logoutSuccessUrl("/protectedLinks").deleteCookies("JSESSIONID").and().exceptionHandling().accessDeniedPage("/403").and().csrf().disable(); } } @@ -86,36 +59,15 @@ public class MultipleLoginSecurityConfig { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("user") - .password("user") - .roles("USER"); + auth.inMemoryAuthentication().withUser("user").password("user").roles("USER"); } protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/user*") - .authorizeRequests() - .anyRequest() - .hasRole("USER") - // log in - .and() - .formLogin() - .loginPage("/loginUser") - .loginProcessingUrl("/user_login") - .failureUrl("/loginUser?error=loginError") - .defaultSuccessUrl("/userPage") - // logout - .and() - .logout() - .logoutUrl("/user_logout") - .logoutSuccessUrl("/protectedLinks") - .deleteCookies("JSESSIONID") - .and() - .exceptionHandling() - .accessDeniedPage("/403") - .and() - .csrf() - .disable(); + http.antMatcher("/user*").authorizeRequests().anyRequest().hasRole("USER") + // log in + .and().formLogin().loginPage("/loginUser").loginProcessingUrl("/user_login").failureUrl("/loginUser?error=loginError").defaultSuccessUrl("/userPage") + // logout + .and().logout().logoutUrl("/user_logout").logoutSuccessUrl("/protectedLinks").deleteCookies("JSESSIONID").and().exceptionHandling().accessDeniedPage("/403").and().csrf().disable(); } } diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java index bee1381778..8041585f42 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java @@ -6,8 +6,8 @@ import org.springframework.context.annotation.ImportResource; /** * Created by ambrusadrianz on 09/10/2016. */ -//@Configuration -//@ImportResource({ "classpath:spring-security-custom-voter.xml" }) +// @Configuration +// @ImportResource({ "classpath:spring-security-custom-voter.xml" }) public class XmlSecurityConfig { public XmlSecurityConfig() { super(); From 63b042a9d8d6a3eb3ff2b52a2c0f8974b521782e Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 11 Feb 2017 14:07:50 +0200 Subject: [PATCH 099/192] maven cleanup --- spring-rest-docs/pom.xml | 4 +--- spring-security-mvc-boot/pom.xml | 2 +- .../src/main/java/org/baeldung/voter/VoterApplication.java | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/spring-rest-docs/pom.xml b/spring-rest-docs/pom.xml index f8945ff922..6714617d99 100644 --- a/spring-rest-docs/pom.xml +++ b/spring-rest-docs/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.example - demo + spring-rest-docs 0.0.1-SNAPSHOT jar @@ -45,13 +45,11 @@ org.springframework.restdocs spring-restdocs-mockmvc - ${restdocs.version} test com.jayway.jsonpath json-path - ${jsonpath.version}
diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index b8563880b3..591ededccf 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 1.4.4.RELEASE diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java index c032a9634e..d2078e6115 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java @@ -4,7 +4,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; @Configuration @EnableAutoConfiguration From c670ac916623acc7b738c0f7f28119f4b3c23062 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sat, 11 Feb 2017 20:59:57 +0530 Subject: [PATCH 100/192] adding more functionality in split/join, added chars() usage (#1155) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality --- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.9799201796740292 | 0 .../baeldung/streamApi/JoinerSplitter.java | 13 ++++++++ .../baeldung/stream/JoinerSplitterTest.java | 31 +++++++++++++++++-- 7 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 core-java/0.004102810554955205 create mode 100644 core-java/0.04832801936270381 create mode 100644 core-java/0.5633433244738808 create mode 100644 core-java/0.6256429734439612 create mode 100644 core-java/0.9799201796740292 diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java index 5183921dea..10bee06f1e 100644 --- a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java +++ b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java @@ -14,10 +14,23 @@ public class JoinerSplitter { .collect(Collectors.joining(",")); } + public static String joinWithPrefixPostFix ( String[] arrayOfString ) { + return Arrays.asList(arrayOfString) + .stream() + .map(x -> x) + .collect(Collectors.joining(",","[","]")); + } + public static List split ( String str ) { return Stream.of(str.split(",")) .map (elem -> new String(elem)) .collect(Collectors.toList()); } + public static List splitToListOfChar ( String str ) { + return str.chars() + .mapToObj(item -> (char) item) + .collect(Collectors.toList()); + } + } diff --git a/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java b/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java index 19d945f836..b995976b2c 100644 --- a/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java +++ b/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java @@ -13,7 +13,9 @@ public class JoinerSplitterTest { @Test public void provided_array_convert_to_stream_and_convert_to_string() { + String[] programming_languages = {"java", "python", "nodejs", "ruby"}; + String expectation = "java,python,nodejs,ruby"; String result = JoinerSplitter.join(programming_languages); @@ -21,7 +23,17 @@ public class JoinerSplitterTest { } @Test - public void provided_list_convert_to_stream_and_convert_to_list() { + public void provided_array_convert_to_stream_and_convert_to_prefixPostfixString() { + String[] programming_languages = {"java", "python", + "nodejs", "ruby"}; + String expectation = "[java,python,nodejs,ruby]"; + + String result = JoinerSplitter.joinWithPrefixPostFix(programming_languages); + assertEquals(result, expectation); + } + + @Test + public void provided_string_convert_to_stream_and_convert_to_listOfString() { String programming_languages = "java,python,nodejs,ruby"; List expectation = new ArrayList(); @@ -34,5 +46,20 @@ public class JoinerSplitterTest { assertEquals(result, expectation); } - + + @Test + public void provided_string_convert_to_stream_and_convert_to_listOfChar() { + String programming_languages = "java,python,nodejs,ruby"; + + List expectation = new ArrayList(); + char[] charArray = programming_languages.toCharArray(); + for (char c : charArray) { + expectation.add(c); + } + + List result = JoinerSplitter.splitToListOfChar(programming_languages); + assertEquals(result, expectation); + + } + } From 70cc228f1e5761c724bbc86dc6665a99a312320b Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 11 Feb 2017 16:53:26 +0100 Subject: [PATCH 101/192] BAEL-12 advanced http client --- httpclient/pom.xml | 13 +- .../HttpClientAdvancedConfiguration.java | 137 ++++++++++++++++++ 2 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java diff --git a/httpclient/pom.xml b/httpclient/pom.xml index be0daae995..eec705b224 100644 --- a/httpclient/pom.xml +++ b/httpclient/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 com.baeldung httpclient @@ -113,6 +114,13 @@ ${mockito.version} test + + com.github.tomakehurst + wiremock + ${wiremock.version} + test + + @@ -145,7 +153,7 @@ **/*LiveTest.java - + @@ -202,6 +210,7 @@ 1.3 4.12 1.10.19 + 2.5.1 4.4.5 4.5.2 diff --git a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java new file mode 100644 index 0000000000..5bb86de2ac --- /dev/null +++ b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java @@ -0,0 +1,137 @@ +package org.baeldung.httpclient.advancedconfig; + + +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.DefaultProxyRoutePlanner; +import org.junit.Rule; +import org.junit.Test; + +import java.io.IOException; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.junit.Assert.assertEquals; + +public class HttpClientAdvancedConfiguration { + + @Rule + public WireMockRule serviceMock = new WireMockRule(8089); + + @Rule + public WireMockRule proxyMock = new WireMockRule(8090); + + @Test + public void givenClientWithCustomUserAgentHeader_whenExecuteRequest_shouldReturn200() throws IOException { + //given + serviceMock.stubFor(get(urlEqualTo("/detail")) + .withHeader("User-Agent", equalTo("BaeldungAgent/1.0")) + .willReturn(aResponse() + .withStatus(200))); + + String userAgent = "BaeldungAgent/1.0"; + HttpClient httpClient = HttpClients.createDefault(); + final HttpGet httpGet = new HttpGet("http://localhost:8089/detail"); + httpGet.setHeader(HttpHeaders.USER_AGENT, userAgent); + + //when + HttpResponse response = httpClient.execute(httpGet); + + //then + assertEquals(response.getStatusLine().getStatusCode(), 200); + } + + @Test + public void givenClientThatSendDataInBody_whenSendXmlInBody_shouldReturn200() throws IOException { + //given + serviceMock.stubFor(post(urlEqualTo("/person")) + .withHeader("Content-Type", equalTo("application/xml")) + .withRequestBody(equalTo("1")) + .willReturn(aResponse() + .withStatus(200))); + + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost("http://localhost:8089/person"); + httpPost.setHeader("Content-Type", "application/xml"); + StringEntity xmlEntity = new StringEntity("1"); + httpPost.setEntity(xmlEntity); + + //when + HttpResponse response = httpClient.execute(httpPost); + + //then + assertEquals(response.getStatusLine().getStatusCode(), 200); + + } + + @Test + public void givenServerThatIsBehindProxy_whenClientIsConfiguredToSendRequestViaProxy_shouldReturn200() throws IOException { + //given + proxyMock.stubFor(get(urlMatching(".*")) + .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); + + serviceMock.stubFor(get(urlEqualTo("/private")) + .willReturn(aResponse().withStatus(200))); + + + HttpHost proxy = new HttpHost("localhost", 8090); + DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); + HttpClient httpclient = HttpClients.custom() + .setRoutePlanner(routePlanner) + .build(); + + //when + final HttpGet httpGet = new HttpGet("http://localhost:8089/private"); + HttpResponse response = httpclient.execute(httpGet); + + //then + assertEquals(response.getStatusLine().getStatusCode(), 200); + proxyMock.verify(getRequestedFor(urlEqualTo("/private"))); + serviceMock.verify(getRequestedFor(urlEqualTo("/private"))); + } + + @Test + public void givenServerThatIsBehindAuthorizationProxy_whenClientSendRequest_shouldAuthorizeProperly() throws IOException { + //given + proxyMock.stubFor(get(urlMatching(".*")) + .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); + + serviceMock.stubFor(get(urlEqualTo("/private/username_admin/secret_password")) + .willReturn(aResponse().withStatus(200))); + + + HttpHost proxy = new HttpHost("localhost", 8090); + DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); + + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(new AuthScope(proxy), + new UsernamePasswordCredentials("username_admin", "secret_password")); + + HttpClient httpclient = HttpClients.custom() + .setRoutePlanner(routePlanner) + .setDefaultCredentialsProvider(credentialsProvider) + .build(); + + + //when + final HttpGet httpGet = new HttpGet("http://localhost:8089/private/username_admin/secret_password"); + HttpResponse response = httpclient.execute(httpGet); + + //then + assertEquals(response.getStatusLine().getStatusCode(), 200); + proxyMock.verify(getRequestedFor(urlEqualTo("/private/username_admin/secret_password"))); + serviceMock.verify(getRequestedFor(urlEqualTo("/private/username_admin/secret_password"))); + } + + +} From 34bfeed011ad8429d8a72071733a1040e9cc1eac Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 11 Feb 2017 17:15:08 +0100 Subject: [PATCH 102/192] BAEL-12 end-to-end test case for auth proxy --- .../HttpClientAdvancedConfiguration.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java index 5bb86de2ac..1bb176876c 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java @@ -7,11 +7,15 @@ import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.AuthCache; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.entity.StringEntity; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.DefaultProxyRoutePlanner; @@ -103,20 +107,32 @@ public class HttpClientAdvancedConfiguration { @Test public void givenServerThatIsBehindAuthorizationProxy_whenClientSendRequest_shouldAuthorizeProperly() throws IOException { //given - proxyMock.stubFor(get(urlMatching(".*")) + proxyMock.stubFor(get(urlMatching("/private")) .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); - - serviceMock.stubFor(get(urlEqualTo("/private/username_admin/secret_password")) + serviceMock.stubFor(get(urlEqualTo("/private")) .willReturn(aResponse().withStatus(200))); HttpHost proxy = new HttpHost("localhost", 8090); DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); + // Client credentials CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(new AuthScope(proxy), new UsernamePasswordCredentials("username_admin", "secret_password")); + + // Create AuthCache instance + AuthCache authCache = new BasicAuthCache(); + + // Generate BASIC scheme object and add it to the local auth cache + BasicScheme basicAuth = new BasicScheme(); + authCache.put(proxy, basicAuth); + HttpClientContext context = HttpClientContext.create(); + context.setCredentialsProvider(credentialsProvider); + context.setAuthCache(authCache); + + HttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner) .setDefaultCredentialsProvider(credentialsProvider) @@ -124,13 +140,13 @@ public class HttpClientAdvancedConfiguration { //when - final HttpGet httpGet = new HttpGet("http://localhost:8089/private/username_admin/secret_password"); - HttpResponse response = httpclient.execute(httpGet); + final HttpGet httpGet = new HttpGet("http://localhost:8089/private"); + HttpResponse response = httpclient.execute(httpGet, context); //then assertEquals(response.getStatusLine().getStatusCode(), 200); - proxyMock.verify(getRequestedFor(urlEqualTo("/private/username_admin/secret_password"))); - serviceMock.verify(getRequestedFor(urlEqualTo("/private/username_admin/secret_password"))); + proxyMock.verify(getRequestedFor(urlEqualTo("/private")).withHeader("Authorization", containing("Basic"))); + serviceMock.verify(getRequestedFor(urlEqualTo("/private"))); } From 5218116a80abba1bfee47875ef7221ba8d18b154 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sat, 11 Feb 2017 18:40:14 +0100 Subject: [PATCH 103/192] Reformat JoinerSplitter --- .../baeldung/streamApi/JoinerSplitter.java | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java index 10bee06f1e..52ffc61799 100644 --- a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java +++ b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java @@ -7,30 +7,34 @@ import java.util.stream.Stream; public class JoinerSplitter { - public static String join ( String[] arrayOfString ) { - return Arrays.asList(arrayOfString) - .stream() - .map(x -> x) - .collect(Collectors.joining(",")); - } - - public static String joinWithPrefixPostFix ( String[] arrayOfString ) { - return Arrays.asList(arrayOfString) - .stream() - .map(x -> x) - .collect(Collectors.joining(",","[","]")); - } - - public static List split ( String str ) { - return Stream.of(str.split(",")) - .map (elem -> new String(elem)) - .collect(Collectors.toList()); - } - - public static List splitToListOfChar ( String str ) { - return str.chars() - .mapToObj(item -> (char) item) - .collect(Collectors.toList()); - } - + public static String join(String[] arrayOfString) { + return Arrays + .asList(arrayOfString) + .stream() + .map(x -> x) + .collect(Collectors.joining(",")); + } + + public static String joinWithPrefixPostFix(String[] arrayOfString) { + return Arrays + .asList(arrayOfString) + .stream() + .map(x -> x) + .collect(Collectors.joining(",", "[", "]")); + } + + public static List split(String str) { + return Stream + .of(str.split(",")) + .map(elem -> new String(elem)) + .collect(Collectors.toList()); + } + + public static List splitToListOfChar(String str) { + return str + .chars() + .mapToObj(item -> (char) item) + .collect(Collectors.toList()); + } + } From 23696a24bd69f0febb433d3ef9e0224ec6e26ebb Mon Sep 17 00:00:00 2001 From: dhruba619 Date: Sat, 11 Feb 2017 23:57:50 +0530 Subject: [PATCH 104/192] BAEL-183 Updated after review --- .../test/comparison/DependentTests.java | 62 +++---- .../test/comparison/DivisibilityTest.java | 21 +++ .../comparison/MyParameterisedUnitTest.java | 29 ++-- .../comparison/MyParameterisedUnitTestNg.java | 129 +++++++-------- .../com/baeldung/test/comparison/MyTest1.java | 12 -- .../com/baeldung/test/comparison/MyTest2.java | 10 -- .../test/comparison/RegistrationTest.java | 8 +- .../baeldung/test/comparison/SignInTest.java | 10 +- .../test/comparison/StringCaseTest.java | 22 +++ .../{MyTest5.java => SuiteTest.java} | 7 +- .../test/comparison/SummationServiceTest.java | 39 +++-- .../SummationServiceTestTestNg.java | 151 +++++++++--------- .../baeldung/test/comparison/TimeOutTest.java | 9 +- .../test/java/temp/SummationServiceTest.java | 49 ++++++ 14 files changed, 309 insertions(+), 249 deletions(-) create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java delete mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyTest1.java delete mode 100644 core-java/src/test/java/com/baeldung/test/comparison/MyTest2.java create mode 100644 core-java/src/test/java/com/baeldung/test/comparison/StringCaseTest.java rename core-java/src/test/java/com/baeldung/test/comparison/{MyTest5.java => SuiteTest.java} (57%) create mode 100644 core-java/src/test/java/temp/SummationServiceTest.java diff --git a/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java b/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java index 6b0394a368..3ef4949067 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java +++ b/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java @@ -5,42 +5,42 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class DependentTests { - - private EmailValidator emailValidator; - private LoginValidator loginValidator; - private String validEmail = "abc@qwe.com"; - - @BeforeClass - public void setup(){ - emailValidator = new EmailValidator(); - loginValidator = new LoginValidator(); - } - - @Test - public void validEmailTest() { - boolean valid = emailValidator.validate(validEmail); - Assert.assertEquals(valid, true); - } - @Test(dependsOnMethods={"validEmailTest"}) - public void validateLogin() { - boolean valid = loginValidator.validate(); - Assert.assertEquals(valid, true); - } + private EmailValidator emailValidator; + private LoginValidator loginValidator; + private String validEmail = "abc@qwe.com"; + + @BeforeClass + public void setup() { + emailValidator = new EmailValidator(); + loginValidator = new LoginValidator(); + } + + @Test + public void givenEmail_ifValid_thenTrue() { + boolean valid = emailValidator.validate(validEmail); + Assert.assertEquals(valid, true); + } + + @Test(dependsOnMethods = { "givenEmail_ifValid_thenTrue" }) + public void givenValidEmail_whenLoggedin_thenTrue() { + boolean valid = loginValidator.validate(); + Assert.assertEquals(valid, true); + } } -class EmailValidator{ +class EmailValidator { + + public boolean validate(String validEmail) { + return true; + } - public boolean validate(String validEmail) { - return true; - } - } -class LoginValidator{ +class LoginValidator { + + public boolean validate() { + return true; + } - public boolean validate() { - return true; - } - } diff --git a/core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java b/core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java new file mode 100644 index 0000000000..9ae13f5934 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java @@ -0,0 +1,21 @@ +package com.baeldung.test.comparison; + +import static org.junit.Assert.assertEquals; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class DivisibilityTest { + + private static int number; + + @BeforeClass + public static void setup() { + number = 40; + } + + @Test + public void givenNumber_whenDivisiblebyTwo_thenCorrect() { + assertEquals(number % 2, 0); + } +} diff --git a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java index 9e63956556..3372bbb577 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java +++ b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java @@ -12,39 +12,38 @@ import org.junit.runners.Parameterized.Parameters; @RunWith(value = Parameterized.class) public class MyParameterisedUnitTest { - + private String name; private NameCheck nameCheck; - + @Before public void initialSetup() { nameCheck = new NameCheck(); } - + public MyParameterisedUnitTest(String myName) { this.name = myName; } - + @Parameters public static Collection data() { - Object[][] data - = new Object[][] { { "Peter" }, { "Sam" }, { "Tim" }, { "Lucy" } }; + Object[][] data = new Object[][] { { "Peter" }, { "Sam" }, { "Tim" }, { "Lucy" } }; return Arrays.asList(data); } - + @Test - public void pushNameTest() { + public void givenName_whenValidLength_thenTrue() { boolean valid = nameCheck.nameCheck(name); Assert.assertEquals(valid, true); } } -class NameCheck{ +class NameCheck { + + public boolean nameCheck(String name) { + if (name.length() > 0) + return true; + return false; + } - public boolean nameCheck(String name) { - if(name.length()>0) - return true; - return false; - } - } diff --git a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java index d5e4465b3d..4096c3fb6f 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java +++ b/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java @@ -7,74 +7,75 @@ import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class MyParameterisedUnitTestNg { - - private PrimeNumberCheck primeNumberChecker; - - @BeforeClass - public void intialSetup(){ - primeNumberChecker = new PrimeNumberCheck(); - } - - @Test(enabled=false) - @Parameters({"num","expectedResult"}) - public void parameterCheckTest(int number,boolean expectedResult) { - Assert.assertEquals(expectedResult, - primeNumberChecker.validate(number)); - } - - @DataProvider(name = "test1") - public static Object[][] primeNumbers() { - return new Object[][] { - {2, true}, {6, false}, {19, true}, {22, false}, {23, true}}; - } - - @Test(dataProvider = "test1") - public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) { - Assert.assertEquals(expectedResult, - primeNumberChecker.validate(inputNumber)); - } - - @Test(dataProvider = "myDataProvider") - public void parameterCheckTest(User user) { - Assert.assertEquals("sam",user.getName()); - Assert.assertEquals(12,user.getAge()); - } - - @DataProvider(name = "myDataProvider") - public Object[][] parameterProvider() { - User usr = new User(); - usr.setName("sam"); - usr.setAge(12); - return new Object[][]{{usr}}; - } + + private PrimeNumberCheck primeNumberChecker; + + @BeforeClass + public void intialSetup() { + primeNumberChecker = new PrimeNumberCheck(); + } + + @Test(enabled = false) + @Parameters({ "num", "expectedResult" }) + public void givenNumber_ifPrime_thenCorrect(int number, boolean expectedResult) { + Assert.assertEquals(expectedResult, primeNumberChecker.validate(number)); + } + + @DataProvider(name = "test1") + public static Object[][] primeNumbers() { + return new Object[][] { { 2, true }, { 6, false }, { 19, true }, { 22, false }, { 23, true } }; + } + + @Test(dataProvider = "test1") + public void givenNumber_whenPrime_thenCorrect(Integer inputNumber, Boolean expectedResult) { + Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber)); + } + + @Test(dataProvider = "myDataProvider") + public void parameterCheckTest(User user) { + Assert.assertEquals("sam", user.getName()); + Assert.assertEquals(12, user.getAge()); + } + + @DataProvider(name = "myDataProvider") + public Object[][] parameterProvider() { + User usr = new User(); + usr.setName("sam"); + usr.setAge(12); + return new Object[][] { { usr } }; + } } -class PrimeNumberCheck{ +class PrimeNumberCheck { + + public Object validate(int number) { + for (int i = 2; i < number; i++) { + if (number % i == 0) + return false; + } + return true; + } - public Object validate(int number) { - for(int i=2;i numbers; - + private static List numbers; + @BeforeClass public static void initialize() { numbers = new ArrayList<>(); } - + @AfterClass public static void tearDown() { numbers = null; } - + @Before public void runBeforeEachTest() { numbers.add(1); numbers.add(2); numbers.add(3); } - + @After public void runAfterEachTest() { numbers.clear(); } - + @Test public void givenNumbers_sumEquals_thenCorrect() { - int sum = 0; - for (int num : numbers) - sum += num; + int sum = numbers.stream() + .reduce(0, Integer::sum); Assert.assertEquals(6, sum); } - + @Ignore @Test - public void givenEmptyList_sumEqualsZero_thenCorrect(){ - int sum = 0; - for (int num : numbers) - sum += num; - Assert.assertEquals(6, sum); - } - - @Test(expected = ArithmeticException.class) - public void calculateWithException() { - int i = 1/0; + public void givenEmptyList_sumEqualsZero_thenCorrect() { + int sum = numbers.stream() + .reduce(0, Integer::sum); + Assert.assertEquals(6, sum); + } + + @Test(expected = ArithmeticException.class) + public void givenNumber_whenThrowsException_thenCorrect() { + int i = 1 / 0; } } diff --git a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java b/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java index aecc790374..fb02f28d06 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java +++ b/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java @@ -13,89 +13,82 @@ import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class SummationServiceTestTestNg extends TestNG{ - - private List numbers; - - private int testCount=0; - - @BeforeClass - public void initialize() { - numbers = new ArrayList<>(); - } +public class SummationServiceTestTestNg extends TestNG { - @AfterClass - public void tearDown() { - numbers = null; - } + private List numbers; - @BeforeMethod - public void runBeforeEachTest() { - testCount++; - } + private int testCount = 0; - @AfterMethod - public void runAfterEachTest() { - - } - - @BeforeGroups("negative_tests") - public void runBeforeEachNegativeGroup() { - numbers.clear(); - } - - @BeforeGroups("regression") - public void runBeforeEachRegressionGroup() { - numbers.add(-11); - numbers.add(2); - } - - @BeforeGroups("positive_tests") - public void runBeforeEachPositiveGroup() { - numbers.add(1); - numbers.add(2); - numbers.add(3); - } - - @AfterGroups("positive_tests,regression,negative_tests") - public void runAfterEachGroup() { - numbers.clear(); - } - - @Test(groups="positive_tests",enabled=false) + @BeforeClass + public void initialize() { + numbers = new ArrayList<>(); + } + + @AfterClass + public void tearDown() { + numbers = null; + } + + @BeforeMethod + public void runBeforeEachTest() { + testCount++; + } + + @AfterMethod + public void runAfterEachTest() { + + } + + @BeforeGroups("negative_tests") + public void runBeforeEachNegativeGroup() { + numbers.clear(); + } + + @BeforeGroups("regression") + public void runBeforeEachRegressionGroup() { + numbers.add(-11); + numbers.add(2); + } + + @BeforeGroups("positive_tests") + public void runBeforeEachPositiveGroup() { + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + @AfterGroups("positive_tests,regression,negative_tests") + public void runAfterEachGroup() { + numbers.clear(); + } + + @Test(groups = "positive_tests", enabled = false) public void givenNumbers_sumEquals_thenCorrect() { - int sum = 0; - for (int num : numbers) - sum += num; + int sum = numbers.stream().reduce(0, Integer::sum); Assert.assertEquals(sum, 6); } - - @Test(groups="negative_tests") - public void givenEmptyList_sumEqualsZero_thenCorrect(){ - int sum = 0; - for (int num : numbers) - sum += num; - Assert.assertEquals(0, sum); - } - - @Test(groups = "regression") - public void givenNegativeNumber_sumLessthanZero_thenCorrect() { - int sum = 0; - for (int num : numbers) - sum += num; - System.out.println(sum); - Assert.assertTrue(sum<0);; - } - - @Test(groups="sanity") - public void givenNumbers_doSum(){ - - } - - @Test(expectedExceptions = ArithmeticException.class) - public void calculateWithException() { - int i = 1/0; - } - - + + @Test(groups = "negative_tests") + public void givenEmptyList_sumEqualsZero_thenCorrect() { + int sum = numbers.stream().reduce(0, Integer::sum); + Assert.assertEquals(0, sum); + } + + @Test(groups = "regression") + public void givenNegativeNumber_sumLessthanZero_thenCorrect() { + int sum = numbers.stream().reduce(0, Integer::sum); + Assert.assertTrue(sum < 0); + ; + } + + @Test(groups = "sanity") + public void givenNumbers_doSum() { + + } + + @Test(expectedExceptions = ArithmeticException.class) + public void givenNumber_whenThrowsException_thenCorrect() { + int i = 1 / 0; + } + } diff --git a/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java b/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java index baf2db9521..6e06132009 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java +++ b/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java @@ -3,8 +3,9 @@ package com.baeldung.test.comparison; import org.testng.annotations.Test; public class TimeOutTest { - @Test(timeOut = 1000,enabled=false) - public void testInfinity() { - while (true); - } + @Test(timeOut = 1000, enabled = false) + public void givenExecution_takeMoreTime_thenFail() { + while (true) + ; + } } diff --git a/core-java/src/test/java/temp/SummationServiceTest.java b/core-java/src/test/java/temp/SummationServiceTest.java new file mode 100644 index 0000000000..3c2d39f5dd --- /dev/null +++ b/core-java/src/test/java/temp/SummationServiceTest.java @@ -0,0 +1,49 @@ +package temp; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import junit.framework.Assert; + +public class SummationServiceTest { + + private static List numbers; + + @BeforeClass + public static void initialize() { + numbers = new ArrayList<>(); + } + + @AfterClass + public static void tearDown() { + numbers = null; + } + + @Before + public void runBeforeEachTest() { + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + @After + public void runAfterEachTest() { + numbers.clear(); + } + + @Test + public void givenNumbers_sumEquals_thenCorrect() { + int sum = 0; + for (int num : numbers) + sum += num; + assertEquals(6, sum); + } +} \ No newline at end of file From ec2bfa70141e4e1a27cae2ffcdbaeb2a510d524a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Sun, 5 Feb 2017 18:21:52 +0000 Subject: [PATCH 105/192] Test Serialize/Deserialize Optional with Jackson --- jackson/pom.xml | 14 +++- .../jackson/miscellaneous/mixin/Book.java | 25 +++++++ .../miscellaneous/mixin/OptionalTypeTest.java | 74 +++++++++++++++++++ 3 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 jackson/src/main/java/com/baeldung/jackson/miscellaneous/mixin/Book.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java diff --git a/jackson/pom.xml b/jackson/pom.xml index 53fb82c61e..2300208605 100644 --- a/jackson/pom.xml +++ b/jackson/pom.xml @@ -67,6 +67,12 @@ ${jackson.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + ${jackson.version} + + joda-time joda-time @@ -128,8 +134,8 @@ ${mockito.version} test - - + + org.slf4j @@ -152,7 +158,7 @@ org.slf4j log4j-over-slf4j ${org.slf4j.version} - +
@@ -198,7 +204,7 @@ 19.0 3.5 - 2.5 + 2.5 2.9.6 2.8.0 4.1 diff --git a/jackson/src/main/java/com/baeldung/jackson/miscellaneous/mixin/Book.java b/jackson/src/main/java/com/baeldung/jackson/miscellaneous/mixin/Book.java new file mode 100644 index 0000000000..fb961efe85 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/miscellaneous/mixin/Book.java @@ -0,0 +1,25 @@ +package com.baeldung.jackson.miscellaneous.mixin; + +import java.util.Optional; + +public class Book { + + private String title; + private Optional subTitle; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Optional getSubTitle() { + return subTitle; + } + + public void setSubTitle(Optional subTitle) { + this.subTitle = subTitle; + } +} diff --git a/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java b/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java new file mode 100644 index 0000000000..035c65f846 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java @@ -0,0 +1,74 @@ +package com.baeldung.jackson.miscellaneous.mixin; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import static io.restassured.path.json.JsonPath.from; +import java.io.IOException; +import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class OptionalTypeTest { + + ObjectMapper mapper = new ObjectMapper() + .registerModule(new Jdk8Module()); + + @Test + public void givenOptional_whenSerializing_thenValueInJson() throws JsonProcessingException { + + // arrange + String subTitle = "The Parish Boy's Progress"; + Book book = new Book(); + book.setTitle("Oliver Twist"); + book.setSubTitle(Optional.of(subTitle)); + + // act + String result = mapper.writeValueAsString(book); + + // assert + assertThat(from(result).getString("subTitle")).isEqualTo(subTitle); + } + + @Test + public void givenEmptyOptional_whenSerializing_thenNullValue() throws JsonProcessingException { + + // arrange + Book book = new Book(); + book.setTitle("Oliver Twist"); + book.setSubTitle(Optional.empty()); + + // act + String result = mapper.writeValueAsString(book); + + // assert + assertThat(from(result).getString("subTitle")).isNull(); + } + + @Test + public void givenField_whenDeserializing_thenOptionalWithValue() throws IOException { + + // arrange + String subTitle = "The Parish Boy's Progress"; + String book = "{ \"title\": \"Oliver Twist\", \"subTitle\": \"" + subTitle + "\" }"; + + // act + Book result = mapper.readValue(book, Book.class); + + // assert + assertThat(result.getSubTitle()).isEqualTo(Optional.of(subTitle)); + } + + @Test + public void givenEmptyField_whenDeserializing_thenEmptyOptional() throws IOException { + + // arrange + String book = "{ \"title\": \"Oliver Twist\", \"subTitle\": null }"; + + // act + Book result = mapper.readValue(book, Book.class); + + // assert + assertThat(result.getSubTitle()).isEmpty(); + } +} From b050db16cbd9dadf5da11587c1777e8f4fcd05d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Sun, 5 Feb 2017 18:22:11 +0000 Subject: [PATCH 106/192] Increase Jackson version --- jackson/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jackson/pom.xml b/jackson/pom.xml index 2300208605..881ba8e24c 100644 --- a/jackson/pom.xml +++ b/jackson/pom.xml @@ -195,7 +195,7 @@ - 2.8.5 + 2.8.6 1.7.21 From bb6224d7712addbaeb15f2db5eaa80fec96aaf35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Sun, 5 Feb 2017 18:24:48 +0000 Subject: [PATCH 107/192] Make test pass in non-english computers where tests are run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tested failed in my portuguese language OS because of: Ter(ça) is Tue(sday) Movie [imdbId=tt0472043, director=null, actors=[ActorJackson [imdbId=nm2199632, dateOfBirth=Ter set 21 11:00:00 GMT 1982, filmography=[Apocalypto, Beatdown, Wind Walkers]]]] Movie [imdbId=tt0472043, director=null, actors=[ActorJackson [imdbId=nm2199632, dateOfBirth=Tue Sep 21 11:00:00 GMT 1982, filmography=[Apocalypto, Beatdown, Wind Walkers]]]] Locale was enforced --- .../main/java/com/baeldung/jackson/entities/ActorJackson.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jackson/src/main/java/com/baeldung/jackson/entities/ActorJackson.java b/jackson/src/main/java/com/baeldung/jackson/entities/ActorJackson.java index f6a8b0cf61..76f87d80b3 100644 --- a/jackson/src/main/java/com/baeldung/jackson/entities/ActorJackson.java +++ b/jackson/src/main/java/com/baeldung/jackson/entities/ActorJackson.java @@ -4,6 +4,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.TimeZone; public class ActorJackson { @@ -53,7 +54,7 @@ public class ActorJackson { } private String formatDateOfBirth() { - final DateFormat formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy"); + final DateFormat formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.US); formatter.setTimeZone(TimeZone.getTimeZone("GMT")); return formatter.format(dateOfBirth); } From 7c07b93def81a51a82bbdcc8c27a02f0336e080d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Sun, 5 Feb 2017 18:25:52 +0000 Subject: [PATCH 108/192] Improve order of passing arguments in assert Expected argument should come first. --- .../jackson/deserialization/JacksonDeserializeTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonDeserializeTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonDeserializeTest.java index 7e91df5332..cb3bccb879 100644 --- a/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonDeserializeTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonDeserializeTest.java @@ -3,12 +3,10 @@ package com.baeldung.jackson.deserialization; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; - import com.baeldung.jackson.entities.Movie; -import org.junit.Assert; import org.junit.Test; - import com.fasterxml.jackson.databind.ObjectMapper; +import static org.junit.Assert.assertEquals; public class JacksonDeserializeTest { @@ -20,7 +18,7 @@ public class JacksonDeserializeTest { final Movie movie = mapper.readValue(jsonInput, Movie.class); final String expectedOutput = "Movie [imdbId=tt0472043, director=null, actors=[ActorJackson [imdbId=nm2199632, dateOfBirth=Tue Sep 21 11:00:00 GMT 1982, filmography=[Apocalypto, Beatdown, Wind Walkers]]]]"; - Assert.assertEquals(movie.toString(), expectedOutput); + assertEquals(expectedOutput, movie.toString()); } @Test @@ -35,7 +33,7 @@ public class JacksonDeserializeTest { final Movie movie = mapper.readValue(jsonInput, Movie.class); final String expectedOutput = "Movie [imdbId=tt0472043, director=Mel Gibson, actors=[ActorJackson [imdbId=nm2199632, dateOfBirth=Tue Sep 21 11:00:00 GMT 1982, filmography=[Apocalypto, Beatdown, Wind Walkers]]]]"; - Assert.assertEquals(movie.toString(), expectedOutput); + assertEquals(expectedOutput, movie.toString()); } } From b5985a586ca0020e013c2ea6b348740b88b6d8db Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sat, 11 Feb 2017 18:23:25 +0000 Subject: [PATCH 109/192] Tidied up tests --- .../miscellaneous/mixin/OptionalTypeTest.java | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java b/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java index 035c65f846..c6d51cd57f 100644 --- a/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/miscellaneous/mixin/OptionalTypeTest.java @@ -11,64 +11,51 @@ import org.junit.Test; public class OptionalTypeTest { - ObjectMapper mapper = new ObjectMapper() - .registerModule(new Jdk8Module()); + ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module()); @Test - public void givenOptional_whenSerializing_thenValueInJson() throws JsonProcessingException { + public void givenPresentOptional_whenSerializing_thenValueInJson() throws JsonProcessingException { - // arrange String subTitle = "The Parish Boy's Progress"; Book book = new Book(); book.setTitle("Oliver Twist"); book.setSubTitle(Optional.of(subTitle)); - // act String result = mapper.writeValueAsString(book); - // assert assertThat(from(result).getString("subTitle")).isEqualTo(subTitle); } @Test public void givenEmptyOptional_whenSerializing_thenNullValue() throws JsonProcessingException { - // arrange Book book = new Book(); book.setTitle("Oliver Twist"); book.setSubTitle(Optional.empty()); - // act String result = mapper.writeValueAsString(book); - // assert assertThat(from(result).getString("subTitle")).isNull(); } @Test - public void givenField_whenDeserializing_thenOptionalWithValue() throws IOException { + public void givenField_whenDeserializingIntoOptional_thenIsPresentWithValue() throws IOException { - // arrange String subTitle = "The Parish Boy's Progress"; String book = "{ \"title\": \"Oliver Twist\", \"subTitle\": \"" + subTitle + "\" }"; - // act Book result = mapper.readValue(book, Book.class); - // assert assertThat(result.getSubTitle()).isEqualTo(Optional.of(subTitle)); } @Test - public void givenEmptyField_whenDeserializing_thenEmptyOptional() throws IOException { + public void givenNullField_whenDeserializingIntoOptional_thenIsEmpty() throws IOException { - // arrange String book = "{ \"title\": \"Oliver Twist\", \"subTitle\": null }"; - // act Book result = mapper.readValue(book, Book.class); - // assert assertThat(result.getSubTitle()).isEmpty(); } } From 4b728ec65b1314e54ae6668557bcbb425fb72cbc Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sun, 12 Feb 2017 13:40:00 +0530 Subject: [PATCH 110/192] Delete JoinerSplitterTest.java (#1160) --- .../baeldung/stream/JoinerSplitterTest.java | 65 ------------------- 1 file changed, 65 deletions(-) delete mode 100644 core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java diff --git a/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java b/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java deleted file mode 100644 index b995976b2c..0000000000 --- a/core-java/src/test/java/com/baeldung/stream/JoinerSplitterTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.stream; - -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; - -import com.baeldung.streamApi.JoinerSplitter; - -public class JoinerSplitterTest { - - @Test - public void provided_array_convert_to_stream_and_convert_to_string() { - - String[] programming_languages = {"java", "python", "nodejs", "ruby"}; - - String expectation = "java,python,nodejs,ruby"; - - String result = JoinerSplitter.join(programming_languages); - assertEquals(result, expectation); - } - - @Test - public void provided_array_convert_to_stream_and_convert_to_prefixPostfixString() { - String[] programming_languages = {"java", "python", - "nodejs", "ruby"}; - String expectation = "[java,python,nodejs,ruby]"; - - String result = JoinerSplitter.joinWithPrefixPostFix(programming_languages); - assertEquals(result, expectation); - } - - @Test - public void provided_string_convert_to_stream_and_convert_to_listOfString() { - String programming_languages = "java,python,nodejs,ruby"; - - List expectation = new ArrayList(); - expectation.add("java"); - expectation.add("python"); - expectation.add("nodejs"); - expectation.add("ruby"); - - List result = JoinerSplitter.split(programming_languages); - - assertEquals(result, expectation); - } - - @Test - public void provided_string_convert_to_stream_and_convert_to_listOfChar() { - String programming_languages = "java,python,nodejs,ruby"; - - List expectation = new ArrayList(); - char[] charArray = programming_languages.toCharArray(); - for (char c : charArray) { - expectation.add(c); - } - - List result = JoinerSplitter.splitToListOfChar(programming_languages); - assertEquals(result, expectation); - - } - -} From 25dc6bc81c8dbc8e6d808d62025dc8bf77304d31 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sun, 12 Feb 2017 13:41:25 +0530 Subject: [PATCH 111/192] Delete JoinerSplitter.java (#1161) --- .../baeldung/streamApi/JoinerSplitter.java | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java diff --git a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java b/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java deleted file mode 100644 index 52ffc61799..0000000000 --- a/core-java/src/main/java/com/baeldung/streamApi/JoinerSplitter.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.streamApi; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class JoinerSplitter { - - public static String join(String[] arrayOfString) { - return Arrays - .asList(arrayOfString) - .stream() - .map(x -> x) - .collect(Collectors.joining(",")); - } - - public static String joinWithPrefixPostFix(String[] arrayOfString) { - return Arrays - .asList(arrayOfString) - .stream() - .map(x -> x) - .collect(Collectors.joining(",", "[", "]")); - } - - public static List split(String str) { - return Stream - .of(str.split(",")) - .map(elem -> new String(elem)) - .collect(Collectors.toList()); - } - - public static List splitToListOfChar(String str) { - return str - .chars() - .mapToObj(item -> (char) item) - .collect(Collectors.toList()); - } - -} From c9bb4b9e37ca9d4a45a0d90adbd1059ceb7ae27d Mon Sep 17 00:00:00 2001 From: Sunil Gulabani Date: Sun, 12 Feb 2017 13:44:03 +0530 Subject: [PATCH 112/192] BAEL-650: Removed unwanted comments --- aws/pom.xml | 10 ---------- .../baeldung/lambda/dynamodb/SavePersonHandler.java | 5 ----- .../baeldung/lambda/dynamodb/bean/PersonRequest.java | 5 ----- .../baeldung/lambda/dynamodb/bean/PersonResponse.java | 5 ----- 4 files changed, 25 deletions(-) diff --git a/aws/pom.xml b/aws/pom.xml index 4ea6b8786c..881ba6522d 100644 --- a/aws/pom.xml +++ b/aws/pom.xml @@ -53,14 +53,4 @@ - - - artifactory-isg-release - https://repository.deere.com/artifactory/isg-release - - - axiom-nexus - http://isgnexus.deere.com/nexus/content/groups/public - - \ No newline at end of file diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java index 47d3569d27..70aa0fd68f 100644 --- a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java @@ -1,8 +1,3 @@ -/** - * "Unpublished Work © 2017 Deere & Company. All Worldwide Rights Reserved. THIS MATERIAL IS THE PROPERTY OF DEERE & - * COMPANY. ALL USE, ALTERATIONS, DISCLOSURE, DISSEMINATION AND/OR REPRODUCTION NOT SPECIFICALLY AUTHORIZED BY DEERE & - * COMPANY IS PROHIBITED." - */ package com.baeldung.lambda.dynamodb; import com.amazonaws.regions.Region; diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java index 1f699d7ee3..6071f4448e 100644 --- a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java @@ -1,8 +1,3 @@ -/** - * "Unpublished Work © 2017 Deere & Company. All Worldwide Rights Reserved. THIS MATERIAL IS THE PROPERTY OF DEERE & - * COMPANY. ALL USE, ALTERATIONS, DISCLOSURE, DISSEMINATION AND/OR REPRODUCTION NOT SPECIFICALLY AUTHORIZED BY DEERE & - * COMPANY IS PROHIBITED." - */ package com.baeldung.lambda.dynamodb.bean; import com.google.gson.Gson; diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java index 19724adbfa..a61294ddea 100644 --- a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java @@ -1,8 +1,3 @@ -/** - * "Unpublished Work © 2017 Deere & Company. All Worldwide Rights Reserved. THIS MATERIAL IS THE PROPERTY OF DEERE & - * COMPANY. ALL USE, ALTERATIONS, DISCLOSURE, DISSEMINATION AND/OR REPRODUCTION NOT SPECIFICALLY AUTHORIZED BY DEERE & - * COMPANY IS PROHIBITED." - */ package com.baeldung.lambda.dynamodb.bean; import com.google.gson.Gson; From 4aaefd39df187bd67191c62ac2d7bd0ecc0b83ee Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sun, 12 Feb 2017 14:20:49 +0530 Subject: [PATCH 113/192] changing package structure (#1157) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality * changing package name * testcase change --- core-java/0.5967303215007616 | 0 core-java/0.9252611327674576 | 0 .../com/baeldung/string/JoinerSplitter.java | 36 ++++++++++ .../baeldung/string/JoinerSplitterTest.java | 65 +++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 core-java/0.5967303215007616 create mode 100644 core-java/0.9252611327674576 create mode 100644 core-java/src/main/java/com/baeldung/string/JoinerSplitter.java create mode 100644 core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java diff --git a/core-java/0.5967303215007616 b/core-java/0.5967303215007616 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.9252611327674576 b/core-java/0.9252611327674576 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/src/main/java/com/baeldung/string/JoinerSplitter.java b/core-java/src/main/java/com/baeldung/string/JoinerSplitter.java new file mode 100644 index 0000000000..085be66801 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/JoinerSplitter.java @@ -0,0 +1,36 @@ +package com.baeldung.string; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class JoinerSplitter { + + public static String join ( String[] arrayOfString ) { + return Arrays.asList(arrayOfString) + .stream() + .map(x -> x) + .collect(Collectors.joining(",")); + } + + public static String joinWithPrefixPostFix ( String[] arrayOfString ) { + return Arrays.asList(arrayOfString) + .stream() + .map(x -> x) + .collect(Collectors.joining(",","[","]")); + } + + public static List split ( String str ) { + return Stream.of(str.split(",")) + .map (elem -> new String(elem)) + .collect(Collectors.toList()); + } + + public static List splitToListOfChar ( String str ) { + return str.chars() + .mapToObj(item -> (char) item) + .collect(Collectors.toList()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java b/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java new file mode 100644 index 0000000000..303296cbc6 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java @@ -0,0 +1,65 @@ +package com.baeldung.string; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import com.baeldung.string.JoinerSplitter; + +public class JoinerSplitterTest { + + @Test + public void provided_array_convert_to_stream_and_convert_to_string() { + + String[] programming_languages = {"java", "python", "nodejs", "ruby"}; + + String expectation = "java,python,nodejs,ruby"; + + String result = JoinerSplitter.join(programming_languages); + assertEquals(result, expectation); + } + + @Test + public void provided_array_convert_to_stream_and_convert_to_prefixPostfix() { + String[] programming_languages = {"java", "python", + "nodejs", "ruby"}; + String expectation = "[java,python,nodejs,ruby]"; + + String result = JoinerSplitter.joinWithPrefixPostFix(programming_languages); + assertEquals(result, expectation); + } + + @Test + public void provided_string_convert_to_stream_and_convert_to_listOfString() { + String programming_languages = "java,python,nodejs,ruby"; + + List expectation = new ArrayList(); + expectation.add("java"); + expectation.add("python"); + expectation.add("nodejs"); + expectation.add("ruby"); + + List result = JoinerSplitter.split(programming_languages); + + assertEquals(result, expectation); + } + + @Test + public void provided_string_convert_to_stream_and_convert_to_listOfChar() { + String programming_languages = "java,python,nodejs,ruby"; + + List expectation = new ArrayList(); + char[] charArray = programming_languages.toCharArray(); + for (char c : charArray) { + expectation.add(c); + } + + List result = JoinerSplitter.splitToListOfChar(programming_languages); + assertEquals(result, expectation); + + } + +} From f772286896a1082fc662e91659a4f335c1b6101c Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sun, 12 Feb 2017 10:22:25 +0100 Subject: [PATCH 114/192] BAEL-669 test of an infinite stream (#1126) * BAEL-669 test of an infinite stream * BAEL-699 example of custom type infinite stream * BAEL-699 do..while stream way * BAEL-669 generate stream of random uuids --- .../com/baeldung/stream/InfiniteStreams.java | 27 +++++++++++ .../baeldung/stream/InfiniteStreamTest.java | 48 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java create mode 100644 core-java/src/test/java/com/baeldung/stream/InfiniteStreamTest.java diff --git a/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java b/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java new file mode 100644 index 0000000000..097b516f8c --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java @@ -0,0 +1,27 @@ +package com.baeldung.stream; + + +import java.util.stream.Stream; + +public class InfiniteStreams { + public static void main(String[] args) { + doWhileOldWay(); + + doWhileStreamWay(); + + } + + private static void doWhileOldWay() { + + int i = 0; + while (i < 10) { + System.out.println(i); + i++; + } + } + + private static void doWhileStreamWay() { + Stream integers = Stream.iterate(0, i -> i + 1); + integers.limit(10).forEach(System.out::println); + } +} diff --git a/core-java/src/test/java/com/baeldung/stream/InfiniteStreamTest.java b/core-java/src/test/java/com/baeldung/stream/InfiniteStreamTest.java new file mode 100644 index 0000000000..a1537a1735 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stream/InfiniteStreamTest.java @@ -0,0 +1,48 @@ +package com.baeldung.stream; + + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.UUID; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; + +public class InfiniteStreamTest { + + @Test + public void givenInfiniteStream_whenUseIntermediateLimitMethod_thenShouldTerminateInFiniteTime() { + //given + Stream infiniteStream = Stream.iterate(0, i -> i + 2); + + //when + List collect = infiniteStream + .limit(10) + .collect(Collectors.toList()); + + //then + assertEquals(collect, Arrays.asList(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)); + } + + @Test + public void givenInfiniteStreamOfRandomInts_whenUseLimit_shouldTerminateInFiniteTime() { + //given + Supplier randomUUIDSupplier = UUID::randomUUID; + Stream infiniteStreamOfRandomUUID = Stream.generate(randomUUIDSupplier); + + //when + List randomInts = infiniteStreamOfRandomUUID + .skip(10) + .limit(10) + .collect(Collectors.toList()); + + //then + assertEquals(randomInts.size(), 10); + } + +} From 7a895108f087e25bdf514a5fb23c1505761742bc Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sun, 12 Feb 2017 07:30:32 -0600 Subject: [PATCH 115/192] Update README.MD --- spring-security-mvc-boot/README.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD index d59aea97b4..3e789dedad 100644 --- a/spring-security-mvc-boot/README.MD +++ b/spring-security-mvc-boot/README.MD @@ -5,3 +5,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [A Custom Security Expression with Spring Security](http://www.baeldung.com/spring-security-create-new-custom-security-expression) - [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) - [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) +- [Two Login Pages with Spring Security](http://www.baeldung.com/spring-security-two-login-pages) From c6c3b71ba1fae47d7c76a66e4fc30708a072121d Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sun, 12 Feb 2017 07:32:40 -0600 Subject: [PATCH 116/192] Update README.md --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index cd16935864..341dbdf910 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -57,3 +57,4 @@ - [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future) - [Guide to java.util.concurrent.BlockingQueue](http://www.baeldung.com/java-blocking-queue) - [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch) +- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm) From 424f55ac484eb2dd662dda7491170eceaad1fb2d Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 12 Feb 2017 16:11:55 +0200 Subject: [PATCH 117/192] custom access denied page (#1133) * custom access denied page * fix formatting, remove imports --- .../security/CustomAccessDeniedHandler.java | 30 +++++++++++++++++++ .../java/org/baeldung/spring/MvcConfig.java | 1 + .../baeldung/spring/SecSecurityConfig.java | 10 +++++++ .../src/main/resources/webSecurityConfig.xml | 6 ++++ .../main/webapp/WEB-INF/view/accessDenied.jsp | 15 ++++++++++ .../src/main/webapp/WEB-INF/view/homepage.jsp | 24 ++++++++------- .../src/main/webapp/WEB-INF/web.xml | 7 +++++ 7 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java create mode 100644 spring-security-mvc-login/src/main/webapp/WEB-INF/view/accessDenied.jsp diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java b/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java new file mode 100644 index 0000000000..ea4407c5c4 --- /dev/null +++ b/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java @@ -0,0 +1,30 @@ +package org.baeldung.security; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.access.AccessDeniedHandler; + +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + + public static final Logger LOG = Logger.getLogger(CustomAccessDeniedHandler.class); + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException, ServletException { + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + if (auth != null) { + LOG.warn("User: " + auth.getName() + " attempted to access the protected URL: " + request.getRequestURI()); + } + + response.sendRedirect(request.getContextPath() + "/accessDenied"); + } + +} diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java index 02392df736..b59dbee0cf 100644 --- a/spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java @@ -28,6 +28,7 @@ public class MvcConfig extends WebMvcConfigurerAdapter { registry.addViewController("/login.html"); registry.addViewController("/homepage.html"); registry.addViewController("/admin/adminpage.html"); + registry.addViewController("/accessDenied"); } @Bean diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java index ae41a037cd..7331d7bb18 100644 --- a/spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java @@ -1,5 +1,6 @@ package org.baeldung.spring; +import org.baeldung.security.CustomAccessDeniedHandler; import org.baeldung.security.CustomLogoutSuccessHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -8,6 +9,7 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; @Configuration @@ -53,6 +55,9 @@ public class SecSecurityConfig extends WebSecurityConfigurerAdapter { .logoutUrl("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler()); + //.and() + //.exceptionHandling().accessDeniedPage("/accessDenied"); + //.exceptionHandling().accessDeniedHandler(accessDeniedHandler()); // @formatter:on } @@ -60,5 +65,10 @@ public class SecSecurityConfig extends WebSecurityConfigurerAdapter { public LogoutSuccessHandler logoutSuccessHandler() { return new CustomLogoutSuccessHandler(); } + + @Bean + public AccessDeniedHandler accessDeniedHandler(){ + return new CustomAccessDeniedHandler(); + } } diff --git a/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml b/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml index 9c8fdea9ee..f0fa956934 100644 --- a/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml +++ b/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml @@ -19,10 +19,16 @@ always-use-default-target="true"/> + + + + + + diff --git a/spring-security-mvc-login/src/main/webapp/WEB-INF/view/accessDenied.jsp b/spring-security-mvc-login/src/main/webapp/WEB-INF/view/accessDenied.jsp new file mode 100644 index 0000000000..45820cf43d --- /dev/null +++ b/spring-security-mvc-login/src/main/webapp/WEB-INF/view/accessDenied.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> + + + + +Access Denied + + +

Sorry, you do not have permission to view this page.

+ +Click ">here to go back to the Homepage. + + \ No newline at end of file diff --git a/spring-security-mvc-login/src/main/webapp/WEB-INF/view/homepage.jsp b/spring-security-mvc-login/src/main/webapp/WEB-INF/view/homepage.jsp index 80f27f5466..c9d88cbc9b 100644 --- a/spring-security-mvc-login/src/main/webapp/WEB-INF/view/homepage.jsp +++ b/spring-security-mvc-login/src/main/webapp/WEB-INF/view/homepage.jsp @@ -4,21 +4,23 @@ -

This is the body of the sample view

+

This is the body of the sample view

- - This text is only visible to a user -
-
+ + This text is only visible to a user +

+ ">Restricted Admin Page +

+
- - This text is only visible to an admin -
+ + This text is only visible to an admin +
">Admin Page
-
+
+ + ">Logout - ">Logout - \ No newline at end of file diff --git a/spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml b/spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml index 0a0a340995..eef48ec9b3 100644 --- a/spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml @@ -43,8 +43,15 @@ /* + + 403 + /accessDenied + + + + \ No newline at end of file From b279e709893dd4f4928445b1178c18217ddfdbee Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sun, 12 Feb 2017 18:38:17 +0000 Subject: [PATCH 118/192] CacheLoader tests --- .../baeldung/guava/GuavaCacheLoaderTest.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 guava/src/test/java/org/baeldung/guava/GuavaCacheLoaderTest.java diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCacheLoaderTest.java b/guava/src/test/java/org/baeldung/guava/GuavaCacheLoaderTest.java new file mode 100644 index 0000000000..2aa2e6140b --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaCacheLoaderTest.java @@ -0,0 +1,71 @@ +package org.baeldung.guava; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import static com.google.common.collect.Iterables.cycle; +import static com.google.common.collect.Maps.newHashMap; +import static org.assertj.core.api.Assertions.assertThat; + +public class GuavaCacheLoaderTest { + int callCount = 0; + + @Test + public void givenAMap_whenAddingValues_thenCanTreatThemAsCache() { + Map cache = newHashMap(); + cache.put("foo", "cachedValueForFoo"); + cache.put("bar", "cachedValueForBar"); + + assertThat(cache.get("foo")).isEqualTo("cachedValueForFoo"); + assertThat(cache.get("bar")).isEqualTo("cachedValueForBar"); + } + + @Test + public void givenCacheLoader_whenGettingItemTwice_shouldOnlyCallOnce() throws ExecutionException { + + final LoadingCache loadingCache = CacheBuilder.newBuilder() + .build(new CacheLoader() { + @Override + public String load(final String s) throws Exception { + return slowMethod(s); + } + }); + + String value = loadingCache.get("key"); + value = loadingCache.get("key"); + + assertThat(callCount).isEqualTo(1); + assertThat(value).isEqualTo("key"); + } + + @Test + public void givenCacheLoader_whenRefreshingItem_shouldCallAgain() throws ExecutionException { + + final LoadingCache loadingCache = CacheBuilder.newBuilder() + .build(new CacheLoader() { + @Override + public String load(final String s) throws Exception { + return slowMethod(s); + } + }); + + String value = loadingCache.get("key"); + loadingCache.refresh("key"); + + assertThat(callCount).isEqualTo(2); + assertThat(value).isEqualTo("key"); + } + + private String slowMethod(final String s) { + callCount++; + return s; + } +} From e5597d87cedfe801fbc2a42ca296c4305dd36cbd Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Mon, 13 Feb 2017 01:33:02 +0100 Subject: [PATCH 119/192] BAEL-183 - removing obsolete class --- .../test/java/temp/SummationServiceTest.java | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 core-java/src/test/java/temp/SummationServiceTest.java diff --git a/core-java/src/test/java/temp/SummationServiceTest.java b/core-java/src/test/java/temp/SummationServiceTest.java deleted file mode 100644 index 3c2d39f5dd..0000000000 --- a/core-java/src/test/java/temp/SummationServiceTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package temp; - -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import junit.framework.Assert; - -public class SummationServiceTest { - - private static List numbers; - - @BeforeClass - public static void initialize() { - numbers = new ArrayList<>(); - } - - @AfterClass - public static void tearDown() { - numbers = null; - } - - @Before - public void runBeforeEachTest() { - numbers.add(1); - numbers.add(2); - numbers.add(3); - } - - @After - public void runAfterEachTest() { - numbers.clear(); - } - - @Test - public void givenNumbers_sumEquals_thenCorrect() { - int sum = 0; - for (int num : numbers) - sum += num; - assertEquals(6, sum); - } -} \ No newline at end of file From 506ac8301b2342c3adc2a7896516eb651f4d8449 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Mon, 13 Feb 2017 17:31:28 +0100 Subject: [PATCH 120/192] Refactor Spring Data examples --- .../baeldung/config/ValidatorEventRegister.java | 10 ++++++++-- .../RestResponseEntityExceptionHandler.java | 14 ++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/spring-data-rest/src/main/java/com/baeldung/config/ValidatorEventRegister.java b/spring-data-rest/src/main/java/com/baeldung/config/ValidatorEventRegister.java index 89ab848e81..8f14d6c1c6 100644 --- a/spring-data-rest/src/main/java/com/baeldung/config/ValidatorEventRegister.java +++ b/spring-data-rest/src/main/java/com/baeldung/config/ValidatorEventRegister.java @@ -22,9 +22,15 @@ public class ValidatorEventRegister implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { List events = Arrays.asList("beforeCreate", "afterCreate", "beforeSave", "afterSave", "beforeLinkSave", "afterLinkSave", "beforeDelete", "afterDelete"); - + for (Map.Entry entry : validators.entrySet()) { - events.stream().filter(p -> entry.getKey().startsWith(p)).findFirst().ifPresent(p -> validatingRepositoryEventListener.addValidator(p, entry.getValue())); + events + .stream() + .filter(p -> entry + .getKey() + .startsWith(p)) + .findFirst() + .ifPresent(p -> validatingRepositoryEventListener.addValidator(p, entry.getValue())); } } } diff --git a/spring-data-rest/src/main/java/com/baeldung/exception/handlers/RestResponseEntityExceptionHandler.java b/spring-data-rest/src/main/java/com/baeldung/exception/handlers/RestResponseEntityExceptionHandler.java index ee84738e7a..aa24fccac7 100644 --- a/spring-data-rest/src/main/java/com/baeldung/exception/handlers/RestResponseEntityExceptionHandler.java +++ b/spring-data-rest/src/main/java/com/baeldung/exception/handlers/RestResponseEntityExceptionHandler.java @@ -1,16 +1,17 @@ package com.baeldung.exception.handlers; -import java.util.stream.Collectors; - import org.springframework.data.rest.core.RepositoryConstraintViolationException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; +import java.util.stream.Collectors; + @ControllerAdvice public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @@ -18,8 +19,13 @@ public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionH public ResponseEntity handleAccessDeniedException(Exception ex, WebRequest request) { RepositoryConstraintViolationException nevEx = (RepositoryConstraintViolationException) ex; - String errors = nevEx.getErrors().getAllErrors().stream().map(p -> p.toString()).collect(Collectors.joining("\n")); - return new ResponseEntity(errors, new HttpHeaders(), HttpStatus.NOT_ACCEPTABLE); + String errors = nevEx + .getErrors() + .getAllErrors() + .stream() + .map(ObjectError::toString) + .collect(Collectors.joining("\n")); + return new ResponseEntity<>(errors, new HttpHeaders(), HttpStatus.NOT_ACCEPTABLE); } } \ No newline at end of file From 5ef3b149f1e44e2a49914f8b3429674b007774b9 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Mon, 13 Feb 2017 23:49:58 +0530 Subject: [PATCH 121/192] Update JoinerSplitterTest.java (#1172) --- .../test/java/com/baeldung/string/JoinerSplitterTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java b/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java index 303296cbc6..9ccff40558 100644 --- a/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java +++ b/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java @@ -12,7 +12,7 @@ import com.baeldung.string.JoinerSplitter; public class JoinerSplitterTest { @Test - public void provided_array_convert_to_stream_and_convert_to_string() { + public void givenArray_transformedToStream_convertToString() { String[] programming_languages = {"java", "python", "nodejs", "ruby"}; @@ -23,7 +23,7 @@ public class JoinerSplitterTest { } @Test - public void provided_array_convert_to_stream_and_convert_to_prefixPostfix() { + public void givenArray_transformedToStream_convertToPrefixPostfixString() { String[] programming_languages = {"java", "python", "nodejs", "ruby"}; String expectation = "[java,python,nodejs,ruby]"; @@ -33,7 +33,7 @@ public class JoinerSplitterTest { } @Test - public void provided_string_convert_to_stream_and_convert_to_listOfString() { + public void givenString_transformedToStream_convertToList() { String programming_languages = "java,python,nodejs,ruby"; List expectation = new ArrayList(); @@ -48,7 +48,7 @@ public class JoinerSplitterTest { } @Test - public void provided_string_convert_to_stream_and_convert_to_listOfChar() { + public void givenString_transformedToStream_convertToListOfChar() { String programming_languages = "java,python,nodejs,ruby"; List expectation = new ArrayList(); From 491d36e745932caf297106a973ea5330e6501a60 Mon Sep 17 00:00:00 2001 From: Ravi-ronic Date: Tue, 14 Feb 2017 00:40:28 +0530 Subject: [PATCH 122/192] BAEL-524:after review comments (#1154) * BAEL-524 * BAEL-524 * BAEL-524 * BAEL-524 * BAEL-524 resolving build failure * BAEL-524 do not exclude test class --- struts2/pom.xml | 101 ++++++++++-------- .../src/com/baeldung/struts/CarAction.java | 9 +- .../baeldung/struts/CarMessageService.java | 9 +- .../baeldung/struts/test/TestCarAction.java | 32 ++++++ struts2/src/struts.xml | 12 --- 5 files changed, 102 insertions(+), 61 deletions(-) create mode 100644 struts2/src/com/baeldung/struts/test/TestCarAction.java delete mode 100644 struts2/src/struts.xml diff --git a/struts2/pom.xml b/struts2/pom.xml index 9b9adeaf46..0ae054ef38 100644 --- a/struts2/pom.xml +++ b/struts2/pom.xml @@ -1,48 +1,59 @@ - 4.0.0 - com.baeldung - struts2 - 0.0.1-SNAPSHOT - war - struts2 - - - src - - - src - - **/*.java - - - - - - maven-compiler-plugin - 3.5.1 - - 1.8 - 1.8 - - - - maven-war-plugin - 3.0.0 - - WebContent - - - - - - - - - org.apache.struts - struts2-core - 2.5.5 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + MyStrutsApp + 0.0.1-SNAPSHOT + war + MyStrutsApp + + src + + + src + + + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + maven-war-plugin + 3.0.0 + + WebContent + + + + + + + + org.apache.struts + struts2-core + 2.5.5 + + + + org.apache.struts + struts2-junit-plugin + 2.5.5 + + + + org.apache.struts + struts2-convention-plugin + 2.5.8 + + + javax.servlet + javax.servlet-api + 3.0.1 - - + \ No newline at end of file diff --git a/struts2/src/com/baeldung/struts/CarAction.java b/struts2/src/com/baeldung/struts/CarAction.java index a96aa440b6..0b9266339c 100644 --- a/struts2/src/com/baeldung/struts/CarAction.java +++ b/struts2/src/com/baeldung/struts/CarAction.java @@ -1,7 +1,14 @@ package com.baeldung.struts; -public class CarAction { +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.Result; +import org.apache.struts2.convention.annotation.ResultPath; +@Namespace("/tutorial") +@Action("/car") +@Result(name = "success", location = "/result.jsp") +public class CarAction { private String carName; private String carMessage; private CarMessageService carMessageService = new CarMessageService(); diff --git a/struts2/src/com/baeldung/struts/CarMessageService.java b/struts2/src/com/baeldung/struts/CarMessageService.java index fef9c1719d..34d3ca3d76 100644 --- a/struts2/src/com/baeldung/struts/CarMessageService.java +++ b/struts2/src/com/baeldung/struts/CarMessageService.java @@ -4,12 +4,15 @@ public class CarMessageService { public String getMessage(String carName) { System.out.println("inside getMessage()" + carName); - if (carName.equalsIgnoreCase("ferrari")) + if (carName.equalsIgnoreCase("ferrari")){ return "Ferrari Fan!"; - else if (carName.equalsIgnoreCase("bmw")) + } + else if (carName.equalsIgnoreCase("bmw")){ return "BMW Fan!"; - else + } + else{ return "please choose ferrari Or bmw"; + } } } diff --git a/struts2/src/com/baeldung/struts/test/TestCarAction.java b/struts2/src/com/baeldung/struts/test/TestCarAction.java new file mode 100644 index 0000000000..ec21bd689a --- /dev/null +++ b/struts2/src/com/baeldung/struts/test/TestCarAction.java @@ -0,0 +1,32 @@ +package com.baeldung.struts.test; +import org.apache.struts2.StrutsTestCase; +import org.junit.Test; + + +import com.baeldung.struts.CarAction; +import com.opensymphony.xwork2.ActionProxy; + +public class TestCarAction extends StrutsTestCase { + + @Test + public void test_givenCarOptions_WhenferrariSelected_ThenShowMessage() throws Exception { + request.setParameter("carName", "ferrari"); + ActionProxy proxy = getActionProxy("/tutorial/car.action"); + CarAction carAction = (CarAction) proxy.getAction(); + String result = proxy.execute(); + assertEquals(result,"success"); + assertEquals(carAction.getCarMessage(), "Ferrari Fan!"); + } + + + public void test_givenCarOptions_WhenbmwSelected_ThenShowMessage() throws Exception { + request.setParameter("carName", "bmw"); + ActionProxy proxy = getActionProxy("/tutorial/car.action"); + CarAction carAction = (CarAction) proxy.getAction(); + String result = proxy.execute(); + assertEquals(result,"success"); + assertEquals(carAction.getCarMessage(), "BMW Fan!"); + } + + +} diff --git a/struts2/src/struts.xml b/struts2/src/struts.xml deleted file mode 100644 index 1c117ac900..0000000000 --- a/struts2/src/struts.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - /result.jsp - - - \ No newline at end of file From 3eb0575708eb3e907a0738c2beee09315791fa57 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 14 Feb 2017 09:59:12 +0100 Subject: [PATCH 123/192] BAEL-12 userAgent header value in one place --- .../advancedconfig/HttpClientAdvancedConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java index 1bb176876c..ac51f75b11 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java @@ -38,12 +38,12 @@ public class HttpClientAdvancedConfiguration { @Test public void givenClientWithCustomUserAgentHeader_whenExecuteRequest_shouldReturn200() throws IOException { //given + String userAgent = "BaeldungAgent/1.0"; serviceMock.stubFor(get(urlEqualTo("/detail")) - .withHeader("User-Agent", equalTo("BaeldungAgent/1.0")) + .withHeader("User-Agent", equalTo(userAgent)) .willReturn(aResponse() .withStatus(200))); - String userAgent = "BaeldungAgent/1.0"; HttpClient httpClient = HttpClients.createDefault(); final HttpGet httpGet = new HttpGet("http://localhost:8089/detail"); httpGet.setHeader(HttpHeaders.USER_AGENT, userAgent); From a985a9fb5a6ce3bfe4a9a213a89dccd138df5f59 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 14 Feb 2017 10:01:09 +0100 Subject: [PATCH 124/192] BAEL-12 remove final --- .../advancedconfig/HttpClientAdvancedConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java index ac51f75b11..99389a001a 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java @@ -45,7 +45,7 @@ public class HttpClientAdvancedConfiguration { .withStatus(200))); HttpClient httpClient = HttpClients.createDefault(); - final HttpGet httpGet = new HttpGet("http://localhost:8089/detail"); + HttpGet httpGet = new HttpGet("http://localhost:8089/detail"); httpGet.setHeader(HttpHeaders.USER_AGENT, userAgent); //when From 24d0acbbd6abc58293ed4b48045adf54f1109cab Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 14 Feb 2017 10:05:16 +0100 Subject: [PATCH 125/192] BAEL-12 xmlBody into a variable --- .../advancedconfig/HttpClientAdvancedConfiguration.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java index 99389a001a..9b5cb3f293 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfiguration.java @@ -58,16 +58,17 @@ public class HttpClientAdvancedConfiguration { @Test public void givenClientThatSendDataInBody_whenSendXmlInBody_shouldReturn200() throws IOException { //given + String xmlBody = "1"; serviceMock.stubFor(post(urlEqualTo("/person")) .withHeader("Content-Type", equalTo("application/xml")) - .withRequestBody(equalTo("1")) + .withRequestBody(equalTo(xmlBody)) .willReturn(aResponse() .withStatus(200))); HttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://localhost:8089/person"); httpPost.setHeader("Content-Type", "application/xml"); - StringEntity xmlEntity = new StringEntity("1"); + StringEntity xmlEntity = new StringEntity(xmlBody); httpPost.setEntity(xmlEntity); //when From b3303dc0cfebe443c1d997900bd8f8cf89d94764 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 14 Feb 2017 16:17:55 +0100 Subject: [PATCH 126/192] BAEL-633 craete cglib template --- cglib/pom.xml | 47 +++++++++++++++++++ .../com/baeldung/cglib/proxy/SampleClass.java | 7 +++ .../baeldung/cglib/proxy/SampleClassTest.java | 20 ++++++++ pom.xml | 1 + 4 files changed, 75 insertions(+) create mode 100644 cglib/pom.xml create mode 100644 cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java create mode 100644 cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java diff --git a/cglib/pom.xml b/cglib/pom.xml new file mode 100644 index 0000000000..21309cf514 --- /dev/null +++ b/cglib/pom.xml @@ -0,0 +1,47 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + cglib + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + + cglib + cglib + ${cglib.version} + + + junit + junit + ${junit.version} + test + + + + + 3.2.4 + 4.12 + + + + \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java b/cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java new file mode 100644 index 0000000000..3e0d098dd1 --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java @@ -0,0 +1,7 @@ +package com.baeldung.cglib.proxy; + +public class SampleClass { + public String test(String input) { + return "Hello world!"; + } +} \ No newline at end of file diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java new file mode 100644 index 0000000000..15037b3f1c --- /dev/null +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java @@ -0,0 +1,20 @@ +package com.baeldung.cglib.proxy; + +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.FixedValue; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SampleClassTest { + @Test + public void testFixedValue() throws Exception { + Enhancer enhancer = new Enhancer(); + enhancer.setSuperclass(SampleClass.class); + enhancer.setCallback((FixedValue) () -> "Hello cglib!"); + SampleClass proxy = (SampleClass) enhancer.create(); + assertEquals("Hello cglib!", proxy.test(null)); + + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2392e2c594..5bf0d4ad02 100644 --- a/pom.xml +++ b/pom.xml @@ -191,6 +191,7 @@ xstream struts2 + cglib From cf87412c429c0ebb1bb162fb029908f5d42c3fef Mon Sep 17 00:00:00 2001 From: Tian Baoqiang Date: Wed, 15 Feb 2017 00:34:44 +0800 Subject: [PATCH 127/192] refined #BAEL-100 and remove Java EE app for simplicity (#1168) --- spring-boot/pom.xml | 37 ++------ .../servletcomponentscan/JavaEEApp.java | 28 ------ .../SpringBootAnnotatedApp.java | 4 +- .../SpringBootPlainApp.java | 2 +- .../{javaee => components}/AttrListener.java | 2 +- .../{javaee => components}/EchoServlet.java | 3 +- .../{javaee => components}/HelloFilter.java | 2 +- .../{javaee => components}/HelloServlet.java | 3 +- .../JavaEEAppIntegrationTest.java | 85 ------------------- ...otWithServletComponentIntegrationTest.java | 2 +- ...ithoutServletComponentIntegrationTest.java | 2 +- 11 files changed, 14 insertions(+), 156 deletions(-) delete mode 100644 spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java rename spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/{javaee => components}/AttrListener.java (90%) rename spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/{javaee => components}/EchoServlet.java (90%) rename spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/{javaee => components}/HelloFilter.java (94%) rename spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/{javaee => components}/HelloServlet.java (90%) delete mode 100644 spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index b6a24b6cb7..e77ab10aff 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -24,26 +24,6 @@ org.springframework.boot spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - org.apache.geronimo.specs - geronimo-osgi-locator - 1.1 - test - - - - org.apache.geronimo.components - geronimo-jaspi - 2.0.0 - test @@ -109,18 +89,12 @@ - org.apache.tomee - arquillian-tomee-embedded - ${arquillian-tomee-embedded.version} - test - - - - org.apache.tomee - javaee-api - ${tomee-javaee-api.version} + org.apache.tomcat + tomcat-servlet-api + ${tomee-servlet-api.version} provided + @@ -220,8 +194,7 @@ 3.1.1 3.3.7-1 3.1.7 - 7.0.2 - 7.0-1 + 8.5.11 diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java deleted file mode 100644 index 773503c5af..0000000000 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/JavaEEApp.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.annotation.servletcomponentscan; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Observes; -import javax.servlet.ServletContext; - -@ApplicationScoped -public class JavaEEApp { - - private ServletContext context; - - /** - * act as a servletContext provider - */ - private void setContext(@Observes @Initialized(ApplicationScoped.class) final ServletContext context) { - if (this.context != null) { - throw new IllegalStateException("app context started twice"); - } - - this.context = context; - } - - public ServletContext getContext() { - return context; - } - -} diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java index 9fd66ee12a..b4d416dd96 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java @@ -9,13 +9,13 @@ import org.springframework.boot.web.servlet.ServletComponentScan; *
  • * @ServletComponentScan *
  • - * @ServletComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.javaee") + * @ServletComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components") *
  • * @ServletComponentScan(basePackageClasses = {AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class}) *
*/ @SpringBootApplication -@ServletComponentScan("com.baeldung.annotation.servletcomponentscan.javaee") +@ServletComponentScan("com.baeldung.annotation.servletcomponentscan.components") public class SpringBootAnnotatedApp { public static void main(String[] args) { diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java index 9ce1c296e6..8a39078aac 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java @@ -4,7 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.javaee") +@ComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components") public class SpringBootPlainApp { public static void main(String[] args) { diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java similarity index 90% rename from spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java rename to spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java index 321ddd59d1..bad39c52c4 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/AttrListener.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java @@ -1,4 +1,4 @@ -package com.baeldung.annotation.servletcomponentscan.javaee; +package com.baeldung.annotation.servletcomponentscan.components; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java similarity index 90% rename from spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java rename to spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java index b9fed314c7..3419cd0eaf 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/EchoServlet.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java @@ -1,4 +1,4 @@ -package com.baeldung.annotation.servletcomponentscan.javaee; +package com.baeldung.annotation.servletcomponentscan.components; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -6,7 +6,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; -import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java similarity index 94% rename from spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java rename to spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java index 81e90d69ad..dc2368c5b2 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloFilter.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.annotation.servletcomponentscan.javaee; +package com.baeldung.annotation.servletcomponentscan.components; import javax.servlet.*; import javax.servlet.annotation.WebFilter; diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java similarity index 90% rename from spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java rename to spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java index 4a46a56107..aeae7aecc9 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/javaee/HelloServlet.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java @@ -1,7 +1,6 @@ -package com.baeldung.annotation.servletcomponentscan.javaee; +package com.baeldung.annotation.servletcomponentscan.components; import javax.servlet.ServletConfig; -import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java deleted file mode 100644 index 95106d2dc8..0000000000 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/JavaEEAppIntegrationTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.baeldung.annotation.servletcomponentscan; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; - -import javax.inject.Inject; -import javax.servlet.FilterRegistration; -import javax.servlet.ServletContext; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.jboss.arquillian.container.test.api.Deployment; -import org.jboss.arquillian.container.test.api.RunAsClient; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.test.api.ArquillianResource; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Test; -import org.junit.runner.RunWith; - -import com.baeldung.annotation.servletcomponentscan.javaee.AttrListener; -import com.baeldung.annotation.servletcomponentscan.javaee.EchoServlet; -import com.baeldung.annotation.servletcomponentscan.javaee.HelloFilter; -import com.baeldung.annotation.servletcomponentscan.javaee.HelloServlet; - -@RunWith(Arquillian.class) -public class JavaEEAppIntegrationTest { - - @Deployment - public static WebArchive createDeployment() { - return ShrinkWrap.create(WebArchive.class).addClass(JavaEEApp.class).addClasses(AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class); - } - - @Inject - private ServletContext servletContext; - - @Test - public void givenServletContextListener_whenAccessSpecialAttrs_thenFound() throws MalformedURLException { - assertNotNull(servletContext); - assertNotNull(servletContext.getAttribute("servlet-context-attr")); - assertEquals("test", servletContext.getAttribute("servlet-context-attr")); - } - - @Test - public void givenServletContext_whenCheckHelloFilterMappings_thenCorrect() throws MalformedURLException { - assertNotNull(servletContext); - FilterRegistration filterRegistration = servletContext.getFilterRegistration("hello filter"); - - assertNotNull(filterRegistration); - assertTrue(filterRegistration.getServletNameMappings().contains("echo servlet")); - } - - @ArquillianResource - private URL base; - - @Test - @RunAsClient - public void givenFilterAndServlet_whenGetHello_thenRespondFilteringHello() throws MalformedURLException { - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(URI.create(new URL(base, "hello").toExternalForm())); - Response response = target.request().get(); - - assertEquals("filtering hello", response.readEntity(String.class)); - } - - @Test - @RunAsClient - public void givenFilterAndServlet_whenPostEcho_thenEchoFiltered() throws MalformedURLException { - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(URI.create(new URL(base, "echo").toExternalForm())); - Response response = target.request().post(Entity.entity("echo", MediaType.TEXT_PLAIN_TYPE)); - - assertEquals("filtering echo", response.readEntity(String.class)); - } - -} diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java index 81ac3c9841..8d5eb56bf4 100644 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java @@ -19,7 +19,7 @@ import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootAnnotatedApp.class) @AutoConfigureMockMvc -@TestPropertySource(properties = { "security.basic.enabled=false", "server.tomcat.additional-tld-skip-patterns=tomee-*.jar,tomcat-*.jar,openejb-*.jar,cxf-*.jar,activemq-*.jar" }) +@TestPropertySource(properties = { "security.basic.enabled=false" }) public class SpringBootWithServletComponentIntegrationTest { @Autowired private ServletContext servletContext; diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java index b2dea25864..64507ad02c 100644 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java @@ -19,7 +19,7 @@ import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootPlainApp.class) @AutoConfigureMockMvc -@TestPropertySource(properties = { "security.basic.enabled=false", "server.tomcat.additional-tld-skip-patterns=tomee-*.jar,tomcat-*.jar,openejb-*.jar,cxf-*.jar,activemq-*.jar" }) +@TestPropertySource(properties = { "security.basic.enabled=false" }) public class SpringBootWithoutServletComponentIntegrationTest { @Autowired private ServletContext servletContext; From 7f4c7157eb9dc040e737eff02fc923c02c0f1179 Mon Sep 17 00:00:00 2001 From: maibin Date: Tue, 14 Feb 2017 17:49:10 +0100 Subject: [PATCH 128/192] Struts2 refactoring (#1176) * Modifications to model on Hibernate One to manyTutorial * Modifications to model on Hibernate One to manyTutorial * Modifications to model on Hibernate One to manyTutorial * Simple Genetic Algorithm improvements * Struts2 refactoring --- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.9799201796740292 | 0 struts2/WebContent/WEB-INF/web.xml | 26 +++++++-------- struts2/pom.xml | 27 ++++++++++------ .../baeldung/struts/test/TestCarAction.java | 32 ------------------- .../java}/com/baeldung/struts/CarAction.java | 1 - .../baeldung/struts/CarMessageService.java | 0 .../baeldung/struts/test/CarActionTest.java | 29 +++++++++++++++++ 11 files changed, 57 insertions(+), 58 deletions(-) delete mode 100644 core-java/0.004102810554955205 delete mode 100644 core-java/0.04832801936270381 delete mode 100644 core-java/0.5633433244738808 delete mode 100644 core-java/0.6256429734439612 delete mode 100644 core-java/0.9799201796740292 delete mode 100644 struts2/src/com/baeldung/struts/test/TestCarAction.java rename struts2/src/{ => main/java}/com/baeldung/struts/CarAction.java (90%) rename struts2/src/{ => main/java}/com/baeldung/struts/CarMessageService.java (100%) create mode 100644 struts2/src/test/java/com/baeldung/struts/test/CarActionTest.java diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/struts2/WebContent/WEB-INF/web.xml b/struts2/WebContent/WEB-INF/web.xml index 3aa1d1d173..8f1b55943c 100644 --- a/struts2/WebContent/WEB-INF/web.xml +++ b/struts2/WebContent/WEB-INF/web.xml @@ -1,16 +1,12 @@ - - - MyStrutsApp - - struts2 - org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter - - - - struts2 - /* - + + + struts + + struts2 + org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter + + + struts2 + /* + \ No newline at end of file diff --git a/struts2/pom.xml b/struts2/pom.xml index 0ae054ef38..983f18903b 100644 --- a/struts2/pom.xml +++ b/struts2/pom.xml @@ -5,12 +5,12 @@ MyStrutsApp 0.0.1-SNAPSHOT war - MyStrutsApp + struts - src + src/main/java - src + src/main/resources @@ -32,28 +32,35 @@ - + + junit + junit + 4.12 + org.apache.struts struts2-core 2.5.5 - org.apache.struts struts2-junit-plugin 2.5.5 - org.apache.struts struts2-convention-plugin 2.5.8 - javax.servlet - javax.servlet-api - 3.0.1 - + javax.servlet + javax.servlet-api + 3.0.1 + + + org.springframework + spring-core + 4.3.6.RELEASE + \ No newline at end of file diff --git a/struts2/src/com/baeldung/struts/test/TestCarAction.java b/struts2/src/com/baeldung/struts/test/TestCarAction.java deleted file mode 100644 index ec21bd689a..0000000000 --- a/struts2/src/com/baeldung/struts/test/TestCarAction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.struts.test; -import org.apache.struts2.StrutsTestCase; -import org.junit.Test; - - -import com.baeldung.struts.CarAction; -import com.opensymphony.xwork2.ActionProxy; - -public class TestCarAction extends StrutsTestCase { - - @Test - public void test_givenCarOptions_WhenferrariSelected_ThenShowMessage() throws Exception { - request.setParameter("carName", "ferrari"); - ActionProxy proxy = getActionProxy("/tutorial/car.action"); - CarAction carAction = (CarAction) proxy.getAction(); - String result = proxy.execute(); - assertEquals(result,"success"); - assertEquals(carAction.getCarMessage(), "Ferrari Fan!"); - } - - - public void test_givenCarOptions_WhenbmwSelected_ThenShowMessage() throws Exception { - request.setParameter("carName", "bmw"); - ActionProxy proxy = getActionProxy("/tutorial/car.action"); - CarAction carAction = (CarAction) proxy.getAction(); - String result = proxy.execute(); - assertEquals(result,"success"); - assertEquals(carAction.getCarMessage(), "BMW Fan!"); - } - - -} diff --git a/struts2/src/com/baeldung/struts/CarAction.java b/struts2/src/main/java/com/baeldung/struts/CarAction.java similarity index 90% rename from struts2/src/com/baeldung/struts/CarAction.java rename to struts2/src/main/java/com/baeldung/struts/CarAction.java index 0b9266339c..478f3b4cc2 100644 --- a/struts2/src/com/baeldung/struts/CarAction.java +++ b/struts2/src/main/java/com/baeldung/struts/CarAction.java @@ -3,7 +3,6 @@ package com.baeldung.struts; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.Result; -import org.apache.struts2.convention.annotation.ResultPath; @Namespace("/tutorial") @Action("/car") diff --git a/struts2/src/com/baeldung/struts/CarMessageService.java b/struts2/src/main/java/com/baeldung/struts/CarMessageService.java similarity index 100% rename from struts2/src/com/baeldung/struts/CarMessageService.java rename to struts2/src/main/java/com/baeldung/struts/CarMessageService.java diff --git a/struts2/src/test/java/com/baeldung/struts/test/CarActionTest.java b/struts2/src/test/java/com/baeldung/struts/test/CarActionTest.java new file mode 100644 index 0000000000..64b640edfb --- /dev/null +++ b/struts2/src/test/java/com/baeldung/struts/test/CarActionTest.java @@ -0,0 +1,29 @@ +//package com.baeldung.struts.test; +// +//import org.apache.struts2.StrutsTestCase; +//import org.junit.Test; +// +//import com.baeldung.struts.CarAction; +//import com.opensymphony.xwork2.ActionProxy; +// +//public class CarActionTest extends StrutsTestCase { +// +// public void testgivenCarOptions_WhenferrariSelected_ThenShowMessage() throws Exception { +// request.setParameter("carName", "ferrari"); +// ActionProxy proxy = getActionProxy("/tutorial/car.action"); +// CarAction carAction = (CarAction) proxy.getAction(); +// String result = proxy.execute(); +// assertEquals(result, "success"); +// assertEquals(carAction.getCarMessage(), "Ferrari Fan!"); +// } +// +// public void testgivenCarOptions_WhenbmwSelected_ThenShowMessage() throws Exception { +// request.setParameter("carName", "bmw"); +// ActionProxy proxy = getActionProxy("/tutorial/car.action"); +// CarAction carAction = (CarAction) proxy.getAction(); +// String result = proxy.execute(); +// assertEquals(result, "success"); +// assertEquals(carAction.getCarMessage(), "BMW Fan!"); +// } +// +//} From dd40ed702560dfd9a947462445bb2b4bdea4d12b Mon Sep 17 00:00:00 2001 From: Danil Kornishev Date: Tue, 14 Feb 2017 15:44:45 -0500 Subject: [PATCH 129/192] Neo4j moved (#1152) * Neo4j cleanup * Neo4j cleanup * Neo4j cleanup x2 --- core-java/pom.xml | 40 +-------------- spring-data-neo4j/pom.xml | 51 +++++++++++++++---- .../MovieDatabaseNeo4jConfiguration.java | 7 +-- .../MovieDatabaseNeo4jTestConfiguration.java | 6 +-- .../spring/data/neo4j/domain}/Car.java | 5 +- .../spring/data/neo4j/domain}/Company.java | 5 +- .../com/baeldung/neo4j}/Neo4JServerTest.java | 4 +- .../com/baeldung/neo4j}/Neo4jOgmTest.java | 19 ++++--- .../java/com/baeldung/neo4j}/Neo4jTest.java | 4 +- .../src/test/resources/logback.xml | 16 ++++++ 10 files changed, 79 insertions(+), 78 deletions(-) rename {core-java/src/main/java/com/baeldung/graph => spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain}/Car.java (89%) rename {core-java/src/main/java/com/baeldung/graph => spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain}/Company.java (87%) rename {core-java/src/test/java/com/baeldung/graph => spring-data-neo4j/src/test/java/com/baeldung/neo4j}/Neo4JServerTest.java (97%) rename {core-java/src/test/java/com/baeldung/graph => spring-data-neo4j/src/test/java/com/baeldung/neo4j}/Neo4jOgmTest.java (80%) rename {core-java/src/test/java/com/baeldung/graph => spring-data-neo4j/src/test/java/com/baeldung/neo4j}/Neo4jTest.java (99%) create mode 100644 spring-data-neo4j/src/test/resources/logback.xml diff --git a/core-java/pom.xml b/core-java/pom.xml index 2b6f065c85..b2c59989f1 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -9,45 +9,7 @@ core-java - - - org.neo4j - neo4j - 3.1.0 - - - - org.neo4j.driver - neo4j-java-driver - 1.1.1 - - - - org.neo4j - neo4j-jdbc-driver - 3.0.1 - - - - org.neo4j - neo4j-ogm-core - 2.1.1 - - - - org.neo4j - neo4j-ogm-embedded-driver - 2.1.1 - - - - com.google.inject - guice - 4.1.0 - no_aop - test - - + net.sourceforge.collections diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml index ce10313b2e..7e7f02e9a9 100644 --- a/spring-data-neo4j/pom.xml +++ b/spring-data-neo4j/pom.xml @@ -7,10 +7,41 @@ 1.0 + + org.neo4j + neo4j + 3.1.0 + + + + org.neo4j + neo4j-ogm-core + 2.1.1 + + + + org.neo4j + neo4j-ogm-embedded-driver + 2.1.1 + + + + org.neo4j.driver + neo4j-java-driver + 1.1.1 + + + + org.springframework.data + spring-data-neo4j + 4.2.0.RELEASE + + org.springframework.data spring-data-neo4j ${spring-data-neo4j.version} + test-jar @@ -27,13 +58,6 @@ test - - org.springframework.data - spring-data-neo4j - ${spring-data-neo4j.version} - test-jar - - org.neo4j neo4j-kernel @@ -72,9 +96,14 @@ spring-test ${spring-test.version} - + + junit + junit + 4.12 + + @@ -130,16 +159,18 @@ + 1.8 + 1.8 1.8 UTF-8 UTF-8 - 3.0.7 + 3.1.0 4.1.6.RELEASE 1.1 1.4.3.RELEASE 4.3.5.RELEASE - 2.0.6 + 2.1.1 4.12 diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java index fb4fda1497..344282d665 100644 --- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java @@ -4,15 +4,12 @@ import org.neo4j.ogm.session.SessionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.data.neo4j.config.Neo4jConfiguration; import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.transaction.annotation.EnableTransactionManagement; @ComponentScan(basePackages = { "com.baeldung.spring.data.neo4j.services" }) @Configuration @EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory") -public class MovieDatabaseNeo4jConfiguration extends Neo4jConfiguration { +public class MovieDatabaseNeo4jConfiguration { public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "http://neo4j:movies@localhost:7474"; @@ -23,7 +20,7 @@ public class MovieDatabaseNeo4jConfiguration extends Neo4jConfiguration { return config; } - @Override + @Bean public SessionFactory getSessionFactory() { return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); } diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java index 81935b2293..7bb1b78a09 100644 --- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java @@ -5,9 +5,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.data.neo4j.config.Neo4jConfiguration; import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; -import org.springframework.data.neo4j.server.Neo4jServer; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @@ -15,7 +13,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory") @Profile({ "embedded", "test" }) -public class MovieDatabaseNeo4jTestConfiguration extends Neo4jConfiguration { +public class MovieDatabaseNeo4jTestConfiguration { @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { @@ -24,7 +22,7 @@ public class MovieDatabaseNeo4jTestConfiguration extends Neo4jConfiguration { return config; } - @Override + @Bean public SessionFactory getSessionFactory() { return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); } diff --git a/core-java/src/main/java/com/baeldung/graph/Car.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java similarity index 89% rename from core-java/src/main/java/com/baeldung/graph/Car.java rename to spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java index 1dc65a0d4b..f2325a334f 100644 --- a/core-java/src/main/java/com/baeldung/graph/Car.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java @@ -1,12 +1,9 @@ -package com.baeldung.graph; +package com.baeldung.spring.data.neo4j.domain; import org.neo4j.ogm.annotation.GraphId; import org.neo4j.ogm.annotation.NodeEntity; import org.neo4j.ogm.annotation.Relationship; -/** - * @author Danil Kornishev (danil.kornishev@mastercard.com) - */ @NodeEntity public class Car { @GraphId diff --git a/core-java/src/main/java/com/baeldung/graph/Company.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java similarity index 87% rename from core-java/src/main/java/com/baeldung/graph/Company.java rename to spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java index 1fe892b331..4422ade44f 100644 --- a/core-java/src/main/java/com/baeldung/graph/Company.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java @@ -1,11 +1,8 @@ -package com.baeldung.graph; +package com.baeldung.spring.data.neo4j.domain; import org.neo4j.ogm.annotation.NodeEntity; import org.neo4j.ogm.annotation.Relationship; -/** - * @author Danil Kornishev (danil.kornishev@mastercard.com) - */ @NodeEntity public class Company { private Long id; diff --git a/core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java rename to spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerTest.java index b41588b71e..e959e0237d 100644 --- a/core-java/src/test/java/com/baeldung/graph/Neo4JServerTest.java +++ b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerTest.java @@ -1,10 +1,11 @@ -package com.baeldung.graph; +package com.baeldung.neo4j; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; +import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.neo4j.driver.v1.AuthTokens; @@ -12,7 +13,6 @@ import org.neo4j.driver.v1.Driver; import org.neo4j.driver.v1.GraphDatabase; import org.neo4j.driver.v1.Session; import org.neo4j.driver.v1.StatementResult; -import org.testng.Assert; @Ignore public class Neo4JServerTest { diff --git a/core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmTest.java similarity index 80% rename from core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java rename to spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmTest.java index 00bd47d029..3e218f39d7 100644 --- a/core-java/src/test/java/com/baeldung/graph/Neo4jOgmTest.java +++ b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmTest.java @@ -1,18 +1,19 @@ -package com.baeldung.graph; +package com.baeldung.neo4j; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; import org.junit.Test; import org.neo4j.ogm.config.Configuration; import org.neo4j.ogm.model.Result; import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; -import org.testng.Assert; -import java.util.HashMap; -import java.util.Map; +import com.baeldung.spring.data.neo4j.domain.Car; +import com.baeldung.spring.data.neo4j.domain.Company; +import org.neo4j.ogm.transaction.Transaction; -/** - * @author Danil Kornishev (danil.kornishev@mastercard.com) - */ public class Neo4jOgmTest { @Test @@ -20,7 +21,7 @@ public class Neo4jOgmTest { Configuration conf = new Configuration(); conf.driverConfiguration().setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver"); - SessionFactory factory = new SessionFactory(conf, "com.baeldung.graph"); + SessionFactory factory = new SessionFactory(conf, "com.baeldung.spring.data.neo4j.domain"); Session session = factory.openSession(); Car tesla = new Car("tesla", "modelS"); @@ -30,6 +31,8 @@ public class Neo4jOgmTest { session.save(baeldung); + Assert.assertEquals(1, session.countEntitiesOfType(Company.class)); + Map params = new HashMap<>(); params.put("make", "tesla"); Result result = session.query("MATCH (car:Car) <-[:owns]- (company:Company)" + diff --git a/core-java/src/test/java/com/baeldung/graph/Neo4jTest.java b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/graph/Neo4jTest.java rename to spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jTest.java index 6956c2c39f..c303410e57 100644 --- a/core-java/src/test/java/com/baeldung/graph/Neo4jTest.java +++ b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jTest.java @@ -1,4 +1,4 @@ -package com.baeldung.graph; +package com.baeldung.neo4j; import java.io.File; @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.neo4j.graphdb.GraphDatabaseService; @@ -16,7 +17,6 @@ import org.neo4j.graphdb.NotFoundException; import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; import org.neo4j.graphdb.factory.GraphDatabaseFactory; -import org.testng.Assert; public class Neo4jTest { diff --git a/spring-data-neo4j/src/test/resources/logback.xml b/spring-data-neo4j/src/test/resources/logback.xml new file mode 100644 index 0000000000..39a6538324 --- /dev/null +++ b/spring-data-neo4j/src/test/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + %d %5p %40.40c:%4L - %m%n + + + + + + + + + + From f3f021f036197f53a8c6288a4895ed7160ae16a0 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Wed, 15 Feb 2017 01:20:28 +0000 Subject: [PATCH 130/192] Mesos marathon module (#1107) * mesos marathon demo * Updated DockerFile to point to maven target * Pointed to baeldung docker repository * Added file permissions for Dockerise script --- mesos-marathon/Dockerfile | 4 ++ mesos-marathon/dockerise.sh | 5 ++ mesos-marathon/marathon.json | 14 ++++++ mesos-marathon/pom.xml | 46 +++++++++++++++++++ .../java/com/mogronalol/DemoApplication.java | 14 ++++++ .../java/com/mogronalol/HelloController.java | 17 +++++++ .../src/main/resources/application.properties | 1 + .../com/mogronalol/DemoApplicationTests.java | 34 ++++++++++++++ pom.xml | 1 + 9 files changed, 136 insertions(+) create mode 100644 mesos-marathon/Dockerfile create mode 100755 mesos-marathon/dockerise.sh create mode 100644 mesos-marathon/marathon.json create mode 100644 mesos-marathon/pom.xml create mode 100644 mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java create mode 100644 mesos-marathon/src/main/java/com/mogronalol/HelloController.java create mode 100644 mesos-marathon/src/main/resources/application.properties create mode 100644 mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java diff --git a/mesos-marathon/Dockerfile b/mesos-marathon/Dockerfile new file mode 100644 index 0000000000..ca79f2dc82 --- /dev/null +++ b/mesos-marathon/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:8-jre-alpine +ADD target/mesos-marathon-0.0.1-SNAPSHOT.jar app.jar +EXPOSE 8082 +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/mesos-marathon/dockerise.sh b/mesos-marathon/dockerise.sh new file mode 100755 index 0000000000..50f5d38306 --- /dev/null +++ b/mesos-marathon/dockerise.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +docker login -u mogronalol -p $DOCKER_PASSWORD +docker build -t baeldung/mesos-marathon-demo:$BUILD_NUMBER . +docker push baeldung/mesos-marathon-demo:$BUILD_NUMBER diff --git a/mesos-marathon/marathon.json b/mesos-marathon/marathon.json new file mode 100644 index 0000000000..6471259e92 --- /dev/null +++ b/mesos-marathon/marathon.json @@ -0,0 +1,14 @@ +{ + "id": "mesos-marathon-demo", + "container": { + "type": "DOCKER", + "docker": { + "image": "", + "network": "BRIDGE", + "portMappings": [ + { "containerPort": 8082, "hostPort": 0 } + ] + }, + "volumes": [] + } +} \ No newline at end of file diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml new file mode 100644 index 0000000000..ca17a5c4c4 --- /dev/null +++ b/mesos-marathon/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.baeldung + mesos-marathon + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.1.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.1.RELEASE + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java b/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java new file mode 100644 index 0000000000..f757178026 --- /dev/null +++ b/mesos-marathon/src/main/java/com/mogronalol/DemoApplication.java @@ -0,0 +1,14 @@ +package com.mogronalol; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } +} diff --git a/mesos-marathon/src/main/java/com/mogronalol/HelloController.java b/mesos-marathon/src/main/java/com/mogronalol/HelloController.java new file mode 100644 index 0000000000..2059280ba0 --- /dev/null +++ b/mesos-marathon/src/main/java/com/mogronalol/HelloController.java @@ -0,0 +1,17 @@ +package com.mogronalol; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController(value = "/") +public class HelloController { + + @GetMapping + @ResponseBody + public String getMapping() { + return "Hello world"; + } + +} diff --git a/mesos-marathon/src/main/resources/application.properties b/mesos-marathon/src/main/resources/application.properties new file mode 100644 index 0000000000..8d51d0c619 --- /dev/null +++ b/mesos-marathon/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8082 \ No newline at end of file diff --git a/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java b/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java new file mode 100644 index 0000000000..5e88f9a70f --- /dev/null +++ b/mesos-marathon/src/test/java/com/mogronalol/DemoApplicationTests.java @@ -0,0 +1,34 @@ +package com.mogronalol; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.client.RestTemplate; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = {DemoApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class DemoApplicationTests { + + private RestTemplate restTemplate; + + @LocalServerPort + private int port; + + @Before + public void setUp() { + restTemplate = new RestTemplate(); + } + + @Test + public void contextLoads() { + final String result = restTemplate.getForObject("http://localhost:" + port + "/", String.class); + assertThat(result).isEqualTo("Hello world"); + } + +} diff --git a/pom.xml b/pom.xml index 2392e2c594..9eb4e78dbf 100644 --- a/pom.xml +++ b/pom.xml @@ -81,6 +81,7 @@ mapstruct metrics + mesos-marathon mockito mocks From 746ed952db17ae4d626bc9398693ab9cf5e3cb49 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Tue, 14 Feb 2017 20:52:25 -0600 Subject: [PATCH 131/192] Update README.md --- spring-security-mvc-login/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-mvc-login/README.md b/spring-security-mvc-login/README.md index d1f6b884b1..35305112b4 100644 --- a/spring-security-mvc-login/README.md +++ b/spring-security-mvc-login/README.md @@ -10,6 +10,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security Logout](http://www.baeldung.com/spring-security-logout) - [Spring Security Expressions – hasRole Example](http://www.baeldung.com/spring-security-expressions-basic) - [Spring HTTP/HTTPS Channel Security](http://www.baeldung.com/spring-channel-security-https) +- [Spring Security - Customize the 403 Forbidden/Access Denied Page](http://www.baeldung.com/spring-security-custom-access-denied-page) ### Build the Project ``` From 9135c6073e9c3ce2906c0a6e9274d26619acd618 Mon Sep 17 00:00:00 2001 From: Stephen Braimah Date: Mon, 13 Feb 2017 21:45:43 +0100 Subject: [PATCH 132/192] BAEL-639: Guide to Guava's EventBus Tests - removed EventWrapper and added DeadEvent Subscriber --- .../org/baeldung/guava/GuavaEventBusTest.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java index 1db361d22c..0ff25c6df2 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java @@ -1,5 +1,6 @@ package org.baeldung.guava; +import com.google.common.eventbus.EventBus; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -9,25 +10,27 @@ import static org.junit.Assert.*; public class GuavaEventBusTest { private EventListener listener; + private EventBus eventBus; @Before public void setUp() { + eventBus = new EventBus(); listener = new EventListener(); - EventBusWrapper.register(listener); + + eventBus.register(listener); } @After public void tearDown() { - EventBusWrapper.unregister(listener); + eventBus.unregister(listener); } @Test public void givenStringEvent_whenEventHandled_thenSuccess() { listener.resetEventsHandled(); - EventBusWrapper.post("String Event"); + eventBus.post("String Event"); assertEquals(1, listener.getEventsHandled()); - } @Test @@ -35,8 +38,17 @@ public class GuavaEventBusTest { listener.resetEventsHandled(); CustomEvent customEvent = new CustomEvent("Custom Event"); - EventBusWrapper.post(customEvent); + eventBus.post(customEvent); assertEquals(1, listener.getEventsHandled()); } + + @Test + public void givenUnSubscribedEvent_whenEventHandledByDeadEvent_thenSuccess() { + listener.resetEventsHandled(); + + eventBus.post(12345); + assertEquals(1, listener.getEventsHandled()); + } + } From cc089e52974a80cb539176cc19922092e986c765 Mon Sep 17 00:00:00 2001 From: Mohd Farid Date: Wed, 15 Feb 2017 12:06:04 +0530 Subject: [PATCH 133/192] BAEL-668 find min/max from a list/collection (#1134) * BAEL-668 find min/max from a list/collection * BAEL-668 using mapToInt instead of Compare * BAEL-668 using direct assertion with the method call --- .../com/baeldung/java_8_features/Person.java | 27 ++++++++++++++ .../com/baeldung/java8/Java8MaxMinTest.java | 37 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/java_8_features/Person.java create mode 100644 core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Person.java b/core-java/src/main/java/com/baeldung/java_8_features/Person.java new file mode 100644 index 0000000000..83b5530ee8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java_8_features/Person.java @@ -0,0 +1,27 @@ +package com.baeldung.java_8_features; + +public class Person { + private String name; + private Integer age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java b/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java new file mode 100644 index 0000000000..0e361d96e1 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java @@ -0,0 +1,37 @@ +package com.baeldung.java8; + +import com.baeldung.java_8_features.Person; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class Java8MaxMinTest { + + @Test + public void whenListIsOfIntegerThenMaxCanBeDoneUsingIntegerComparator() { + //given + final List listOfIntegers = Arrays.asList(1, 2, 3, 4, 56, 7, 89, 10); + final Integer expectedResult = 89; + + //then + assertEquals(expectedResult, + (Integer) listOfIntegers.stream().mapToInt(val -> val).max().getAsInt()); + } + + @Test + public void whenListIsOfPersonObjectThenMinCanBeDoneUsingCustomComparatorThroughLambda() { + //given + final Person alex = new Person("Alex", 23); + final Person john = new Person("John", 40); + final Person peter = new Person("Peter", 32); + final List people = Arrays.asList(alex, john, peter); + + //then + assertEquals("Alex must be having min age", alex, + people.stream().min((o1, o2) -> o1.getAge().compareTo(o2.getAge())).get()); + } + +} From f7ef3766cbb49b3588e2d3b740d4e0c6ae24e92e Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Wed, 15 Feb 2017 09:58:37 +0100 Subject: [PATCH 134/192] BAEL-639: Guide to Guava's EventBus Tests - adding sleep --- guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java index 0ff25c6df2..b20ea45e41 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java @@ -44,10 +44,12 @@ public class GuavaEventBusTest { } @Test - public void givenUnSubscribedEvent_whenEventHandledByDeadEvent_thenSuccess() { + public void givenUnSubscribedEvent_whenEventHandledByDeadEvent_thenSuccess() throws InterruptedException { listener.resetEventsHandled(); eventBus.post(12345); + Thread.sleep(1000); + assertEquals(1, listener.getEventsHandled()); } From 429c700caff0ac3c59b97255999aca649f28a624 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Wed, 15 Feb 2017 10:04:00 +0100 Subject: [PATCH 135/192] BAEL-639: Fixing failing test --- .../org/baeldung/guava/EventBusWrapper.java | 21 ------------------- .../org/baeldung/guava/EventListener.java | 7 +++++++ .../org/baeldung/guava/GuavaEventBusTest.java | 1 - 3 files changed, 7 insertions(+), 22 deletions(-) delete mode 100644 guava/src/main/java/org/baeldung/guava/EventBusWrapper.java diff --git a/guava/src/main/java/org/baeldung/guava/EventBusWrapper.java b/guava/src/main/java/org/baeldung/guava/EventBusWrapper.java deleted file mode 100644 index 243bc9e6ea..0000000000 --- a/guava/src/main/java/org/baeldung/guava/EventBusWrapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.baeldung.guava; - -import com.google.common.eventbus.EventBus; - -class EventBusWrapper { - - private static EventBus eventBus = new EventBus(); - - static void register(Object object) { - eventBus.register(object); - } - - static void unregister(Object object) { - eventBus.unregister(object); - } - - static void post(Object object) { - eventBus.post(object); - } - -} diff --git a/guava/src/main/java/org/baeldung/guava/EventListener.java b/guava/src/main/java/org/baeldung/guava/EventListener.java index 02f22ce6b9..438fcade63 100644 --- a/guava/src/main/java/org/baeldung/guava/EventListener.java +++ b/guava/src/main/java/org/baeldung/guava/EventListener.java @@ -1,5 +1,6 @@ package org.baeldung.guava; +import com.google.common.eventbus.DeadEvent; import com.google.common.eventbus.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,6 +22,12 @@ public class EventListener { eventsHandled++; } + @Subscribe + public void handleDeadEvent(DeadEvent deadEvent) { + LOG.info("unhandled event [" + deadEvent.getEvent() + "]"); + eventsHandled++; + } + public int getEventsHandled() { return eventsHandled; } diff --git a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java index b20ea45e41..1390eb05aa 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaEventBusTest.java @@ -48,7 +48,6 @@ public class GuavaEventBusTest { listener.resetEventsHandled(); eventBus.post(12345); - Thread.sleep(1000); assertEquals(1, listener.getEventsHandled()); } From 99963ee271d63ccb35a2f8c161e2d7e520c51aca Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 15 Feb 2017 11:24:25 +0100 Subject: [PATCH 136/192] Refactor spring-data-neo4j --- .../spring/data/neo4j/repostory/MovieRepository.java | 1 + .../spring/data/neo4j/repostory/PersonRepository.java | 1 - .../baeldung/spring/data/neo4j/services/MovieService.java | 8 ++++---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java index 1bd605a7bc..afb82551e7 100644 --- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java @@ -12,6 +12,7 @@ import java.util.Map; @Repository public interface MovieRepository extends GraphRepository { + Movie findByTitle(@Param("title") String title); @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m") diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java index f7f694c07f..4ac40ef75b 100644 --- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java @@ -6,5 +6,4 @@ import org.springframework.stereotype.Repository; @Repository public interface PersonRepository extends GraphRepository { - } diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java index d760d19066..ae1f6eb8e5 100644 --- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java +++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java @@ -12,11 +12,11 @@ import java.util.*; public class MovieService { @Autowired - MovieRepository movieRepository; + private MovieRepository movieRepository; private Map toD3Format(Iterator> result) { - List> nodes = new ArrayList>(); - List> rels = new ArrayList>(); + List> nodes = new ArrayList<>(); + List> rels = new ArrayList<>(); int i = 0; while (result.hasNext()) { Map row = result.next(); @@ -37,7 +37,7 @@ public class MovieService { } private Map map(String key1, Object value1, String key2, Object value2) { - Map result = new HashMap(2); + Map result = new HashMap<>(2); result.put(key1, value1); result.put(key2, value2); return result; From dd0158836921e4170255dddc3da808ebe47577a5 Mon Sep 17 00:00:00 2001 From: Sunil Gulabani Date: Wed, 15 Feb 2017 18:07:14 +0530 Subject: [PATCH 137/192] BAEL-650: Small refactoring --- .../lambda/dynamodb/SavePersonHandler.java | 23 ++++++++----------- .../lambda/dynamodb/bean/PersonRequest.java | 3 ++- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java index 70aa0fd68f..625da62efd 100644 --- a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java +++ b/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java @@ -17,35 +17,32 @@ public class SavePersonHandler implements RequestHandler Date: Wed, 15 Feb 2017 20:34:39 +0530 Subject: [PATCH 138/192] BAEL-604 Introduction to Apache velocity (#1179) * BAEL-604 Introduction to apache velocity * BAEL-604 Introduction to apache velocity --- apache-velocity/pom.xml | 101 ++++++++++++++++++ .../apache/velocity/model/Product.java | 33 ++++++ .../velocity/service/ProductService.java | 20 ++++ .../velocity/servlet/LayoutServlet.java | 41 +++++++ .../velocity/servlet/ProductServlet.java | 40 +++++++ .../src/main/resources/logback.xml | 23 ++++ .../main/webapp/WEB-INF/velocity.properties | 4 + .../src/main/webapp/WEB-INF/web.xml | 49 +++++++++ .../src/main/webapp/fragments/footer.vm | 4 + .../src/main/webapp/fragments/header.vm | 5 + .../src/main/webapp/layout/Default.vm | 22 ++++ .../src/main/webapp/templates/index.vm | 63 +++++++++++ .../src/main/webapp/templates/layoutdemo.vm | 27 +++++ .../servlet/LayoutServletLiveTest.java | 26 +++++ .../servlet/ProductServletLiveTest.java | 24 +++++ pom.xml | 2 + 16 files changed, 484 insertions(+) create mode 100644 apache-velocity/pom.xml create mode 100644 apache-velocity/src/main/java/com/baeldung/apache/velocity/model/Product.java create mode 100644 apache-velocity/src/main/java/com/baeldung/apache/velocity/service/ProductService.java create mode 100644 apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/LayoutServlet.java create mode 100644 apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/ProductServlet.java create mode 100644 apache-velocity/src/main/resources/logback.xml create mode 100644 apache-velocity/src/main/webapp/WEB-INF/velocity.properties create mode 100644 apache-velocity/src/main/webapp/WEB-INF/web.xml create mode 100644 apache-velocity/src/main/webapp/fragments/footer.vm create mode 100644 apache-velocity/src/main/webapp/fragments/header.vm create mode 100644 apache-velocity/src/main/webapp/layout/Default.vm create mode 100644 apache-velocity/src/main/webapp/templates/index.vm create mode 100644 apache-velocity/src/main/webapp/templates/layoutdemo.vm create mode 100644 apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/LayoutServletLiveTest.java create mode 100644 apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/ProductServletLiveTest.java diff --git a/apache-velocity/pom.xml b/apache-velocity/pom.xml new file mode 100644 index 0000000000..08f0e96a58 --- /dev/null +++ b/apache-velocity/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + com.baeldung + 0.1-SNAPSHOT + apache-velocity + + war + apache-velocity + + + 1.8 + 1.2 + 4.11 + 1.0.13 + 1.7.5 + 3.6.0 + 2.6 + 2.19.1 + 4.5.2 + 1.7 + 2.0 + + + + + junit + junit + ${junit.version} + test + + + org.apache.velocity + velocity + ${velocity-version} + + + org.apache.velocity + velocity-tools + ${velocity-tools-version} + + + org.slf4j + jcl-over-slf4j + ${jcl-over-slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.apache.httpcomponents + httpclient + ${org.apache.httpcomponents.version} + test + + + + apache-velocity + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${jdk.version} + ${jdk.version} + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*LiveTest.java + + + + + + + + diff --git a/apache-velocity/src/main/java/com/baeldung/apache/velocity/model/Product.java b/apache-velocity/src/main/java/com/baeldung/apache/velocity/model/Product.java new file mode 100644 index 0000000000..c215223181 --- /dev/null +++ b/apache-velocity/src/main/java/com/baeldung/apache/velocity/model/Product.java @@ -0,0 +1,33 @@ +package com.baeldung.apache.velocity.model; + +public class Product { + + private String name; + private double price; + + public Product(String name, double price) { + this.name = name; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + @Override + public String toString() { + return "Product{" + "name='" + name + '\'' + ", price=" + price + '}'; + } +} diff --git a/apache-velocity/src/main/java/com/baeldung/apache/velocity/service/ProductService.java b/apache-velocity/src/main/java/com/baeldung/apache/velocity/service/ProductService.java new file mode 100644 index 0000000000..0a623d4d65 --- /dev/null +++ b/apache-velocity/src/main/java/com/baeldung/apache/velocity/service/ProductService.java @@ -0,0 +1,20 @@ +package com.baeldung.apache.velocity.service; + +import com.baeldung.apache.velocity.model.Product; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.List; + +public class ProductService { + + Logger logger = LoggerFactory.getLogger(ProductService.class); + + public List getProducts() { + logger.debug("Product service returning list of products"); + + return Arrays.asList(new Product("Laptop", 31000.00), new Product("Mobile", 16000.00), + new Product("Tablet", 15000.00), new Product("Camera", 23000.00)); + } +} diff --git a/apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/LayoutServlet.java b/apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/LayoutServlet.java new file mode 100644 index 0000000000..d4208a3880 --- /dev/null +++ b/apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/LayoutServlet.java @@ -0,0 +1,41 @@ +package com.baeldung.apache.velocity.servlet; + +import com.baeldung.apache.velocity.model.Product; +import com.baeldung.apache.velocity.service.ProductService; +import org.apache.velocity.Template; +import org.apache.velocity.context.Context; +import org.apache.velocity.tools.view.VelocityLayoutServlet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public class LayoutServlet extends VelocityLayoutServlet { + ProductService service = new ProductService(); + + @Override + public Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) { + + Logger logger= LoggerFactory.getLogger(LayoutServlet.class); + + List products = service.getProducts(); + + context.put("products", products); + + Template template = null; + + try { + template = getTemplate("templates/layoutdemo.vm"); + + response.setHeader("Template Returned", "Success"); + } catch (Exception e) { + logger.error("Error while reading the template ",e); + } + + return template; + + } + +} diff --git a/apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/ProductServlet.java b/apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/ProductServlet.java new file mode 100644 index 0000000000..60c9169fce --- /dev/null +++ b/apache-velocity/src/main/java/com/baeldung/apache/velocity/servlet/ProductServlet.java @@ -0,0 +1,40 @@ +package com.baeldung.apache.velocity.servlet; + +import com.baeldung.apache.velocity.model.Product; +import com.baeldung.apache.velocity.service.ProductService; +import org.apache.velocity.Template; +import org.apache.velocity.context.Context; +import org.apache.velocity.tools.view.VelocityViewServlet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public class ProductServlet extends VelocityViewServlet { + + ProductService service = new ProductService(); + + @Override + public Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) { + + Logger logger= LoggerFactory.getLogger(ProductServlet.class); + + List products = service.getProducts(); + + context.put("products", products); + + Template template = null; + + try { + template = getTemplate("templates/index.vm"); + response.setHeader("Template Returned", "Success"); + } catch (Exception e) { + logger.error("Error while reading the template ", e); + } + + return template; + + } +} diff --git a/apache-velocity/src/main/resources/logback.xml b/apache-velocity/src/main/resources/logback.xml new file mode 100644 index 0000000000..70a420a57a --- /dev/null +++ b/apache-velocity/src/main/resources/logback.xml @@ -0,0 +1,23 @@ + + + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apache-velocity/src/main/webapp/WEB-INF/velocity.properties b/apache-velocity/src/main/webapp/WEB-INF/velocity.properties new file mode 100644 index 0000000000..00e0b7e410 --- /dev/null +++ b/apache-velocity/src/main/webapp/WEB-INF/velocity.properties @@ -0,0 +1,4 @@ +resource.loader=webapp +webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader +webapp.resource.loader.path = . +webapp.resource.loader.cache = true \ No newline at end of file diff --git a/apache-velocity/src/main/webapp/WEB-INF/web.xml b/apache-velocity/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..95b41b36dd --- /dev/null +++ b/apache-velocity/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,49 @@ + + + + apache-velocity + + ProductServlet + com.baeldung.apache.velocity.servlet.ProductServlet + + + + LayoutServlet + com.baeldung.apache.velocity.servlet.LayoutServlet + + + velocityLayout + org.apache.velocity.tools.view.VelocityLayoutServlet + + + org.apache.velocity.properties + /WEB-INF/velocity.properties + + + + ProductServlet + / + + + + LayoutServlet + /layout + + + velocityLayout + *.vm + + + + + 30 + + + + + + index.html + + diff --git a/apache-velocity/src/main/webapp/fragments/footer.vm b/apache-velocity/src/main/webapp/fragments/footer.vm new file mode 100644 index 0000000000..41bb36ce5e --- /dev/null +++ b/apache-velocity/src/main/webapp/fragments/footer.vm @@ -0,0 +1,4 @@ +
+ @Copyright baeldung.com +
\ No newline at end of file diff --git a/apache-velocity/src/main/webapp/fragments/header.vm b/apache-velocity/src/main/webapp/fragments/header.vm new file mode 100644 index 0000000000..96700d3baf --- /dev/null +++ b/apache-velocity/src/main/webapp/fragments/header.vm @@ -0,0 +1,5 @@ +
+
+

Layout Demo Page

+
+
\ No newline at end of file diff --git a/apache-velocity/src/main/webapp/layout/Default.vm b/apache-velocity/src/main/webapp/layout/Default.vm new file mode 100644 index 0000000000..39a8b277a5 --- /dev/null +++ b/apache-velocity/src/main/webapp/layout/Default.vm @@ -0,0 +1,22 @@ + + + Velocity + + +
+ #parse("/fragments/header.vm") +
+ + +
+ + + $screen_content + +
+ +
+ #parse("/fragments/footer.vm") +
+ + \ No newline at end of file diff --git a/apache-velocity/src/main/webapp/templates/index.vm b/apache-velocity/src/main/webapp/templates/index.vm new file mode 100644 index 0000000000..0ca07caf42 --- /dev/null +++ b/apache-velocity/src/main/webapp/templates/index.vm @@ -0,0 +1,63 @@ + + + Online Electronic Store + + + + +
+

Today's Offers

+
+
+

$products.size() Products on Sale!

+
+ We are proud to offer these fine products + at these amazing prices. +
+
+ #set( $count = 1 ) + + + + + #foreach( $product in $products ) + + + + + + #set( $count = $count + 1 ) + #end +
Serial #Product NamePrice
$count)$product.getName()$product.getPrice()
+
+
+ + + diff --git a/apache-velocity/src/main/webapp/templates/layoutdemo.vm b/apache-velocity/src/main/webapp/templates/layoutdemo.vm new file mode 100644 index 0000000000..0626b655c9 --- /dev/null +++ b/apache-velocity/src/main/webapp/templates/layoutdemo.vm @@ -0,0 +1,27 @@ +#set( $layout = "layout.vm" ) +
+

Today's Offers

+
+
+

$products.size() Products on Sale!

+
+ We are proud to offer these fine products + at these amazing prices. +
+
+ #set( $count = 1 ) + + + + + #foreach( $product in $products ) + + + + + + #set( $count = $count + 1 ) + #end +
Serial #Product NamePrice
$count)$product.getName()$product.getPrice()
+
+
\ No newline at end of file diff --git a/apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/LayoutServletLiveTest.java b/apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/LayoutServletLiveTest.java new file mode 100644 index 0000000000..f1f166b119 --- /dev/null +++ b/apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/LayoutServletLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.apache.velocity.servlet; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + + +public class LayoutServletLiveTest { + + @Test + public void whenRequestUsingHttpClient_thenCorrectResponse() throws Exception { + + HttpClient client = new DefaultHttpClient(); + HttpGet method= new HttpGet("http://localhost:8080/layout"); + + HttpResponse httpResponse = client.execute(method); + + assertEquals("Success", httpResponse.getHeaders("Template Returned")[0].getValue()); + + } + +} diff --git a/apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/ProductServletLiveTest.java b/apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/ProductServletLiveTest.java new file mode 100644 index 0000000000..397e575d4d --- /dev/null +++ b/apache-velocity/src/test/java/com/baeldung/apache/velocity/servlet/ProductServletLiveTest.java @@ -0,0 +1,24 @@ +package com.baeldung.apache.velocity.servlet; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ProductServletLiveTest { + + @Test + public void whenRequestUsingHttpClient_thenCorrectResponse() throws Exception { + + HttpClient client = new DefaultHttpClient(); + HttpGet method= new HttpGet("http://localhost:8080/"); + + HttpResponse httpResponse = client.execute(method); + + assertEquals("Success", httpResponse.getHeaders("Template Returned")[0].getValue()); + + } +} diff --git a/pom.xml b/pom.xml index 9eb4e78dbf..ecb07e987b 100644 --- a/pom.xml +++ b/pom.xml @@ -192,6 +192,8 @@ xstream struts2 + apache-velocity + From 90a5a8c8d022758058844f4b6fdba0e83ad7d220 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Wed, 15 Feb 2017 21:46:45 +0530 Subject: [PATCH 139/192] Changes_for_BAEL-552-Update_SpringDataREST_article --- .../SpringDataRestValidatorTest.java | 186 ++++++++---------- 1 file changed, 86 insertions(+), 100 deletions(-) rename spring-data-rest/src/{main/test => test/java}/com/baeldung/validator/SpringDataRestValidatorTest.java (75%) diff --git a/spring-data-rest/src/main/test/com/baeldung/validator/SpringDataRestValidatorTest.java b/spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorTest.java similarity index 75% rename from spring-data-rest/src/main/test/com/baeldung/validator/SpringDataRestValidatorTest.java rename to spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorTest.java index b185c6d5ab..300fc081d3 100644 --- a/spring-data-rest/src/main/test/com/baeldung/validator/SpringDataRestValidatorTest.java +++ b/spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorTest.java @@ -1,100 +1,86 @@ -package com.baeldung.validator; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.ResultMatcher; -import org.springframework.web.context.WebApplicationContext; - -import com.baeldung.SpringDataRestApplication; -import com.baeldung.models.WebsiteUser; -import com.fasterxml.jackson.databind.ObjectMapper; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SpringDataRestApplication.class) -@WebAppConfiguration -public class SpringDataRestValidatorTest { - public static final String URL = "http://localhost"; - - private MockMvc mockMvc; - - @Autowired - protected WebApplicationContext wac; - - @Before - public void setup() { - mockMvc = webAppContextSetup(wac).build(); - } - - @Test - public void whenStartingApplication_thenCorrectStatusCode() throws Exception { - mockMvc.perform(get("/users")).andExpect(status().is2xxSuccessful()); - }; - - @Test - public void whenAddingNewCorrectUser_thenCorrectStatusCodeAndResponse() throws Exception { - WebsiteUser user = new WebsiteUser(); - user.setEmail("john.doe@john.com"); - user.setName("John Doe"); - - mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))) - .andExpect(status().is2xxSuccessful()) - .andExpect(redirectedUrl("http://localhost/users/1")); - } - - @Test - public void whenAddingNewUserWithoutName_thenErrorStatusCodeAndResponse() throws Exception { - WebsiteUser user = new WebsiteUser(); - user.setEmail("john.doe@john.com"); - - mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))) - .andExpect(status().isNotAcceptable()) - .andExpect(redirectedUrl(null)); - } - - @Test - public void whenAddingNewUserWithEmptyName_thenErrorStatusCodeAndResponse() throws Exception { - WebsiteUser user = new WebsiteUser(); - user.setEmail("john.doe@john.com"); - user.setName(""); - mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))) - .andExpect(status().isNotAcceptable()) - .andExpect(redirectedUrl(null)); - } - - @Test - public void whenAddingNewUserWithoutEmail_thenErrorStatusCodeAndResponse() throws Exception { - WebsiteUser user = new WebsiteUser(); - user.setName("John Doe"); - - mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))) - .andExpect(status().isNotAcceptable()) - .andExpect(redirectedUrl(null)); - } - - @Test - public void whenAddingNewUserWithEmptyEmail_thenErrorStatusCodeAndResponse() throws Exception { - WebsiteUser user = new WebsiteUser(); - user.setName("John Doe"); - user.setEmail(""); - mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))) - .andExpect(status().isNotAcceptable()) - .andExpect(redirectedUrl(null)); - } - -} +package com.baeldung.validator; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.SpringDataRestApplication; +import com.baeldung.models.WebsiteUser; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = SpringDataRestApplication.class) +@WebAppConfiguration +public class SpringDataRestValidatorTest { + public static final String URL = "http://localhost"; + + private MockMvc mockMvc; + + @Autowired + protected WebApplicationContext wac; + + @Before + public void setup() { + mockMvc = webAppContextSetup(wac).build(); + } + + @Test + public void whenStartingApplication_thenCorrectStatusCode() throws Exception { + mockMvc.perform(get("/users")).andExpect(status().is2xxSuccessful()); + }; + + @Test + public void whenAddingNewCorrectUser_thenCorrectStatusCodeAndResponse() throws Exception { + WebsiteUser user = new WebsiteUser(); + user.setEmail("john.doe@john.com"); + user.setName("John Doe"); + + mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().is2xxSuccessful()).andExpect(redirectedUrl("http://localhost/users/1")); + } + + @Test + public void whenAddingNewUserWithoutName_thenErrorStatusCodeAndResponse() throws Exception { + WebsiteUser user = new WebsiteUser(); + user.setEmail("john.doe@john.com"); + + mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().isNotAcceptable()).andExpect(redirectedUrl(null)); + } + + @Test + public void whenAddingNewUserWithEmptyName_thenErrorStatusCodeAndResponse() throws Exception { + WebsiteUser user = new WebsiteUser(); + user.setEmail("john.doe@john.com"); + user.setName(""); + mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().isNotAcceptable()).andExpect(redirectedUrl(null)); + } + + @Test + public void whenAddingNewUserWithoutEmail_thenErrorStatusCodeAndResponse() throws Exception { + WebsiteUser user = new WebsiteUser(); + user.setName("John Doe"); + + mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().isNotAcceptable()).andExpect(redirectedUrl(null)); + } + + @Test + public void whenAddingNewUserWithEmptyEmail_thenErrorStatusCodeAndResponse() throws Exception { + WebsiteUser user = new WebsiteUser(); + user.setName("John Doe"); + user.setEmail(""); + mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().isNotAcceptable()).andExpect(redirectedUrl(null)); + } + +} From 498230ff89e752ea01a6fd71c081d8ab736fd3c1 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 15 Feb 2017 20:48:46 +0100 Subject: [PATCH 140/192] Refactor MinMaxTest --- .../com/baeldung/java8/Java8MaxMinTest.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java b/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java index 0e361d96e1..b0e514124d 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8MaxMinTest.java @@ -4,7 +4,9 @@ import com.baeldung.java_8_features.Person; import org.junit.Test; import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.NoSuchElementException; import static org.junit.Assert.assertEquals; @@ -17,8 +19,12 @@ public class Java8MaxMinTest { final Integer expectedResult = 89; //then - assertEquals(expectedResult, - (Integer) listOfIntegers.stream().mapToInt(val -> val).max().getAsInt()); + final Integer max = listOfIntegers + .stream() + .mapToInt(v -> v) + .max().orElseThrow(NoSuchElementException::new); + + assertEquals("Should be 89", expectedResult, max); } @Test @@ -30,8 +36,12 @@ public class Java8MaxMinTest { final List people = Arrays.asList(alex, john, peter); //then - assertEquals("Alex must be having min age", alex, - people.stream().min((o1, o2) -> o1.getAge().compareTo(o2.getAge())).get()); + final Person minByAge = people + .stream() + .min(Comparator.comparing(Person::getAge)) + .orElseThrow(NoSuchElementException::new); + + assertEquals("Should be Alex", alex, minByAge); } } From 41ea1898ebfabef3dda1715e4559feba70018171 Mon Sep 17 00:00:00 2001 From: Zeger Hendrikse Date: Wed, 15 Feb 2017 23:21:13 +0100 Subject: [PATCH 141/192] Moved tests to live tests --- spring-data-neo4j/pom.xml | 5 ----- .../baeldung/neo4j/{Neo4jTest.java => Neo4jLiveTest.java} | 2 +- .../neo4j/{Neo4jOgmTest.java => Neo4jOgmLiveTest.java} | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) rename spring-data-neo4j/src/test/java/com/baeldung/neo4j/{Neo4jTest.java => Neo4jLiveTest.java} (99%) rename spring-data-neo4j/src/test/java/com/baeldung/neo4j/{Neo4jOgmTest.java => Neo4jOgmLiveTest.java} (97%) diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml index 7e7f02e9a9..96606d597b 100644 --- a/spring-data-neo4j/pom.xml +++ b/spring-data-neo4j/pom.xml @@ -96,11 +96,6 @@ spring-test ${spring-test.version}
- - junit - junit - 4.12 -
diff --git a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jTest.java b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java similarity index 99% rename from spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jTest.java rename to spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java index c303410e57..1ff01b93a1 100644 --- a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jTest.java +++ b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java @@ -18,7 +18,7 @@ import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; import org.neo4j.graphdb.factory.GraphDatabaseFactory; -public class Neo4jTest { +public class Neo4jLiveTest { private static GraphDatabaseService graphDb; diff --git a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmTest.java b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java similarity index 97% rename from spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmTest.java rename to spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java index 3e218f39d7..06b31667dd 100644 --- a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmTest.java +++ b/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java @@ -14,7 +14,7 @@ import com.baeldung.spring.data.neo4j.domain.Car; import com.baeldung.spring.data.neo4j.domain.Company; import org.neo4j.ogm.transaction.Transaction; -public class Neo4jOgmTest { +public class Neo4jOgmLiveTest { @Test public void testOgm() { From a4c5fb1c128570c340f39f859f0dd3575503305f Mon Sep 17 00:00:00 2001 From: Nancy Bosecker Date: Wed, 15 Feb 2017 15:48:53 -0800 Subject: [PATCH 142/192] Solr w Apache SolrJ (#1073) * Solr w Apache SolrJ * Solr w Apache SolrJ --- spring-data-solr/pom.xml | 6 ++ .../solrjava/SolrJavaIntegrationTest.java | 70 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml index e43b3ff774..2aa9f86a96 100644 --- a/spring-data-solr/pom.xml +++ b/spring-data-solr/pom.xml @@ -51,6 +51,12 @@ ${spring.version} test + diff --git a/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java b/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java new file mode 100644 index 0000000000..1613ba5480 --- /dev/null +++ b/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java @@ -0,0 +1,70 @@ +package com.baeldung.solrjava; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.impl.HttpSolrClient; +import org.apache.solr.client.solrj.impl.XMLResponseParser; +import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.common.SolrDocumentList; +import org.apache.solr.common.SolrInputDocument; +import org.junit.Before; +import org.junit.Test; + +public class SolrJavaIntegrationTest { + + private HttpSolrClient solr; + + @Before + public void setUp() throws Exception { + + solr = new HttpSolrClient("http://localhost:8983/solr/bigboxstore"); + solr.setParser(new XMLResponseParser()); + } + + @Test + public void givenAdd_thenVerifyAdded() throws SolrServerException, IOException { + + SolrInputDocument document = new SolrInputDocument(); + document.addField("id", "123456"); + document.addField("name", "Kenmore Dishwasher"); + document.addField("price", "599.99"); + + solr.add(document); + solr.commit(); + + SolrQuery query = new SolrQuery(); + query.set("q", "id:123456"); + QueryResponse response = null; + + response = solr.query(query); + + SolrDocumentList docList = response.getResults(); + assertEquals(docList.getNumFound(), 1); + + for (SolrDocument doc : docList) { + assertEquals((String) doc.getFieldValue("id"), "123456"); + assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99); + } + } + + @Test + public void givenDelete_thenVerifyDeleted() throws SolrServerException, IOException { + + solr.deleteById("123456"); + solr.commit(); + + SolrQuery query = new SolrQuery(); + query.set("q", "id:123456"); + QueryResponse response = null; + + response = solr.query(query); + + SolrDocumentList docList = response.getResults(); + assertEquals(docList.getNumFound(), 0); + } +} From 6b0e59afac0777717900f822158aa946ed0c071b Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Thu, 16 Feb 2017 21:45:08 +0530 Subject: [PATCH 143/192] Guide to the Spring WebUtils and ServletRequestUtils (#1184) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality * changing package name * testcase change * adding webutils --- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.9799201796740292 | 0 .../baeldung/string/JoinerSplitterTest.java | 5 +- .../java/com/baeldung/utils/Application.java | 18 +++++++ .../utils/controller/UtilsController.java | 49 +++++++++++++++++++ .../src/main/resources/templates/other.html | 16 ++++++ .../src/main/resources/templates/utils.html | 23 +++++++++ 10 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 core-java/0.004102810554955205 create mode 100644 core-java/0.04832801936270381 create mode 100644 core-java/0.5633433244738808 create mode 100644 core-java/0.6256429734439612 create mode 100644 core-java/0.9799201796740292 create mode 100644 spring-boot/src/main/java/com/baeldung/utils/Application.java create mode 100644 spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java create mode 100644 spring-boot/src/main/resources/templates/other.html create mode 100644 spring-boot/src/main/resources/templates/utils.html diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java b/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java index 9ccff40558..a89f89b8d5 100644 --- a/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java +++ b/core-java/src/test/java/com/baeldung/string/JoinerSplitterTest.java @@ -12,7 +12,7 @@ import com.baeldung.string.JoinerSplitter; public class JoinerSplitterTest { @Test - public void givenArray_transformedToStream_convertToString() { + public void provided_array_convert_to_stream_and_convert_to_string() { String[] programming_languages = {"java", "python", "nodejs", "ruby"}; @@ -24,6 +24,7 @@ public class JoinerSplitterTest { @Test public void givenArray_transformedToStream_convertToPrefixPostfixString() { + String[] programming_languages = {"java", "python", "nodejs", "ruby"}; String expectation = "[java,python,nodejs,ruby]"; @@ -34,6 +35,7 @@ public class JoinerSplitterTest { @Test public void givenString_transformedToStream_convertToList() { + String programming_languages = "java,python,nodejs,ruby"; List expectation = new ArrayList(); @@ -49,6 +51,7 @@ public class JoinerSplitterTest { @Test public void givenString_transformedToStream_convertToListOfChar() { + String programming_languages = "java,python,nodejs,ruby"; List expectation = new ArrayList(); diff --git a/spring-boot/src/main/java/com/baeldung/utils/Application.java b/spring-boot/src/main/java/com/baeldung/utils/Application.java new file mode 100644 index 0000000000..1f637eec11 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/utils/Application.java @@ -0,0 +1,18 @@ +package com.baeldung.utils; + +import javax.annotation.security.RolesAllowed; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages="com.baeldung.utils") +public class Application { + + @RolesAllowed("*") + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java b/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java new file mode 100644 index 0000000000..a14d0b26c6 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java @@ -0,0 +1,49 @@ +package com.baeldung.utils.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.ServletRequestBindingException; +import org.springframework.web.bind.ServletRequestUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.util.WebUtils; + +@Controller +public class UtilsController { + + @GetMapping("/utils") + public String webUtils(Model model) { + return "utils"; + } + + @PostMapping("/setParam") + public String post(HttpServletRequest request, Model model) { + String param = ServletRequestUtils.getStringParameter(request, "param", "DEFAULT"); + +// Long param = ServletRequestUtils.getLongParameter(request, "param",1L); +// boolean param = ServletRequestUtils.getBooleanParameter(request, "param", true); +// double param = ServletRequestUtils.getDoubleParameter(request, "param", 1000); +// float param = ServletRequestUtils.getFloatParameter(request, "param", (float) 1.00); +// int param = ServletRequestUtils.getIntParameter(request, "param", 100); + +// try { +// ServletRequestUtils.getRequiredStringParameter(request, "param"); +// } catch (ServletRequestBindingException e) { +// e.printStackTrace(); +// } + + WebUtils.setSessionAttribute(request, "parameter", param); + model.addAttribute("parameter", "You set: "+(String) WebUtils.getSessionAttribute(request, "parameter")); + return "utils"; + } + + @GetMapping("/other") + public String other(HttpServletRequest request, Model model) { + String param = (String) WebUtils.getSessionAttribute(request, "parameter"); + model.addAttribute("parameter", param); + return "other"; + } + +} diff --git a/spring-boot/src/main/resources/templates/other.html b/spring-boot/src/main/resources/templates/other.html new file mode 100644 index 0000000000..d13373f9fe --- /dev/null +++ b/spring-boot/src/main/resources/templates/other.html @@ -0,0 +1,16 @@ + + + + +Spring Utils Demo + + + + Parameter set by you:

+ + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/utils.html b/spring-boot/src/main/resources/templates/utils.html new file mode 100644 index 0000000000..93030f424f --- /dev/null +++ b/spring-boot/src/main/resources/templates/utils.html @@ -0,0 +1,23 @@ + + + + +Spring Utils Demo + + + +

+

Set Parameter:

+

+ + +

+
+Another Page + + \ No newline at end of file From 935b815ad4828a184a3f246d595b3fc6dfb42599 Mon Sep 17 00:00:00 2001 From: Nancy Bosecker Date: Thu, 16 Feb 2017 19:59:06 -0800 Subject: [PATCH 144/192] Updated test names and moved document add code to @Before method. (#1187) * Solr w Apache SolrJ * Solr w Apache SolrJ * updated test names and moved add to @before method --- .../solrjava/SolrJavaIntegrationTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java b/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java index 1613ba5480..ce90ccaf16 100644 --- a/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java +++ b/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java @@ -18,24 +18,24 @@ import org.junit.Test; public class SolrJavaIntegrationTest { private HttpSolrClient solr; + private SolrInputDocument document; @Before public void setUp() throws Exception { solr = new HttpSolrClient("http://localhost:8983/solr/bigboxstore"); solr.setParser(new XMLResponseParser()); - } - - @Test - public void givenAdd_thenVerifyAdded() throws SolrServerException, IOException { - - SolrInputDocument document = new SolrInputDocument(); + + document = new SolrInputDocument(); document.addField("id", "123456"); document.addField("name", "Kenmore Dishwasher"); document.addField("price", "599.99"); - solr.add(document); solr.commit(); + } + + @Test + public void whenAdd_thenVerifyAdded() throws SolrServerException, IOException { SolrQuery query = new SolrQuery(); query.set("q", "id:123456"); @@ -53,7 +53,7 @@ public class SolrJavaIntegrationTest { } @Test - public void givenDelete_thenVerifyDeleted() throws SolrServerException, IOException { + public void whenDelete_thenVerifyDeleted() throws SolrServerException, IOException { solr.deleteById("123456"); solr.commit(); From de376eb0fc7fe10c5a552ef1a8043b7fa0dc7bfd Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Fri, 17 Feb 2017 11:02:53 +0530 Subject: [PATCH 145/192] Update Application.java --- spring-boot/src/main/java/com/baeldung/utils/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot/src/main/java/com/baeldung/utils/Application.java b/spring-boot/src/main/java/com/baeldung/utils/Application.java index 1f637eec11..a3d9f9130c 100644 --- a/spring-boot/src/main/java/com/baeldung/utils/Application.java +++ b/spring-boot/src/main/java/com/baeldung/utils/Application.java @@ -12,7 +12,7 @@ public class Application { @RolesAllowed("*") public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(Application.class, args); } } From 88a97726948c7dc422c1d3aa6087296e3f730c55 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Fri, 17 Feb 2017 11:04:33 +0530 Subject: [PATCH 146/192] Update UtilsController.java --- .../java/com/baeldung/utils/controller/UtilsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java b/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java index a14d0b26c6..7b4827cdf2 100644 --- a/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java +++ b/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java @@ -35,7 +35,7 @@ public class UtilsController { // } WebUtils.setSessionAttribute(request, "parameter", param); - model.addAttribute("parameter", "You set: "+(String) WebUtils.getSessionAttribute(request, "parameter")); + model.addAttribute("parameter", "You set: "+(String) WebUtils.getSessionAttribute(request, "parameter")); return "utils"; } From 895bcc1921eb716d6f7bd08bbef8c1e124753445 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Fri, 17 Feb 2017 12:19:57 +0100 Subject: [PATCH 147/192] BAEL-633 add mixing and bean creator test --- .../java/com/baeldung/cglib/mixin/Class1.java | 8 +++ .../java/com/baeldung/cglib/mixin/Class2.java | 8 +++ .../com/baeldung/cglib/mixin/Interface1.java | 5 ++ .../com/baeldung/cglib/mixin/Interface2.java | 5 ++ .../baeldung/cglib/mixin/MixinInterface.java | 4 ++ .../baeldung/cglib/proxy/PersonService.java | 11 ++++ .../com/baeldung/cglib/proxy/SampleClass.java | 7 --- .../cglib/proxy/BeanGeneratorTest.java | 28 +++++++++ .../com/baeldung/cglib/proxy/MixinTest.java | 24 ++++++++ .../cglib/proxy/PersonServiceProxyTest.java | 61 +++++++++++++++++++ .../baeldung/cglib/proxy/SampleClassTest.java | 20 ------ 11 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java create mode 100644 cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java create mode 100644 cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java create mode 100644 cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java create mode 100644 cglib/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java create mode 100644 cglib/src/main/java/com/baeldung/cglib/proxy/PersonService.java delete mode 100644 cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java create mode 100644 cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java create mode 100644 cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java create mode 100644 cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java delete mode 100644 cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java new file mode 100644 index 0000000000..2921cda8a6 --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java @@ -0,0 +1,8 @@ +package com.baeldung.cglib.mixin; + +public class Class1 implements Interface1 { + @Override + public String first() { + return "first"; + } +} \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java new file mode 100644 index 0000000000..0098c9debd --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java @@ -0,0 +1,8 @@ +package com.baeldung.cglib.mixin; + +public class Class2 implements Interface2 { + @Override + public String second() { + return "second"; + } +} \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java new file mode 100644 index 0000000000..5aab155c1d --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java @@ -0,0 +1,5 @@ +package com.baeldung.cglib.mixin; + +public interface Interface1 { + String first(); +} \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java new file mode 100644 index 0000000000..7fd2e78608 --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java @@ -0,0 +1,5 @@ +package com.baeldung.cglib.mixin; + +public interface Interface2 { + String second(); +} \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java b/cglib/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java new file mode 100644 index 0000000000..e7ed362a25 --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java @@ -0,0 +1,4 @@ +package com.baeldung.cglib.mixin; + +public interface MixinInterface extends Interface1, Interface2 { +} \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/proxy/PersonService.java b/cglib/src/main/java/com/baeldung/cglib/proxy/PersonService.java new file mode 100644 index 0000000000..9085e6c49a --- /dev/null +++ b/cglib/src/main/java/com/baeldung/cglib/proxy/PersonService.java @@ -0,0 +1,11 @@ +package com.baeldung.cglib.proxy; + +public class PersonService { + public String sayHello(String name) { + return "Hello " + name; + } + + public Integer lengthOfName(String name) { + return name.length(); + } +} \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java b/cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java deleted file mode 100644 index 3e0d098dd1..0000000000 --- a/cglib/src/main/java/com/baeldung/cglib/proxy/SampleClass.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.cglib.proxy; - -public class SampleClass { - public String test(String input) { - return "Hello world!"; - } -} \ No newline at end of file diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java new file mode 100644 index 0000000000..4b401ae690 --- /dev/null +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java @@ -0,0 +1,28 @@ +package com.baeldung.cglib.proxy; + + +import net.sf.cglib.beans.BeanGenerator; +import org.junit.Test; + +import java.lang.reflect.Method; + +import static junit.framework.TestCase.assertEquals; + +public class BeanGeneratorTest { + + @Test + public void testBeanGenerator() throws Exception { + //given + BeanGenerator beanGenerator = new BeanGenerator(); + + //when + beanGenerator.addProperty("value", String.class); + Object myBean = beanGenerator.create(); + Method setter = myBean.getClass().getMethod("setValue", String.class); + setter.invoke(myBean, "some string value set by a cglib"); + + //then + Method getter = myBean.getClass().getMethod("getValue"); + assertEquals("some string value set by a cglib", getter.invoke(myBean)); + } +} diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java new file mode 100644 index 0000000000..31e7b2204f --- /dev/null +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java @@ -0,0 +1,24 @@ +package com.baeldung.cglib.proxy; + +import com.baeldung.cglib.mixin.*; +import net.sf.cglib.proxy.Mixin; +import org.junit.Test; + +import static junit.framework.TestCase.assertEquals; + +public class MixinTest { + + @Test + public void testMixin() throws Exception { + //when + Mixin mixin = Mixin.create( + new Class[]{Interface1.class, Interface2.class, MixinInterface.class}, + new Object[]{new Class1(), new Class2()} + ); + MixinInterface mixinDelegate = (MixinInterface) mixin; + + //then + assertEquals("first", mixinDelegate.first()); + assertEquals("second", mixinDelegate.second()); + } +} diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java new file mode 100644 index 0000000000..2ae6392a05 --- /dev/null +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java @@ -0,0 +1,61 @@ +package com.baeldung.cglib.proxy; + +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.FixedValue; +import net.sf.cglib.proxy.MethodInterceptor; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class PersonServiceProxyTest { + @Test + public void testService() { + //given + PersonService personService = new PersonService(); + + //when + String res = personService.sayHello("Tom"); + + //then + assertEquals(res, "Hello Tom"); + } + + @Test + public void testFixedValue() throws Exception { + //given + Enhancer enhancer = new Enhancer(); + enhancer.setSuperclass(PersonService.class); + enhancer.setCallback((FixedValue) () -> "Hello cglib!"); + PersonService proxy = (PersonService) enhancer.create(); + + //when + String res = proxy.sayHello(null); + + //then + assertEquals("Hello cglib!", res); + } + + @Test + public void testMethodInterceptor() throws Exception { + //given + Enhancer enhancer = new Enhancer(); + enhancer.setSuperclass(PersonService.class); + enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> { + if (method.getDeclaringClass() != Object.class && method.getReturnType() == String.class) { + return "Hello cglib!"; + } else { + return proxy.invokeSuper(obj, args); + } + }); + + //when + PersonService proxy = (PersonService) enhancer.create(); + + //then + assertEquals("Hello cglib!", proxy.sayHello(null)); + + int lengthOfName = proxy.lengthOfName("Mary"); + assertEquals(4, lengthOfName); + } + +} \ No newline at end of file diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java deleted file mode 100644 index 15037b3f1c..0000000000 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/SampleClassTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.cglib.proxy; - -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.FixedValue; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class SampleClassTest { - @Test - public void testFixedValue() throws Exception { - Enhancer enhancer = new Enhancer(); - enhancer.setSuperclass(SampleClass.class); - enhancer.setCallback((FixedValue) () -> "Hello cglib!"); - SampleClass proxy = (SampleClass) enhancer.create(); - assertEquals("Hello cglib!", proxy.test(null)); - - } - -} \ No newline at end of file From 31cf702160ae3b6a2cfb84fb37340c953a35ff97 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Fri, 17 Feb 2017 15:57:35 +0100 Subject: [PATCH 148/192] BAEL-633 more descriptive code --- cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java | 2 +- cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java | 2 +- .../java/com/baeldung/cglib/proxy/BeanGeneratorTest.java | 6 +++--- .../test/java/com/baeldung/cglib/proxy/MixinTest.java | 6 +++--- .../com/baeldung/cglib/proxy/PersonServiceProxyTest.java | 9 ++++----- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java index 2921cda8a6..932951b4cd 100644 --- a/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java @@ -3,6 +3,6 @@ package com.baeldung.cglib.mixin; public class Class1 implements Interface1 { @Override public String first() { - return "first"; + return "first behaviour"; } } \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java index 0098c9debd..b2b922a05d 100644 --- a/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java @@ -3,6 +3,6 @@ package com.baeldung.cglib.mixin; public class Class2 implements Interface2 { @Override public String second() { - return "second"; + return "second behaviour"; } } \ No newline at end of file diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java index 4b401ae690..32706409c5 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java @@ -16,13 +16,13 @@ public class BeanGeneratorTest { BeanGenerator beanGenerator = new BeanGenerator(); //when - beanGenerator.addProperty("value", String.class); + beanGenerator.addProperty("name", String.class); Object myBean = beanGenerator.create(); - Method setter = myBean.getClass().getMethod("setValue", String.class); + Method setter = myBean.getClass().getMethod("setName", String.class); setter.invoke(myBean, "some string value set by a cglib"); //then - Method getter = myBean.getClass().getMethod("getValue"); + Method getter = myBean.getClass().getMethod("getName"); assertEquals("some string value set by a cglib", getter.invoke(myBean)); } } diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java index 31e7b2204f..ac4b50af4c 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java @@ -9,7 +9,7 @@ import static junit.framework.TestCase.assertEquals; public class MixinTest { @Test - public void testMixin() throws Exception { + public void testMixinBehaviour() throws Exception { //when Mixin mixin = Mixin.create( new Class[]{Interface1.class, Interface2.class, MixinInterface.class}, @@ -18,7 +18,7 @@ public class MixinTest { MixinInterface mixinDelegate = (MixinInterface) mixin; //then - assertEquals("first", mixinDelegate.first()); - assertEquals("second", mixinDelegate.second()); + assertEquals("first behaviour", mixinDelegate.first()); + assertEquals("second behaviour", mixinDelegate.second()); } } diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java index 2ae6392a05..e0ad017538 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java @@ -25,14 +25,14 @@ public class PersonServiceProxyTest { //given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); - enhancer.setCallback((FixedValue) () -> "Hello cglib!"); + enhancer.setCallback((FixedValue) () -> "Hello Tom!"); PersonService proxy = (PersonService) enhancer.create(); //when String res = proxy.sayHello(null); //then - assertEquals("Hello cglib!", res); + assertEquals("Hello Tom!", res); } @Test @@ -42,7 +42,7 @@ public class PersonServiceProxyTest { enhancer.setSuperclass(PersonService.class); enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> { if (method.getDeclaringClass() != Object.class && method.getReturnType() == String.class) { - return "Hello cglib!"; + return "Hello Tom!"; } else { return proxy.invokeSuper(obj, args); } @@ -52,8 +52,7 @@ public class PersonServiceProxyTest { PersonService proxy = (PersonService) enhancer.create(); //then - assertEquals("Hello cglib!", proxy.sayHello(null)); - + assertEquals("Hello Tom!", proxy.sayHello(null)); int lengthOfName = proxy.lengthOfName("Mary"); assertEquals(4, lengthOfName); } From 8fe5a2ac727031afc043b89839844ff4fb4d5a97 Mon Sep 17 00:00:00 2001 From: lor6 Date: Fri, 17 Feb 2017 17:06:34 +0200 Subject: [PATCH 149/192] Bael 682 (#1124) * upload, read excel files with mvc * formatting * add excel files * update excel files --- spring-mvc-java/persons.xls | Bin 0 -> 33792 bytes spring-mvc-java/persons.xlsx | Bin 0 -> 13514 bytes spring-mvc-java/pom.xml | 16 -- .../com/baeldung/excel/ExcelPOIHelper.java | 264 +++++++++++------- .../java/com/baeldung/excel/JExcelHelper.java | 82 ------ .../main/java/com/baeldung/excel/MyCell.java | 57 ++++ .../baeldung/spring/web/config/WebConfig.java | 5 - .../web/controller/ExcelController.java | 50 +--- .../src/main/webapp/WEB-INF/view/excel.jsp | 80 +++--- 9 files changed, 254 insertions(+), 300 deletions(-) create mode 100644 spring-mvc-java/persons.xls create mode 100644 spring-mvc-java/persons.xlsx delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/excel/JExcelHelper.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java diff --git a/spring-mvc-java/persons.xls b/spring-mvc-java/persons.xls new file mode 100644 index 0000000000000000000000000000000000000000..ea270f69cc8eb16b866db0414dde14c23ae9d365 GIT binary patch literal 33792 zcmeHw2|QF^*zlRLjeRFeO!l(xWKTlbLR3VSv1H4VRJKH=MWQ`v6;aY6ib`k^Er_yJ zXqUA4E782?%ovR^{Pn)?_kHj8eU9Imd+&3f?L6l>&spxd*W*XLFOOdk?F2N*7%+g} zL{`8|1;@a1Q_3|DfcJ?+bV)gyz;g(iPX8BKfE5QTl9>rO>pftpslWhc763W{78Ehw zg1-QC!R!uJ0}cRO14Dho)<)u&L=qzK|EtqHk`7)Nqytn77{N0P$bwK_AVSiNkMzq= z`aMs=D<}OL0X|3r)ABqSJ<eo$ z26~!52mnzd{)T}bIe8rcz&6TnyhI6L3a$6=JoF~yA;BmPm|!gfDH$ngC246j&)Ej< z3X}`?*%FMiU{4`F=DwRF!FR=2Bq_iGX8u7^Q5(w#UL#iWP*o{fEE;YjsJdVd&;Y;_ zsWJyo(QM?>U4aB}pKUM#kW!X{dV4CEdO|5GU^e`Nq||hC@YF>B>E5KOCSI}6M%jqo^&MtRNxVui30ylxit;{ zuh<9CVgR1Z0{voX?0I?Q7USWu_8*0xp8%dZ0sPPe@S_vJ^Cy6xod7nPmM@22EUNx(?fhY7|IlAV7*1X7~-=j;jKN)y26 z(1o)>o+SP>@r0cMAFW@qAHtC#8UG1z03dM&9Iuhe#W@BJgeY*XKX5!e9S^6G%T2)_ zwGY{U;JB3{cO^U(rSRvaz(@6@@#idFULkfNXlHV}L!(7fc_DwYohj{tl?{0ST~f(xT|5Tw9q@L|EpamEUspv0_5vK#DWY2XU@SeyWeMUFC>OhJ6j=k_?9 zGKd=kM+jKJ3Ht>Gc!q|ts8faA(Ht(=Q((svAe6r%AP*M*LIP6cuOu-3EdlBR|4IUi z8Gl898t-2bpi22G0@U39iU76Kzal^l_^$|1%l<0@)a3t)0L6m8B0#}lQUWuY_JE=U z!^G`@kBSSns4oAxbg_J2UL2fuP6BK8rzy!JG#7t1|nF15!t`jpsk!lJ| zkPA=D1ckLJFhOoTF%uL6|CLFd&E&O%0_GH$OkO)MTu+6`gRfoN+B4THCosrTZ$SseiW++ z(I*`j(2kRp{+2-bZwXZXmOyos0M$0Cz%hm$KP*v$XylF$5x`l;SOSWV-RYzDG1{>W zT#lj&BdAKpNJYMbfRl$2xCZy{Oo%3vGtrz16WZ>EwqCU$lRu6yt~le}SsN1kX=5fP z(e#Z-tUEZ)o&WpV7;UBKjGBUO!>2T8Vj^Z#sqyZiJBCRXVFLFc_GD2pp>6GYqvk=j z95U8 zHH@MZb-1A@MGYGtg5c6HmFJDK)OZ4eF$A=(iiyK5q3I3`ApzsWa~WiJ+NMg~d@0?* zcukB(H9_tMD`TuZ$Ges>M4Q5pd-BfOWRwXheBoD)l}d3fQ1p4!wRYlWgPo}N9!aRU z4AANvfC*~-^yyQg2z(Avjzv!^Afn1RWE6qmEkwa!Mt)k2DAF+`icBmY;DH7P8fvn5 zWxSb>4PA#NY^iEuCNKixH$1 zqcdKN#w23M(VJv6R)SwwUn_kvLP(6(Pc$)kqVyHc>&Ze!cjlLKWS}}AyO>q)2)SgynLws|Pz8FzjF?2jl zbrLbuo>pgb`OaJVV#H|0(D5|QNyJclTAj_EmzU{_5l3QlCigTv6r(c*Pt(vmT=|A9 z1_d;jMq}DcS}}AyO=c1?)SjlH`MoHaz8DEwF?2jlVG=Rao~EH$Q&U4dd6smvdy(0^!| z%F-~U_89=s+?LdNHHLYaf8s=Pc_@W723@L`3ySFq2TV6Ujau+R+L#<2{sLPT~z-kaqE*1#QFUU29Y z2*ThH3{4GC-;0={83089T0S8OUk+Xq*((u#zm0EzCK{xD1}NQ3#3q?pJ=3h zu@3J{h>6O;S&n6e)h6-)3lIZ$CZf6zCDnfzRAe2rxieHJ2KoaU=TmAQRrZK`vBI*! zd4OeD7<5#Fv3xP2L`Gl?Su(L~ zKpV~4tV36?fv&J-Y?WaJV0o;eWmiLAM3w%h`J+V}N~NKdo&RF<=Yazx7?*4ULxTvu zBkg|?jWRP}TtfTzLSgGCz$&MX01TtvI2wy6(Fd*MFhj#}09~j*up_LAitvKrg(fg# z#9?5zgN#v0BcM;Az(StUkm4y^%Au4u3$FK!I6QQzL;#zk=2%@Z0E)DOo*qF85Qx=? z^)c`iM(5G?qKDdxU04($1Lr-K2bK-C7sMk9Dut%jl*o$~geV~mE#~|QwB##FNF!fS zLK^uh6Uz?t;jA3kuZben_*xpFf{?X6$p+)=oI2#A2sx(C5#Wy|FRY?YoMhoN+)|K6wMeoXmW~(xIYTDiq|!P;mDiEZY+>0^ zFkA!uP6Jvo5JZza=nn?<4p<$q3#SA#vM(i}1tSh%3;8*LaL98$kx}I$1cFIhr}!J4(m`uWLYp7f4}eLK-DR z!$XH=ndbs~M_V)J5q!ZBd}V~sI}YE`#g}?~KHbf!pODQ*unxvB3E^}HuQhu@^AK1YG2}a;00ep~MaXzs100}Gt z;6@;*wnres7=Xw5pk+S_3bH-U2gWBF2wHm_!I=RE6?BX2WMOV^H-BsaW{ebIf~s@2 zwjEz}d?PdyRK+q2Gn%U4ClTDj;J__d=$lShFhm}dpg>Cswq79wSV}X00vvBH3=0Uw zJB0*B1;F0NEYu5+0Fhy#L^v45fj#P|Edbzy6M`9@j3l9vBNpt#nR4u-y0h5@3mg_P zFbY5qN8nlD{d4Y{uqgv^Xlj0VbTbbNje={Rp3du56Czir#DoN&-Cb)}rN(11U^TSq zwerHOi>5f)_epot?w*LPxOY%SsOH(l+$FyTY#N;B<>7^bm0C0hvJJW;u1m5MR~^X8 zU3mWMJVluvG0PP>FLdo&&bg#+6rEw{mBW4D`?VY83c6boty2#<=4^Pg+TZ4)QCfP0 zWcsOwK|O4(cC=jLa3a@(HH+J4^rY_A>#i|>`kLWN(afbrpI-kwAk&q8`I?E2-Pwia zxJ{QTGM;?Q`?;V-Xr9XbtMdISrxa6eay)`C7f4!ZNV6-yT>N*mG|*H)o!Qj>3M|wClZf~OMf;G!=j8Y zXwbTSLYrU#x513IgG2=oLI|oP&)%T|TwG3|^yzBau@*QZRu!uw)v zVc9>xJWJHSuC8}2oF@YmVAy?$`#9NwGzLr6x?}N z@Xh;}88w%8^1raY7r8i2x+y*7TyY1!xmdAjR-aOb$5okCM%yi2-!%@*?y~4nlw-r{ z(N}(ZQs~lBIE+YxTWU~ipi-M$1a+kL$7PSUw=EF3Av|b;>zGN*81hNgeRlCk$fd){ z&#Y_0ns9{cTi11skY;XtWK4>`{5#)d04y5!0@bN z{GY|@y>p!N1*PYEKTTcC7#e0H=bL=wc+~q(Dn|wsvhF0+ZsfIPZqU|I5{Qm<-iN#K z5@Va?Gv7_6PSa1`Jl3<6%fh`PWuKd4LTLCv1aGhJ0_WfhO&rRMN54)ggO>;g$)+k3KcoG<&CPUyI^9KKbSnON~G(e>>BN8u*5gY4c1 ze=eUPQo(R1V2f-saLR+ysz zyVh-Wp|tWlX=+!_eo~pWz@7V^f>)Mpa^!x!ne)%i63H+>neMV+gG^GnQZVDJrUk)V zpY&!f2r2l~<-^aa%XmWQtGUfiH4lr(jZ%keXKl-q_#7uQPpsyal*s#13E}kjvrpH( z->Lpq=dc*-S=U8_+C0J=TDjjzY3xqLTk0JBwN-s)3&GNC>xqM$2KewiACoRihZFa% z)+BSrSJWBI&o-BEDA(>-i_>X{yTa4XyrOCLIkx#82j%ylyV!^Nhj?P)LI845JeNgW?>z_L92@Vxy0TM5&S3e5YDH<3Y_PE(WydED` zw*SSARp*mMwcJAm8#}JGmRY)$eBz(?-c(89`P)?k504w|{H3PQ`@~1_q2z17S>pE% zMC8;~H!{u^llSW4m#Q?|>Q{7IwXC6LkAGoq`$2Usg9Pp1e&sJw5;Kd!2dkH>)aEui z8|v{De91VvtEzFcRekZ`huKPN&p)$kYW$j!csY)ruhmyBH9uv3oW8=QQ`rw@1qku2 zB7~(_G*+IN)uHNCd<&cRdfCR|Oop<;eLWjiVi$aNNKufeHOx8V;pZy*EyQoVo7zsc z#0S+Eu`UNg7Z$qhmv`O2uT@_oB>nOI2QtT{POhK9T|dLWX}0Af^KRS74)>fV$K=hA zzuDBVygpC&_s-iEk(|*zt)@OJW(R!Cy4=3JX-kI4@ny9~Dl$#P7ii|qR2jIw)vmL@ z#Y*NqX96$bpsafoFLz_2V!d?}UJ5JECA+wGZ|$Q-Q=gn!+uW{VlRiJp2ueCz9`p+T z-Y?^eZ<6Ia`!XFV=_A=mmAT8kuIJaOa_!p}%=KO(xtsrO`ol~&+`_u^`w8G~auxfr z2+;@X8+8v|O+WV`?3_B`V!=&EXYD;{(sS7tH!qG-x9?ndKXUE|rCl4N_ni~L=BLO6 zC2w(RS=oO~v_q>;boQ2WD+Yq4Mf7d8T#XtX1Y5Lw=lInX1v3O)C|{cSbg8mA$Dz|} ze>h)zDqC{($+hCRdCz6>FV_tztr!sJG&_0aP~9;(k+AzkPd)}e`8czdDch{q&~~2F zaBD;F^7gM1UPri?RiFI46?%P@SHQ(~*LK zcsQSA%k1SWwfMCCV{@Xke|Gx5U&mgRTtC*ulHyp^Cs>~EI!9|Ly7=)w!>g{o-M^^A z?)5A!A>IW9li`mITLuZ_Plp3!_E4SCQ(OxnEq*Pswn6eOGVNW)`qvotnKY9h;5rf^hJWXFm z9-WYSKdSC}WVB+-R;ebCJdm^&7Z%odjc2!9$JWQ^o-ic8(&p4Lky-q)m$Og_r?SQC z#=*d{{YPr}eKek{2jq+5=Dyz>e&|+6>BlrvMq? zsHh)^;F4dMne}*^^UuUWy_36KUP+xiZFaBhvDLtuxMN=qV`6X1T=(YL&;&&GIUFKh z8rBm{^;eY?TJd|aS!7EJlfsERbuXn4=i4yece{42`o(C`F<51|+hL;ND@3D8bOy5y zi^ejb9nbxtR)hAW8r{(n(vFY*5Q@No9Iait&Lv;&stV0TJFq`42WN=JfUd%N7{#8IzZ`6yA2SbzX?DctGBNqJ7(tpY>Sy z`ok4m2RQk43S3VBHiW1sLImmBk>C#>S;FT!YgPvnVnz;jVa{tpyn_kAkq{Xcyaqkg zggY|SVqo@N9XPqp=XJ~Ou#nXegvdyOukw7aC@)o2 zU}{0c%5wxQGGFw-opZHdlb~@Je|)70=5(p)*UC220FXJ5DOt>vA>iP>L)B)xaa1C>cM4 zqsRvoTlB~>nJh~G6^e1m*&3PnDgAVKB6{jxhbuwY~n4SCjN}OY0BXFO8VpALyRXJ=~|=`O79|C+mx_${^dABdjJX zD|>8X7`nInTxbn&h^bE8CAvEEOt;^@ces_QY~kI-VGWxkN^V5&D~$7e8E>q>5Xe&U zHtp^QmK_E1EBm#4Oo~kuJ#HRY9vu-myW{Jjn3S-zf7k+^ezaY$E!q37#3+}ua7UAI@0VmxuUMv|@<;p(_aDeMYv=BH5z)5z z#7~1eC5`c)0IOuF2d@?Nv)?mF3K`GYZ3rZ}tO$3@8ktfWz^yx^}Lm;=6*nYN`F zUu;hmEHPgHAWtf}>BbMW=3iFEH#7%@LtaVzdT+}v(s%NCiQ04X-V%*$(;q=Q1{#bO z#mx%{>i1W!dUW-B2G`89-$gdHOIr;wF{vmIh^#M~ceA9;pCk70^Jix^mHk|GOM7W? z&(4Bs={6Rr;Fmo=tH03 zEMdfxtXk!s{^@0)*5=cT4Z1xlXLj8Q{ITyn&z+K#B9$#{LnR!d>E=8=5#hz+n!{qr zJr}NXUDc^vgH=Dnx7~kFl|Z`0o2S>$J_eeFGG%3%U(N?e3}u817avVewpz1E=KB4o zE{(;yB4M&aLfyT|#5p3^8`VDqin;5&Eau$f4e7LADyUH?{n6iW)91_LJ}M6hn; z)s6K<3M7LbwcQO7KGVx|$LRZ~qnbD7^{Q(8R_$ciQR88KcLw*Yp>6+^cem^8XtjG4 zaH*3sw0xuJ3-2L|$}r7r>mM`kXeTF}j8m_4o$*Lw=iaPZpItgGbMC(uwrl>tcOzPP z#o>&gcX0>8_q0myD6zSfzwe9rv+Vs%V`wHAnqh&9TRNO~*Mq#2E4{S9qo#^xGs^oX6HLm$dZ_)BE=MPmbH1j{hOo z)ql$YB=DUt!!y?^EltsU$ac)6ouNZ-e)YL~)dj2sLH@7H3zxCq)ES71uhVwoV5wMz z>uL_3oz^{{|Ga8vncFduYrE_DO5K(g@m=<6toNRgp;$Yk#H+~q-iKZ0V4+PppQTE2 z-#piRS*#eFHejuh!6k8XUT<-V%mg3p){LdA3hDkq< z2JBVsZvMHRUv-7b-en>diI(a_&feV#Lf%+=+?`*v9vh#gtB zMCd@sEt~R(Zy4$>buKx=b3JgVZn4yNv3W=9Cuw@7YYr=G^|HFF3PViaCr^D?LQ44>tL^i0>mC2aPUOzx7_ z1GTp0XPYe>1~nQ(ug%#c?qAhyDv^F5ll9vLsfV&%yuy*&DhC*I*E$SH$K9_D*1WGV z_cZ%U)=tretg}T~yRNk-oi5IL>nHd63hqkfFTJ!=zjS5ZUB4yo-D=_*qm{<(?XlhX zu1mYU^WhlnPFzpWVk@_V80D{icE+23CSD2k+PYtxbY@lIOL*ToVzw%qmvTaZac1o=JY%FU%*64LHr8 z^In<9S5?<;v$SxZdvIXOjhzSe>OJN*v#3@*<@C#H(fh&m!s-{$);JC`<*k?*efPW^QqF3P=eraQ!9u7nEb zo^5L`=W~s?_xYNUU}QwQt6=zxM(S1=kff=S{obvzM^i6?spyQECcVa+cKx?mHI1w^JwMAvN5uj-)B|5oq5UWp@DO6 zIm5;E&v|Y2`y4EW3TDQI49arU+)vMb(Iq3ZO?my3l^25E&SZCln2lGHyj-sv_buHM z@%;F)2xm~H>}b*nnPQfl4H z4K`=Ix4raYY0CEgUmqK_+4e6`znh!7K2`5|>EJ#Km(n^xulVOW(d=UN>zlH>1ywfR zc>Lq@kGn-jSG-_l6Ylv^+~;|0wY6vVSyc-*;j%B6nx)%+E4nxIl`MFcpIDirI&3p^ z1#GLl{pnZB7bTa{Q!jR{vs+wxp#PMUUaj(K`R7eLhg}XSS+);5l+M3Bw|zTd+493( z@7aXEg%b*1#`fQc6i|8pk-hnV3;S&R6%jE@aQ6A)8NWX4_PqS-0^#t-*uY4GVXNrS z&Fyw>u}}dcUt16>rd-bJXz2{v(G2N*cv3HU{@b_kXBuZuOkhNW*KnnmLAcmeYnD}q|v(N%!cmYZ2$Dw-@0{f$?Gi; zv$FSl`N#G(YYlq$AK8Lww=>B+vPGcXj)m|xG{5bA;zz^zUD2&725Y}{*tz+>Jr4C{ zx%jP{>8ZWRkd%^{+v%Z2Vsk(28CtPF7XSMc+uqL1tEUAX-+zZqEH;1mX5dZve(B+! zgeOOS7uFt&^e;JQ@U>IF=6lreF6$**i3Lq3o8q5b;uz%fTzO>VkHRkoWniK%5A;(<2hX zqahqY*T5Ad@(O?ed`zhh*G^R6^K=#X>V!7jv!xHu5KIkT3&9;0>ZE%VxIV-{n0oO0 zW{lvN@PoV=BfLc5@o(psW9LcJSJM`lw!pLnrY$gSfoTg&TVUD(|0gYQ96m?Gz;Ps6 z(Z-OTy)DIRl2W4y{N7{V}cbRdZ=a(?SS1V8= zk4F&%hb2E`!-7-f;UtEe1Vi_*06zwXo`X@thDlFU(RYhcB41(P6(T}ch=&R3Hy&;r zN6%7CAjH@d-9x-gNWbVFdd`UM>6<=<_tN2+0vs!g17r9$`W4a>0aFO0r0ww8?)EWO zz`{@WasviZ5g{uqVvO;}2?KvBG^hX?)icZ|KMAIAn?C+ewZLyU17n6yqG=QIua_xD zzy7oj;3?RR1B&vOTHpgAPy{pDT8-|T!i>D!3TEU3D`Dn?IR<9*Pzm`M+B2R7Gul<0 z2Q!lN3KB`cBM;2fAC-rf{|dJa^oaL-ma$%-kBS0`~_%3q9>NVcMfj*?wEF=N(L}{X<1Qdq!L2DJ{ zxA+0t0gG6pr3Xaj8Ws^0iC*xJBymO9WIZWs2Y7gmpy+d>h|p~08l5AZ5d-hAuprAd zfxcsuR)9DC^mKH5y><1J^?eBhWi35zFJ*l%9bIKTf}fVRwwIo-mo9v9dpb>9VA=xH z7MQlcv<0RuFl~Wp3rt&J+5*!Sn6|*Q1^%~K0L^dFd=|}l(X)K?PBq#Lg67TWnLe7= zqj&nzgc;4n(YzP!Z$Wc>G@pmxRU zDcY2y1vC2mu@21Wz8*ZHxjXvL90o8O!i@ga1=>r4?hnI^j{iR=N4Sd~eM}M$zov`+ zeFgf0?%yOKz(m^dgKUWW2#-U*0925E!2)pzlzkPb8zVqYugYL0!n-ME&zk>52F%K>4T*q4qOX`RE@# gks1#?Fu`wEhQT))kPhUpO8lKZdjE;?>r%=856^P^mH+?% literal 0 HcmV?d00001 diff --git a/spring-mvc-java/persons.xlsx b/spring-mvc-java/persons.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1f58606532f81e6d03575f4e127b841c31a61304 GIT binary patch literal 13514 zcmeHuRd5{1677hYC5xGv87;P$naN@XihfAe*<8?Rh3+#)ns(!K3+J=!Z20q=i12fm3l5J?ka^ z(*b`3_y^5O%a6opxI)YXYa0k3agkE(8~SBbL|?_E#%RsaizWhhvwDKXQG7#`Jdzky zV6JL6eB)c{!IM4aEW@TR5MUcCsNMCiuNH>CYs9tNPBxavP@P*P&>H1Cn%)XZPGSTP zzi;zeu5tb>;5VZIqM%$XfJG5PjqG4VwWDa}htu}nO|uXWJIc_MPr&|&68d!Fu)@_r z|Cu*nI#xy{SAO39%u#og5c8eW{<}l>xT?Z%aw%NXll41nAHGPIZ;+fEGkci9jQ2!m z%(0j59l=yiAYl!qAa=SxsXW4UN&y~H-#d245uWD-_5&p>Q8Oj7R{(3}HH2{-t^1nL zpx9jS!?k9-$nHDU47?3)pCQ+hvKZrZoY;M6oxmA>K=3>QN%{5$22l75WzqD$nSuf- zy8&b*9FVg5j;7X5j10fM|BtHw#r*u!&@19)rNNkyL(T) ztFa)>2xb@Jem*|vddH5q4Tg5xOh(z?JWhR8pa)QZ)#nNdCe?(SueY9c6?=eXEq%xqP zsfj3^+HCi&MP&6SWKMuP;q)~&%m+RMcfj<)95L;Ex7bhUtM+FzS@#L6?)*piUA%H> zf--h~uMlUV&>;yzU+Q?L-Mq9m)$=W9;inPm&ebcr(VKI#o#Dax4d5^RpDttA=hZ&| zbQc6j000U21kh#v>?{?DHu9@X$b%d5D{f)WMk{2(1nI(u>A6#oily>aU}&gHyA-xR z;+E1*r}8W|yi_5L16-s6&)3KzVnWS{D_;(CgF@ z$X3b};V^>jFwGx#F!yx-rD=EDwf~_K5ZwN81cP^p00}y(J$Ui46IZaZ(34dfm)wycq0Z&xqeW1}BWuq%cTt2R} zkgBp=X3yM5%S>u2kd&@fc`t(zuImgg{f&ImCyYdp)*QAi`Nt9kOZ%Y8SkSu!b_OL3 zVN@JGJnJUwRR(!s1)s7o1C2O=kFacB3UB(iWlJwXBCZYG51I<^bE%}3+X=iJ=K5*5 zdugU&<628LIuwJq1GZJxg$#vS4wrQc-n!iG&Ezefd7{pza3oBpAVqaO)h6|6Hg89G zzU7(F<}}cyteo+hGH*4`g!b&8DxvPo0p(ASbDZDqMn4L zu981c7RfkbTa(*A;-Eo+VUZ_oND@-3ih{!`NpDKVKnp?SSq?R4zH%oqdU?COYR-Mp zYv3-B74w2@0TX4c#KC#B*G>1VL)eb^{LmW*wm(XlxvPI1HR6gg_S`}!w?99Sz5Iy> zh7pJN>C_eM?J*c*W=i_L|K@7C_~VH^7h>FU>1D#^AWaZop3E* z3SW-}IK3L8YSD`8YMGL#t0h^|VjxOcM(aV!Zt82T`}Tp^l;yG9e%}JG+~~s7L>J=9 zU^fw$)!S<)5-gi$lY4?RBO09wmAx}uB|GIYE8UiVDJ|@C&?ZiG)WFCS*x$K)b!K{g zBhb~KfiLubxV)3Op`)pZva_Rw?MJ8If}}}wH!N@wC<@Fh$Umz}Nl4;FMK3nHBOXD% z=w=Ajm#$SFY-pogZeEUO_%mlnSkB?|MyJt@6+uuHu&Bpb!lhjM)PeSImtM(IG+c;= zMB&E3*OwSdTN8&hSXH*br}D`=MX;q>oyDhsv}rl5eyQdnlCr#Mr%L8|kjx$Vo}i)O zcSODJ@!fkFJ9;9F_c2I3g7tAc$6EVMEEG>NODXX}ouYa@ne`=+V7(0!IEepbHm?nf zbT{yhFfhoI{$rTGG26-9)YRGOpLyZ;3+8`kg`k-3&pk}&Vs~J#BA+}H7J}hLlsQS7 zRrkS+9#?I(9RGM@NKam^6p=;m5MgLjNE&1)_^SLi$6*K!?w zM~9*3i#42O_?8YPCnps?7^{H+R~xKI_JY;x)3;n34O1E`u($jn+?{FoAp&=*qRi6f zN*}6$QLgcvZpT|akcVGM^YtX!n~={ozjH$JYBJ~pcdUUxo+S5>*y)v@(feb!pV?O4 zh~PywW24tUVg7CgA_8nR5`b|n8t1o7-|w-_+1%8|l=1iX--msoIT?Y=iT(}qQ4rqA z?b*uAn(-3S)B5A;2?g8fe9$M2_`G9 zc8E}gMaTC3@yvO2-8OFiEuI!nFLw-i^e9_cyiM8ZuMR*1@)3Y@Y$mfGf_nmQqwZ zEn+wrsv5otM=&$TE!=S0!)5Hs*XI^|tk4I+XWoW!yPw>|m^`hv9{w4@yU_>iHsx-V zHxkLpa?IJI250Wti}9f1gcg8t-0YK2coUe!4Vd;$B z+t-(nTm_>+s}}B2I;B*eXXC`mcO0g?s^DnPxns^}2$p**^#%5*C_Jtek}! z%+C`s=6JtdEu-!4)(=u5WoPrN7; z^P?sD?KV{2=i$ML7nwr))7C>ujIZb8{eybW>+2dRTzf(u7`^}*^WKE2*U5JS<}q3K zZj)%F8Q%qCEMlV@A(W-Bsb>*G06kqI%U+k-!**?I=tzW5?mmN?t%QY6@99YO!;Qe2 z2eD4;=8pVm9qGnh6h~ zTp}JwUS6ZX3F zA=wHRniKX3E8Q9xHD^$;X5|)Tp2zhYP{>Ct$srE;RwQFww=XsNq_&qy_;PF{jVvzu#g9<jttrl7rCj zfc*x^67=1&usxcyYOxAgm=}vYeQkSW+JgYY0k~ly3(-?Z`XCv%@``+T>zmwMeVMb? z94~e4H!a@c0xz^PL8?uDHu);!PahZHmUv%$iZ{;Q^g1~^M)#{%f)xToFw0#UU1K;I z)+mE!ylZnmrIgR}hF-A|2<5M+m2~V{(sD*@vTRUcHCudEA*3|jCMC&xfgU#q*H^`z zrk<3QZ(%jYQ+qAbv;6IL=L;oSL$?g73tad>9ZKGX8`<30M6lRsPagF+qex@q_6UZM4F-mWAa~7? zW!txuEby)(SVg{MhY>`G$cpXkT`3VN;M)k0U_rlVg z2|>vrC^$d(cyIF)t|MK_p-bP(w;DZgptIqObD~&LlN2}jQ?x2g^>N#_ynZujPd!HYLsp_FZ5F)w@$cR5hODTmkU++YE|Yd4X$|} zo2Wzif)Mh$mLq*^Qd1Nj_!>M*w#5DKLUiVMQgh4%5e;D`;OIo4%~RG zO#L;gXjQk%k@WkI5sg_Xs_5wbhxh*8`eBA zI)4PS3(~2k`*iNicSw~Ux*ZippD&hscWNEFSlxZ838SidT>h8>k|{AQ_IfGSSncf> zo+4q3DNe`0dh1_U5mt`GG{3Tk#DoYk-GVs>S?N)Zo2Yd=k-Kx-I<72iw*0*>I+;t0y0icoOT2ch6 zlsxg9Ce0aND;!d*W&C?j>QvMhi ztf+0XeiD50Vc7p@80iDMVa71$1%0^(_mH?QNG5GYi0X}Ya(G6wUt)0-x}{JOA8gVV zhL9CfMvSn)XJJ85kV@5T#J60i9>e}Y+ibP?Q37fO$gnhw_gXw!-;pOqvMuUE8X|KB zcZC?Sm@9QhH_bh!=lR4r+_fyrht;30y!l;mTR zXyM@8VGY$AFd<}O@i%gKr&NVPq93u^-fGwHc21zCM>*l+>$U2aHt6!*qvDKsh}+Al z{3k85`rg<5?69}#lD3)Bo|Ix@bAwRQb*|}q=>`-}kT%ef4WtOUafr8;HGzxz0?^3h0){q}Lmr=n z-D-|^|Tj3D#E7BoxGzCNATTEenGLcpi*5^>$KD_i~eh!+LNRd4OVitpi zVs2}Y1GsC`K||vhmJghb`PC6JvsjcRNz{_|>@IL&Rtu~|Jxc%-3wFmPus7L>%eVLa+O^9AJ0WaW*V zka5pgE^tfD`#S-*}Sc`Owuf>%=yqOVe|;5v|I6hiuw)Uvz8SwTTwB z8Q)fb@oYP%IeZ)!485Ju783E!#m?A-y)$Exr9CyWEMo_3Mf&UmvS&5vhSTSyeO^PE zg$W)#F*%fnZU)4rCPftbW(mQ8wL6^+LVY*32lIRlX>K&-&$8i-I>Fxq4t?=@vPiZj zs*NB1p1+4FW%As>{dF!l0D$!$tMEV8-;pY#w)srxYcXtZ2JZUsK{x(>WmzTZbmBOT z*BZQgplVEJ*89_)IabgX8P0JCb>kiTcsWkQZ5!pu*4-MVZJFZlC1IR}Q|ii{9-kIx z=jq88E~|Db&xnev4Gz68Z>7J^n%Uq2B#^(vUZhhq@bZup?4iQzsw#B}M??ioL=i!1ohfwMnAlOWku&%!f3M(tNt!B? z2urdq^u!mURwU6~$l~yt-|o0m?CB5Ux1QKcLKoN8Z2@d8QQbUGxSd23E5#+D+HKlU zLY8F;h#ndXYsMkGKF8J6pD*-X&cihj;U!|Bk*~idEm-L{_vIs_oGNUhwAeesZRFaZ zdg^UY$de%%{NlM^v5f#^MEJGR9`D}a^>!UV}o zuXT#vXfuK8uoy;m=Si`OPB*ZeD|IsAcr}BY+{idf%@>K$ix>9^$_DQ2Qyg{&Dc3t_ z6VJ0yIw@nR_E@Y*fw;I_gq|k8`|K}h5%k%%5lqI~@{T2+_^QLAG2qi;Zq~cpZgSRr z@@^YTqT@+zyo7mGKYgg@lqJNP{twk4WAPqC)W$jj(;6u*AeiFj3;c~A*g$SuJ7vS>b_JWexOqR(E3fp`@#wI7GtN)ZeJtOEdD{qdTz zQHofY1S+*Qcu;sw)Pb0M1xG88)z3uaf0 z5Bu}9!}PR-?5KgKK>G$B37FL_>%f4f$g}jz;xamuO5)3kws~SE2gYn=_gQ>?;6zep zk)@3+m^8;ik_B?27j+3P)610F0Qp>5z8F-p@W>SZ^%8^FPjh6COkrmV?jPZ`9?Pll z4rp=lKG26SRsdmgO{RCD_GMWEXXV*QpokN}9o^79QBHkP`H&a-jV$5o#M$!UP$6+{ zeVTV(KQffRZH+$9(4L!`=U+m-45Ae@d+w-Gxzm+t@8?`F*!DCMbIJW|FIi~(pm4<^ zmmr8Shk(S+-Z5Oq;RCm;c>Q&Hqx_*w^1=;8Px}JAzek7a5b?Lx~H#= zVT5%E7H9p>xY)6ep=E ze8JYpi}VWO7GZzb>U#MD<7He*it9)^nS~sLv%N+z>OKZ|Ik`?Z`nCsb`V&c z7u?IpT?^(5y+^vNB98wcZU(jup|E#<Shalq$1Sf})L`5MB#RexMCBmKO7?59{j#{7KIhnOu_ z3=Ps2Ply6=K!yA?#R)wy6>~>7h zJ5E{yDbW3+PzGl;Z|b+cub$D!Z*MFYlfDCQ-_%i4IapgO zd^P%EcRu)p}PSgseXXSH@jEz$c)e!PJlVYqu$`A z4^_h?a7AByjJ1ghdF;f`v{@spr-cLMim4ytJ6ZjX6EKv^sEO~x$ZGzkIh;vfZ3dW> zfMliRf&iU@p>ZsmC79q~5z*zF6J&jhCcgxW$GLiPS5AcVlkOb%2V_IOIq_qSeP3N3 z99<*~>^IUOYs3S?Gh`Cdee#paT%HA(P8oWBPpMBqJM4|FRu42unCqNJDs2NB#vKO5 zV7udz$wV~_fre^wSS4~Wi*KF7HT+F zygmz^GLh@r=raK=A^XAJhx@=bz$&tN^f)6^!oizM#FssKI!0;hn)!2%2JTG_)tDh( z%yalkU^JJkd3K>R9dc)@Pq${J@M-%?hRQLK@5yqUUFW8e7xV@;zd3%$R1d9`YdMa) z_Hi?L-@5rZ|BSePCUga}rBg{!)V)DSNxD-zRV`*q4eIG8mejQ<-5j&X8E@X!A*~i0+v*RmS=Hh)eA1fvqKArepo$zK-m|O@Kl01o zrxvyCw`Q1#sPC@uC(j03@hSH9w6?LaDaGUR5tFCeg^AdXeTk8Hy3Q;6S~cHYNwar` z&IXG#4Wmn#vuddmx3S6~awRC)gsA-SE$h7^ z)(P(h`5F4mGH8@fj^z_J+^q$kM;@cGlu2A798!kHGJ=e{>dg}U+9r)(zmf4uIUG;RrQ&kSRLc>yoA(|>j8ejF> z!nk-{EsY_q+sUCTkIT8&Ds`T5xZdcAE_$w=#&{7aM#qirt6am&?EK-G%!Ix@{&>;X z>A;Slm<3dZl|Zrb;L`$){L~CIDn_zOMHhi5m4Ohb+r$@$590{=mU^?&t}Pt+f+*AC zavwb&8AtZ2!Ms?Yyt)mi=c}w-_TgTxQa18bNt&{o1^pBszX~rIx+)=6U6@N84B_GF zn_DY|`-L|gv)Q+ZA~b(>dP1b4u7PQdZA^NYsZMn&^q9w1bCXkSN|8-1o?U`^f)#bk zuRi|7>N9%Y?^2_=DlyR(!RKhQTWeqDZ&bf{84yf4ThSI_zHHBod9rG3&n!D6An;TI z!$%?~Fw;+RditPWZT%2ZH?qk*u(jc#oemx`A#4!;bCueKF>Gb2QHCz%!vr^j2 zxG8$DLi(B!@7mL=W1gsgfKSC5l4em$XhU6pQ_pk*8Q61Y*oDRUQCxz*hDj%4;KtVh zcd2ws%Y^5w2$hy zywE-M_z-bv={yd_@7bllL-fE^Y7U1iYXV7Fmhj;s>NpRaCV4`ulis}4xtw0k-z0-VhroU7!HSXm$+34>S~fkIUK6*cb*F-N z!q3|*NQwAPMj5nyee9?!OuRK{O`Q&Zd=SmKW%qNSc}m z?_1OKhnkv7cF|mkBI-B~cfYbxD&B_-eEo!Pqg^P0+hlppC+xgRdpq5YBS7dTiz{SZ z=QYyf`K3L_OK-I6)^g5yj1M`7F|j<1$J>a`Y;+BtLdPq-V@WIIQLM(@GB#lV`!vd6 zq6s06|9SVs?4%is@w@u!>yWYI?vjfHTQ|4<kpY2c#GH6clhV7{vg+Mk_TAcozqdX4G>TCU7TVN#*2B3Q%QgZPuG;ql>WM z9pO|D62h}2PB*zN1%396Lf_FVD^(HO``C+z3v zrsHi6S1efM&$N$j+X~)^!vkMe9T04d4oGST7V36{uXY-xEoi(d_ou{`qbk`4-ub-R zE8Z9_J%zB9G?VjXRwt_K5GBceuLJ#Z04hO>l6R12<`?Q1{JRr2SxtI+LP`JtRj_3QIbMbw)eY}@#J8385phLQ5P6tfyx5oU`=$9R$$ z8C8^1LL#%-lyq38*XgNJ@<2?8MJ| zzfBikmdpFr6?tFtec$v7^D1_HQ-X;{C603-O|jN)vXQLJYe>Z2I?(UH^Qv>twz3bZ zX-LOt%S-(va=u6zNJ(PsjCpmX$b$_AvXkQRQm0VFZ}lwl7?zM!dNX|iu2y#fUmPK8 z?1z~Wauq3Ez#6qX^VS^w#3FRf|v)U7;W zeK*V3KXf`?^r|yxBuG-rwj(dUE^C8eYPA_B&Y)OrzOsk;?4||IJ0UoFt}}b8vuF(R zvHy12cn#o&Az)6z5j>K-Xg32>%XW{_x&$?&A7xsoW;4++QA4rFZ3O4O5;Z#UY)kA0rrx)Tc(77sD%Ca;a-?u(NM|oaF*7+% zR;ti(n>-$Io1phJV7HX3jXVa0-c7Fh=#c20OvaS>BCfK2_lD?OKad@`d(he$8=)t7!>MWBMqa@{ zD7AWN7iZDdO4t#dQ<&ylK4m)SuEAY1Hg%0W1~(o(Y<1y|z)>GI5%rok?%ZhO^_ugH zHMqS_Erz*c&^u1$CSFC&qclW~-YDC5Iv19sr%w)8wgF{29LsHxUQ+dUZl_AZ5O+Du z0;!T!V|(`(J|Q%Dp!3{~%&J)=?VOme)ZU#X^k~Q8USFPVglk>s4bH2wA5H@U)+_X$ zi&>J_NZ9-@w$?G<>T~Xj>7%}U=9EApQh~|^`1w) zAN32JU(7>*H3OnI%OglrogiO?0B{3=UH67;$Of;Mpj{wB-FK*58srE+;d055r~(!Y zWpHj<{FHOOQ=dqyptVAip#5*=#cN<%%L%B?NU|A&!_yX$S|ELcdyEr-9+5E4t@~^TAutXTkZ}+PRoWecQs$ksw96W;imlJ`2(gVd(fB$!i zKj!QoXMgkO3I*xE0{m6n{bzuBU^(zlQtw|4|0;3)v*8|4>GOXVy#9*wtM2g+By3=( z^%oW7ug1SB$o?>fhyUI9KlEh3BK#`O`UBzm9|-?1sn)N6ziOTS0K5gZje+C&Rr&NQ zz~C>9=05;hfFd~{z#nbrUrm4Qas6TH4s3b-b1wg>JNu*K^()F>TNi&|000L-{noFI zj9;z)S}*>ybuBOu{@eOr)#G2ye=Yd^0l-M~`w;$r%74Ft{x#VC0SN#=GyeHI{X6t3 WNJ9Xf__szs0^lQ%2eQn+UHu<^-Hi7D literal 0 HcmV?d00001 diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 9513c81064..ef18cef3e0 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -161,26 +161,11 @@ - - org.apache.poi - poi - ${poi.version} - org.apache.poi poi-ooxml ${poi.version} - - org.apache.poi - poi-ooxml-schemas - ${poi.version} - - - org.jxls - jxls-jexcel - ${jexcel.version} - @@ -395,7 +380,6 @@ 3.16-beta1 - 1.0.6 diff --git a/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java b/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java index 5cf74aff63..e3658e8f89 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java +++ b/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java @@ -1,140 +1,188 @@ package com.baeldung.excel; import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.DateUtil; -import org.apache.poi.ss.usermodel.FillPatternType; + import java.io.File; -import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; -import org.springframework.stereotype.Service; +import java.util.List; -@Service public class ExcelPOIHelper { - public Map> readExcel(String fileLocation) throws IOException { + public Map> readExcel(String fileLocation) throws IOException { - Map> data = new HashMap>(); - FileInputStream file = new FileInputStream(new File(fileLocation)); - Workbook workbook = new XSSFWorkbook(file); - Sheet sheet = workbook.getSheetAt(0); - int i = 0; - for (Row row : sheet) { - data.put(i, new ArrayList()); - for (Cell cell : row) { - switch (cell.getCellTypeEnum()) { - case STRING: - data.get(i) - .add(cell.getRichStringCellValue() - .getString()); - break; - case NUMERIC: - if (DateUtil.isCellDateFormatted(cell)) { - data.get(i) - .add(cell.getDateCellValue() + ""); - } else { - data.get(i) - .add(cell.getNumericCellValue() + ""); - } - break; - case BOOLEAN: - data.get(i) - .add(cell.getBooleanCellValue() + ""); - break; - case FORMULA: - data.get(i) - .add(cell.getCellFormula() + ""); - break; - default: - data.get(i) - .add(" "); + Map> data = new HashMap<>(); + FileInputStream fis = new FileInputStream(new File(fileLocation)); + + if (fileLocation.endsWith(".xls")) { + data = readHSSFWorkbook(fis); + } else if (fileLocation.endsWith(".xlsx")) { + data = readXSSFWorkbook(fis); + } + + int maxNrCols = 0; + + for (List ls : data.values()) { + if (ls.size() > maxNrCols) { + maxNrCols = ls.size(); + } + } + + for (List ls : data.values()) { + if (ls.size() < maxNrCols) { + for (int i = ls.size(); i < maxNrCols; i++) { + ls.add(new MyCell("")); } } - i++; } - if (workbook != null){ - workbook.close(); + + return data; + } + + private String readCellContent(Cell cell) { + String content = ""; + switch (cell.getCellTypeEnum()) { + case STRING: + content = cell.getStringCellValue(); + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + content = cell.getDateCellValue() + ""; + } else { + content = cell.getNumericCellValue() + ""; + } + break; + case BOOLEAN: + content = cell.getBooleanCellValue() + ""; + break; + case FORMULA: + content = cell.getCellFormula() + ""; + break; + default: + content = ""; + } + return content; + } + + private Map> readHSSFWorkbook(FileInputStream fis) throws IOException { + Map> data = new HashMap<>(); + HSSFWorkbook workbook = null; + try { + workbook = new HSSFWorkbook(fis); + + HSSFSheet sheet = workbook.getSheetAt(0); + for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) { + HSSFRow row = sheet.getRow(i); + data.put(i, new ArrayList()); + if (row != null) { + for (int j = 0; j < row.getLastCellNum(); j++) { + HSSFCell cell = row.getCell(j); + if (cell != null) { + HSSFCellStyle cellStyle = cell.getCellStyle(); + + MyCell myCell = new MyCell(); + + HSSFColor bgColor = cellStyle.getFillForegroundColorColor(); + if (bgColor != null) { + short[] rgbColor = bgColor.getTriplet(); + myCell.setBgColor("rgb(" + rgbColor[0] + "," + rgbColor[1] + "," + rgbColor[2] + ")"); + } + HSSFFont font = cell.getCellStyle() + .getFont(workbook); + myCell.setTextSize(font.getFontHeightInPoints() + ""); + if (font.getBold()) { + myCell.setTextWeight("bold"); + } + HSSFColor textColor = font.getHSSFColor(workbook); + if (textColor != null) { + short[] rgbColor = textColor.getTriplet(); + myCell.setTextColor("rgb(" + rgbColor[0] + "," + rgbColor[1] + "," + rgbColor[2] + ")"); + } + myCell.setContent(readCellContent(cell)); + data.get(i) + .add(myCell); + } else { + data.get(i) + .add(new MyCell("")); + } + } + } + } + } finally { + if (workbook != null) { + workbook.close(); + } } return data; } - public void writeExcel() throws IOException { - Workbook workbook = new XSSFWorkbook(); - + private Map> readXSSFWorkbook(FileInputStream fis) throws IOException { + XSSFWorkbook workbook = null; + Map> data = new HashMap<>(); try { - Sheet sheet = workbook.createSheet("Persons"); - sheet.setColumnWidth(0, 6000); - sheet.setColumnWidth(1, 4000); - Row header = sheet.createRow(0); + workbook = new XSSFWorkbook(fis); + XSSFSheet sheet = workbook.getSheetAt(0); - CellStyle headerStyle = workbook.createCellStyle(); + for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) { + XSSFRow row = sheet.getRow(i); + data.put(i, new ArrayList()); + if (row != null) { + for (int j = 0; j < row.getLastCellNum(); j++) { + XSSFCell cell = row.getCell(j); + if (cell != null) { + XSSFCellStyle cellStyle = cell.getCellStyle(); - headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); - headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - - XSSFFont font = ((XSSFWorkbook) workbook).createFont(); - font.setFontName("Arial"); - font.setFontHeightInPoints((short) 16); - font.setBold(true); - headerStyle.setFont(font); - - Cell headerCell = header.createCell(0); - headerCell.setCellValue("Name"); - headerCell.setCellStyle(headerStyle); - - headerCell = header.createCell(1); - headerCell.setCellValue("Age"); - headerCell.setCellStyle(headerStyle); - - CellStyle style = workbook.createCellStyle(); - style.setWrapText(true); - - Row row = sheet.createRow(2); - Cell cell = row.createCell(0); - cell.setCellValue("John Smith"); - cell.setCellStyle(style); - - cell = row.createCell(1); - cell.setCellValue(20); - cell.setCellStyle(style); - - row = sheet.createRow(3); - cell = row.createCell(0); - cell.setCellValue("Ana Johnson"); - cell.setCellStyle(style); - - cell = row.createCell(1); - cell.setCellValue(30); - cell.setCellStyle(style); - - File currDir = new File("."); - String path = currDir.getAbsolutePath(); - String fileLocation = path.substring(0, path.length() - 1) + "temp.xlsx"; - - FileOutputStream outputStream = new FileOutputStream(fileLocation); - workbook.write(outputStream); - } finally { - if (workbook != null) { - try { - workbook.close(); - } catch (IOException e) { - e.printStackTrace(); + MyCell myCell = new MyCell(); + XSSFColor bgColor = cellStyle.getFillForegroundColorColor(); + if (bgColor != null) { + byte[] rgbColor = bgColor.getRGB(); + myCell.setBgColor("rgb(" + (rgbColor[0] < 0 ? (rgbColor[0] + 0xff) : rgbColor[0]) + "," + (rgbColor[1] < 0 ? (rgbColor[1] + 0xff) : rgbColor[1]) + "," + (rgbColor[2] < 0 ? (rgbColor[2] + 0xff) : rgbColor[2]) + ")"); + } + XSSFFont font = cellStyle.getFont(); + myCell.setTextSize(font.getFontHeightInPoints() + ""); + if (font.getBold()) { + myCell.setTextWeight("bold"); + } + XSSFColor textColor = font.getXSSFColor(); + if (textColor != null) { + byte[] rgbColor = textColor.getRGB(); + myCell.setTextColor("rgb(" + (rgbColor[0] < 0 ? (rgbColor[0] + 0xff) : rgbColor[0]) + "," + (rgbColor[1] < 0 ? (rgbColor[1] + 0xff) : rgbColor[1]) + "," + (rgbColor[2] < 0 ? (rgbColor[2] + 0xff) : rgbColor[2]) + ")"); + } + myCell.setContent(readCellContent(cell)); + data.get(i) + .add(myCell); + } else { + data.get(i) + .add(new MyCell("")); + } + } } } + } finally { + if (workbook != null) { + workbook.close(); + } } + return data; } } \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/excel/JExcelHelper.java b/spring-mvc-java/src/main/java/com/baeldung/excel/JExcelHelper.java deleted file mode 100644 index d0e33bf471..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/excel/JExcelHelper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.baeldung.excel; - -import jxl.Sheet; -import jxl.Workbook; -import jxl.format.Colour; -import jxl.read.biff.BiffException; -import jxl.write.*; -import jxl.write.Number; -import org.springframework.stereotype.Service; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -@Service -public class JExcelHelper { - - public Map> readJExcel(String fileLocation) throws IOException, BiffException { - Map> data = new HashMap<>(); - - Workbook workbook = Workbook.getWorkbook(new File(fileLocation)); - Sheet sheet = workbook.getSheet(0); - int rows = sheet.getRows(); - int columns = sheet.getColumns(); - - for (int i = 0; i < rows; i++) { - data.put(i, new ArrayList<>()); - for (int j = 0; j < columns; j++) { - data.get(i).add(sheet.getCell(j, i).getContents()); - } - } - return data; - } - - public void writeJExcel() throws IOException, WriteException { - WritableWorkbook workbook = null; - try { - File currDir = new File("."); - String path = currDir.getAbsolutePath(); - String fileLocation = path.substring(0, path.length() - 1) + "temp.xls"; - - workbook = Workbook.createWorkbook(new File(fileLocation)); - - WritableSheet sheet = workbook.createSheet("Sheet 1", 0); - - WritableCellFormat headerFormat = new WritableCellFormat(); - WritableFont font = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD); - headerFormat.setFont(font); - headerFormat.setBackground(Colour.LIGHT_BLUE); - headerFormat.setWrap(true); - Label headerLabel = new Label(0, 0, "Name", headerFormat); - sheet.setColumnView(0, 60); - sheet.addCell(headerLabel); - - headerLabel = new Label(1, 0, "Age", headerFormat); - sheet.setColumnView(0, 40); - sheet.addCell(headerLabel); - - WritableCellFormat cellFormat = new WritableCellFormat(); - cellFormat.setWrap(true); - - Label cellLabel = new Label(0, 2, "John Smith", cellFormat); - sheet.addCell(cellLabel); - Number cellNumber = new Number(1, 2, 20, cellFormat); - sheet.addCell(cellNumber); - - cellLabel = new Label(0, 3, "Ana Johnson", cellFormat); - sheet.addCell(cellLabel); - cellNumber = new Number(1, 3, 30, cellFormat); - sheet.addCell(cellNumber); - - workbook.write(); - } finally { - if (workbook != null) { - workbook.close(); - } - } - - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java b/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java new file mode 100644 index 0000000000..409829bc35 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java @@ -0,0 +1,57 @@ +package com.baeldung.excel; + +public class MyCell { + private String content; + private String textColor; + private String bgColor; + private String textSize; + private String textWeight; + + public MyCell() { + } + + public MyCell(String content) { + this.content = content; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTextColor() { + return textColor; + } + + public void setTextColor(String textColor) { + this.textColor = textColor; + } + + public String getBgColor() { + return bgColor; + } + + public void setBgColor(String bgColor) { + this.bgColor = bgColor; + } + + public String getTextSize() { + return textSize; + } + + public void setTextSize(String textSize) { + this.textSize = textSize; + } + + public String getTextWeight() { + return textWeight; + } + + public void setTextWeight(String textWeight) { + this.textWeight = textWeight; + } + +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 9578303554..11be08a79d 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -108,11 +108,6 @@ public class WebConfig extends WebMvcConfigurerAdapter { configurer.setUrlPathHelper(urlPathHelper); } - @Bean - public JExcelHelper jExcelHelper() { - return new JExcelHelper(); - } - @Bean public ExcelPOIHelper excelPOIHelper() { return new ExcelPOIHelper(); diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java index 810282dd65..f76f7441a5 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java @@ -10,20 +10,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import com.baeldung.excel.*; -import jxl.read.biff.BiffException; import java.util.Map; -import java.util.ArrayList; +import java.util.List; import javax.annotation.Resource; -import jxl.write.WriteException; @Controller public class ExcelController { private String fileLocation; - @Resource(name = "jExcelHelper") - private JExcelHelper jExcelHelper; - @Resource(name = "excelPOIHelper") private ExcelPOIHelper excelPOIHelper; @@ -45,36 +40,19 @@ public class ExcelController { } f.flush(); f.close(); - System.out.println(fileLocation); model.addAttribute("message", "File: " + file.getOriginalFilename() + " has been uploaded successfully!"); return "excel"; } - @RequestMapping(method = RequestMethod.GET, value = "/readJExcel") - public String readJExcel(Model model) throws IOException, BiffException { - - if (fileLocation != null) { - if (fileLocation.endsWith(".xls")) { - Map> data = jExcelHelper.readJExcel(fileLocation); - model.addAttribute("data", data); - } else { - model.addAttribute("message", "Not a valid .xls file!"); - } - } else { - model.addAttribute("message", "File missing! Please upload an excel file."); - } - return "excel"; - } - @RequestMapping(method = RequestMethod.GET, value = "/readPOI") public String readPOI(Model model) throws IOException { if (fileLocation != null) { - if (fileLocation.endsWith(".xlsx")) { - Map> data = excelPOIHelper.readExcel(fileLocation); + if (fileLocation.endsWith(".xlsx") || fileLocation.endsWith(".xls")) { + Map> data = excelPOIHelper.readExcel(fileLocation); model.addAttribute("data", data); } else { - model.addAttribute("message", "Not a valid .xlsx file!"); + model.addAttribute("message", "Not a valid excel file!"); } } else { model.addAttribute("message", "File missing! Please upload an excel file."); @@ -82,24 +60,4 @@ public class ExcelController { return "excel"; } - @RequestMapping(method = RequestMethod.POST, value = "/writeJExcel") - public String writeJExcel(Model model) throws IOException, BiffException, WriteException { - - jExcelHelper.writeJExcel(); - - model.addAttribute("message", "Write successful!"); - - return "excel"; - } - - @RequestMapping(method = RequestMethod.POST, value = "/writePOI") - public String writePOI(Model model) throws IOException { - - excelPOIHelper.writeExcel(); - - model.addAttribute("message", "Write successful!"); - - return "excel"; - } - } \ No newline at end of file diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/excel.jsp b/spring-mvc-java/src/main/webapp/WEB-INF/view/excel.jsp index b50687df15..bcb5a31371 100644 --- a/spring-mvc-java/src/main/webapp/WEB-INF/view/excel.jsp +++ b/spring-mvc-java/src/main/webapp/WEB-INF/view/excel.jsp @@ -1,6 +1,6 @@ <%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + pageEncoding="ISO-8859-1"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> @@ -8,49 +8,43 @@ Excel Processing - - - - - - + + + -
- - -
-
-${message } -

-
- -
-

-Read file using JExcel     -Read file using Apache POI -

+
+ + +
+
+
+ +
+
${message } +
+
-File content: - - - - - - - - - -
${cell}
-
-

-
- -
-
-
- -
+
+ +
+
+
+ + + + + + + + + + +
+ ${cell.content} +
+
- \ No newline at end of file From 00d83f90709108e88c16ade58dbeb9899f7067dc Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Fri, 17 Feb 2017 18:26:23 +0100 Subject: [PATCH 150/192] BAEL-602 create JOOL module, one test case --- jooq/pom.xml | 46 +++++++++++++++++++ jooq/src/test/java/com/baeldung/JOOLTest.java | 29 ++++++++++++ pom.xml | 1 + 3 files changed, 76 insertions(+) create mode 100644 jooq/pom.xml create mode 100644 jooq/src/test/java/com/baeldung/JOOLTest.java diff --git a/jooq/pom.xml b/jooq/pom.xml new file mode 100644 index 0000000000..ef287d0292 --- /dev/null +++ b/jooq/pom.xml @@ -0,0 +1,46 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + jooq + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + org.jooq + jool + ${jool.version} + + + junit + junit + ${junit.version} + test + + + + + 0.9.12 + 4.12 + + + + \ No newline at end of file diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java new file mode 100644 index 0000000000..aa729a3edf --- /dev/null +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -0,0 +1,29 @@ +package com.baeldung; + + +import org.jooq.lambda.Seq; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static junit.framework.Assert.assertTrue; +import static junit.framework.TestCase.assertEquals; + +public class JOOLTest { + @Test + public void givenSeq_whenCheckContains_shouldReturnTrue() { + List concat = Seq.of(1, 2, 3).concat(Seq.of(4, 5, 6)).toList(); + + assertEquals(concat, Arrays.asList(1, 2, 3, 4, 5, 6)); + + + assertTrue(Seq.of(1, 2, 3, 4).contains(2)); + + + assertTrue(Seq.of(1, 2, 3, 4).containsAll(2, 3)); + + + assertTrue(Seq.of(1, 2, 3, 4).containsAny(2, 5)); + } +} diff --git a/pom.xml b/pom.xml index ecb07e987b..42ded9de0d 100644 --- a/pom.xml +++ b/pom.xml @@ -193,6 +193,7 @@ struts2 apache-velocity + jooq From 6c282a742ce71e04513f1a2c6d560754a7acd854 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sat, 18 Feb 2017 07:31:10 +0100 Subject: [PATCH 151/192] BAEL-639: Fixing failing test --- .../DivisibilityTest.java | 4 +- .../MyParameterisedUnitTest.java | 28 +---- .../StringCaseTest.java | 2 +- .../SuiteTest.java | 2 +- .../SummationServiceTest.java | 9 +- .../src/test/resources/parameterised_test.xml | 10 -- core-java/src/test/resources/test_group.xml | 13 --- core-java/src/test/resources/test_suite.xml | 9 -- pom.xml | 1 + testng/pom.xml | 109 ++++++++++++++++++ .../java/baeldung/com}/DependentTests.java | 10 +- .../baeldung/com/ParametrizedTestNGTest.java | 36 ++---- .../java/baeldung/com}/RegistrationTest.java | 2 +- .../test/java/baeldung/com}/SignInTest.java | 2 +- .../baeldung/com/SummationServiceTest.java | 49 ++++---- .../src/test/java/baeldung/com/TestGroup.java | 44 +++++++ .../test/java/baeldung/com}/TimeOutTest.java | 6 +- testng/src/test/resources/logback.xml | 14 +++ .../src/test/resources/parameterised_test.xml | 17 +++ testng/src/test/resources/test_group.xml | 13 +++ testng/src/test/resources/test_suite.xml | 9 ++ 21 files changed, 265 insertions(+), 124 deletions(-) rename core-java/src/test/java/com/baeldung/{test/comparison => junit4vstestng}/DivisibilityTest.java (74%) rename core-java/src/test/java/com/baeldung/{test/comparison => junit4vstestng}/MyParameterisedUnitTest.java (59%) rename core-java/src/test/java/com/baeldung/{test/comparison => junit4vstestng}/StringCaseTest.java (90%) rename core-java/src/test/java/com/baeldung/{test/comparison => junit4vstestng}/SuiteTest.java (83%) rename core-java/src/test/java/com/baeldung/{test/comparison => junit4vstestng}/SummationServiceTest.java (94%) delete mode 100644 core-java/src/test/resources/parameterised_test.xml delete mode 100644 core-java/src/test/resources/test_group.xml delete mode 100644 core-java/src/test/resources/test_suite.xml create mode 100644 testng/pom.xml rename {core-java/src/test/java/com/baeldung/test/comparison => testng/src/test/java/baeldung/com}/DependentTests.java (82%) rename core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java => testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java (51%) rename {core-java/src/test/java/com/baeldung/test/comparison => testng/src/test/java/baeldung/com}/RegistrationTest.java (78%) rename {core-java/src/test/java/com/baeldung/test/comparison => testng/src/test/java/baeldung/com}/SignInTest.java (78%) rename core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java => testng/src/test/java/baeldung/com/SummationServiceTest.java (79%) create mode 100644 testng/src/test/java/baeldung/com/TestGroup.java rename {core-java/src/test/java/com/baeldung/test/comparison => testng/src/test/java/baeldung/com}/TimeOutTest.java (70%) create mode 100644 testng/src/test/resources/logback.xml create mode 100644 testng/src/test/resources/parameterised_test.xml create mode 100644 testng/src/test/resources/test_group.xml create mode 100644 testng/src/test/resources/test_suite.xml diff --git a/core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/DivisibilityTest.java similarity index 74% rename from core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java rename to core-java/src/test/java/com/baeldung/junit4vstestng/DivisibilityTest.java index 9ae13f5934..dec7dbe6aa 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/DivisibilityTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/DivisibilityTest.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package com.baeldung.junit4vstestng; import static org.junit.Assert.assertEquals; @@ -15,7 +15,7 @@ public class DivisibilityTest { } @Test - public void givenNumber_whenDivisiblebyTwo_thenCorrect() { + public void givenNumber_whenDivisibleByTwo_thenCorrect() { assertEquals(number % 2, 0); } } diff --git a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/MyParameterisedUnitTest.java similarity index 59% rename from core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java rename to core-java/src/test/java/com/baeldung/junit4vstestng/MyParameterisedUnitTest.java index 3372bbb577..95f9274af3 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/MyParameterisedUnitTest.java @@ -1,7 +1,4 @@ -package com.baeldung.test.comparison; - -import java.util.Arrays; -import java.util.Collection; +package com.baeldung.junit4vstestng; import org.junit.Assert; import org.junit.Before; @@ -10,16 +7,13 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import java.util.Arrays; +import java.util.Collection; + @RunWith(value = Parameterized.class) public class MyParameterisedUnitTest { private String name; - private NameCheck nameCheck; - - @Before - public void initialSetup() { - nameCheck = new NameCheck(); - } public MyParameterisedUnitTest(String myName) { this.name = myName; @@ -27,23 +21,13 @@ public class MyParameterisedUnitTest { @Parameters public static Collection data() { - Object[][] data = new Object[][] { { "Peter" }, { "Sam" }, { "Tim" }, { "Lucy" } }; + Object[][] data = new Object[][]{{"Peter"}, {"Sam"}, {"Tim"}, {"Lucy"}}; return Arrays.asList(data); } @Test public void givenName_whenValidLength_thenTrue() { - boolean valid = nameCheck.nameCheck(name); + boolean valid = name.length() > 0; Assert.assertEquals(valid, true); } } - -class NameCheck { - - public boolean nameCheck(String name) { - if (name.length() > 0) - return true; - return false; - } - -} diff --git a/core-java/src/test/java/com/baeldung/test/comparison/StringCaseTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/StringCaseTest.java similarity index 90% rename from core-java/src/test/java/com/baeldung/test/comparison/StringCaseTest.java rename to core-java/src/test/java/com/baeldung/junit4vstestng/StringCaseTest.java index b4226b82e7..520017e4c1 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/StringCaseTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/StringCaseTest.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package com.baeldung.junit4vstestng; import static org.junit.Assert.assertEquals; diff --git a/core-java/src/test/java/com/baeldung/test/comparison/SuiteTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java similarity index 83% rename from core-java/src/test/java/com/baeldung/test/comparison/SuiteTest.java rename to core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java index a30e5d312a..3d6d6cbbfb 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/SuiteTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package com.baeldung.junit4vstestng; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/SummationServiceTest.java similarity index 94% rename from core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTest.java rename to core-java/src/test/java/com/baeldung/junit4vstestng/SummationServiceTest.java index b76a87c0fe..7d1bf3b7af 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/SummationServiceTest.java @@ -1,8 +1,4 @@ -package com.baeldung.test.comparison; - -import java.security.Security; -import java.util.ArrayList; -import java.util.List; +package com.baeldung.junit4vstestng; import org.junit.After; import org.junit.AfterClass; @@ -12,6 +8,9 @@ import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; + public class SummationServiceTest { private static List numbers; diff --git a/core-java/src/test/resources/parameterised_test.xml b/core-java/src/test/resources/parameterised_test.xml deleted file mode 100644 index 69a2c60460..0000000000 --- a/core-java/src/test/resources/parameterised_test.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/core-java/src/test/resources/test_group.xml b/core-java/src/test/resources/test_group.xml deleted file mode 100644 index 0c9a6c73df..0000000000 --- a/core-java/src/test/resources/test_group.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/core-java/src/test/resources/test_suite.xml b/core-java/src/test/resources/test_suite.xml deleted file mode 100644 index 36305aa5fc..0000000000 --- a/core-java/src/test/resources/test_suite.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index ecb07e987b..eb89b9cbaa 100644 --- a/pom.xml +++ b/pom.xml @@ -194,6 +194,7 @@ struts2 apache-velocity + testng diff --git a/testng/pom.xml b/testng/pom.xml new file mode 100644 index 0000000000..02f51d4d99 --- /dev/null +++ b/testng/pom.xml @@ -0,0 +1,109 @@ + + + 4.0.0 + com.baeldung + testng + 0.1.0-SNAPSHOT + jar + testng + + + + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + + org.testng + testng + ${testng.version} + test + + + + + + testng + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + + + + + + + + + 1.7.21 + 1.1.7 + + + 6.10 + + + 3.6.0 + 2.19.1 + + + + + \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java b/testng/src/test/java/baeldung/com/DependentTests.java similarity index 82% rename from core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java rename to testng/src/test/java/baeldung/com/DependentTests.java index 3ef4949067..ab593e0439 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/DependentTests.java +++ b/testng/src/test/java/baeldung/com/DependentTests.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package baeldung.com; import org.testng.Assert; import org.testng.annotations.BeforeClass; @@ -6,9 +6,9 @@ import org.testng.annotations.Test; public class DependentTests { + private String validEmail = "abc@qwe.com"; private EmailValidator emailValidator; private LoginValidator loginValidator; - private String validEmail = "abc@qwe.com"; @BeforeClass public void setup() { @@ -23,7 +23,7 @@ public class DependentTests { } @Test(dependsOnMethods = { "givenEmail_ifValid_thenTrue" }) - public void givenValidEmail_whenLoggedin_thenTrue() { + public void givenValidEmail_whenLoggedIn_thenTrue() { boolean valid = loginValidator.validate(); Assert.assertEquals(valid, true); } @@ -31,7 +31,7 @@ public class DependentTests { class EmailValidator { - public boolean validate(String validEmail) { + boolean validate(String validEmail) { return true; } @@ -39,7 +39,7 @@ class EmailValidator { class LoginValidator { - public boolean validate() { + boolean validate() { return true; } diff --git a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java b/testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java similarity index 51% rename from core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java rename to testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java index 4096c3fb6f..e4f3aacf5b 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/MyParameterisedUnitTestNg.java +++ b/testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package baeldung.com; import org.testng.Assert; import org.testng.annotations.BeforeClass; @@ -6,29 +6,22 @@ import org.testng.annotations.DataProvider; import org.testng.annotations.Parameters; import org.testng.annotations.Test; -public class MyParameterisedUnitTestNg { +public class ParametrizedTestNGTest { - private PrimeNumberCheck primeNumberChecker; - - @BeforeClass - public void intialSetup() { - primeNumberChecker = new PrimeNumberCheck(); - } - - @Test(enabled = false) - @Parameters({ "num", "expectedResult" }) - public void givenNumber_ifPrime_thenCorrect(int number, boolean expectedResult) { - Assert.assertEquals(expectedResult, primeNumberChecker.validate(number)); + @Test + @Parameters({ "name", "expectedResult" }) + public void givenNumber_ifPrime_thenCorrect(String name, boolean expectedResult) { + Assert.assertEquals(expectedResult, name.length() > 0); } @DataProvider(name = "test1") public static Object[][] primeNumbers() { - return new Object[][] { { 2, true }, { 6, false }, { 19, true }, { 22, false }, { 23, true } }; + return new Object[][] { { "Peter", true }, { "Sam", true }, { "Tim", true }, { "Lucy", true } }; } @Test(dataProvider = "test1") - public void givenNumber_whenPrime_thenCorrect(Integer inputNumber, Boolean expectedResult) { - Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber)); + public void givenNumber_whenPrime_thenCorrect(String name, boolean expectedResult) { + Assert.assertEquals(expectedResult, name.length() > 0); } @Test(dataProvider = "myDataProvider") @@ -47,17 +40,6 @@ public class MyParameterisedUnitTestNg { } -class PrimeNumberCheck { - - public Object validate(int number) { - for (int i = 2; i < number; i++) { - if (number % i == 0) - return false; - } - return true; - } - -} class User { private String name; diff --git a/core-java/src/test/java/com/baeldung/test/comparison/RegistrationTest.java b/testng/src/test/java/baeldung/com/RegistrationTest.java similarity index 78% rename from core-java/src/test/java/com/baeldung/test/comparison/RegistrationTest.java rename to testng/src/test/java/baeldung/com/RegistrationTest.java index 86836425a9..7cb17c9cb8 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/RegistrationTest.java +++ b/testng/src/test/java/baeldung/com/RegistrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package baeldung.com; import org.testng.annotations.Test; diff --git a/core-java/src/test/java/com/baeldung/test/comparison/SignInTest.java b/testng/src/test/java/baeldung/com/SignInTest.java similarity index 78% rename from core-java/src/test/java/com/baeldung/test/comparison/SignInTest.java rename to testng/src/test/java/baeldung/com/SignInTest.java index 9669f60b6b..4884154345 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/SignInTest.java +++ b/testng/src/test/java/baeldung/com/SignInTest.java @@ -1,4 +1,4 @@ -package com.baeldung.test.comparison; +package baeldung.com; import org.testng.annotations.Test; diff --git a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java b/testng/src/test/java/baeldung/com/SummationServiceTest.java similarity index 79% rename from core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java rename to testng/src/test/java/baeldung/com/SummationServiceTest.java index fb02f28d06..471d7a7c8a 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/SummationServiceTestTestNg.java +++ b/testng/src/test/java/baeldung/com/SummationServiceTest.java @@ -1,19 +1,13 @@ -package com.baeldung.test.comparison; +package baeldung.com; + +import org.testng.Assert; +import org.testng.TestNG; +import org.testng.annotations.*; import java.util.ArrayList; import java.util.List; -import org.testng.Assert; -import org.testng.TestNG; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterGroups; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeGroups; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class SummationServiceTestTestNg extends TestNG { +public class SummationServiceTest extends TestNG { private List numbers; @@ -29,14 +23,16 @@ public class SummationServiceTestTestNg extends TestNG { numbers = null; } - @BeforeMethod - public void runBeforeEachTest() { - testCount++; + @BeforeSuite(groups = "regression") + public void runBeforeRegressionSuite() { + numbers = new ArrayList<>(); + numbers.add(-11); + numbers.add(2); } - @AfterMethod - public void runAfterEachTest() { - + @AfterSuite(groups = "regression") + public void runAfterRegressionSuite() { + numbers = null; } @BeforeGroups("negative_tests") @@ -62,6 +58,17 @@ public class SummationServiceTestTestNg extends TestNG { numbers.clear(); } + @BeforeMethod + public void runBeforeEachTest() { + testCount++; + } + + @AfterMethod + public void runAfterEachTest() { + + } + + @Test(groups = "positive_tests", enabled = false) public void givenNumbers_sumEquals_thenCorrect() { int sum = numbers.stream().reduce(0, Integer::sum); @@ -78,12 +85,6 @@ public class SummationServiceTestTestNg extends TestNG { public void givenNegativeNumber_sumLessthanZero_thenCorrect() { int sum = numbers.stream().reduce(0, Integer::sum); Assert.assertTrue(sum < 0); - ; - } - - @Test(groups = "sanity") - public void givenNumbers_doSum() { - } @Test(expectedExceptions = ArithmeticException.class) diff --git a/testng/src/test/java/baeldung/com/TestGroup.java b/testng/src/test/java/baeldung/com/TestGroup.java new file mode 100644 index 0000000000..08bb5c996e --- /dev/null +++ b/testng/src/test/java/baeldung/com/TestGroup.java @@ -0,0 +1,44 @@ +package baeldung.com; + +import org.testng.annotations.AfterGroups; +import org.testng.annotations.BeforeGroups; +import org.testng.annotations.Test; + +public class TestGroup { + + @BeforeGroups("database") + public void setupDB() { + System.out.println("setupDB()"); + } + + @AfterGroups("database") + public void cleanDB() { + System.out.println("cleanDB()"); + } + + @Test(groups= "selenium-test") + public void runSelenium() { + System.out.println("runSelenium()"); + } + + @Test(groups= "selenium-test") + public void runSelenium1() { + System.out.println("runSelenium()1"); + } + + @Test(groups = "database") + public void testConnectOracle() { + System.out.println("testConnectOracle()"); + } + + @Test(groups = "database") + public void testConnectMsSQL() { + System.out.println("testConnectMsSQL"); + } + + @Test(dependsOnGroups = {"database","selenium-test"}) + public void runFinal() { + System.out.println("runFinal"); + } + +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java b/testng/src/test/java/baeldung/com/TimeOutTest.java similarity index 70% rename from core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java rename to testng/src/test/java/baeldung/com/TimeOutTest.java index 6e06132009..d54a914e08 100644 --- a/core-java/src/test/java/com/baeldung/test/comparison/TimeOutTest.java +++ b/testng/src/test/java/baeldung/com/TimeOutTest.java @@ -1,11 +1,11 @@ -package com.baeldung.test.comparison; +package baeldung.com; import org.testng.annotations.Test; public class TimeOutTest { + @Test(timeOut = 1000, enabled = false) public void givenExecution_takeMoreTime_thenFail() { - while (true) - ; + while (true) ; } } diff --git a/testng/src/test/resources/logback.xml b/testng/src/test/resources/logback.xml new file mode 100644 index 0000000000..e9ae1894a6 --- /dev/null +++ b/testng/src/test/resources/logback.xml @@ -0,0 +1,14 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + \ No newline at end of file diff --git a/testng/src/test/resources/parameterised_test.xml b/testng/src/test/resources/parameterised_test.xml new file mode 100644 index 0000000000..2381ba67d0 --- /dev/null +++ b/testng/src/test/resources/parameterised_test.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testng/src/test/resources/test_group.xml b/testng/src/test/resources/test_group.xml new file mode 100644 index 0000000000..d636a4174d --- /dev/null +++ b/testng/src/test/resources/test_group.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/testng/src/test/resources/test_suite.xml b/testng/src/test/resources/test_suite.xml new file mode 100644 index 0000000000..201ed3f645 --- /dev/null +++ b/testng/src/test/resources/test_suite.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file From 2ee0a8a7a13145df12259429012f9c57b5509509 Mon Sep 17 00:00:00 2001 From: tschiman Date: Sat, 11 Feb 2017 19:52:16 +0100 Subject: [PATCH 152/192] BAEL-684 Adding spring JPA to resource servers --- .../gateway/GatewayApplicationLiveTest.java | 69 ------ .../bootstrap/gateway/IntegrationTest.java | 201 ++++++++++++++++++ .../spring-cloud-bootstrap/svc-book/pom.xml | 11 + .../svcbook/BookServiceApplication.java | 24 --- .../bootstrap/svcbook/SecurityConfig.java | 8 +- .../bootstrap/svcbook/{ => book}/Book.java | 19 +- .../svcbook/book/BookController.java | 40 ++++ .../svcbook/book/BookNotFoundException.java | 11 + .../svcbook/book/BookRepository.java | 6 + .../bootstrap/svcbook/book/BookService.java | 55 +++++ .../spring-cloud-bootstrap/svc-rating/pom.xml | 11 + .../svcrating/RatingServiceApplication.java | 28 --- .../bootstrap/svcrating/SecurityConfig.java | 8 +- .../svcrating/{ => rating}/Rating.java | 14 +- .../svcrating/rating/RatingController.java | 38 ++++ .../rating/RatingNotFoundException.java | 11 + .../svcrating/rating/RatingRepository.java | 9 + .../svcrating/rating/RatingService.java | 57 +++++ 18 files changed, 487 insertions(+), 133 deletions(-) delete mode 100644 spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java create mode 100644 spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java rename spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/{ => book}/Book.java (57%) create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java rename spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/{ => rating}/Rating.java (62%) create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java create mode 100644 spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java deleted file mode 100644 index aa39232bb2..0000000000 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplicationLiveTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.spring.cloud.bootstrap.gateway; - -import org.junit.Assert; -import org.junit.Test; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; - -public class GatewayApplicationLiveTest { - - @Test - public void testAccess() throws Exception { - TestRestTemplate testRestTemplate = new TestRestTemplate(); - String testUrl = "http://localhost:8080"; - - ResponseEntity response = testRestTemplate.getForEntity(testUrl + "/book-service/books", String.class); - Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - Assert.assertNotNull(response.getBody()); - - //try the protected resource and confirm the redirect to login - response = testRestTemplate.getForEntity(testUrl + "/book-service/books/1", String.class); - Assert.assertEquals(HttpStatus.FOUND, response.getStatusCode()); - Assert.assertEquals("http://localhost:8080/login", response.getHeaders().get("Location").get(0)); - - //login as user/password - MultiValueMap form = new LinkedMultiValueMap<>(); - form.add("username", "user"); - form.add("password", "password"); - response = testRestTemplate.postForEntity(testUrl + "/login", form, String.class); - - //extract the session from the cookie and propagate it to the next request - String sessionCookie = response.getHeaders().get("Set-Cookie").get(0).split(";")[0]; - HttpHeaders headers = new HttpHeaders(); - headers.add("Cookie", sessionCookie); - HttpEntity httpEntity = new HttpEntity<>(headers); - - //request the protected resource - response = testRestTemplate.exchange(testUrl + "/book-service/books/1", HttpMethod.GET, httpEntity, String.class); - Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - Assert.assertNotNull(response.getBody()); - - //request the admin protected resource to determine it is still protected - response = testRestTemplate.exchange(testUrl + "/rating-service/ratings/all", HttpMethod.GET, httpEntity, String.class); - Assert.assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); - - //login as the admin - form.clear(); - form.add("username", "admin"); - form.add("password", "admin"); - response = testRestTemplate.postForEntity(testUrl + "/login", form, String.class); - - //extract the session from the cookie and propagate it to the next request - sessionCookie = response.getHeaders().get("Set-Cookie").get(0).split(";")[0]; - headers = new HttpHeaders(); - headers.add("Cookie", sessionCookie); - httpEntity = new HttpEntity<>(headers); - - //request the protected resource - response = testRestTemplate.exchange(testUrl + "/rating-service/ratings/all", HttpMethod.GET, httpEntity, String.class); - Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - Assert.assertNotNull(response.getBody()); - - //request the discovery resources as the admin - response = testRestTemplate.exchange(testUrl + "/discovery", HttpMethod.GET, httpEntity, String.class); - Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); - } - -} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java new file mode 100644 index 0000000000..16057edc48 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java @@ -0,0 +1,201 @@ +package com.baeldung.spring.cloud.bootstrap.gateway; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.http.entity.ContentType; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.*; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +public class IntegrationTest { + + private TestRestTemplate testRestTemplate = new TestRestTemplate(); + private String testUrl = "http://localhost:8080"; + + @Test + public void testAccess() throws Exception { + ResponseEntity response = testRestTemplate.getForEntity(testUrl + "/book-service/books", String.class); + Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assert.assertNotNull(response.getBody()); + + //try the protected resource and confirm the redirect to login + response = testRestTemplate.getForEntity(testUrl + "/book-service/books/1", String.class); + Assert.assertEquals(HttpStatus.FOUND, response.getStatusCode()); + Assert.assertEquals("http://localhost:8080/login", response.getHeaders().get("Location").get(0)); + + //login as user/password + MultiValueMap form = new LinkedMultiValueMap<>(); + form.add("username", "user"); + form.add("password", "password"); + response = testRestTemplate.postForEntity(testUrl + "/login", form, String.class); + + //extract the session from the cookie and propagate it to the next request + String sessionCookie = response.getHeaders().get("Set-Cookie").get(0).split(";")[0]; + HttpHeaders headers = new HttpHeaders(); + headers.add("Cookie", sessionCookie); + HttpEntity httpEntity = new HttpEntity<>(headers); + + addBook(); + + //request the protected resource + response = testRestTemplate.exchange(testUrl + "/book-service/books/1", HttpMethod.GET, httpEntity, String.class); + Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assert.assertNotNull(response.getBody()); + + addRatings(); + + //request the admin protected resource to determine it is still protected + response = testRestTemplate.exchange(testUrl + "/rating-service/ratings", HttpMethod.GET, httpEntity, String.class); + Assert.assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); + + //login as the admin + form.clear(); + form.add("username", "admin"); + form.add("password", "admin"); + response = testRestTemplate.postForEntity(testUrl + "/login", form, String.class); + + //extract the session from the cookie and propagate it to the next request + sessionCookie = response.getHeaders().get("Set-Cookie").get(0).split(";")[0]; + headers = new HttpHeaders(); + headers.add("Cookie", sessionCookie); + httpEntity = new HttpEntity<>(headers); + + //request the protected resource + response = testRestTemplate.exchange(testUrl + "/rating-service/ratings", HttpMethod.GET, httpEntity, String.class); + Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assert.assertNotNull(response.getBody()); + + //request the discovery resources as the admin + response = testRestTemplate.exchange(testUrl + "/discovery", HttpMethod.GET, httpEntity, String.class); + Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + private void addRatings() { + //login as user/password + MultiValueMap form = new LinkedMultiValueMap<>(); + form.add("username", "user"); + form.add("password", "password"); + ResponseEntity response = testRestTemplate.postForEntity(testUrl + "/login", form, String.class); + + //extract the session from the cookie and propagate it to the next request + String sessionCookie = response.getHeaders().get("Set-Cookie").get(0).split(";")[0]; + HttpHeaders headers = new HttpHeaders(); + headers.add("Cookie", sessionCookie); + headers.add("ContentType", ContentType.APPLICATION_JSON.getMimeType()); + Rating rating = new Rating(1L, 4); + + HttpEntity httpEntity = new HttpEntity<>(rating, headers); + + //request the protected resource + ResponseEntity bookResponse = testRestTemplate.postForEntity(testUrl + "/rating-service/ratings", httpEntity, Rating.class); + Assert.assertEquals(HttpStatus.OK, bookResponse.getStatusCode()); + Assert.assertEquals(rating.getBookId(), bookResponse.getBody().getBookId()); + Assert.assertEquals(rating.getStars(), bookResponse.getBody().getStars()); + } + + private void addBook(){ + //login as user/password + MultiValueMap form = new LinkedMultiValueMap<>(); + form.add("username", "admin"); + form.add("password", "admin"); + ResponseEntity response = testRestTemplate.postForEntity(testUrl + "/login", form, String.class); + + //extract the session from the cookie and propagate it to the next request + String sessionCookie = response.getHeaders().get("Set-Cookie").get(0).split(";")[0]; + HttpHeaders headers = new HttpHeaders(); + headers.add("Cookie", sessionCookie); + headers.add("ContentType", ContentType.APPLICATION_JSON.getMimeType()); + Book book = new Book("Baeldung", "How to spring cloud"); + + HttpEntity httpEntity = new HttpEntity<>(book, headers); + + //request the protected resource + ResponseEntity bookResponse = testRestTemplate.postForEntity(testUrl + "/book-service/books", httpEntity, Book.class); + Assert.assertEquals(HttpStatus.OK, bookResponse.getStatusCode()); + Assert.assertEquals(book.getAuthor(), bookResponse.getBody().getAuthor()); + Assert.assertEquals(book.getTitle(), bookResponse.getBody().getTitle()); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Book { + + private Long id; + private String author; + private String title; + + public Book() { + } + + public Book(String author, String title) { + this.author = author; + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Rating { + private Long id; + private Long bookId; + private int stars; + + public Rating() { + } + + public Rating(Long bookId, int stars) { + this.bookId = bookId; + this.stars = stars; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getBookId() { + return bookId; + } + + public void setBookId(Long bookId) { + this.bookId = bookId; + } + + public int getStars() { + return stars; + } + + public void setStars(int stars) { + this.stars = stars; + } + } + + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml index 9a99054ed5..c351c444f6 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml @@ -42,6 +42,17 @@ spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java index 25ad2a83b2..c5499cd924 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java @@ -3,35 +3,11 @@ package com.baeldung.spring.cloud.bootstrap.svcbook; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Arrays; -import java.util.List; @SpringBootApplication @EnableEurekaClient -@RestController -@RequestMapping("/books") public class BookServiceApplication { public static void main(String[] args) { SpringApplication.run(BookServiceApplication.class, args); } - - private List bookList = Arrays.asList( - new Book(1L, "Baeldung goes to the market", "Tim Schimandle"), - new Book(2L, "Baeldung goes to the park", "Slavisa") - ); - - @GetMapping("") - public List findAllBooks() { - return bookList; - } - - @GetMapping("/{bookId}") - public Book findBook(@PathVariable Long bookId) { - return bookList.stream().filter(b -> b.getId().equals(bookId)).findFirst().orElse(null); - } } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java index 300b4d7c5a..6aa996c575 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java @@ -2,6 +2,7 @@ package com.baeldung.spring.cloud.bootstrap.svcbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -22,8 +23,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { http.httpBasic() .disable() .authorizeRequests() - .antMatchers("/books").permitAll() - .antMatchers("/books/*").hasAnyRole("USER", "ADMIN") + .antMatchers(HttpMethod.GET, "/books").permitAll() + .antMatchers(HttpMethod.GET, "/books/*").permitAll() + .antMatchers(HttpMethod.POST, "/books").hasRole("ADMIN") + .antMatchers(HttpMethod.PATCH, "/books/*").hasRole("ADMIN") + .antMatchers(HttpMethod.DELETE, "/books/*").hasRole("ADMIN") .anyRequest().authenticated() .and() .csrf() diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java similarity index 57% rename from spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java rename to spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java index e652437454..33ea8dcb81 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/Book.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java @@ -1,16 +1,21 @@ -package com.baeldung.spring.cloud.bootstrap.svcbook; +package com.baeldung.spring.cloud.bootstrap.svcbook.book; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +@JsonIgnoreProperties(ignoreUnknown = true) public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String author; private String title; - public Book(Long id, String title, String author) { - this.id = id; - this.author = author; - this.title = title; - } - public Book() { } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java new file mode 100644 index 0000000000..d00f114b8c --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.cloud.bootstrap.svcbook.book; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/books") +public class BookController { + + @Autowired + private BookService bookService; + + @GetMapping("") + public List findAllBooks() { + return bookService.findAllBooks(); + } + + @GetMapping("/{bookId}") + public Book findBook(@PathVariable Long bookId) { + return bookService.findBookById(bookId); + } + + @PostMapping("") + public Book createBook(@RequestBody Book book) { + return bookService.createBook(book); + } + + @DeleteMapping("/{bookId}") + public void deleteBook(@PathVariable Long bookId) { + bookService.deleteBook(bookId); + } + + @PatchMapping("/{bookId") + public Book updateBook(@RequestBody Map updates, @PathVariable Long bookId) { + return bookService.updateBook(updates, bookId); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java new file mode 100644 index 0000000000..f0a4797387 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.cloud.bootstrap.svcbook.book; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) +class BookNotFoundException extends RuntimeException { + BookNotFoundException(String message) { + super(message); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java new file mode 100644 index 0000000000..66fd3880c5 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java @@ -0,0 +1,6 @@ +package com.baeldung.spring.cloud.bootstrap.svcbook.book; + +import org.springframework.data.jpa.repository.JpaRepository; + +interface BookRepository extends JpaRepository{ +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java new file mode 100644 index 0000000000..cfcbf15757 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java @@ -0,0 +1,55 @@ +package com.baeldung.spring.cloud.bootstrap.svcbook.book; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service +@Transactional(readOnly = true) +public class BookService { + + @Autowired + private BookRepository bookRepository; + + public List findAllBooks() { + return bookRepository.findAll(); + } + + public Book findBookById(Long bookId) { + return Optional.ofNullable(bookRepository.findOne(bookId)) + .orElseThrow(() -> new BookNotFoundException("Book not found. ID: " + bookId)); + } + + @Transactional(propagation = Propagation.REQUIRED) + public Book createBook(Book book) { + Book newBook = new Book(); + newBook.setTitle(book.getTitle()); + newBook.setAuthor(book.getAuthor()); + return bookRepository.save(newBook); + } + + @Transactional(propagation = Propagation.REQUIRED) + public void deleteBook(Long bookId) { + bookRepository.delete(bookId); + } + + @Transactional(propagation = Propagation.REQUIRED) + public Book updateBook(Map updates, Long bookId) { + Book book = findBookById(bookId); + updates.keySet().forEach(key -> { + switch (key) { + case "author": + book.setAuthor(updates.get(key)); + break; + case "title": + book.setTitle(updates.get(key)); + } + }); + return bookRepository.save(book); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml index 35da8beba8..2285286812 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -42,6 +42,17 @@ spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java index 11fb5f06b6..61074e0bcc 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java @@ -3,39 +3,11 @@ package com.baeldung.spring.cloud.bootstrap.svcrating; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; @SpringBootApplication @EnableEurekaClient -@RestController -@RequestMapping("/ratings") public class RatingServiceApplication { public static void main(String[] args) { SpringApplication.run(RatingServiceApplication.class, args); } - - private List ratingList = Arrays.asList( - new Rating(1L, 1L, 2), - new Rating(2L, 1L, 3), - new Rating(3L, 2L, 4), - new Rating(4L, 2L, 5) - ); - - @GetMapping("") - public List findRatingsByBookId(@RequestParam Long bookId) { - return bookId == null || bookId.equals(0L) ? Collections.EMPTY_LIST : ratingList.stream().filter(r -> r.getBookId().equals(bookId)).collect(Collectors.toList()); - } - - @GetMapping("/all") - public List findAllRatings() { - return ratingList; - } } \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java index 371dc810d5..171fbba7af 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java @@ -2,6 +2,7 @@ package com.baeldung.spring.cloud.bootstrap.svcrating; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -22,8 +23,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { http.httpBasic() .disable() .authorizeRequests() - .antMatchers("/ratings").hasRole("USER") - .antMatchers("/ratings/all").hasRole("ADMIN") + .regexMatchers("^/ratings\\?bookId.*$").authenticated() + .antMatchers(HttpMethod.POST,"/ratings").authenticated() + .antMatchers(HttpMethod.PATCH,"/ratings/*").hasRole("ADMIN") + .antMatchers(HttpMethod.DELETE,"/ratings/*").hasRole("ADMIN") + .antMatchers(HttpMethod.GET,"/ratings").hasRole("ADMIN") .anyRequest().authenticated() .and() .csrf() diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java similarity index 62% rename from spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java rename to spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java index 5dd3572098..ae44f9ae2e 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/Rating.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java @@ -1,6 +1,18 @@ -package com.baeldung.spring.cloud.bootstrap.svcrating; +package com.baeldung.spring.cloud.bootstrap.svcrating.rating; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +@JsonIgnoreProperties(ignoreUnknown = true) public class Rating { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private Long bookId; private int stars; diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java new file mode 100644 index 0000000000..83452ad747 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java @@ -0,0 +1,38 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating.rating; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/ratings") +public class RatingController { + + @Autowired + private RatingService ratingService; + + @GetMapping("") + public List findRatingsByBookId(@RequestParam(required = false, defaultValue = "0") Long bookId) { + if (bookId.equals(0L)) { + return ratingService.findAllRatings(); + } + return ratingService.findRatingsByBookId(bookId); + } + + @PostMapping("") + public Rating createRating(@RequestBody Rating rating) { + return ratingService.createRating(rating); + } + + @DeleteMapping("/{ratingId}") + public void deleteRating(@PathVariable Long ratingId) { + ratingService.deleteRating(ratingId); + } + + @PatchMapping("/{ratingId") + public Rating updateRating(@RequestBody Map updates, @PathVariable Long ratingId) { + return ratingService.updateRating(updates, ratingId); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java new file mode 100644 index 0000000000..473d636a71 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating.rating; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) +class RatingNotFoundException extends RuntimeException { + RatingNotFoundException(String message) { + super(message); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java new file mode 100644 index 0000000000..08d781b5a3 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating.rating; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +interface RatingRepository extends JpaRepository{ + List findRatingsByBookId(Long bookId); +} diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java new file mode 100644 index 0000000000..a2360b7be5 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java @@ -0,0 +1,57 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating.rating; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service +@Transactional(readOnly = true) +public class RatingService { + + @Autowired + private RatingRepository ratingRepository; + + public Rating findRatingById(Long ratingId) { + return Optional.ofNullable(ratingRepository.findOne(ratingId)) + .orElseThrow(() -> new RatingNotFoundException("Rating not found. ID: " + ratingId)); + } + + public List findRatingsByBookId(Long bookId) { + return ratingRepository.findRatingsByBookId(bookId); + } + + public List findAllRatings() { + return ratingRepository.findAll(); + } + + @Transactional(propagation = Propagation.REQUIRED) + public Rating createRating(Rating rating) { + Rating newRating = new Rating(); + newRating.setBookId(rating.getBookId()); + newRating.setStars(rating.getStars()); + return ratingRepository.save(newRating); + } + + @Transactional(propagation = Propagation.REQUIRED) + public void deleteRating(Long ratingId) { + ratingRepository.delete(ratingId); + } + + @Transactional(propagation = Propagation.REQUIRED) + public Rating updateRating(Map updates, Long ratingId) { + Rating rating = findRatingById(ratingId); + updates.keySet().forEach(key -> { + switch (key) { + case "stars": + rating.setStars(Integer.parseInt(updates.get(key))); + break; + } + }); + return ratingRepository.save(rating); + } +} From f800e9dc4f32f118117c06362a61332e274cdf1e Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sat, 18 Feb 2017 07:47:36 +0100 Subject: [PATCH 153/192] BAEL-684 - suffix testname to match surefire configuration --- .../gateway/{IntegrationTest.java => IntegrationLiveTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/{IntegrationTest.java => IntegrationLiveTest.java} (99%) diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationLiveTest.java similarity index 99% rename from spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java rename to spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationLiveTest.java index 16057edc48..47a4b744eb 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationTest.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/IntegrationLiveTest.java @@ -9,7 +9,7 @@ import org.springframework.http.*; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -public class IntegrationTest { +public class IntegrationLiveTest { private TestRestTemplate testRestTemplate = new TestRestTemplate(); private String testUrl = "http://localhost:8080"; From 2bf21cbff37fb78efad08fea90a9d26ecbe141ca Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sat, 18 Feb 2017 08:31:42 +0100 Subject: [PATCH 154/192] Refactor ExcelPOIHelper to Stream API --- .../com/baeldung/excel/ExcelPOIHelper.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java b/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java index e3658e8f89..0519a8f3c7 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java +++ b/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; public class ExcelPOIHelper { @@ -38,27 +39,23 @@ public class ExcelPOIHelper { data = readXSSFWorkbook(fis); } - int maxNrCols = 0; + int maxNrCols = data.values().stream() + .mapToInt(List::size) + .max() + .orElse(0); - for (List ls : data.values()) { - if (ls.size() > maxNrCols) { - maxNrCols = ls.size(); - } - } - - for (List ls : data.values()) { - if (ls.size() < maxNrCols) { - for (int i = ls.size(); i < maxNrCols; i++) { - ls.add(new MyCell("")); - } - } - } + data.values().stream() + .filter(ls -> ls.size() < maxNrCols) + .forEach(ls -> { + IntStream.range(ls.size(), maxNrCols) + .forEach(i -> ls.add(new MyCell(""))); + }); return data; } private String readCellContent(Cell cell) { - String content = ""; + String content; switch (cell.getCellTypeEnum()) { case STRING: content = cell.getStringCellValue(); @@ -91,7 +88,7 @@ public class ExcelPOIHelper { HSSFSheet sheet = workbook.getSheetAt(0); for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) { HSSFRow row = sheet.getRow(i); - data.put(i, new ArrayList()); + data.put(i, new ArrayList<>()); if (row != null) { for (int j = 0; j < row.getLastCellNum(); j++) { HSSFCell cell = row.getCell(j); @@ -144,7 +141,7 @@ public class ExcelPOIHelper { for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) { XSSFRow row = sheet.getRow(i); - data.put(i, new ArrayList()); + data.put(i, new ArrayList<>()); if (row != null) { for (int j = 0; j < row.getLastCellNum(); j++) { XSSFCell cell = row.getCell(j); From 8d4b69671a164f224c1bb7593973a9eca1b2e19c Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 18 Feb 2017 13:59:08 +0100 Subject: [PATCH 155/192] BAEL-602 more examples of JOOL --- jooq/src/test/java/com/baeldung/JOOLTest.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java index aa729a3edf..4f5cb3741a 100644 --- a/jooq/src/test/java/com/baeldung/JOOLTest.java +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -5,10 +5,13 @@ import org.jooq.lambda.Seq; import org.junit.Test; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.assertEquals; +import static org.jooq.lambda.tuple.Tuple.tuple; public class JOOLTest { @Test @@ -26,4 +29,123 @@ public class JOOLTest { assertTrue(Seq.of(1, 2, 3, 4).containsAny(2, 5)); } + + @Test + public void givenSeq_whenJoin_shouldHaveElementsFromBothSeq() { + assertEquals( + Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(), + Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B")) + ); + + + assertEquals( + Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(), + Arrays.asList(tuple(1, 1), tuple(2, 2)) + ); + + + assertEquals( + Seq.of(1, 2, 4).leftOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(), + Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(4, null)) + ); + + assertEquals( + Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(), + Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(null, 3)) + ); + } + + @Test + public void givenSeq_whenManipulateSeq_seqShouldHaveNewElementsInIt() { + assertEquals( + Seq.of(1, 2, 3).cycle().limit(9).toList(), + Arrays.asList(1, 2, 3, 1, 2, 3, 1, 2, 3) + ); + + assertEquals( + Seq.of(1, 2, 3).duplicate().map((first, second) -> tuple(first.toList(), second.toList())), + tuple(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3)) + ); + + assertEquals( + Seq.of(1, 2, 3, 4).intersperse(0).toList(), + Arrays.asList(1, 0, 2, 0, 3, 0, 4) + ); + + assertEquals( + Seq.of(1, 2, 3, 4, 5).shuffle().toList().size(), + 5 + ); + + assertEquals( + Seq.of(1, 2, 3, 4).partition(i -> i % 2 != 0).map((first, second) -> tuple(first.toList(), second.toList())), + tuple(Arrays.asList(1, 3), Arrays.asList(2, 4)) + + ); + + assertEquals( + Seq.of(1, 2, 3, 4).reverse().toList(), + Arrays.asList(4, 3, 2, 1) + ); + } + + @Test + public void givenSeq_whenGroupByAndFold_shouldReturnProperSeq() { + + Map> expectedAfterGroupBy = new HashMap<>(); + expectedAfterGroupBy.put(1, Arrays.asList(1, 3)); + expectedAfterGroupBy.put(0, Arrays.asList(2, 4)); + + assertEquals( + Seq.of(1, 2, 3, 4).groupBy(i -> i % 2), + expectedAfterGroupBy + ); + + + assertEquals( + Seq.of("a", "b", "c").foldLeft("!", (u, t) -> u + t), + "!abc" + ); + + + assertEquals( + Seq.of("a", "b", "c").foldRight("!", (t, u) -> t + u), + "abc!" + ); + } + + @Test + public void givenSeq_whenUsingSeqWhile_shouldBehaveAsWhileLoop() { + + assertEquals( + Seq.of(1, 2, 3, 4, 5).skipWhile(i -> i < 3).toList(), + Arrays.asList(3, 4, 5) + ); + + assertEquals( + Seq.of(1, 2, 3, 4, 5).skipUntil(i -> i == 3).toList(), + Arrays.asList(3, 4, 5) + ); + } + + @Test + public void givenSeq_whenZip_shouldHaveZippedSeq() { + + assertEquals( + Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c")).toList(), + Arrays.asList(tuple(1, "a"), tuple(2, "b"), tuple(3, "c")) + ); + + // ("1:a", "2:b", "3:c") + assertEquals( + Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y).toList(), + Arrays.asList("1:a", "2:b", "3:c") + ); + + + assertEquals( + Seq.of("a", "b", "c").zipWithIndex().toList(), + Arrays.asList(tuple("a", 0L), tuple("b", 1L), tuple("c", 2L)) + ); + } } From 306eb4ee96036d762c6611899953fa9afc02322c Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 18 Feb 2017 14:06:08 +0100 Subject: [PATCH 156/192] BAEL-602 example of using Unchecked --- jooq/src/test/java/com/baeldung/JOOLTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java index 4f5cb3741a..487af9bddb 100644 --- a/jooq/src/test/java/com/baeldung/JOOLTest.java +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -2,12 +2,14 @@ package com.baeldung; import org.jooq.lambda.Seq; +import org.jooq.lambda.Unchecked; import org.junit.Test; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.assertEquals; @@ -148,4 +150,44 @@ public class JOOLTest { Arrays.asList(tuple("a", 0L), tuple("b", 1L), tuple("c", 2L)) ); } + + + public Integer methodThatThrowsChecked(String arg) throws Exception { + return arg.length(); + } + + @Test + public void givenOperationThatThrowsCheckedException_whenExecuteAndNeedToWrapCheckedIntoUnchecked_shouldPass() { + //when + List collect = Arrays.asList("a", "b", "c").stream().map(elem -> { + try { + return methodThatThrowsChecked(elem); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + }).collect(Collectors.toList()); + + //then + assertEquals( + collect, + Arrays.asList(1, 1, 1) + ); + } + + + @Test + public void givenOperationThatThrowsCheckedException_whenExecuteUsingUncheckedFuction_shouldPass() { + //when + List collect = Arrays.asList("a", "b", "c").stream() + .map(Unchecked.function(elem -> methodThatThrowsChecked(elem))) + .collect(Collectors.toList()); + + //then + assertEquals( + collect, + Arrays.asList(1, 1, 1) + ); + } + } From 51756367ce8b8d9db7e2898559bbcf642f870f7d Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sat, 18 Feb 2017 21:24:41 +0530 Subject: [PATCH 157/192] adding testcase for WebUtils and ServletRequestUtils (#1193) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality * changing package name * testcase change * adding webutils * adding testcase for WebUtils and ServletRequestUtils * adding testcase --- .../baeldung/utils/UtilsControllerTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 spring-boot/src/test/java/com/baeldung/utils/UtilsControllerTest.java diff --git a/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerTest.java b/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerTest.java new file mode 100644 index 0000000000..7aed45dbb0 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerTest.java @@ -0,0 +1,41 @@ +package com.baeldung.utils; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.MockitoAnnotations; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +import com.baeldung.utils.controller.UtilsController; + +public class UtilsControllerTest { + + @InjectMocks + private UtilsController utilsController; + + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(utilsController) + .build(); + + } + + @Test + public void givenParameter_setRequestParam_andSetSessionAttribute() throws Exception { + String param = "testparam"; + this.mockMvc.perform( + post("/setParam") + .param("param", param) + .sessionAttr("parameter", param)) + .andExpect(status().isOk()); + } + +} From e35c452ad1ac8ce4fd6bbf5f182cdf952e6bf02e Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 18 Feb 2017 22:40:15 +0100 Subject: [PATCH 158/192] BAEL-602 add example of join using only Stream API --- jooq/src/test/java/com/baeldung/JOOLTest.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java index 487af9bddb..64ad3b316d 100644 --- a/jooq/src/test/java/com/baeldung/JOOLTest.java +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.assertEquals; @@ -32,14 +33,22 @@ public class JOOLTest { assertTrue(Seq.of(1, 2, 3, 4).containsAny(2, 5)); } + @Test + public void givenStreams_whenJoin_shouldHaveElementsFromTwoStreams() { + //given + Stream left = Arrays.asList(1, 2, 4).stream(); + Stream right = Arrays.asList(1, 2, 3).stream(); + + //when + List rightCollected = right.collect(Collectors.toList()); + List collect = left.filter(rightCollected::contains).collect(Collectors.toList()); + + //then + assertEquals(collect, Arrays.asList(1, 2)); + } + @Test public void givenSeq_whenJoin_shouldHaveElementsFromBothSeq() { - assertEquals( - Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(), - Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B")) - ); - - assertEquals( Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(), Arrays.asList(tuple(1, 1), tuple(2, 2)) @@ -55,6 +64,11 @@ public class JOOLTest { Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(), Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(null, 3)) ); + + assertEquals( + Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(), + Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B")) + ); } @Test From 333953b204e473c06b7c86c72a164538e51f60e6 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sat, 18 Feb 2017 22:56:41 +0100 Subject: [PATCH 159/192] BAEL-183 - refactoring and moving testng to dedicated module --- ...edUnitTest.java => ParametrizedTests.java} | 17 ++-- .../junit4vstestng/RegistrationTest.java | 15 ++++ .../baeldung/junit4vstestng/SignInTest.java | 14 ++++ .../baeldung/junit4vstestng/SuiteTest.java | 2 +- pom.xml | 3 +- testng/pom.xml | 6 ++ .../java/baeldung/com/DependentTests.java | 35 ++------- .../baeldung/com/ParametrizedTestNGTest.java | 63 --------------- .../java/baeldung/com/ParametrizedTests.java | 77 +++++++++++++++++++ .../java/baeldung/com/RegistrationTest.java | 7 +- .../test/java/baeldung/com/SignInTest.java | 8 +- .../baeldung/com/SummationServiceTest.java | 3 + .../src/test/resources/parameterised_test.xml | 17 ---- .../src/test/resources/parametrized_test.xml | 10 +++ testng/src/test/resources/test_group.xml | 2 +- testng/src/test/resources/test_setup.xml | 17 ++++ testng/src/test/resources/test_suite.xml | 2 +- 17 files changed, 172 insertions(+), 126 deletions(-) rename core-java/src/test/java/com/baeldung/junit4vstestng/{MyParameterisedUnitTest.java => ParametrizedTests.java} (53%) create mode 100644 core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationTest.java create mode 100644 core-java/src/test/java/com/baeldung/junit4vstestng/SignInTest.java delete mode 100644 testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java create mode 100644 testng/src/test/java/baeldung/com/ParametrizedTests.java delete mode 100644 testng/src/test/resources/parameterised_test.xml create mode 100644 testng/src/test/resources/parametrized_test.xml create mode 100644 testng/src/test/resources/test_setup.xml diff --git a/core-java/src/test/java/com/baeldung/junit4vstestng/MyParameterisedUnitTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/ParametrizedTests.java similarity index 53% rename from core-java/src/test/java/com/baeldung/junit4vstestng/MyParameterisedUnitTest.java rename to core-java/src/test/java/com/baeldung/junit4vstestng/ParametrizedTests.java index 95f9274af3..e9a9c6a07a 100644 --- a/core-java/src/test/java/com/baeldung/junit4vstestng/MyParameterisedUnitTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/ParametrizedTests.java @@ -11,23 +11,24 @@ import java.util.Arrays; import java.util.Collection; @RunWith(value = Parameterized.class) -public class MyParameterisedUnitTest { +public class ParametrizedTests { - private String name; + private int value; + private boolean isEven; - public MyParameterisedUnitTest(String myName) { - this.name = myName; + public ParametrizedTests(int value, boolean isEven) { + this.value = value; + this.isEven = isEven; } @Parameters public static Collection data() { - Object[][] data = new Object[][]{{"Peter"}, {"Sam"}, {"Tim"}, {"Lucy"}}; + Object[][] data = new Object[][]{{1, false}, {2, true}, {4, true}}; return Arrays.asList(data); } @Test - public void givenName_whenValidLength_thenTrue() { - boolean valid = name.length() > 0; - Assert.assertEquals(valid, true); + public void givenParametrizedNumber_ifEvenCheckOK_thenCorrect() { + Assert.assertEquals(isEven, value % 2 == 0); } } diff --git a/core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationTest.java new file mode 100644 index 0000000000..4aa1fa1a17 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/RegistrationTest.java @@ -0,0 +1,15 @@ +package com.baeldung.junit4vstestng; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class RegistrationTest { + private static final Logger LOGGER = LoggerFactory.getLogger(RegistrationTest.class); + + @Test + public void whenCalledFromSuite_thanOK() { + LOGGER.info("Registration successful"); + } +} diff --git a/core-java/src/test/java/com/baeldung/junit4vstestng/SignInTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/SignInTest.java new file mode 100644 index 0000000000..bb908ff37e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/SignInTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit4vstestng; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SignInTest { + private static final Logger LOGGER = LoggerFactory.getLogger(SignInTest.class); + + @Test + public void whenCalledFromSuite_thanOK() { + LOGGER.info("SignIn successful"); + } +} diff --git a/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java b/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java index 3d6d6cbbfb..effd7fa10a 100644 --- a/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java +++ b/core-java/src/test/java/com/baeldung/junit4vstestng/SuiteTest.java @@ -4,7 +4,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) -@Suite.SuiteClasses({ StringCaseTest.class, DivisibilityTest.class }) +@Suite.SuiteClasses({ RegistrationTest.class, SignInTest.class }) public class SuiteTest { } diff --git a/pom.xml b/pom.xml index eb89b9cbaa..82df776044 100644 --- a/pom.xml +++ b/pom.xml @@ -182,6 +182,7 @@ spring-reactor testing + testng video-tutorials @@ -194,8 +195,6 @@ struts2 apache-velocity - testng - diff --git a/testng/pom.xml b/testng/pom.xml index 02f51d4d99..272b1d316d 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -43,6 +43,12 @@ true + + + src/main/resources + true + + diff --git a/testng/src/test/java/baeldung/com/DependentTests.java b/testng/src/test/java/baeldung/com/DependentTests.java index ab593e0439..b60f8a6c0d 100644 --- a/testng/src/test/java/baeldung/com/DependentTests.java +++ b/testng/src/test/java/baeldung/com/DependentTests.java @@ -1,46 +1,25 @@ package baeldung.com; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testng.Assert; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class DependentTests { - private String validEmail = "abc@qwe.com"; - private EmailValidator emailValidator; - private LoginValidator loginValidator; + private static final Logger LOGGER = LoggerFactory.getLogger(DependentTests.class); - @BeforeClass - public void setup() { - emailValidator = new EmailValidator(); - loginValidator = new LoginValidator(); - } + private String email = "abc@qwe.com"; @Test public void givenEmail_ifValid_thenTrue() { - boolean valid = emailValidator.validate(validEmail); + boolean valid = email.contains("@"); Assert.assertEquals(valid, true); } - @Test(dependsOnMethods = { "givenEmail_ifValid_thenTrue" }) + @Test(dependsOnMethods = {"givenEmail_ifValid_thenTrue"}) public void givenValidEmail_whenLoggedIn_thenTrue() { - boolean valid = loginValidator.validate(); - Assert.assertEquals(valid, true); + LOGGER.info("Email {} valid >> logging in", email); } } -class EmailValidator { - - boolean validate(String validEmail) { - return true; - } - -} - -class LoginValidator { - - boolean validate() { - return true; - } - -} diff --git a/testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java b/testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java deleted file mode 100644 index e4f3aacf5b..0000000000 --- a/testng/src/test/java/baeldung/com/ParametrizedTestNGTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package baeldung.com; - -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Parameters; -import org.testng.annotations.Test; - -public class ParametrizedTestNGTest { - - @Test - @Parameters({ "name", "expectedResult" }) - public void givenNumber_ifPrime_thenCorrect(String name, boolean expectedResult) { - Assert.assertEquals(expectedResult, name.length() > 0); - } - - @DataProvider(name = "test1") - public static Object[][] primeNumbers() { - return new Object[][] { { "Peter", true }, { "Sam", true }, { "Tim", true }, { "Lucy", true } }; - } - - @Test(dataProvider = "test1") - public void givenNumber_whenPrime_thenCorrect(String name, boolean expectedResult) { - Assert.assertEquals(expectedResult, name.length() > 0); - } - - @Test(dataProvider = "myDataProvider") - public void parameterCheckTest(User user) { - Assert.assertEquals("sam", user.getName()); - Assert.assertEquals(12, user.getAge()); - } - - @DataProvider(name = "myDataProvider") - public Object[][] parameterProvider() { - User usr = new User(); - usr.setName("sam"); - usr.setAge(12); - return new Object[][] { { usr } }; - } - -} - - -class User { - private String name; - private int age; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/testng/src/test/java/baeldung/com/ParametrizedTests.java b/testng/src/test/java/baeldung/com/ParametrizedTests.java new file mode 100644 index 0000000000..d3813f5382 --- /dev/null +++ b/testng/src/test/java/baeldung/com/ParametrizedTests.java @@ -0,0 +1,77 @@ +package baeldung.com; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Parameters; +import org.testng.annotations.Test; + +public class ParametrizedTests { + + private static final Logger LOGGER = LoggerFactory.getLogger(ParametrizedTests.class); + + @Test + @Parameters({"value", "isEven"}) + public void givenNumberFromXML_ifEvenCheckOK_thenCorrect(int value, boolean isEven) { + Assert.assertEquals(isEven, value % 2 == 0); + } + + @DataProvider(name = "numbers") + public static Object[][] evenNumbers() { + return new Object[][]{{1, false}, {2, true}, {4, true}}; + } + + @Test(dataProvider = "numbers") + public void givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect(Integer number, boolean expected) { + Assert.assertEquals(expected, number % 2 == 0); + } + + @Test(dataProvider = "numbersObject") + public void givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect(EvenNumber number) { + Assert.assertEquals(number.isEven(), number.getValue() % 2 == 0); + } + + @DataProvider(name = "numbersObject") + public Object[][] parameterProvider() { + return new Object[][]{{new EvenNumber(1, false)}, {new EvenNumber(2, true)}, {new EvenNumber(4, true),}}; + } + +} + + +class EvenNumber { + private int value; + private boolean isEven; + + public EvenNumber(int number, boolean isEven) { + this.value = number; + this.isEven = isEven; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public boolean isEven() { + return isEven; + } + + public void setEven(boolean even) { + isEven = even; + } + + @Override + public String toString() { + return "EvenNumber{" + + "value=" + value + + ", isEven=" + isEven + + '}'; + } +} + + diff --git a/testng/src/test/java/baeldung/com/RegistrationTest.java b/testng/src/test/java/baeldung/com/RegistrationTest.java index 7cb17c9cb8..ec551d9c27 100644 --- a/testng/src/test/java/baeldung/com/RegistrationTest.java +++ b/testng/src/test/java/baeldung/com/RegistrationTest.java @@ -1,11 +1,14 @@ package baeldung.com; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testng.annotations.Test; public class RegistrationTest { + private static final Logger LOGGER = LoggerFactory.getLogger(RegistrationTest.class); @Test - public void givenEmail_ifValid_thenCorrect() { - + public void whenCalledFromSuite_thanOK() { + LOGGER.info("Registration successful"); } } diff --git a/testng/src/test/java/baeldung/com/SignInTest.java b/testng/src/test/java/baeldung/com/SignInTest.java index 4884154345..f0547374d1 100644 --- a/testng/src/test/java/baeldung/com/SignInTest.java +++ b/testng/src/test/java/baeldung/com/SignInTest.java @@ -1,12 +1,14 @@ package baeldung.com; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testng.annotations.Test; public class SignInTest { + private static final Logger LOGGER = LoggerFactory.getLogger(SignInTest.class); @Test - public void givenUsername_ifValid_thenCorrect() { - + public void whenCalledFromSuite_thanOK() { + LOGGER.info("SignIn successful"); } - } diff --git a/testng/src/test/java/baeldung/com/SummationServiceTest.java b/testng/src/test/java/baeldung/com/SummationServiceTest.java index 471d7a7c8a..f377a009df 100644 --- a/testng/src/test/java/baeldung/com/SummationServiceTest.java +++ b/testng/src/test/java/baeldung/com/SummationServiceTest.java @@ -1,5 +1,7 @@ package baeldung.com; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.TestNG; import org.testng.annotations.*; @@ -8,6 +10,7 @@ import java.util.ArrayList; import java.util.List; public class SummationServiceTest extends TestNG { + private static final Logger LOGGER = LoggerFactory.getLogger(DependentTests.class); private List numbers; diff --git a/testng/src/test/resources/parameterised_test.xml b/testng/src/test/resources/parameterised_test.xml deleted file mode 100644 index 2381ba67d0..0000000000 --- a/testng/src/test/resources/parameterised_test.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/testng/src/test/resources/parametrized_test.xml b/testng/src/test/resources/parametrized_test.xml new file mode 100644 index 0000000000..932af30e4e --- /dev/null +++ b/testng/src/test/resources/parametrized_test.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/testng/src/test/resources/test_group.xml b/testng/src/test/resources/test_group.xml index d636a4174d..26868375f2 100644 --- a/testng/src/test/resources/test_group.xml +++ b/testng/src/test/resources/test_group.xml @@ -1,6 +1,6 @@ - + diff --git a/testng/src/test/resources/test_setup.xml b/testng/src/test/resources/test_setup.xml new file mode 100644 index 0000000000..7d9708193e --- /dev/null +++ b/testng/src/test/resources/test_setup.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testng/src/test/resources/test_suite.xml b/testng/src/test/resources/test_suite.xml index 201ed3f645..0fe5d1cc40 100644 --- a/testng/src/test/resources/test_suite.xml +++ b/testng/src/test/resources/test_suite.xml @@ -1,6 +1,6 @@ - + From 46f854c03be775b12477f238eec62b66a6e7b9e7 Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 19 Feb 2017 05:01:49 +0200 Subject: [PATCH 160/192] apache bval project (#1178) * apache bval project * update tests * remove extra lines --- apache-bval/pom.xml | 51 ++++++++ .../main/java/com/baeldung/model/User.java | 120 ++++++++++++++++++ .../com/baeldung/validation/Password.java | 25 ++++ .../validation/PasswordValidator.java | 35 +++++ .../baeldung/validation/ValidationTest.java | 97 ++++++++++++++ 5 files changed, 328 insertions(+) create mode 100644 apache-bval/pom.xml create mode 100644 apache-bval/src/main/java/com/baeldung/model/User.java create mode 100644 apache-bval/src/main/java/com/baeldung/validation/Password.java create mode 100644 apache-bval/src/main/java/com/baeldung/validation/PasswordValidator.java create mode 100644 apache-bval/src/test/java/com/baeldung/validation/ValidationTest.java diff --git a/apache-bval/pom.xml b/apache-bval/pom.xml new file mode 100644 index 0000000000..5d556af56f --- /dev/null +++ b/apache-bval/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + apache-bval + apache-bval + 0.0.1-SNAPSHOT + + + + org.apache.bval + bval-jsr + ${bval.version} + + + javax.validation + validation-api + 1.1.0.Final + + + org.apache.bval + bval-extras + ${bval.version} + + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + 3.6.0 + 4.12 + 1.1.2 + + \ No newline at end of file diff --git a/apache-bval/src/main/java/com/baeldung/model/User.java b/apache-bval/src/main/java/com/baeldung/model/User.java new file mode 100644 index 0000000000..477136ddb4 --- /dev/null +++ b/apache-bval/src/main/java/com/baeldung/model/User.java @@ -0,0 +1,120 @@ +package com.baeldung.model; + +import java.io.File; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.apache.bval.constraints.Email; +import org.apache.bval.constraints.NotEmpty; +import org.apache.bval.extras.constraints.checkdigit.IBAN; +import org.apache.bval.extras.constraints.creditcard.Visa; +import org.apache.bval.extras.constraints.file.Directory; +import org.apache.bval.extras.constraints.net.InetAddress; + +import com.baeldung.validation.Password; + +public class User { + @NotNull + @Email + private String email; + + @NotEmpty + @Password + private String password; + + @Size(min = 1, max = 20) + private String name; + + @Min(18) + private int age; + + @Visa + private String cardNumber = ""; + + @IBAN + private String iban = ""; + + @InetAddress + private String website = ""; + + @Directory + private File mainDirectory=new File("."); + + public User() { + } + + public User(String email, String password, String name, int age) { + super(); + this.email = email; + this.password = password; + this.name = name; + this.age = age; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public String getIban() { + return iban; + } + + public void setIban(String iban) { + this.iban = iban; + } + + public String getWebsite() { + return website; + } + + public void setWebsite(String website) { + this.website = website; + } + + public File getMainDirectory() { + return mainDirectory; + } + + public void setMainDirectory(File mainDirectory) { + this.mainDirectory = mainDirectory; + } + +} diff --git a/apache-bval/src/main/java/com/baeldung/validation/Password.java b/apache-bval/src/main/java/com/baeldung/validation/Password.java new file mode 100644 index 0000000000..4ae06b2fb0 --- /dev/null +++ b/apache-bval/src/main/java/com/baeldung/validation/Password.java @@ -0,0 +1,25 @@ +package com.baeldung.validation; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import static java.lang.annotation.ElementType.*; + +@Constraint(validatedBy = { PasswordValidator.class }) +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface Password { + String message() default "Invalid password"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + int length() default 6; + + int nonAlpha() default 1; +} diff --git a/apache-bval/src/main/java/com/baeldung/validation/PasswordValidator.java b/apache-bval/src/main/java/com/baeldung/validation/PasswordValidator.java new file mode 100644 index 0000000000..19038d04d5 --- /dev/null +++ b/apache-bval/src/main/java/com/baeldung/validation/PasswordValidator.java @@ -0,0 +1,35 @@ +package com.baeldung.validation; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class PasswordValidator implements ConstraintValidator { + + private int length; + private int nonAlpha; + + @Override + public void initialize(Password password) { + this.length = password.length(); + this.nonAlpha = password.nonAlpha(); + + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value.length() < length) { + return false; + } + int nonAlphaNr = 0; + for (int i = 0; i < value.length(); i++) { + if (!Character.isLetterOrDigit(value.charAt(i))) { + nonAlphaNr++; + } + } + if (nonAlphaNr < nonAlpha) { + return false; + } + return true; + } + +} diff --git a/apache-bval/src/test/java/com/baeldung/validation/ValidationTest.java b/apache-bval/src/test/java/com/baeldung/validation/ValidationTest.java new file mode 100644 index 0000000000..cd58d4460a --- /dev/null +++ b/apache-bval/src/test/java/com/baeldung/validation/ValidationTest.java @@ -0,0 +1,97 @@ +package com.baeldung.validation; + +import java.io.File; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +import org.apache.bval.jsr.ApacheValidationProvider; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +import com.baeldung.model.User; + +public class ValidationTest { + private static ValidatorFactory validatorFactory; + private static Validator validator; + + @BeforeClass + public static void setup() { + validatorFactory = Validation.byProvider(ApacheValidationProvider.class) + .configure() + .buildValidatorFactory(); + validator = validatorFactory.getValidator(); + } + + @Test + public void givenUser_whenValidate_thenValidationViolations() { + User user = new User("ana@yahoo.com", "pass", "nameTooLong_______________", 15); + + Set> violations = validator.validate(user); + assertTrue("no violations", violations.size() > 0); + } + + @Test + public void givenInvalidAge_whenValidateProperty_thenConstraintViolation() { + User user = new User("ana@yahoo.com", "pass", "Ana", 12); + + Set> propertyViolations = validator.validateProperty(user, "age"); + assertEquals("size is not 1", 1, propertyViolations.size()); + } + + @Test + public void givenValidAge_whenValidateValue_thenNoConstraintViolation() { + User user = new User("ana@yahoo.com", "pass", "Ana", 18); + + Set> valueViolations = validator.validateValue(User.class, "age", 20); + assertEquals("size is not 0", 0, valueViolations.size()); + } + + @Test + public void whenValidateNonJSR_thenCorrect() { + User user = new User("ana@yahoo.com", "pass", "Ana", 20); + user.setCardNumber("1234"); + user.setIban("1234"); + user.setWebsite("10.0.2.50"); + user.setMainDirectory(new File(".")); + + Set> violations = validator.validateProperty(user, "iban"); + assertEquals("size is not 1", 1, violations.size()); + + violations = validator.validateProperty(user, "website"); + assertEquals("size is not 0", 0, violations.size()); + + violations = validator.validateProperty(user, "mainDirectory"); + assertEquals("size is not 0", 0, violations.size()); + } + + @Test + public void givenInvalidPassword_whenValidatePassword_thenConstraintViolation() { + User user = new User("ana@yahoo.com", "password", "Ana", 20); + Set> violations = validator.validateProperty(user, "password"); + assertEquals("message incorrect", "Invalid password", violations.iterator() + .next() + .getMessage()); + } + + @Test + public void givenValidPassword_whenValidatePassword_thenNoConstraintViolation() { + User user = new User("ana@yahoo.com", "password#", "Ana", 20); + + Set> violations = validator.validateProperty(user, "password"); + assertEquals("size is not 0", 0, violations.size()); + } + + @AfterClass + public static void close() { + if (validatorFactory != null) { + validatorFactory.close(); + } + } +} From e5ecd86f27adedff215716f6916e72caccdfda83 Mon Sep 17 00:00:00 2001 From: mariiakulik Date: Sun, 19 Feb 2017 22:22:43 +0100 Subject: [PATCH 161/192] README files update (#1195) * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.MD * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.MD * Create README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.MD * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Delete README.md --- JGit/README.md | 3 +++ algorithms/README.md | 3 +++ apache-thrift/README.md | 3 +++ apache-velocity/README.md | 3 +++ core-java-9/README.md | 2 ++ core-java/README.md | 21 +++++++++++++++++++ .../test/java/com/baeldung/java/map/README.md | 2 -- couchbase-sdk/README.md | 1 + disruptor/README.md | 3 +++ ejb/README.md | 3 +++ guava/README.md | 8 +++++++ httpclient/README.md | 1 + jackson/README.md | 1 + java-mongodb/README.md | 3 +++ javaslang/README.md | 2 ++ jee7/README.md | 1 + kotlin/README.md | 3 +++ metrics/README.md | 3 +++ pdf/README.md | 1 + rxjava/README.md | 4 ++++ spring-all/README.md | 2 ++ spring-amqp/README.md | 3 +++ spring-boot/README.MD | 3 +++ spring-data-mongodb/README.md | 1 + spring-data-neo4j/README.md | 1 + spring-hibernate4/README.md | 2 ++ spring-jersey/README.md | 2 ++ spring-mobile/README.md | 4 ++++ spring-mvc-email/README.md | 6 +++++- spring-mvc-java/README.md | 2 ++ spring-mvc-simple/README.md | 3 +++ spring-reactor/README.md | 3 +++ spring-security-rest/README.md | 1 + spring-sleuth/README.md | 3 +++ static-analysis/README.md | 3 +++ 35 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 JGit/README.md create mode 100644 algorithms/README.md create mode 100644 apache-thrift/README.md create mode 100644 apache-velocity/README.md delete mode 100644 core-java/src/test/java/com/baeldung/java/map/README.md create mode 100644 ejb/README.md create mode 100644 java-mongodb/README.md create mode 100644 kotlin/README.md create mode 100644 metrics/README.md create mode 100644 rxjava/README.md create mode 100644 spring-amqp/README.md create mode 100644 spring-mobile/README.md create mode 100644 spring-mvc-simple/README.md create mode 100644 spring-reactor/README.md create mode 100644 spring-sleuth/README.md create mode 100644 static-analysis/README.md diff --git a/JGit/README.md b/JGit/README.md new file mode 100644 index 0000000000..5c65f1101b --- /dev/null +++ b/JGit/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [A Guide to JGit](http://www.baeldung.com/jgit) diff --git a/algorithms/README.md b/algorithms/README.md new file mode 100644 index 0000000000..4789768fad --- /dev/null +++ b/algorithms/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra) diff --git a/apache-thrift/README.md b/apache-thrift/README.md new file mode 100644 index 0000000000..d8b9195dcc --- /dev/null +++ b/apache-thrift/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Working with Apache Thrift](http://www.baeldung.com/apache-thrift) diff --git a/apache-velocity/README.md b/apache-velocity/README.md new file mode 100644 index 0000000000..53c67f847e --- /dev/null +++ b/apache-velocity/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Introduction to Apache Velocity](http://www.baeldung.com/apache-velocity) diff --git a/core-java-9/README.md b/core-java-9/README.md index 1b44239e40..53ad79e59c 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -6,3 +6,5 @@ ### Relevant Articles: - [Java 9 Stream API Improvements](http://www.baeldung.com/java-9-stream-api) +- [Java 9 Convenience Factory Methods for Collections](http://www.baeldung.com/java-9-collections-factory-methods) +- [New Stream Collectors in Java 9](http://www.baeldung.com/java9-stream-collectors) diff --git a/core-java/README.md b/core-java/README.md index 341dbdf910..a34908d8ae 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -58,3 +58,24 @@ - [Guide to java.util.concurrent.BlockingQueue](http://www.baeldung.com/java-blocking-queue) - [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch) - [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm) +- [A Guide to ConcurrentMap](http://www.baeldung.com/java-concurrent-map) +- [Guide to PriorityBlockingQueue in Java](http://www.baeldung.com/java-priority-blocking-queue) +- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector) +- [Avoiding the ConcurrentModificationException in Java](http://www.baeldung.com/java-concurrentmodificationexception) +- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap) +- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern) +- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams) +- [Custom Thread Pools In Java 8 Parallel Streams](http://www.baeldung.com/java-8-parallel-streams-custom-threadpool) +- [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings) +- [Spring Security – Cache Control Headers](http://www.baeldung.com/spring-security-cache-control-headers) +- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) +- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda) +- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) +- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions) +- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap) +- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) +- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany) +- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions) +- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) +- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap) +- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap) diff --git a/core-java/src/test/java/com/baeldung/java/map/README.md b/core-java/src/test/java/com/baeldung/java/map/README.md deleted file mode 100644 index 0bba153763..0000000000 --- a/core-java/src/test/java/com/baeldung/java/map/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) diff --git a/couchbase-sdk/README.md b/couchbase-sdk/README.md index 9cdcdea012..f124a0192c 100644 --- a/couchbase-sdk/README.md +++ b/couchbase-sdk/README.md @@ -4,6 +4,7 @@ - [Introduction to Couchbase SDK for Java](http://www.baeldung.com/java-couchbase-sdk) - [Using Couchbase in a Spring Application](http://www.baeldung.com/couchbase-sdk-spring) - [Asynchronous Batch Opereations in Couchbase](http://www.baeldung.com/async-batch-operations-in-couchbase) +- [Querying Couchbase with MapReduce Views](http://www.baeldung.com/couchbase-query-mapreduce-view) ### Overview This Maven project contains the Java code for the Couchbase entities and Spring services diff --git a/disruptor/README.md b/disruptor/README.md index e69de29bb2..779b1e89c4 100644 --- a/disruptor/README.md +++ b/disruptor/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Concurrency with LMAX Disruptor – An Introduction](http://www.baeldung.com/lmax-disruptor-concurrency) diff --git a/ejb/README.md b/ejb/README.md new file mode 100644 index 0000000000..08392bc80d --- /dev/null +++ b/ejb/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro) diff --git a/guava/README.md b/guava/README.md index 40e7f19f41..ee224bae5f 100644 --- a/guava/README.md +++ b/guava/README.md @@ -16,3 +16,11 @@ - [Guava – Sets](http://www.baeldung.com/guava-sets) - [Guava – Maps](http://www.baeldung.com/guava-maps) - [Guava Set + Function = Map](http://www.baeldung.com/guava-set-function-map-tutorial) +- [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering) +- [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions) +- [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader) +- [Guide to Guava’s EventBus](http://www.baeldung.com/guava-eventbus) +- [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap) +- [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset) +- [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap) +- [Guide to Guava Table](http://www.baeldung.com/guava-table) diff --git a/httpclient/README.md b/httpclient/README.md index a848edfea6..2a98c2feac 100644 --- a/httpclient/README.md +++ b/httpclient/README.md @@ -19,3 +19,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Multipart Upload with HttpClient 4](http://www.baeldung.com/httpclient-multipart-upload) - [HttpAsyncClient Tutorial](http://www.baeldung.com/httpasyncclient-tutorial) - [HttpClient 4 Tutorial](http://www.baeldung.com/httpclient-guide) +- [Advanced HttpClient Configuration](http://www.baeldung.com/httpclient-advanced-config) diff --git a/jackson/README.md b/jackson/README.md index 67a03589a8..d9faa377f1 100644 --- a/jackson/README.md +++ b/jackson/README.md @@ -25,3 +25,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [More Jackson Annotations](http://www.baeldung.com/jackson-advanced-annotations) - [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance) - [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat) +- [A Guide to Optional with Jackson](http://www.baeldung.com/jackson-optional) diff --git a/java-mongodb/README.md b/java-mongodb/README.md new file mode 100644 index 0000000000..01245ac6cf --- /dev/null +++ b/java-mongodb/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [A Guide to MongoDB with Java](http://www.baeldung.com/java-mongodb) diff --git a/javaslang/README.md b/javaslang/README.md index 334ac02f60..e451883516 100644 --- a/javaslang/README.md +++ b/javaslang/README.md @@ -1,2 +1,4 @@ ### Relevant Articles: - [Introduction to Javaslang](http://www.baeldung.com/javaslang) +- [Guide to Try in Javaslang](http://www.baeldung.com/javaslang-try) +- [Guide to Pattern Matching in Javaslang](http://www.baeldung.com/javaslang-pattern-matching) diff --git a/jee7/README.md b/jee7/README.md index 44ca9c2f6e..bc242c3340 100644 --- a/jee7/README.md +++ b/jee7/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Scheduling in Java EE](http://www.baeldung.com/scheduling-in-java-enterprise-edition) +- [JSON Processing in Java EE 7](http://www.baeldung.com/jee7-json) diff --git a/kotlin/README.md b/kotlin/README.md new file mode 100644 index 0000000000..6447a26f5c --- /dev/null +++ b/kotlin/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Introduction to the Kotlin Language](http://www.baeldung.com/kotlin) diff --git a/metrics/README.md b/metrics/README.md new file mode 100644 index 0000000000..c98024c479 --- /dev/null +++ b/metrics/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Intro to Dropwizard Metrics](http://www.baeldung.com/dropwizard-metrics) diff --git a/pdf/README.md b/pdf/README.md index 7160df4081..5454d2b2de 100644 --- a/pdf/README.md +++ b/pdf/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [PDF Conversions in Java](http://www.baeldung.com/pdf-conversions-java) +- [Creating PDF Files in Java](http://www.baeldung.com/java-pdf-creation) diff --git a/rxjava/README.md b/rxjava/README.md new file mode 100644 index 0000000000..7670dd4ed3 --- /dev/null +++ b/rxjava/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Dealing with Backpressure with RxJava](http://www.baeldung.com/rxjava-backpressure) +- [How to Test RxJava?](http://www.baeldung.com/rxjava-testing) diff --git a/spring-all/README.md b/spring-all/README.md index 90ae69300a..a8ea7c58c7 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -16,3 +16,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Introduction To Ehcache](http://www.baeldung.com/ehcache) +- [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler) +- [Guide to Spring Retry](http://www.baeldung.com/spring-retry) diff --git a/spring-amqp/README.md b/spring-amqp/README.md new file mode 100644 index 0000000000..b0d16c9305 --- /dev/null +++ b/spring-amqp/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Messaging With Spring AMQP](http://www.baeldung.com/spring-amqp) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 05173ef318..d0a02c69fc 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -7,3 +7,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) - [Introduction to WebJars](http://www.baeldung.com/maven-webjars) - [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot) +- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan) +- [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder) +- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) diff --git a/spring-data-mongodb/README.md b/spring-data-mongodb/README.md index d656bc897c..c2a1f703b5 100644 --- a/spring-data-mongodb/README.md +++ b/spring-data-mongodb/README.md @@ -9,3 +9,4 @@ - [Custom Cascading in Spring Data MongoDB](http://www.baeldung.com/cascading-with-dbref-and-lifecycle-events-in-spring-data-mongodb) - [GridFS in Spring Data MongoDB](http://www.baeldung.com/spring-data-mongodb-gridfs) - [Introduction to Spring Data MongoDB](http://www.baeldung.com/spring-data-mongodb-tutorial) +- [Spring Data MongoDB: Projections and Aggregations](http://www.baeldung.com/spring-data-mongodb-projections-aggregations) diff --git a/spring-data-neo4j/README.md b/spring-data-neo4j/README.md index 0f13d9dbc9..03c9ed333d 100644 --- a/spring-data-neo4j/README.md +++ b/spring-data-neo4j/README.md @@ -2,6 +2,7 @@ ### Relevant Articles: - [Introduction to Spring Data Neo4j](http://www.baeldung.com/spring-data-neo4j-intro) +- [A Guide to Neo4J with Java](http://www.baeldung.com/java-neo4j) ### Build the Project with Tests Running ``` diff --git a/spring-hibernate4/README.md b/spring-hibernate4/README.md index 7888e8b4ee..02888c4ad0 100644 --- a/spring-hibernate4/README.md +++ b/spring-hibernate4/README.md @@ -12,6 +12,7 @@ - [Hibernate: save, persist, update, merge, saveOrUpdate](http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate/) - [Eager/Lazy Loading In Hibernate](http://www.baeldung.com/hibernate-lazy-eager-loading) - [Hibernate Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries) +- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) ### Quick Start @@ -22,3 +23,4 @@ mvn install mvn cargo:run ``` - **note**: starts on port `8082` + diff --git a/spring-jersey/README.md b/spring-jersey/README.md index 2767ceb9a7..8b2eecc0e1 100644 --- a/spring-jersey/README.md +++ b/spring-jersey/README.md @@ -1,3 +1,5 @@ ========= ## REST API with Jersey & Spring Example Project +- [REST API with Jersey and Spring](http://www.baeldung.com/jersey-rest-api-with-spring) +- [JAX-RS Client with Jersey](http://www.baeldung.com/jersey-jax-rs-client) diff --git a/spring-mobile/README.md b/spring-mobile/README.md new file mode 100644 index 0000000000..e3d23bcda6 --- /dev/null +++ b/spring-mobile/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [A Guide to Spring Mobile](http://www.baeldung.com/spring-mobile) + diff --git a/spring-mvc-email/README.md b/spring-mvc-email/README.md index 0de6532393..aa880188d7 100644 --- a/spring-mvc-email/README.md +++ b/spring-mvc-email/README.md @@ -1,3 +1,7 @@ +## Relevant articles: + +- [Guide to Spring Email](http://www.baeldung.com/spring-email) + ## Spring MVC Email Example Spring MVC project to send email from web form. @@ -10,4 +14,4 @@ Type http://localhost:8080 in your browser to open the application. ### Sending test emails -Follow UI links to send simple email, email using template or email with attachment. \ No newline at end of file +Follow UI links to send simple email, email using template or email with attachment. diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index 0f267c5ec9..575e4f583e 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -18,3 +18,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring MVC Content Negotiation](http://www.baeldung.com/spring-mvc-content-negotiation-json-xml) - [Circular Dependencies in Spring](http://www.baeldung.com/circular-dependencies-in-spring) - [Introduction to HtmlUnit](http://www.baeldung.com/htmlunit) +- [Spring @RequestMapping New Shortcut Annotations](http://www.baeldung.com/spring-new-requestmapping-shortcuts) +- [Guide to Spring Handler Mappings](http://www.baeldung.com/spring-handler-mappings) diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md new file mode 100644 index 0000000000..ffb02c846a --- /dev/null +++ b/spring-mvc-simple/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [HandlerAdapters in Spring MVC](http://www.baeldung.com/spring-mvc-handler-adapters) diff --git a/spring-reactor/README.md b/spring-reactor/README.md new file mode 100644 index 0000000000..0da2d6be51 --- /dev/null +++ b/spring-reactor/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Introduction to Spring Reactor](http://www.baeldung.com/spring-reactor) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index a1dfa32c6d..92b759a66a 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -13,3 +13,4 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Custom Error Message Handling for REST API](http://www.baeldung.com/global-error-handler-in-a-spring-rest-api) - [An Intro to Spring HATEOAS](http://www.baeldung.com/spring-hateoas-tutorial) - [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) +- [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security) diff --git a/spring-sleuth/README.md b/spring-sleuth/README.md new file mode 100644 index 0000000000..47aa126939 --- /dev/null +++ b/spring-sleuth/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Spring Cloud Sleuth in a Monolith Application](http://www.baeldung.com/spring-cloud-sleuth-single-application) diff --git a/static-analysis/README.md b/static-analysis/README.md new file mode 100644 index 0000000000..74cc64b90d --- /dev/null +++ b/static-analysis/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Introduction to PMD](http://www.baeldung.com/pmd) From 7c337eb6c08ec8500f22e328d715b60d682744c6 Mon Sep 17 00:00:00 2001 From: buddhini81 Date: Mon, 20 Feb 2017 05:24:42 +0530 Subject: [PATCH 162/192] Adding Code for BAEL-394 (#1163) * Code for evaluation article Article : Field vs. Constructor Injection * Correct typo in attribute name * Delete EbookRepositiry.java * Add corrected class * Update LibraryUtils.java * Update Member.java * Update Reservation.java * Adding new file AccountServlet * Adding new files for BAEL-394 * Add new files for BAEL-394 * Add new file for BAEL-394 * Indentation of annotations fixed * Indentation of annotations fixed * Indentation of annotations fixed * Removing this class since it is not relevant * New example added for @WebListener --- .../javaeeannotations/AccountServlet.java | 57 +++++++++++++++++++ .../BankAppServletContextListener.java | 17 ++++++ .../javaeeannotations/LoggingFilter.java | 36 ++++++++++++ .../UploadCustomerDocumentsServlet.java | 29 ++++++++++ jee7/src/main/webapp/WEB-INF/web.xml | 11 ++++ jee7/src/main/webapp/index.jsp | 16 ++++++ jee7/src/main/webapp/login.jsp | 12 ++++ jee7/src/main/webapp/upload.jsp | 16 ++++++ .../src/main/java/com/baeldung/Ebook.java | 20 +++++++ .../java/com/baeldung/EbookRepository.java | 5 ++ .../main/java/com/baeldung/LibraryUtils.java | 12 ++++ .../src/main/java/com/baeldung/Member.java | 20 +++++++ .../main/java/com/baeldung/Reservation.java | 14 +++++ 13 files changed, 265 insertions(+) create mode 100644 jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java create mode 100644 jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java create mode 100644 jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java create mode 100644 jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java create mode 100644 jee7/src/main/webapp/WEB-INF/web.xml create mode 100644 jee7/src/main/webapp/index.jsp create mode 100644 jee7/src/main/webapp/login.jsp create mode 100644 jee7/src/main/webapp/upload.jsp create mode 100644 spring-core/src/main/java/com/baeldung/Ebook.java create mode 100644 spring-core/src/main/java/com/baeldung/EbookRepository.java create mode 100644 spring-core/src/main/java/com/baeldung/LibraryUtils.java create mode 100644 spring-core/src/main/java/com/baeldung/Member.java create mode 100644 spring-core/src/main/java/com/baeldung/Reservation.java diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java b/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java new file mode 100644 index 0000000000..e3f1667595 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java @@ -0,0 +1,57 @@ +package com.baeldung.javaeeannotations; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.HttpConstraint; +import javax.servlet.annotation.HttpMethodConstraint; +import javax.servlet.annotation.ServletSecurity; +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet( + name = "BankAccountServlet", + description = "Represents a Bank Account and it's transactions", + urlPatterns = {"/account", "/bankAccount" }, + initParams = { @WebInitParam(name = "type", value = "savings") } + ) +@ServletSecurity( + value = @HttpConstraint(rolesAllowed = {"admin"}), + httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"admin"})} + ) +public class AccountServlet extends javax.servlet.http.HttpServlet { + + String accountType = null; + + @Override + public void init(ServletConfig config) throws ServletException { + accountType = config.getInitParameter("type"); + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + PrintWriter writer = response.getWriter(); + writer.println("Hello, I am an AccountServlet!"); + writer.flush(); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + double accountBalance = 1000d; + double interestRate = Double.parseDouble(request.getAttribute("interest").toString()); + + String paramDepositAmt = request.getParameter("dep"); + double depositAmt = Double.parseDouble(paramDepositAmt); + + accountBalance = accountBalance + depositAmt; + + PrintWriter writer = response.getWriter(); + writer.println(" Balance of " + accountType + " account is: " + + accountBalance + "
This account bares an interest rate of " + interestRate + + " % "); + writer.flush(); + + } +} diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java b/jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java new file mode 100644 index 0000000000..6b43dd8a84 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java @@ -0,0 +1,17 @@ +package com.baeldung.javaeeannotations; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +@WebListener +public class BankAppServletContextListener implements ServletContextListener { + + public void contextInitialized(ServletContextEvent sce) { + sce.getServletContext().setAttribute("ATTR_DEFAULT_LANGUAGE", "english"); + } + + public void contextDestroyed(ServletContextEvent sce) { + System.out.println("CONTEXT DESTROYED"); + } +} diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java b/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java new file mode 100644 index 0000000000..97de5ec0de --- /dev/null +++ b/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java @@ -0,0 +1,36 @@ +package com.baeldung.javaeeannotations; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebFilter( + urlPatterns = "/bankAccount/*", + filterName = "LoggingFilter", + description = "Filter all account transaction URLs" + ) +public class LoggingFilter implements javax.servlet.Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + + res.sendRedirect(req.getContextPath() + "/login.jsp"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + +} diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java b/jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java new file mode 100644 index 0000000000..8a6c709b81 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java @@ -0,0 +1,29 @@ +package com.baeldung.javaeeannotations; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.Part; + +@WebServlet(urlPatterns = { "/uploadCustDocs" }) +@MultipartConfig( + fileSizeThreshold = 1024 * 1024 * 20, + maxFileSize = 1024 * 1024 * 20, + maxRequestSize = 1024 * 1024 * 25, + location = "D:/custDocs" + ) +public class UploadCustomerDocumentsServlet extends HttpServlet { + + protected void doPost( + HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + for (Part part : request.getParts()) { + part.write("myFile"); + } + } + +} diff --git a/jee7/src/main/webapp/WEB-INF/web.xml b/jee7/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..0a3d84d2d4 --- /dev/null +++ b/jee7/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,11 @@ + + + + BASIC + default + + + \ No newline at end of file diff --git a/jee7/src/main/webapp/index.jsp b/jee7/src/main/webapp/index.jsp new file mode 100644 index 0000000000..0c389ef5b1 --- /dev/null +++ b/jee7/src/main/webapp/index.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +My Account + + +
+ Width: +    + +
+ + \ No newline at end of file diff --git a/jee7/src/main/webapp/login.jsp b/jee7/src/main/webapp/login.jsp new file mode 100644 index 0000000000..885df0c3d9 --- /dev/null +++ b/jee7/src/main/webapp/login.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Login + + +Login Here... + + \ No newline at end of file diff --git a/jee7/src/main/webapp/upload.jsp b/jee7/src/main/webapp/upload.jsp new file mode 100644 index 0000000000..020483b99f --- /dev/null +++ b/jee7/src/main/webapp/upload.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Insert title here + + +
+ +
+ +
+ + \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/Ebook.java b/spring-core/src/main/java/com/baeldung/Ebook.java new file mode 100644 index 0000000000..fc29ddfcf5 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/Ebook.java @@ -0,0 +1,20 @@ +package com.baeldung; + +public class Ebook { + + private int bookId; + private String bookTitle; + + public int getBookId() { + return bookId; + } + public void setBookId(int bookId) { + this.bookId = bookId; + } + public String getBookTitle() { + return bookTitle; + } + public void setBookTitle(String bookTitle) { + this.bookTitle = bookTitle; + } +} diff --git a/spring-core/src/main/java/com/baeldung/EbookRepository.java b/spring-core/src/main/java/com/baeldung/EbookRepository.java new file mode 100644 index 0000000000..661283c355 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/EbookRepository.java @@ -0,0 +1,5 @@ +package com.baeldung; + +public interface EbookRepository { + String titleById(int id); +} diff --git a/spring-core/src/main/java/com/baeldung/LibraryUtils.java b/spring-core/src/main/java/com/baeldung/LibraryUtils.java new file mode 100644 index 0000000000..49af60c89d --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/LibraryUtils.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Autowired; + +public class LibraryUtils { + @Autowired + private EbookRepository eBookRepository; + + public String findBook(int id) { + return eBookRepository.titleById(id); + } +} diff --git a/spring-core/src/main/java/com/baeldung/Member.java b/spring-core/src/main/java/com/baeldung/Member.java new file mode 100644 index 0000000000..ceebb32017 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/Member.java @@ -0,0 +1,20 @@ +package com.baeldung; + +public class Member { + + private int memberId; + private String memberName; + + public int getMemberId() { + return memberId; + } + public void setMemberId(int memberId) { + this.memberId = memberId; + } + public String getMemberName() { + return memberName; + } + public void setMemberName(String memberName) { + this.memberName = memberName; + } +} diff --git a/spring-core/src/main/java/com/baeldung/Reservation.java b/spring-core/src/main/java/com/baeldung/Reservation.java new file mode 100644 index 0000000000..ed33bb6464 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/Reservation.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Autowired; + +public class Reservation { + private Member member; + private Ebook eBook; + + @Autowired + public Reservation(Member member, Ebook eBook) { + this.member = member; + this.eBook = eBook; + } +} From 689219c7187577afbd460d733e5e5153f4b0f990 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sun, 19 Feb 2017 22:02:57 -0600 Subject: [PATCH 163/192] Create README.md --- apache-bval/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apache-bval/README.md diff --git a/apache-bval/README.md b/apache-bval/README.md new file mode 100644 index 0000000000..80ea149993 --- /dev/null +++ b/apache-bval/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Intro to Apache BVal](http://www.baeldung.com/apache-bval) From 99c8ee52282b30d97cbab7fd717a43356d80b4a8 Mon Sep 17 00:00:00 2001 From: dhruba619 Date: Mon, 20 Feb 2017 12:52:19 +0530 Subject: [PATCH 164/192] BAEL-41 Intro to Log4J2 code simplification and refactoring --- log4j2/pom.xml | 179 +++++++++--------- .../AsyncFileAppenderUsingJsonLayoutTest.java | 32 ---- ...ConsoleAppenderUsingDefaultLayoutTest.java | 21 -- ...enderUsingPatternLayoutWithColorsTest.java | 51 ----- .../log4j2/tests/CustomLoggingTest.java | 121 ++++++++++++ .../FailoverSyslogConsoleAppenderTest.java | 27 --- .../log4j2/tests/JDBCAppenderTest.java | 51 ----- ...RollingFileAppenderUsingXMLLayoutTest.java | 34 ---- .../log4j2/tests/jdbc/ConnectionFactory.java | 1 - ...log4j2-async-file-appender_json-layout.xml | 17 -- ...log4j2-console-appender_pattern-layout.xml | 27 --- ...syslog-console-appender_pattern-layout.xml | 20 -- ...onsole-appender_pattern-layout_colored.xml | 3 +- .../test/resources/log4j2-jdbc-appender.xml | 19 -- ...og4j2-rolling-file-appender_xml-layout.xml | 18 -- log4j2/src/test/resources/log4j2.xml | 66 ++++++- 16 files changed, 273 insertions(+), 414 deletions(-) delete mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java delete mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java delete mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java create mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java delete mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java delete mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java delete mode 100644 log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java delete mode 100644 log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml delete mode 100644 log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml delete mode 100644 log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml delete mode 100644 log4j2/src/test/resources/log4j2-jdbc-appender.xml delete mode 100644 log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml diff --git a/log4j2/pom.xml b/log4j2/pom.xml index 893c79be72..a4c8f19f69 100644 --- a/log4j2/pom.xml +++ b/log4j2/pom.xml @@ -1,105 +1,104 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - log4j2 + log4j2 - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - .. - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + .. + - - - - org.apache.logging.log4j - log4j-core - ${log4j-core.version} - + + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - ${jackson.version} - + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson.version} + - - - com.h2database - h2 - ${h2.version} - - - org.apache.commons - commons-dbcp2 - ${commons-dbcp2.version} - + + + com.h2database + h2 + ${h2.version} + + + org.apache.commons + commons-dbcp2 + ${commons-dbcp2.version} + - - - org.apache.logging.log4j - log4j-core - ${log4j-core.version} - test-jar - test - - - junit - junit - ${junit.version} - test - - + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + test-jar + test + + + junit + junit + ${junit.version} + test + + - - + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - - true - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + - - + + - - 2.8.5 - 1.4.193 - 2.1.1 - 2.7 - 4.12 - - 3.6.0 - 2.19.1 - + + 2.8.5 + 1.4.193 + 2.1.1 + 2.7 + 4.12 + 3.6.0 + 2.19.1 + diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java deleted file mode 100644 index 0472c2219e..0000000000 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.junit.LoggerContextRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.nio.file.Files; -import java.nio.file.Paths; - -import static org.junit.Assert.assertTrue; - -@RunWith(JUnit4.class) -public class AsyncFileAppenderUsingJsonLayoutTest { - @Rule - public LoggerContextRule contextRule = - new LoggerContextRule("log4j2-async-file-appender_json-layout.xml"); - - @Test - public void givenLoggerWithAsyncConfig_shouldLogToJsonFile() - throws Exception { - Logger logger = contextRule.getLogger(getClass().getSimpleName()); - final int count = 88; - for (int i = 0; i < count; i++) { - logger.info("This is async JSON message #{} at INFO level.", count); - } - long logEventsCount = Files.lines(Paths.get("target/logfile.json")).count(); - assertTrue(logEventsCount > 0 && logEventsCount <= count); - } -} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java deleted file mode 100644 index 9831030d02..0000000000 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class ConsoleAppenderUsingDefaultLayoutTest { - @Test - public void givenLoggerWithDefaultConfig_shouldLogToConsole() - throws Exception { - Logger logger = LogManager.getLogger(getClass()); - Exception e = new RuntimeException("This is only a test!"); - logger.info("This is a simple message at INFO level. " + - "It will be hidden."); - logger.error("This is a simple message at ERROR level. " + - "This is the minimum visible level.", e); - } -} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java deleted file mode 100644 index 86b005538f..0000000000 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.MarkerManager; -import org.apache.logging.log4j.ThreadContext; -import org.apache.logging.log4j.junit.LoggerContextRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class ConsoleAppenderUsingPatternLayoutWithColorsTest { - @Rule - public LoggerContextRule contextRule = - new LoggerContextRule("log4j2-console-appender_pattern-layout.xml"); - - @Test - public void givenLoggerWithConsoleConfig_shouldLogToConsoleInColors() - throws Exception { - Logger logger = contextRule.getLogger(getClass().getSimpleName()); - logger.trace("This is a colored message at TRACE level."); - logger.debug("This is a colored message at DEBUG level. " + - "This is the minimum visible level."); - logger.info("This is a colored message at INFO level."); - logger.warn("This is a colored message at WARN level."); - Exception e = new RuntimeException("This is only a test!"); - logger.error("This is a colored message at ERROR level.", e); - logger.fatal("This is a colored message at FATAL level."); - } - - @Test - public void givenLoggerWithConsoleConfig_shouldFilterByMarker() throws Exception { - Logger logger = contextRule.getLogger("ConnTrace"); - Marker appError = MarkerManager.getMarker("APP_ERROR"); - logger.error(appError, "This marker message at ERROR level should be hidden."); - Marker connectionTrace = MarkerManager.getMarker("CONN_TRACE"); - logger.trace(connectionTrace, "This is a marker message at TRACE level."); - } - - @Test - public void givenLoggerWithConsoleConfig_shouldFilterByThreadContext() throws Exception { - Logger logger = contextRule.getLogger("UserAudit"); - ThreadContext.put("userId", "1000"); - logger.info("This is a log-visible user login. Maybe from an admin account?"); - ThreadContext.put("userId", "1001"); - logger.info("This is a log-invisible user login."); - boolean b = true; - } -} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java new file mode 100644 index 0000000000..d88a967562 --- /dev/null +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java @@ -0,0 +1,121 @@ +package com.baeldung.logging.log4j2.tests; + +import static org.junit.Assert.assertTrue; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.ResultSet; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; +import org.apache.logging.log4j.ThreadContext; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import com.baeldung.logging.log4j2.tests.jdbc.ConnectionFactory; + +@RunWith(JUnit4.class) +public class CustomLoggingTest { + + @BeforeClass + public static void setup() throws Exception { + Connection connection = ConnectionFactory.getConnection(); + connection.createStatement() + .execute("CREATE TABLE logs(" + "when TIMESTAMP," + "logger VARCHAR(255)," + "level VARCHAR(255)," + "message VARCHAR(4096)," + "throwable TEXT)"); + connection.commit(); + } + + @Test + public void givenLoggerWithDefaultConfig_shouldLogToConsole() throws Exception { + Logger logger = LogManager.getLogger(getClass()); + Exception e = new RuntimeException("This is only a test!"); + logger.info("This is a simple message at INFO level. " + "It will be hidden."); + logger.error("This is a simple message at ERROR level. " + "This is the minimum visible level.", e); + } + + @Test + public void givenLoggerWithConsoleConfig_shouldLogToConsoleInColors() throws Exception { + Logger logger = LogManager.getLogger("CONSOLE_PATTERN_APPENDER_MARKER"); + logger.trace("This is a colored message at TRACE level."); + logger.debug("This is a colored message at DEBUG level. " + "This is the minimum visible level."); + logger.info("This is a colored message at INFO level."); + logger.warn("This is a colored message at WARN level."); + Exception e = new RuntimeException("This is only a test!"); + logger.error("This is a colored message at ERROR level.", e); + logger.fatal("This is a colored message at FATAL level."); + } + + @Test + public void givenLoggerWithConsoleConfig_shouldFilterByMarker() throws Exception { + Logger logger = LogManager.getLogger("CONSOLE_PATTERN_APPENDER_MARKER"); + Marker appError = MarkerManager.getMarker("APP_ERROR"); + logger.error(appError, "This marker message at ERROR level should be hidden."); + Marker connectionTrace = MarkerManager.getMarker("CONN_TRACE"); + logger.trace(connectionTrace, "This is a marker message at TRACE level."); + } + + @Test + public void givenLoggerWithConsoleConfig_shouldFilterByThreadContext() throws Exception { + Logger logger = LogManager.getLogger("CONSOLE_PATTERN_APPENDER_THREAD_CONTEXT"); + ThreadContext.put("userId", "1000"); + logger.info("This is a log-visible user login. Maybe from an admin account?"); + ThreadContext.put("userId", "1001"); + logger.info("This is a log-invisible user login."); + + } + + @Test + public void givenLoggerWithAsyncConfig_shouldLogToJsonFile() throws Exception { + Logger logger = LogManager.getLogger("ASYNC_JSON_FILE_APPENDER"); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is async JSON message #{} at INFO level.", count); + } + long logEventsCount = Files.lines(Paths.get("target/logfile.json")) + .count(); + assertTrue(logEventsCount > 0 && logEventsCount <= count); + } + + @Test + public void givenLoggerWithFailoverConfig_shouldLog() throws Exception { + Logger logger = LogManager.getLogger("FAIL_OVER_SYSLOG_APPENDER"); + logger.trace("This is a syslog message at TRACE level."); + logger.debug("This is a syslog message at DEBUG level."); + logger.info("This is a syslog message at INFO level. This is the minimum visible level."); + logger.warn("This is a syslog message at WARN level."); + Exception e = new RuntimeException("This is only a test!"); + logger.error("This is a syslog message at ERROR level.", e); + logger.fatal("This is a syslog message at FATAL level."); + } + + @Test + public void givenLoggerWithJdbcConfig_shouldLogToDataSource() throws Exception { + Logger logger = LogManager.getLogger("JDBC_APPENDER"); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is JDBC message #{} at INFO level.", count); + } + Connection connection = ConnectionFactory.getConnection(); + ResultSet resultSet = connection.createStatement() + .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs"); + int logCount = 0; + if (resultSet.next()) { + logCount = resultSet.getInt("ROW_COUNT"); + } + assertTrue(logCount == count); + } + + @Test + public void givenLoggerWithRollingFileConfig_shouldLogToXMLFile() throws Exception { + Logger logger = LogManager.getLogger("XML_ROLLING_FILE_APPENDER"); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is rolling file XML message #{} at INFO level.", i); + } + } + +} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java deleted file mode 100644 index 0653394e5a..0000000000 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.junit.LoggerContextRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class FailoverSyslogConsoleAppenderTest { - @Rule - public LoggerContextRule contextRule = - new LoggerContextRule("log4j2-failover-syslog-console-appender_pattern-layout.xml"); - - @Test - public void givenLoggerWithFailoverConfig_shouldLog() throws Exception { - Logger logger = contextRule.getLogger(getClass().getSimpleName()); - logger.trace("This is a syslog message at TRACE level."); - logger.debug("This is a syslog message at DEBUG level."); - logger.info("This is a syslog message at INFO level. This is the minimum visible level."); - logger.warn("This is a syslog message at WARN level."); - Exception e = new RuntimeException("This is only a test!"); - logger.error("This is a syslog message at ERROR level.", e); - logger.fatal("This is a syslog message at FATAL level."); - } -} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java deleted file mode 100644 index 1b8d33e2bf..0000000000 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import com.baeldung.logging.log4j2.tests.jdbc.ConnectionFactory; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.junit.LoggerContextRule; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.sql.Connection; -import java.sql.ResultSet; - -import static org.junit.Assert.assertTrue; - -@RunWith(JUnit4.class) -public class JDBCAppenderTest { - @Rule - public LoggerContextRule contextRule = new LoggerContextRule("log4j2-jdbc-appender.xml"); - - @BeforeClass - public static void setup() throws Exception { - Connection connection = ConnectionFactory.getConnection(); - connection.createStatement() - .execute("CREATE TABLE logs(" + - "when TIMESTAMP," + - "logger VARCHAR(255)," + - "level VARCHAR(255)," + - "message VARCHAR(4096)," + - "throwable TEXT)"); - //connection.commit(); - } - - @Test - public void givenLoggerWithJdbcConfig_shouldLogToDataSource() throws Exception { - Logger logger = contextRule.getLogger(getClass().getSimpleName()); - final int count = 88; - for (int i = 0; i < count; i++) { - logger.info("This is JDBC message #{} at INFO level.", count); - } - Connection connection = ConnectionFactory.getConnection(); - ResultSet resultSet = connection.createStatement() - .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs"); - int logCount = 0; - if (resultSet.next()) { - logCount = resultSet.getInt("ROW_COUNT"); - } - assertTrue(logCount == count); - } -} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java deleted file mode 100644 index 3ab69d263c..0000000000 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.junit.LoggerContextRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertTrue; - -@RunWith(JUnit4.class) -public class RollingFileAppenderUsingXMLLayoutTest { - @Rule - public LoggerContextRule contextRule = - new LoggerContextRule("log4j2-rolling-file-appender_xml-layout.xml"); - - @Test - public void givenLoggerWithRollingFileConfig_shouldLogToXMLFile() throws Exception { - Logger logger = contextRule.getLogger(getClass().getSimpleName()); - final int count = 88; - for (int i = 0; i < count; i++) { - logger.info("This is rolling file XML message #{} at INFO level.", i); - } - String[] logEvents = Files.readAllLines(Paths.get("target/logfile.xml")).stream() - .collect(Collectors.joining(System.lineSeparator())) - .split("\\n\\n+"); - assertTrue(logEvents.length == 39); - } -} diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java index 73b323f335..cc594f293c 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java @@ -2,7 +2,6 @@ package com.baeldung.logging.log4j2.tests.jdbc; import org.apache.commons.dbcp2.BasicDataSource; import org.h2.Driver; - import java.sql.Connection; import java.sql.SQLException; diff --git a/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml b/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml deleted file mode 100644 index c291eacd59..0000000000 --- a/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml b/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml deleted file mode 100644 index d6621f9166..0000000000 --- a/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml b/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml deleted file mode 100644 index 62ba37f28c..0000000000 --- a/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml b/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml index c2b9c65430..fd61e4581f 100644 --- a/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml +++ b/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml @@ -1,4 +1,5 @@ - + diff --git a/log4j2/src/test/resources/log4j2-jdbc-appender.xml b/log4j2/src/test/resources/log4j2-jdbc-appender.xml deleted file mode 100644 index 6b50f7d5a4..0000000000 --- a/log4j2/src/test/resources/log4j2-jdbc-appender.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml b/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml deleted file mode 100644 index 9de1a29186..0000000000 --- a/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/log4j2/src/test/resources/log4j2.xml b/log4j2/src/test/resources/log4j2.xml index 8f7608aa78..83c1184f1f 100644 --- a/log4j2/src/test/resources/log4j2.xml +++ b/log4j2/src/test/resources/log4j2.xml @@ -1,13 +1,69 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file From 08ced4054783518d34038059f831fe902ca32e20 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 20 Feb 2017 10:13:25 +0100 Subject: [PATCH 165/192] BAEL-602 remove unnecessary comment --- jooq/src/test/java/com/baeldung/JOOLTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java index 64ad3b316d..5560e7ea14 100644 --- a/jooq/src/test/java/com/baeldung/JOOLTest.java +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -94,8 +94,8 @@ public class JOOLTest { ); assertEquals( - Seq.of(1, 2, 3, 4).partition(i -> i % 2 != 0).map((first, second) -> tuple(first.toList(), second.toList())), - tuple(Arrays.asList(1, 3), Arrays.asList(2, 4)) + Seq.of(1, 2, 3, 4).partition(i -> i > 2).map((first, second) -> tuple(first.toList(), second.toList())), + tuple(Arrays.asList(3, 4), Arrays.asList(1, 2)) ); @@ -152,7 +152,6 @@ public class JOOLTest { Arrays.asList(tuple(1, "a"), tuple(2, "b"), tuple(3, "c")) ); - // ("1:a", "2:b", "3:c") assertEquals( Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y).toList(), Arrays.asList("1:a", "2:b", "3:c") From fae4d381c1b4662f86918f45423698533bbc7461 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Mon, 20 Feb 2017 08:51:46 -0600 Subject: [PATCH 166/192] Update README.md --- spring-mvc-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index 575e4f583e..4d3e58558b 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -20,3 +20,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Introduction to HtmlUnit](http://www.baeldung.com/htmlunit) - [Spring @RequestMapping New Shortcut Annotations](http://www.baeldung.com/spring-new-requestmapping-shortcuts) - [Guide to Spring Handler Mappings](http://www.baeldung.com/spring-handler-mappings) +- [Uploading and Displaying Excel Files with Spring MVC](http://www.baeldung.com/spring-mvc-excel-files) From 99dbc3efd11ba5567b6f3e8ab30922506febbf09 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Mon, 20 Feb 2017 20:03:32 +0100 Subject: [PATCH 167/192] BAEL-41 - Log4j 2 appenders, layout, filters --- .../baeldung/logging/log4j2/tests/CustomLoggingTest.java | 7 ++++--- .../logging/log4j2/tests/jdbc/ConnectionFactory.java | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java index d88a967562..1562b67068 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingTest.java @@ -6,6 +6,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.sql.Connection; import java.sql.ResultSet; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -25,7 +26,7 @@ public class CustomLoggingTest { public static void setup() throws Exception { Connection connection = ConnectionFactory.getConnection(); connection.createStatement() - .execute("CREATE TABLE logs(" + "when TIMESTAMP," + "logger VARCHAR(255)," + "level VARCHAR(255)," + "message VARCHAR(4096)," + "throwable TEXT)"); + .execute("CREATE TABLE logs(" + "when TIMESTAMP," + "logger VARCHAR(255)," + "level VARCHAR(255)," + "message VARCHAR(4096)," + "throwable TEXT)"); connection.commit(); } @@ -76,7 +77,7 @@ public class CustomLoggingTest { logger.info("This is async JSON message #{} at INFO level.", count); } long logEventsCount = Files.lines(Paths.get("target/logfile.json")) - .count(); + .count(); assertTrue(logEventsCount > 0 && logEventsCount <= count); } @@ -101,7 +102,7 @@ public class CustomLoggingTest { } Connection connection = ConnectionFactory.getConnection(); ResultSet resultSet = connection.createStatement() - .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs"); + .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs"); int logCount = 0; if (resultSet.next()) { logCount = resultSet.getInt("ROW_COUNT"); diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java index cc594f293c..73b323f335 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java @@ -2,6 +2,7 @@ package com.baeldung.logging.log4j2.tests.jdbc; import org.apache.commons.dbcp2.BasicDataSource; import org.h2.Driver; + import java.sql.Connection; import java.sql.SQLException; From 494d6d57e1ee74b2a6699da15c3fcdb67fe08984 Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Mon, 20 Feb 2017 22:17:08 +0000 Subject: [PATCH 168/192] Add Cobertura Plugin configuration (#1185) --- algorithms/pom.xml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/algorithms/pom.xml b/algorithms/pom.xml index 0c85a19534..f72457650a 100644 --- a/algorithms/pom.xml +++ b/algorithms/pom.xml @@ -41,4 +41,23 @@
- \ No newline at end of file + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.7 + + + + com/baeldung/algorithms/dijkstra/* + + + com/baeldung/algorithms/dijkstra/* + + + + + + + From fda362f79d114473afba5e82698299fce3c111e1 Mon Sep 17 00:00:00 2001 From: Andrew Evans Date: Mon, 20 Feb 2017 15:17:48 -0700 Subject: [PATCH 169/192] Spring Groovy Config with fixed pom (#1200) * 'bean_injection' * 'bean_injection' * 'changes' * code * git ignore * pom fix * pom fix --- .../com/baeldung/annotationinjection/App.java | 48 +++++++++++++ .../annotationinjection/AppConfig.java | 23 +++++++ .../baeldung/annotationinjection/AppTest.java | 52 ++++++++++++++ .../annotationinjection/AutowireObject.java | 6 ++ .../annotationinjection/ImportConfig.java | 20 ++++++ .../annotationinjection/InjectedClass.java | 39 +++++++++++ spring-groovy-config/.gitignore | 1 + .../org.eclipse.core.resources.prefs | 4 ++ .../.settings/org.eclipse.jdt.core.prefs | 5 ++ .../org.eclipse.jdt.groovy.core.prefs | 2 + .../.settings/org.eclipse.m2e.core.prefs | 4 ++ .../groovyContextWithConstructor.groovy | 9 +++ .../config/groovyPropConfig.groovy | 5 ++ .../config/groovyPropConfigWithClosure.groovy | 8 +++ .../config/groovyTestWithRefBean.groovy | 10 +++ spring-groovy-config/pom.xml | 67 +++++++++++++++++++ .../spring_groovy_config/ClassWithRef.java | 18 +++++ .../spring_groovy_config/GroovyClass.groovy | 9 +++ .../spring_groovy_config/MainApp.java | 14 ++++ .../spring_groovy_config/TestClass.java | 22 ++++++ .../spring_groovy_config/TestClassB.java | 26 +++++++ .../spring_groovy_config/AppTest.java | 57 ++++++++++++++++ 22 files changed, 449 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/App.java create mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java create mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java create mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java create mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java create mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java create mode 100644 spring-groovy-config/.gitignore create mode 100644 spring-groovy-config/.settings/org.eclipse.core.resources.prefs create mode 100644 spring-groovy-config/.settings/org.eclipse.jdt.core.prefs create mode 100644 spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs create mode 100644 spring-groovy-config/.settings/org.eclipse.m2e.core.prefs create mode 100644 spring-groovy-config/config/groovyContextWithConstructor.groovy create mode 100644 spring-groovy-config/config/groovyPropConfig.groovy create mode 100644 spring-groovy-config/config/groovyPropConfigWithClosure.groovy create mode 100644 spring-groovy-config/config/groovyTestWithRefBean.groovy create mode 100644 spring-groovy-config/pom.xml create mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java create mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy create mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java create mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java create mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java create mode 100644 spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/App.java b/spring-core/src/main/java/com/baeldung/annotationinjection/App.java new file mode 100644 index 0000000000..dc9560286d --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotationinjection/App.java @@ -0,0 +1,48 @@ +package com.baeldung.java_bean_injection; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.java_bean_injection.*; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + + +import junit.framework.TestResult; +import junit.framework.TestFailure; + +import java.util.Enumeration; + + +/** + * Bean Injection Test Application + * + */ +public class App +{ + public static void main( String[] args ) + { + + TestResult result = new TestResult(); + AppTest.suite().run(result); + System.out.println(String.format("Tests: %d",result.runCount())); + System.out.println(String.format("Errors: %d",result.errorCount())); + System.out.println(String.format("Failures: %d",result.failureCount())); + if(result.failureCount() > 0){ + Enumeration failures = result.failures(); + int failNum = 0; + TestFailure failure = null; + while(failures.hasMoreElements()){ + failure = failures.nextElement(); + + System.out.println(failure.exceptionMessage()); + System.out.println(String.format("Test Failure %d\n",failNum)); + System.out.println(failure.trace()); + System.out.print("\n"); + } + } + + } +} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java b/spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java new file mode 100644 index 0000000000..138bda6b1b --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java @@ -0,0 +1,23 @@ +package com.baeldung.java_bean_injection; + +import org.springframework.beans.factory.annotation.*; +import org.springframework.context.annotation.*; +import org.springframework.stereotype.*; + +import com.baeldung.java_bean_injection.*; + +@Configuration +@PropertySource(value="classpath:inject.properties") +@Import(ImportConfig.class) +public class AppConfig { + @Value("${contructor.arg1}") String constructorArg; + + @Bean + public InjectedClass injectedClass(){ + InjectedClass ic = new InjectedClass(constructorArg); + ic.setMyInt(10); + ic.setTestString("test"); + return ic; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java b/spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java new file mode 100644 index 0000000000..fa7b46f06b --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java @@ -0,0 +1,52 @@ +package com.baeldung.java_bean_injection; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.java_bean_injection.*; + +import java.io.File; +import java.util.Scanner; + +/** + * Unit test for simple App. + */ +public class AppTest extends TestCase{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(); + context.register(AppConfig.class); + context.refresh(); + InjectedClass injectedClass = (InjectedClass) context.getBean(InjectedClass.class); + assertTrue(injectedClass.getMyInt() == 10); + assertTrue(injectedClass.getTestString().equals("test")); + assertNotNull(injectedClass.obj); + assertTrue(injectedClass.myConstructorArg.equals("test")); + } +} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java b/spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java new file mode 100644 index 0000000000..df5859f0af --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java @@ -0,0 +1,6 @@ +package com.baeldung.java_bean_injection; + + +public class AutowireObject { + +} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java b/spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java new file mode 100644 index 0000000000..e37d94931b --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.java_bean_injection; + +import org.springframework.context.annotation.*; + +import com.baeldung.java_bean_injection.*; + +@Configuration +public class ImportConfig { + + @Bean(name="autobean") + public AutowireObject autowireObject(){ + return new AutowireObject(); + } + + + @Bean(name="autobean2") + public AutowireObject autowireObject2(){ + return new AutowireObject(); + } +} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java b/spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java new file mode 100644 index 0000000000..55fe733db5 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java @@ -0,0 +1,39 @@ +package com.baeldung.java_bean_injection; + +import org.springframework.beans.factory.annotation.*; +import org.springframework.context.annotation.*; + +import com.baeldung.java_bean_injection.*; + + +public class InjectedClass { + private int myInt; + private String testString; + String myConstructorArg; + + + @Autowired + @Qualifier("autobean") + AutowireObject obj; + + public InjectedClass(String constArg){ + this.myConstructorArg = constArg; + } + + public void setMyInt(int myInt){ + this.myInt = myInt; + } + + public void setTestString(String testString){ + this.testString = testString; + } + + public int getMyInt(){ + return this.myInt; + } + + public String getTestString(){ + return this.testString; + } + +} diff --git a/spring-groovy-config/.gitignore b/spring-groovy-config/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/spring-groovy-config/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/spring-groovy-config/.settings/org.eclipse.core.resources.prefs b/spring-groovy-config/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..f9fe34593f --- /dev/null +++ b/spring-groovy-config/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/spring-groovy-config/.settings/org.eclipse.jdt.core.prefs b/spring-groovy-config/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..abec6ca389 --- /dev/null +++ b/spring-groovy-config/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs b/spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs new file mode 100644 index 0000000000..ae98feaa79 --- /dev/null +++ b/spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +groovy.compiler.level=24 diff --git a/spring-groovy-config/.settings/org.eclipse.m2e.core.prefs b/spring-groovy-config/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/spring-groovy-config/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/spring-groovy-config/config/groovyContextWithConstructor.groovy b/spring-groovy-config/config/groovyContextWithConstructor.groovy new file mode 100644 index 0000000000..dbde5f3822 --- /dev/null +++ b/spring-groovy-config/config/groovyContextWithConstructor.groovy @@ -0,0 +1,9 @@ +import com.baeldung.spring_groovy_config.TestClass + +beans{ + testString String, 'Test String' + testClass(TestClass){ + beanDefinition -> + beanDefinition.constructorArgs = ["Test String",10.2] + } +} \ No newline at end of file diff --git a/spring-groovy-config/config/groovyPropConfig.groovy b/spring-groovy-config/config/groovyPropConfig.groovy new file mode 100644 index 0000000000..08d3acf354 --- /dev/null +++ b/spring-groovy-config/config/groovyPropConfig.groovy @@ -0,0 +1,5 @@ +import com.baeldung.spring_groovy_config.TestClassB + +beans{ + testClassB(TestClassB,testStringB:"Test String",testIntB:10.2) +} \ No newline at end of file diff --git a/spring-groovy-config/config/groovyPropConfigWithClosure.groovy b/spring-groovy-config/config/groovyPropConfigWithClosure.groovy new file mode 100644 index 0000000000..3ca306bdd7 --- /dev/null +++ b/spring-groovy-config/config/groovyPropConfigWithClosure.groovy @@ -0,0 +1,8 @@ +import com.baeldung.spring_groovy_config.TestClassB + +beans{ + testClassB(TestClassB){ + testStringB = "Test String" + testIntB = 10 + } +} \ No newline at end of file diff --git a/spring-groovy-config/config/groovyTestWithRefBean.groovy b/spring-groovy-config/config/groovyTestWithRefBean.groovy new file mode 100644 index 0000000000..d079480d46 --- /dev/null +++ b/spring-groovy-config/config/groovyTestWithRefBean.groovy @@ -0,0 +1,10 @@ +import com.baeldung.spring_groovy_config.GroovyClass +import com.baeldung.spring_groovy_config.ClassWithRef + +beans{ + groovyClass(GroovyClass, groovyInt:5) + classWithRef(ClassWithRef){ + myClass = groovyClass + } + +} \ No newline at end of file diff --git a/spring-groovy-config/pom.xml b/spring-groovy-config/pom.xml new file mode 100644 index 0000000000..f6c63ae232 --- /dev/null +++ b/spring-groovy-config/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + com.baeldung + spring-groovy-config + 0.0.1-SNAPSHOT + jar + spring-groovy-config + http://maven.apache.org + + UTF-8 + + + + + maven-compiler-plugin + + 3.1 + + groovy-eclipse-compiler + + + + org.codehaus.groovy + groovy-eclipse-compiler + 2.9.1-01 + + + + org.codehaus.groovy + groovy-eclipse-batch + 2.3.7-01 + + + + + + + + org.codehaus.groovy + groovy-all + 2.4.8 + + + junit + junit + 4.12 + test + + + org.springframework + spring-context + 4.3.6.RELEASE + + + org.springframework + spring-core + 4.3.6.RELEASE + + + org.springframework + spring-test + 4.3.6.RELEASE + + + + diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java new file mode 100644 index 0000000000..ec8987f387 --- /dev/null +++ b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java @@ -0,0 +1,18 @@ +package com.baeldung.spring_groovy_config; + +import org.springframework.stereotype.Component; + +import com.baeldung.spring_groovy_config.GroovyClass; + +@Component +public class ClassWithRef { + private GroovyClass myClass = null; + + public void setMyClass(GroovyClass myClass){ + this.myClass = myClass; + } + + public GroovyClass getMyClass(){ + return this.myClass; + } +} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy new file mode 100644 index 0000000000..2a1ef6a2c5 --- /dev/null +++ b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy @@ -0,0 +1,9 @@ +package com.baeldung.spring_groovy_config + +class GroovyClass { + int groovyInt = 0 + + def getGroovyInt(){ + return groovyInt + } +} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java new file mode 100644 index 0000000000..ac85963cf7 --- /dev/null +++ b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java @@ -0,0 +1,14 @@ +package com.baeldung.spring_groovy_config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericGroovyApplicationContext; + +public class MainApp { + public static void main(String[] args){ + ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyTestWithRefBean.groovy"); + ClassWithRef test = (ClassWithRef) context.getBean("classWithRef"); + } +} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java new file mode 100644 index 0000000000..75b6b5fc5b --- /dev/null +++ b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java @@ -0,0 +1,22 @@ +package com.baeldung.spring_groovy_config; + +import org.springframework.stereotype.Component; + +@Component +public class TestClass { + private String testString; + private double testDouble; + + public TestClass(String testString, double testDouble){ + this.testString = testString; + this.testDouble = testDouble; + } + + public String getTestString(){ + return this.testString; + } + + public double getTestDouble(){ + return this.testDouble; + } +} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java new file mode 100644 index 0000000000..d2387c87e5 --- /dev/null +++ b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java @@ -0,0 +1,26 @@ +package com.baeldung.spring_groovy_config; + +import org.springframework.stereotype.Component; + +@Component +public class TestClassB { + private String testStringB; + private int testIntB; + + public void setTestStringB(String testStringB){ + this.testStringB = testStringB; + } + + public String getTestStringB(){ + return this.testStringB; + } + + + public void setTestIntB(int testIntB){ + this.testIntB = testIntB; + } + + public int getTestIntB(){ + return this.testIntB; + } +} diff --git a/spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java b/spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java new file mode 100644 index 0000000000..93de401e0c --- /dev/null +++ b/spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java @@ -0,0 +1,57 @@ +package com.baeldung.spring_groovy_config; + +import com.baeldung.spring_groovy_config.*; +import groovy.lang.Binding; +import junit.framework.TestCase; +import static org.junit.Assert.*; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.context.support.GenericGroovyApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +/** + * Spring Framework Tests for Groovy. + */ +public class AppTest{ + + @Test + public void testSimple(){ + ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyContextWithConstructor.groovy"); + TestClass test = (TestClass) context.getBean("testClass"); + assertNotNull(test.getTestString()); + assertEquals(test.getTestString(),"Test String"); + assertTrue(test.getTestDouble() == 10.2); + + String testString = context.getBean("testString",String.class); + assertEquals(testString,"Test String"); + } + + + @Test + public void testProperties(){ + ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyPropConfig.groovy"); + TestClassB test = (TestClassB) context.getBean("testClassB"); + assertNotNull(test.getTestStringB()); + assertEquals(test.getTestStringB(),"Test String"); + assertTrue(test.getTestIntB() == 10); + } + + @Test + public void testPropertiesWithClosure(){ + ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyPropConfigWithClosure.groovy"); + TestClassB test = (TestClassB) context.getBean("testClassB"); + assertNotNull(test.getTestStringB()); + assertEquals(test.getTestStringB(),"Test String"); + assertTrue(test.getTestIntB() == 10); + } + + + @Test + public void testWithRef(){ + ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyTestWithRefBean.groovy"); + ClassWithRef test = (ClassWithRef) context.getBean("classWithRef"); + assertEquals(test.getMyClass().getGroovyInt(),5); + } +} From 3371c9047a3d7d704ff0583dd4551a40be89183e Mon Sep 17 00:00:00 2001 From: Nancy Bosecker Date: Mon, 20 Feb 2017 17:28:16 -0800 Subject: [PATCH 170/192] Moved code to apache-solrj from spring-data-solr, updated code to 6.4.0 solrj, fixed dependencies in both modules (#1196) * Solr w Apache SolrJ * Solr w Apache SolrJ * updated test names and moved add to @before method * create apache-solrj module, moved code from spring-data-solr --- apache-solrj/pom.xml | 50 +++++++++++++++++++ .../solrjava/SolrJavaIntegration.java | 43 ++++++++++++++++ .../solrjava/SolrJavaIntegrationTest.java | 24 +++------ pom.xml | 1 + spring-data-solr/pom.xml | 6 --- 5 files changed, 100 insertions(+), 24 deletions(-) create mode 100644 apache-solrj/pom.xml create mode 100644 apache-solrj/src/main/java/com/baeldung/solrjava/SolrJavaIntegration.java rename {spring-data-solr => apache-solrj}/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java (64%) diff --git a/apache-solrj/pom.xml b/apache-solrj/pom.xml new file mode 100644 index 0000000000..74daeae55c --- /dev/null +++ b/apache-solrj/pom.xml @@ -0,0 +1,50 @@ + + 4.0.0 + com.baeldung + apache-solrj + 0.0.1-SNAPSHOT + jar + apache-solrj + + + 4.12 + 2.19.1 + + + + + org.apache.solr + solr-solrj + 6.4.0 + + + junit + junit + ${junit.version} + test + + + + + + + maven-compiler-plugin + 2.3.2 + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 1.8 + 1.8 + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + \ No newline at end of file diff --git a/apache-solrj/src/main/java/com/baeldung/solrjava/SolrJavaIntegration.java b/apache-solrj/src/main/java/com/baeldung/solrjava/SolrJavaIntegration.java new file mode 100644 index 0000000000..f2d21f0993 --- /dev/null +++ b/apache-solrj/src/main/java/com/baeldung/solrjava/SolrJavaIntegration.java @@ -0,0 +1,43 @@ +package com.baeldung.solrjava; + +import java.io.IOException; + +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.impl.HttpSolrClient; +import org.apache.solr.client.solrj.impl.XMLResponseParser; +import org.apache.solr.common.SolrInputDocument; + +public class SolrJavaIntegration { + + private HttpSolrClient solrClient; + + public SolrJavaIntegration(String clientUrl) { + + solrClient = new HttpSolrClient.Builder(clientUrl).build(); + solrClient.setParser(new XMLResponseParser()); + } + + public void addSolrDocument(String documentId, String itemName, String itemPrice) throws SolrServerException, IOException { + + SolrInputDocument document = new SolrInputDocument(); + document.addField("id", documentId); + document.addField("name", itemName); + document.addField("price", itemPrice); + solrClient.add(document); + solrClient.commit(); + } + + public void deleteSolrDocument(String documentId) throws SolrServerException, IOException { + + solrClient.deleteById(documentId); + solrClient.commit(); + } + + protected HttpSolrClient getSolrClient() { + return solrClient; + } + + protected void setSolrClient(HttpSolrClient solrClient) { + this.solrClient = solrClient; + } +} diff --git a/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java b/apache-solrj/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java similarity index 64% rename from spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java rename to apache-solrj/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java index ce90ccaf16..22f9eae8ee 100644 --- a/spring-data-solr/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java +++ b/apache-solrj/src/test/java/com/baeldung/solrjava/SolrJavaIntegrationTest.java @@ -6,32 +6,21 @@ import java.io.IOException; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.impl.HttpSolrClient; -import org.apache.solr.client.solrj.impl.XMLResponseParser; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; -import org.apache.solr.common.SolrInputDocument; import org.junit.Before; import org.junit.Test; public class SolrJavaIntegrationTest { - private HttpSolrClient solr; - private SolrInputDocument document; + private SolrJavaIntegration solrJavaIntegration; @Before public void setUp() throws Exception { - solr = new HttpSolrClient("http://localhost:8983/solr/bigboxstore"); - solr.setParser(new XMLResponseParser()); - - document = new SolrInputDocument(); - document.addField("id", "123456"); - document.addField("name", "Kenmore Dishwasher"); - document.addField("price", "599.99"); - solr.add(document); - solr.commit(); + solrJavaIntegration = new SolrJavaIntegration("http://localhost:8983/solr/bigboxstore"); + solrJavaIntegration.addSolrDocument("123456", "Kenmore Dishwasher", "599.99"); } @Test @@ -41,7 +30,7 @@ public class SolrJavaIntegrationTest { query.set("q", "id:123456"); QueryResponse response = null; - response = solr.query(query); + response = solrJavaIntegration.getSolrClient().query(query); SolrDocumentList docList = response.getResults(); assertEquals(docList.getNumFound(), 1); @@ -55,14 +44,13 @@ public class SolrJavaIntegrationTest { @Test public void whenDelete_thenVerifyDeleted() throws SolrServerException, IOException { - solr.deleteById("123456"); - solr.commit(); + solrJavaIntegration.deleteSolrDocument("123456"); SolrQuery query = new SolrQuery(); query.set("q", "id:123456"); QueryResponse response = null; - response = solr.query(query); + response = solrJavaIntegration.getSolrClient().query(query); SolrDocumentList docList = response.getResults(); assertEquals(docList.getNumFound(), 0); diff --git a/pom.xml b/pom.xml index 82df776044..aa58b1d2e9 100644 --- a/pom.xml +++ b/pom.xml @@ -194,6 +194,7 @@ struts2 apache-velocity + apache-solrj diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml index 2aa9f86a96..e43b3ff774 100644 --- a/spring-data-solr/pom.xml +++ b/spring-data-solr/pom.xml @@ -51,12 +51,6 @@ ${spring.version} test
- From a75ed7e70ac5f7ec46b372661d015200da20a9c6 Mon Sep 17 00:00:00 2001 From: Daniele Demichelis Date: Tue, 21 Feb 2017 04:38:52 +0100 Subject: [PATCH 171/192] BAEL-554 Spring Remoting with Hessian and Burlap (#1166) * Burlap & Hessian server added * Burlap & Hessian client work * Fixed main * Fixed formatting --- spring-remoting/pom.xml | 12 +++--- .../remoting-hessian-burlap/client/pom.xml | 35 ++++++++++++++++++ .../com/baeldung/client/BurlapClient.java | 28 ++++++++++++++ .../com/baeldung/client/HessianClient.java | 28 ++++++++++++++ .../remoting-hessian-burlap/pom.xml | 20 ++++++++++ .../remoting-hessian-burlap/server/pom.xml | 30 +++++++++++++++ .../main/java/com/baeldung/server/Server.java | 37 +++++++++++++++++++ 7 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 spring-remoting/remoting-hessian-burlap/client/pom.xml create mode 100644 spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/BurlapClient.java create mode 100644 spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/HessianClient.java create mode 100644 spring-remoting/remoting-hessian-burlap/pom.xml create mode 100644 spring-remoting/remoting-hessian-burlap/server/pom.xml create mode 100644 spring-remoting/remoting-hessian-burlap/server/src/main/java/com/baeldung/server/Server.java diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index a43dd52a3e..52d670a726 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -3,16 +3,17 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + com.baeldung + spring-remoting + pom + 1.0-SNAPSHOT + spring-remoting + Parent for all projects related to Spring Remoting. org.springframework.boot spring-boot-starter-parent 1.4.3.RELEASE - com.baeldung - spring-remoting - 1.0-SNAPSHOT - Parent for all projects related to Spring Remoting. - pom 1.8 @@ -34,6 +35,7 @@ remoting-http + remoting-hessian-burlap \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/client/pom.xml b/spring-remoting/remoting-hessian-burlap/client/pom.xml new file mode 100644 index 0000000000..11250e63d2 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/client/pom.xml @@ -0,0 +1,35 @@ + + + + remoting-hessian-burlap + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + spring-remoting-hessian-burlap-client + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + ${project.groupId} + api + + + com.caucho + hessian + 4.0.38 + + + \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/BurlapClient.java b/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/BurlapClient.java new file mode 100644 index 0000000000..477c29eb26 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/BurlapClient.java @@ -0,0 +1,28 @@ +package com.baeldung.client; + +import com.baeldung.api.BookingException; +import com.baeldung.api.CabBookingService; +import org.springframework.boot.SpringApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.caucho.BurlapProxyFactoryBean; + +import static java.lang.System.out; + +@Configuration +public class BurlapClient { + + @Bean + public BurlapProxyFactoryBean burlapInvoker() { + BurlapProxyFactoryBean invoker = new BurlapProxyFactoryBean(); + invoker.setServiceUrl("http://localhost:8080/b_booking"); + invoker.setServiceInterface(CabBookingService.class); + return invoker; + } + + public static void main(String[] args) throws BookingException { + CabBookingService service = SpringApplication.run(BurlapClient.class, args).getBean(CabBookingService.class); + out.println(service.bookRide("13 Seagate Blvd, Key Largo, FL 33037")); + } + +} diff --git a/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/HessianClient.java b/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/HessianClient.java new file mode 100644 index 0000000000..b5f366094e --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/HessianClient.java @@ -0,0 +1,28 @@ +package com.baeldung.client; + +import com.baeldung.api.BookingException; +import com.baeldung.api.CabBookingService; +import org.springframework.boot.SpringApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.caucho.HessianProxyFactoryBean; + +import static java.lang.System.out; + +@Configuration +public class HessianClient { + + @Bean + public HessianProxyFactoryBean hessianInvoker() { + HessianProxyFactoryBean invoker = new HessianProxyFactoryBean(); + invoker.setServiceUrl("http://localhost:8080/booking"); + invoker.setServiceInterface(CabBookingService.class); + return invoker; + } + + public static void main(String[] args) throws BookingException { + CabBookingService service = SpringApplication.run(HessianClient.class, args).getBean(CabBookingService.class); + out.println(service.bookRide("13 Seagate Blvd, Key Largo, FL 33037")); + } + +} diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml new file mode 100644 index 0000000000..682e460880 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/pom.xml @@ -0,0 +1,20 @@ + + + + spring-remoting + com.baeldung + 1.0-SNAPSHOT + + pom + + server + client + + 4.0.0 + + remoting-hessian-burlap + + + \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/server/pom.xml b/spring-remoting/remoting-hessian-burlap/server/pom.xml new file mode 100644 index 0000000000..c97092b247 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/server/pom.xml @@ -0,0 +1,30 @@ + + + + remoting-hessian-burlap + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + remoting-hessian-burlap-server + + + + com.baeldung + spring-remoting-http-server + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-web + + + com.caucho + hessian + 4.0.38 + + + \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/server/src/main/java/com/baeldung/server/Server.java b/spring-remoting/remoting-hessian-burlap/server/src/main/java/com/baeldung/server/Server.java new file mode 100644 index 0000000000..9b7e463871 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/server/src/main/java/com/baeldung/server/Server.java @@ -0,0 +1,37 @@ +package com.baeldung.server; + +import com.baeldung.api.CabBookingService; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.caucho.BurlapServiceExporter; +import org.springframework.remoting.caucho.HessianServiceExporter; +import org.springframework.remoting.support.RemoteExporter; + +@Configuration @ComponentScan @EnableAutoConfiguration public class Server { + + @Bean CabBookingService bookingService() { + return new CabBookingServiceImpl(); + } + + @Bean(name = "/booking") RemoteExporter hessianService(CabBookingService service) { + HessianServiceExporter exporter = new HessianServiceExporter(); + exporter.setService(bookingService()); + exporter.setServiceInterface(CabBookingService.class); + return exporter; + } + + @Bean(name = "/b_booking") RemoteExporter burlapService(CabBookingService service) { + BurlapServiceExporter exporter = new BurlapServiceExporter(); + exporter.setService(bookingService()); + exporter.setServiceInterface(CabBookingService.class); + return exporter; + } + + public static void main(String[] args) { + SpringApplication.run(Server.class, args); + } + +} \ No newline at end of file From d3d11a18f3d05e37ddd284cb6b4b2c06283c7a0f Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Tue, 21 Feb 2017 07:35:07 +0100 Subject: [PATCH 172/192] Revert "Spring Groovy Config with fixed pom" (#1209) --- .../com/baeldung/annotationinjection/App.java | 48 ------------- .../annotationinjection/AppConfig.java | 23 ------- .../baeldung/annotationinjection/AppTest.java | 52 -------------- .../annotationinjection/AutowireObject.java | 6 -- .../annotationinjection/ImportConfig.java | 20 ------ .../annotationinjection/InjectedClass.java | 39 ----------- spring-groovy-config/.gitignore | 1 - .../org.eclipse.core.resources.prefs | 4 -- .../.settings/org.eclipse.jdt.core.prefs | 5 -- .../org.eclipse.jdt.groovy.core.prefs | 2 - .../.settings/org.eclipse.m2e.core.prefs | 4 -- .../groovyContextWithConstructor.groovy | 9 --- .../config/groovyPropConfig.groovy | 5 -- .../config/groovyPropConfigWithClosure.groovy | 8 --- .../config/groovyTestWithRefBean.groovy | 10 --- spring-groovy-config/pom.xml | 67 ------------------- .../spring_groovy_config/ClassWithRef.java | 18 ----- .../spring_groovy_config/GroovyClass.groovy | 9 --- .../spring_groovy_config/MainApp.java | 14 ---- .../spring_groovy_config/TestClass.java | 22 ------ .../spring_groovy_config/TestClassB.java | 26 ------- .../spring_groovy_config/AppTest.java | 57 ---------------- 22 files changed, 449 deletions(-) delete mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/App.java delete mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java delete mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java delete mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java delete mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java delete mode 100644 spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java delete mode 100644 spring-groovy-config/.gitignore delete mode 100644 spring-groovy-config/.settings/org.eclipse.core.resources.prefs delete mode 100644 spring-groovy-config/.settings/org.eclipse.jdt.core.prefs delete mode 100644 spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs delete mode 100644 spring-groovy-config/.settings/org.eclipse.m2e.core.prefs delete mode 100644 spring-groovy-config/config/groovyContextWithConstructor.groovy delete mode 100644 spring-groovy-config/config/groovyPropConfig.groovy delete mode 100644 spring-groovy-config/config/groovyPropConfigWithClosure.groovy delete mode 100644 spring-groovy-config/config/groovyTestWithRefBean.groovy delete mode 100644 spring-groovy-config/pom.xml delete mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java delete mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy delete mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java delete mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java delete mode 100644 spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java delete mode 100644 spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/App.java b/spring-core/src/main/java/com/baeldung/annotationinjection/App.java deleted file mode 100644 index dc9560286d..0000000000 --- a/spring-core/src/main/java/com/baeldung/annotationinjection/App.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.java_bean_injection; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.java_bean_injection.*; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - - -import junit.framework.TestResult; -import junit.framework.TestFailure; - -import java.util.Enumeration; - - -/** - * Bean Injection Test Application - * - */ -public class App -{ - public static void main( String[] args ) - { - - TestResult result = new TestResult(); - AppTest.suite().run(result); - System.out.println(String.format("Tests: %d",result.runCount())); - System.out.println(String.format("Errors: %d",result.errorCount())); - System.out.println(String.format("Failures: %d",result.failureCount())); - if(result.failureCount() > 0){ - Enumeration failures = result.failures(); - int failNum = 0; - TestFailure failure = null; - while(failures.hasMoreElements()){ - failure = failures.nextElement(); - - System.out.println(failure.exceptionMessage()); - System.out.println(String.format("Test Failure %d\n",failNum)); - System.out.println(failure.trace()); - System.out.print("\n"); - } - } - - } -} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java b/spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java deleted file mode 100644 index 138bda6b1b..0000000000 --- a/spring-core/src/main/java/com/baeldung/annotationinjection/AppConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.java_bean_injection; - -import org.springframework.beans.factory.annotation.*; -import org.springframework.context.annotation.*; -import org.springframework.stereotype.*; - -import com.baeldung.java_bean_injection.*; - -@Configuration -@PropertySource(value="classpath:inject.properties") -@Import(ImportConfig.class) -public class AppConfig { - @Value("${contructor.arg1}") String constructorArg; - - @Bean - public InjectedClass injectedClass(){ - InjectedClass ic = new InjectedClass(constructorArg); - ic.setMyInt(10); - ic.setTestString("test"); - return ic; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java b/spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java deleted file mode 100644 index fa7b46f06b..0000000000 --- a/spring-core/src/main/java/com/baeldung/annotationinjection/AppTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.java_bean_injection; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.java_bean_injection.*; - -import java.io.File; -import java.util.Scanner; - -/** - * Unit test for simple App. - */ -public class AppTest extends TestCase{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(); - context.register(AppConfig.class); - context.refresh(); - InjectedClass injectedClass = (InjectedClass) context.getBean(InjectedClass.class); - assertTrue(injectedClass.getMyInt() == 10); - assertTrue(injectedClass.getTestString().equals("test")); - assertNotNull(injectedClass.obj); - assertTrue(injectedClass.myConstructorArg.equals("test")); - } -} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java b/spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java deleted file mode 100644 index df5859f0af..0000000000 --- a/spring-core/src/main/java/com/baeldung/annotationinjection/AutowireObject.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.java_bean_injection; - - -public class AutowireObject { - -} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java b/spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java deleted file mode 100644 index e37d94931b..0000000000 --- a/spring-core/src/main/java/com/baeldung/annotationinjection/ImportConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.java_bean_injection; - -import org.springframework.context.annotation.*; - -import com.baeldung.java_bean_injection.*; - -@Configuration -public class ImportConfig { - - @Bean(name="autobean") - public AutowireObject autowireObject(){ - return new AutowireObject(); - } - - - @Bean(name="autobean2") - public AutowireObject autowireObject2(){ - return new AutowireObject(); - } -} diff --git a/spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java b/spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java deleted file mode 100644 index 55fe733db5..0000000000 --- a/spring-core/src/main/java/com/baeldung/annotationinjection/InjectedClass.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.java_bean_injection; - -import org.springframework.beans.factory.annotation.*; -import org.springframework.context.annotation.*; - -import com.baeldung.java_bean_injection.*; - - -public class InjectedClass { - private int myInt; - private String testString; - String myConstructorArg; - - - @Autowired - @Qualifier("autobean") - AutowireObject obj; - - public InjectedClass(String constArg){ - this.myConstructorArg = constArg; - } - - public void setMyInt(int myInt){ - this.myInt = myInt; - } - - public void setTestString(String testString){ - this.testString = testString; - } - - public int getMyInt(){ - return this.myInt; - } - - public String getTestString(){ - return this.testString; - } - -} diff --git a/spring-groovy-config/.gitignore b/spring-groovy-config/.gitignore deleted file mode 100644 index b83d22266a..0000000000 --- a/spring-groovy-config/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/spring-groovy-config/.settings/org.eclipse.core.resources.prefs b/spring-groovy-config/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f9fe34593f..0000000000 --- a/spring-groovy-config/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/spring-groovy-config/.settings/org.eclipse.jdt.core.prefs b/spring-groovy-config/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index abec6ca389..0000000000 --- a/spring-groovy-config/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs b/spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs deleted file mode 100644 index ae98feaa79..0000000000 --- a/spring-groovy-config/.settings/org.eclipse.jdt.groovy.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -groovy.compiler.level=24 diff --git a/spring-groovy-config/.settings/org.eclipse.m2e.core.prefs b/spring-groovy-config/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1cb..0000000000 --- a/spring-groovy-config/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/spring-groovy-config/config/groovyContextWithConstructor.groovy b/spring-groovy-config/config/groovyContextWithConstructor.groovy deleted file mode 100644 index dbde5f3822..0000000000 --- a/spring-groovy-config/config/groovyContextWithConstructor.groovy +++ /dev/null @@ -1,9 +0,0 @@ -import com.baeldung.spring_groovy_config.TestClass - -beans{ - testString String, 'Test String' - testClass(TestClass){ - beanDefinition -> - beanDefinition.constructorArgs = ["Test String",10.2] - } -} \ No newline at end of file diff --git a/spring-groovy-config/config/groovyPropConfig.groovy b/spring-groovy-config/config/groovyPropConfig.groovy deleted file mode 100644 index 08d3acf354..0000000000 --- a/spring-groovy-config/config/groovyPropConfig.groovy +++ /dev/null @@ -1,5 +0,0 @@ -import com.baeldung.spring_groovy_config.TestClassB - -beans{ - testClassB(TestClassB,testStringB:"Test String",testIntB:10.2) -} \ No newline at end of file diff --git a/spring-groovy-config/config/groovyPropConfigWithClosure.groovy b/spring-groovy-config/config/groovyPropConfigWithClosure.groovy deleted file mode 100644 index 3ca306bdd7..0000000000 --- a/spring-groovy-config/config/groovyPropConfigWithClosure.groovy +++ /dev/null @@ -1,8 +0,0 @@ -import com.baeldung.spring_groovy_config.TestClassB - -beans{ - testClassB(TestClassB){ - testStringB = "Test String" - testIntB = 10 - } -} \ No newline at end of file diff --git a/spring-groovy-config/config/groovyTestWithRefBean.groovy b/spring-groovy-config/config/groovyTestWithRefBean.groovy deleted file mode 100644 index d079480d46..0000000000 --- a/spring-groovy-config/config/groovyTestWithRefBean.groovy +++ /dev/null @@ -1,10 +0,0 @@ -import com.baeldung.spring_groovy_config.GroovyClass -import com.baeldung.spring_groovy_config.ClassWithRef - -beans{ - groovyClass(GroovyClass, groovyInt:5) - classWithRef(ClassWithRef){ - myClass = groovyClass - } - -} \ No newline at end of file diff --git a/spring-groovy-config/pom.xml b/spring-groovy-config/pom.xml deleted file mode 100644 index f6c63ae232..0000000000 --- a/spring-groovy-config/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - com.baeldung - spring-groovy-config - 0.0.1-SNAPSHOT - jar - spring-groovy-config - http://maven.apache.org - - UTF-8 - - - - - maven-compiler-plugin - - 3.1 - - groovy-eclipse-compiler - - - - org.codehaus.groovy - groovy-eclipse-compiler - 2.9.1-01 - - - - org.codehaus.groovy - groovy-eclipse-batch - 2.3.7-01 - - - - - - - - org.codehaus.groovy - groovy-all - 2.4.8 - - - junit - junit - 4.12 - test - - - org.springframework - spring-context - 4.3.6.RELEASE - - - org.springframework - spring-core - 4.3.6.RELEASE - - - org.springframework - spring-test - 4.3.6.RELEASE - - - - diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java deleted file mode 100644 index ec8987f387..0000000000 --- a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/ClassWithRef.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.spring_groovy_config; - -import org.springframework.stereotype.Component; - -import com.baeldung.spring_groovy_config.GroovyClass; - -@Component -public class ClassWithRef { - private GroovyClass myClass = null; - - public void setMyClass(GroovyClass myClass){ - this.myClass = myClass; - } - - public GroovyClass getMyClass(){ - return this.myClass; - } -} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy deleted file mode 100644 index 2a1ef6a2c5..0000000000 --- a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/GroovyClass.groovy +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.spring_groovy_config - -class GroovyClass { - int groovyInt = 0 - - def getGroovyInt(){ - return groovyInt - } -} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java deleted file mode 100644 index ac85963cf7..0000000000 --- a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/MainApp.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.spring_groovy_config; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.GenericGroovyApplicationContext; - -public class MainApp { - public static void main(String[] args){ - ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyTestWithRefBean.groovy"); - ClassWithRef test = (ClassWithRef) context.getBean("classWithRef"); - } -} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java deleted file mode 100644 index 75b6b5fc5b..0000000000 --- a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClass.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.spring_groovy_config; - -import org.springframework.stereotype.Component; - -@Component -public class TestClass { - private String testString; - private double testDouble; - - public TestClass(String testString, double testDouble){ - this.testString = testString; - this.testDouble = testDouble; - } - - public String getTestString(){ - return this.testString; - } - - public double getTestDouble(){ - return this.testDouble; - } -} diff --git a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java b/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java deleted file mode 100644 index d2387c87e5..0000000000 --- a/spring-groovy-config/src/main/java/com/baeldung/spring_groovy_config/TestClassB.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.spring_groovy_config; - -import org.springframework.stereotype.Component; - -@Component -public class TestClassB { - private String testStringB; - private int testIntB; - - public void setTestStringB(String testStringB){ - this.testStringB = testStringB; - } - - public String getTestStringB(){ - return this.testStringB; - } - - - public void setTestIntB(int testIntB){ - this.testIntB = testIntB; - } - - public int getTestIntB(){ - return this.testIntB; - } -} diff --git a/spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java b/spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java deleted file mode 100644 index 93de401e0c..0000000000 --- a/spring-groovy-config/src/test/java/com/baeldung/spring_groovy_config/AppTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.spring_groovy_config; - -import com.baeldung.spring_groovy_config.*; -import groovy.lang.Binding; -import junit.framework.TestCase; -import static org.junit.Assert.*; -import org.junit.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.support.FileSystemXmlApplicationContext; -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.context.support.GenericGroovyApplicationContext; -import org.springframework.core.env.ConfigurableEnvironment; -/** - * Spring Framework Tests for Groovy. - */ -public class AppTest{ - - @Test - public void testSimple(){ - ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyContextWithConstructor.groovy"); - TestClass test = (TestClass) context.getBean("testClass"); - assertNotNull(test.getTestString()); - assertEquals(test.getTestString(),"Test String"); - assertTrue(test.getTestDouble() == 10.2); - - String testString = context.getBean("testString",String.class); - assertEquals(testString,"Test String"); - } - - - @Test - public void testProperties(){ - ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyPropConfig.groovy"); - TestClassB test = (TestClassB) context.getBean("testClassB"); - assertNotNull(test.getTestStringB()); - assertEquals(test.getTestStringB(),"Test String"); - assertTrue(test.getTestIntB() == 10); - } - - @Test - public void testPropertiesWithClosure(){ - ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyPropConfigWithClosure.groovy"); - TestClassB test = (TestClassB) context.getBean("testClassB"); - assertNotNull(test.getTestStringB()); - assertEquals(test.getTestStringB(),"Test String"); - assertTrue(test.getTestIntB() == 10); - } - - - @Test - public void testWithRef(){ - ApplicationContext context = new GenericGroovyApplicationContext("file:config/groovyTestWithRefBean.groovy"); - ClassWithRef test = (ClassWithRef) context.getBean("classWithRef"); - assertEquals(test.getMyClass().getGroovyInt(),5); - } -} From 12193e96fa8b39a8444ea97586ffa13ee8730e30 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 21 Feb 2017 17:29:29 +0100 Subject: [PATCH 173/192] BAEL-633 proper formatting and test naming --- .../src/main/java/com/baeldung/cglib/mixin/Class1.java | 8 ++++---- .../src/main/java/com/baeldung/cglib/mixin/Class2.java | 8 ++++---- .../main/java/com/baeldung/cglib/mixin/Interface1.java | 2 +- .../main/java/com/baeldung/cglib/mixin/Interface2.java | 2 +- .../com/baeldung/cglib/proxy/BeanGeneratorTest.java | 10 +++++++--- .../test/java/com/baeldung/cglib/proxy/MixinTest.java | 2 +- .../baeldung/cglib/proxy/PersonServiceProxyTest.java | 6 +++--- pom.xml | 2 +- 8 files changed, 22 insertions(+), 18 deletions(-) diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java index 932951b4cd..fa0cba5b78 100644 --- a/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java @@ -1,8 +1,8 @@ package com.baeldung.cglib.mixin; public class Class1 implements Interface1 { - @Override - public String first() { - return "first behaviour"; - } + @Override + public String first() { + return "first behaviour"; + } } \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java index b2b922a05d..0db0620ab8 100644 --- a/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java @@ -1,8 +1,8 @@ package com.baeldung.cglib.mixin; public class Class2 implements Interface2 { - @Override - public String second() { - return "second behaviour"; - } + @Override + public String second() { + return "second behaviour"; + } } \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java index 5aab155c1d..56ad679cad 100644 --- a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java @@ -1,5 +1,5 @@ package com.baeldung.cglib.mixin; public interface Interface1 { - String first(); + String first(); } \ No newline at end of file diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java index 7fd2e78608..0dfb8737ab 100644 --- a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java +++ b/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java @@ -1,5 +1,5 @@ package com.baeldung.cglib.mixin; public interface Interface2 { - String second(); + String second(); } \ No newline at end of file diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java index 32706409c5..67214cd32d 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java @@ -11,18 +11,22 @@ import static junit.framework.TestCase.assertEquals; public class BeanGeneratorTest { @Test - public void testBeanGenerator() throws Exception { + public void givenBeanCreator_whenAddPropery_classShouldHaveFieldValue() throws Exception { //given BeanGenerator beanGenerator = new BeanGenerator(); //when beanGenerator.addProperty("name", String.class); Object myBean = beanGenerator.create(); - Method setter = myBean.getClass().getMethod("setName", String.class); + Method setter = myBean + .getClass() + .getMethod("setName", String.class); setter.invoke(myBean, "some string value set by a cglib"); //then - Method getter = myBean.getClass().getMethod("getName"); + Method getter = myBean + .getClass() + .getMethod("getName"); assertEquals("some string value set by a cglib", getter.invoke(myBean)); } } diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java index ac4b50af4c..186c66aa42 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java @@ -9,7 +9,7 @@ import static junit.framework.TestCase.assertEquals; public class MixinTest { @Test - public void testMixinBehaviour() throws Exception { + public void givenTwoClasses_whenMixtThemIntoOne_mixinShouldHaveMethodsFromBothClasses() throws Exception { //when Mixin mixin = Mixin.create( new Class[]{Interface1.class, Interface2.class, MixinInterface.class}, diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java index e0ad017538..6208ed12b8 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java @@ -9,7 +9,7 @@ import static org.junit.Assert.assertEquals; public class PersonServiceProxyTest { @Test - public void testService() { + public void givenPersonService_whenSayHello_shouldReturnResult() { //given PersonService personService = new PersonService(); @@ -21,7 +21,7 @@ public class PersonServiceProxyTest { } @Test - public void testFixedValue() throws Exception { + public void givenEnhancerProxy_whenExtendPersonService_shouldInterceptMethod() throws Exception { //given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); @@ -36,7 +36,7 @@ public class PersonServiceProxyTest { } @Test - public void testMethodInterceptor() throws Exception { + public void givenEnhancer_whenExecuteMethodOnProxy_shouldInterceptOnlyStringReturnTypeMethod() throws Exception { //given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); diff --git a/pom.xml b/pom.xml index a32a204304..52e00edbb4 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ autovalue cdi + cglib core-java couchbase-sdk @@ -192,7 +193,6 @@ xstream struts2 - cglib apache-velocity From 72d5bfca82ffe4a4f98612e3e7da39a11558438e Mon Sep 17 00:00:00 2001 From: Adam InTae Gerard Date: Tue, 21 Feb 2017 18:15:35 -0600 Subject: [PATCH 174/192] BAEL-9 #3 (#1207) * BAEL-9 #3 * pom.xml fix --- pom.xml | 1 + spring-boot-servlet/.gitignore | 4 ++ spring-boot-servlet/README.md | 2 + spring-boot-servlet/pom.xml | 55 +++++++++++++++++++ .../src/main/java/META-INF/MANIFEST.MF | 2 + .../java/com/baeldung/ApplicationMain.java | 19 +++++++ .../configuration/WebAppInitializer.java | 32 +++++++++++ .../configuration/WebMvcConfigure.java | 40 ++++++++++++++ .../java/com/baeldung/props/Constants.java | 20 +++++++ .../com/baeldung/props/PropertyLoader.java | 27 +++++++++ .../baeldung/props/PropertySourcesLoader.java | 23 ++++++++ .../servlets/GenericCustomServlet.java | 18 ++++++ .../servlets/javaee/AnnotationServlet.java | 20 +++++++ .../servlets/javaee/EEWebXmlServlet.java | 20 +++++++ .../SpringRegistrationBeanServlet.java | 19 +++++++ .../embedded/EmbeddedTomcatExample.java | 16 ++++++ .../src/main/resources/application.properties | 10 ++++ .../src/main/resources/custom.properties | 4 ++ .../src/main/webapp/WEB-INF/context.xml | 12 ++++ .../src/main/webapp/WEB-INF/dispatcher.xml | 16 ++++++ .../src/main/webapp/WEB-INF/web.xml | 40 ++++++++++++++ .../src/main/webapp/annotationservlet.jsp | 1 + spring-boot-servlet/src/main/webapp/index.jsp | 1 + 23 files changed, 402 insertions(+) create mode 100644 spring-boot-servlet/.gitignore create mode 100644 spring-boot-servlet/README.md create mode 100644 spring-boot-servlet/pom.xml create mode 100644 spring-boot-servlet/src/main/java/META-INF/MANIFEST.MF create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/ApplicationMain.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/configuration/WebAppInitializer.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/configuration/WebMvcConfigure.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/props/Constants.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/props/PropertyLoader.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/props/PropertySourcesLoader.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/servlets/GenericCustomServlet.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/AnnotationServlet.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/EEWebXmlServlet.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/SpringRegistrationBeanServlet.java create mode 100644 spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/embedded/EmbeddedTomcatExample.java create mode 100644 spring-boot-servlet/src/main/resources/application.properties create mode 100644 spring-boot-servlet/src/main/resources/custom.properties create mode 100644 spring-boot-servlet/src/main/webapp/WEB-INF/context.xml create mode 100644 spring-boot-servlet/src/main/webapp/WEB-INF/dispatcher.xml create mode 100644 spring-boot-servlet/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-boot-servlet/src/main/webapp/annotationservlet.jsp create mode 100644 spring-boot-servlet/src/main/webapp/index.jsp diff --git a/pom.xml b/pom.xml index aa58b1d2e9..924bd96ade 100644 --- a/pom.xml +++ b/pom.xml @@ -109,6 +109,7 @@ spring-autowire spring-batch spring-boot + spring-boot-servlet spring-cloud-data-flow spring-cloud spring-core diff --git a/spring-boot-servlet/.gitignore b/spring-boot-servlet/.gitignore new file mode 100644 index 0000000000..60be5b80aa --- /dev/null +++ b/spring-boot-servlet/.gitignore @@ -0,0 +1,4 @@ +/target/ +.settings/ +.classpath +.project diff --git a/spring-boot-servlet/README.md b/spring-boot-servlet/README.md new file mode 100644 index 0000000000..262a11fc36 --- /dev/null +++ b/spring-boot-servlet/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/how-to-register-a-servlet-in-a-java-web-application/) \ No newline at end of file diff --git a/spring-boot-servlet/pom.xml b/spring-boot-servlet/pom.xml new file mode 100644 index 0000000000..3818e3468f --- /dev/null +++ b/spring-boot-servlet/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + com.baeldung + spring-boot-servlet + 0.0.1-SNAPSHOT + war + spring-boot-servlet + + + org.springframework.boot + spring-boot-dependencies + 1.5.1.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + org.apache.tomcat.embed + tomcat-embed-core + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-jasper + ${tomcat.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + UTF-8 + 1.8 + 8.5.11 + + + diff --git a/spring-boot-servlet/src/main/java/META-INF/MANIFEST.MF b/spring-boot-servlet/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..69ebae1751 --- /dev/null +++ b/spring-boot-servlet/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Main-Class: com.baeldung.ApplicationMain diff --git a/spring-boot-servlet/src/main/java/com/baeldung/ApplicationMain.java b/spring-boot-servlet/src/main/java/com/baeldung/ApplicationMain.java new file mode 100644 index 0000000000..66f2e85999 --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/ApplicationMain.java @@ -0,0 +1,19 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +@SpringBootApplication +public class ApplicationMain extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(ApplicationMain.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ApplicationMain.class); + } +} \ No newline at end of file diff --git a/spring-boot-servlet/src/main/java/com/baeldung/configuration/WebAppInitializer.java b/spring-boot-servlet/src/main/java/com/baeldung/configuration/WebAppInitializer.java new file mode 100644 index 0000000000..b7e22500f4 --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/configuration/WebAppInitializer.java @@ -0,0 +1,32 @@ +package com.baeldung.configuration; + +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.context.support.XmlWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +public class WebAppInitializer implements WebApplicationInitializer { + + public void onStartup(ServletContext container) throws ServletException { + + AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); + ctx.register(WebMvcConfigure.class); + ctx.setServletContext(container); + + ServletRegistration.Dynamic servletOne = container.addServlet("SpringProgrammaticDispatcherServlet", new DispatcherServlet(ctx)); + servletOne.setLoadOnStartup(1); + servletOne.addMapping("/"); + + XmlWebApplicationContext xctx = new XmlWebApplicationContext(); + xctx.setConfigLocation("/WEB-INF/context.xml"); + xctx.setServletContext(container); + + ServletRegistration.Dynamic servletTwo = container.addServlet("SpringProgrammaticXMLDispatcherServlet", new DispatcherServlet(xctx)); + servletTwo.setLoadOnStartup(1); + servletTwo.addMapping("/"); + } + +} \ No newline at end of file diff --git a/spring-boot-servlet/src/main/java/com/baeldung/configuration/WebMvcConfigure.java b/spring-boot-servlet/src/main/java/com/baeldung/configuration/WebMvcConfigure.java new file mode 100644 index 0000000000..de9067de6e --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/configuration/WebMvcConfigure.java @@ -0,0 +1,40 @@ +package com.baeldung.configuration; + +import org.springframework.boot.web.support.ErrorPageFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.resource.PathResourceResolver; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Configuration +public class WebMvcConfigure extends WebMvcConfigurerAdapter { + + @Bean + public ViewResolver getViewResolver() { + InternalResourceViewResolver resolver = new InternalResourceViewResolver(); + resolver.setPrefix("/WEB-INF/"); + resolver.setSuffix(".jsp"); + return resolver; + } + + @Override + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(3600).resourceChain(true).addResolver(new PathResourceResolver()); + } + + @Bean + public ErrorPageFilter errorPageFilter() { + return new ErrorPageFilter(); + } +} + diff --git a/spring-boot-servlet/src/main/java/com/baeldung/props/Constants.java b/spring-boot-servlet/src/main/java/com/baeldung/props/Constants.java new file mode 100644 index 0000000000..421401eec7 --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/props/Constants.java @@ -0,0 +1,20 @@ +package com.baeldung.props; + +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Properties; + +public final class Constants { + + @Autowired + PropertySourcesLoader psl; + + public static final String breakLine = System.getProperty("line.separator"); + private static final PropertyLoader pl = new PropertyLoader(); + private static final Properties mainProps = pl.getProperties("custom.properties"); + public static final String DISPATCHER_SERVLET_NAME = mainProps.getProperty("dispatcher.servlet.name"); + public static final String DISPATCHER_SERVLET_MAPPING = mainProps.getProperty("dispatcher.servlet.mapping"); + private final String EXAMPLE_SERVLET_NAME = psl.getProperty("example.servlet.name"); + private final String EXAMPLE_SERVLET_MAPPING = psl.getProperty("example.servlet.mapping"); + +} diff --git a/spring-boot-servlet/src/main/java/com/baeldung/props/PropertyLoader.java b/spring-boot-servlet/src/main/java/com/baeldung/props/PropertyLoader.java new file mode 100644 index 0000000000..5d890d96fa --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/props/PropertyLoader.java @@ -0,0 +1,27 @@ +package com.baeldung.props; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class PropertyLoader { + private static final Logger log = LoggerFactory.getLogger(PropertyLoader.class); + + public Properties getProperties(String file) { + Properties prop = new Properties(); + InputStream input = null; + try { + input = getClass().getResourceAsStream(file); + prop.load(input); + if (input != null) { + input.close(); + } + } catch (IOException ex) { + log.error("IOException: " + ex); + } + return prop; + } +} diff --git a/spring-boot-servlet/src/main/java/com/baeldung/props/PropertySourcesLoader.java b/spring-boot-servlet/src/main/java/com/baeldung/props/PropertySourcesLoader.java new file mode 100644 index 0000000000..8c7b3a4af5 --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/props/PropertySourcesLoader.java @@ -0,0 +1,23 @@ +package com.baeldung.props; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.ConfigurableEnvironment; + +@Configuration +@ComponentScan(basePackages = { "com.baeldung.*" }) +@PropertySource("classpath:custom.properties") public class PropertySourcesLoader { + + private static final Logger log = LoggerFactory.getLogger(PropertySourcesLoader.class); + + @Autowired + ConfigurableEnvironment env; + + public String getProperty(String key) { + return env.getProperty(key); + } +} diff --git a/spring-boot-servlet/src/main/java/com/baeldung/servlets/GenericCustomServlet.java b/spring-boot-servlet/src/main/java/com/baeldung/servlets/GenericCustomServlet.java new file mode 100644 index 0000000000..c6543c9eef --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/servlets/GenericCustomServlet.java @@ -0,0 +1,18 @@ +package com.baeldung.servlets; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +public class GenericCustomServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println("

Hello World

"); + } +} diff --git a/spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/AnnotationServlet.java b/spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/AnnotationServlet.java new file mode 100644 index 0000000000..d971e68cfa --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/AnnotationServlet.java @@ -0,0 +1,20 @@ +package com.baeldung.servlets.javaee; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "AnnotationServlet", + description = "Example Servlet Using Annotations", + urlPatterns = { "/annotationservlet" }) +public class AnnotationServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/annotationservlet.jsp").forward(request, response); + } +} diff --git a/spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/EEWebXmlServlet.java b/spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/EEWebXmlServlet.java new file mode 100644 index 0000000000..4209e815cd --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/servlets/javaee/EEWebXmlServlet.java @@ -0,0 +1,20 @@ +package com.baeldung.servlets.javaee; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +public class EEWebXmlServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println("

Hello World

"); + } +} \ No newline at end of file diff --git a/spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/SpringRegistrationBeanServlet.java b/spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/SpringRegistrationBeanServlet.java new file mode 100644 index 0000000000..4a34465894 --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/SpringRegistrationBeanServlet.java @@ -0,0 +1,19 @@ +package com.baeldung.servlets.springboot; + +import com.baeldung.servlets.GenericCustomServlet; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SpringRegistrationBeanServlet { + + @Bean + public ServletRegistrationBean genericCustomServlet() { + ServletRegistrationBean bean = new ServletRegistrationBean(new GenericCustomServlet(), "/springregistrationbeanservlet/*"); + bean.setLoadOnStartup(1); + return bean; + } +} + + diff --git a/spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/embedded/EmbeddedTomcatExample.java b/spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/embedded/EmbeddedTomcatExample.java new file mode 100644 index 0000000000..b2458f33c7 --- /dev/null +++ b/spring-boot-servlet/src/main/java/com/baeldung/servlets/springboot/embedded/EmbeddedTomcatExample.java @@ -0,0 +1,16 @@ +package com.baeldung.servlets.springboot.embedded; + +import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; +import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class EmbeddedTomcatExample { + + @Bean + public EmbeddedServletContainerFactory servletContainer() { + TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); + return tomcat; + } +} diff --git a/spring-boot-servlet/src/main/resources/application.properties b/spring-boot-servlet/src/main/resources/application.properties new file mode 100644 index 0000000000..4e9e2b4cf1 --- /dev/null +++ b/spring-boot-servlet/src/main/resources/application.properties @@ -0,0 +1,10 @@ +#Server Configuration +#server.port=8080 +#server.context-path=/javabootdata +#Resource Handling +#spring.resources.static-locations=classpath:/WEB-INF/resources +#spring.mvc.view.prefix=/WEB-INF/ +#spring.mvc.view.suffix=.jsp +#spring.resources.cache-period=3600 +servlet.name=dispatcherExample +servlet.mapping=/dispatcherExampleURL \ No newline at end of file diff --git a/spring-boot-servlet/src/main/resources/custom.properties b/spring-boot-servlet/src/main/resources/custom.properties new file mode 100644 index 0000000000..34f31bcd50 --- /dev/null +++ b/spring-boot-servlet/src/main/resources/custom.properties @@ -0,0 +1,4 @@ +dispatcher.servlet.name=dispatcherExample +dispatcher.servlet.mapping=/dispatcherExampleURL +example.servlet.name=dispatcherExample +example.servlet.mapping=/dispatcherExampleURL \ No newline at end of file diff --git a/spring-boot-servlet/src/main/webapp/WEB-INF/context.xml b/spring-boot-servlet/src/main/webapp/WEB-INF/context.xml new file mode 100644 index 0000000000..263bed4430 --- /dev/null +++ b/spring-boot-servlet/src/main/webapp/WEB-INF/context.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/spring-boot-servlet/src/main/webapp/WEB-INF/dispatcher.xml b/spring-boot-servlet/src/main/webapp/WEB-INF/dispatcher.xml new file mode 100644 index 0000000000..ade8e66777 --- /dev/null +++ b/spring-boot-servlet/src/main/webapp/WEB-INF/dispatcher.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/spring-boot-servlet/src/main/webapp/WEB-INF/web.xml b/spring-boot-servlet/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..60a4b079de --- /dev/null +++ b/spring-boot-servlet/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,40 @@ + + + JSP + + index.html + index.htm + index.jsp + + + + + EEWebXmlServlet + com.baeldung.servlets.javaee.EEWebXmlServlet + + + + EEWebXmlServlet + /eewebxmlservlet + + + + + SpringBootWebXmlServlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + /WEB-INF/dispatcher.xml + + 1 + + + + SpringBootWebXmlServlet + / + + + + diff --git a/spring-boot-servlet/src/main/webapp/annotationservlet.jsp b/spring-boot-servlet/src/main/webapp/annotationservlet.jsp new file mode 100644 index 0000000000..f21748df50 --- /dev/null +++ b/spring-boot-servlet/src/main/webapp/annotationservlet.jsp @@ -0,0 +1 @@ +

Annotation Servlet!

\ No newline at end of file diff --git a/spring-boot-servlet/src/main/webapp/index.jsp b/spring-boot-servlet/src/main/webapp/index.jsp new file mode 100644 index 0000000000..e534282777 --- /dev/null +++ b/spring-boot-servlet/src/main/webapp/index.jsp @@ -0,0 +1 @@ +

Hello!

\ No newline at end of file From dbc52e86545b5631cdf39a17620d31c3f86d6a9e Mon Sep 17 00:00:00 2001 From: Pedja Date: Wed, 22 Feb 2017 12:58:04 +0100 Subject: [PATCH 175/192] BAEL-633 Small refactoring --- .../java/com/baeldung/cglib/proxy/BeanGeneratorTest.java | 2 +- .../src/test/java/com/baeldung/cglib/proxy/MixinTest.java | 2 +- .../proxy/{PersonServiceProxyTest.java => ProxyTest.java} | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) rename cglib/src/test/java/com/baeldung/cglib/proxy/{PersonServiceProxyTest.java => ProxyTest.java} (82%) diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java index 67214cd32d..1e49536065 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java @@ -11,7 +11,7 @@ import static junit.framework.TestCase.assertEquals; public class BeanGeneratorTest { @Test - public void givenBeanCreator_whenAddPropery_classShouldHaveFieldValue() throws Exception { + public void givenBeanCreator_whenAddProperty_thenClassShouldHaveFieldValue() throws Exception { //given BeanGenerator beanGenerator = new BeanGenerator(); diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java index 186c66aa42..db8453e6c1 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java @@ -9,7 +9,7 @@ import static junit.framework.TestCase.assertEquals; public class MixinTest { @Test - public void givenTwoClasses_whenMixtThemIntoOne_mixinShouldHaveMethodsFromBothClasses() throws Exception { + public void givenTwoClasses_whenMixedIntoOne_thenMixinShouldHaveMethodsFromBothClasses() throws Exception { //when Mixin mixin = Mixin.create( new Class[]{Interface1.class, Interface2.class, MixinInterface.class}, diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java b/cglib/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java similarity index 82% rename from cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java rename to cglib/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java index 6208ed12b8..195c4b903d 100644 --- a/cglib/src/test/java/com/baeldung/cglib/proxy/PersonServiceProxyTest.java +++ b/cglib/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java @@ -7,9 +7,9 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; -public class PersonServiceProxyTest { +public class ProxyTest { @Test - public void givenPersonService_whenSayHello_shouldReturnResult() { + public void givenPersonService_whenSayHello_thenReturnResult() { //given PersonService personService = new PersonService(); @@ -21,7 +21,7 @@ public class PersonServiceProxyTest { } @Test - public void givenEnhancerProxy_whenExtendPersonService_shouldInterceptMethod() throws Exception { + public void givenEnhancerProxy_whenExtendPersonService_thenInterceptMethod() throws Exception { //given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); @@ -36,7 +36,7 @@ public class PersonServiceProxyTest { } @Test - public void givenEnhancer_whenExecuteMethodOnProxy_shouldInterceptOnlyStringReturnTypeMethod() throws Exception { + public void givenEnhancer_whenExecuteMethodOnProxy_thenInterceptOnlyStringReturnTypeMethod() throws Exception { //given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); From ed4ccd92f77f6514590456df9a6c5731384f63a7 Mon Sep 17 00:00:00 2001 From: Pedja Date: Wed, 22 Feb 2017 15:23:26 +0100 Subject: [PATCH 176/192] BAEL-633 Excluded jackson-databind transient dependency --- spring-mvc-xml/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index f0e4bbff55..86eb17da64 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -116,7 +116,13 @@ com.maxmind.geoip2 geoip2 ${geoip2.version} - + + + com.fasterxml.jackson.core + jackson-databind + + + From d267d393210fc2c06272dd491a79f43633e9e70c Mon Sep 17 00:00:00 2001 From: Sunil Gulabani Date: Thu, 23 Feb 2017 11:19:30 +0530 Subject: [PATCH 177/192] BAEL-650: Review comment changes --- aws/pom.xml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/aws/pom.xml b/aws/pom.xml index 881ba6522d..681b76cfd4 100644 --- a/aws/pom.xml +++ b/aws/pom.xml @@ -7,29 +7,36 @@ jar aws + + 2.5 + 1.3.0 + 1.1.0 + 2.8.0 + + com.amazonaws aws-lambda-java-core - 1.1.0 + ${aws-lambda-java-core.version} com.amazonaws aws-lambda-java-events - 1.3.0 + ${aws-lambda-java-events.version} commons-io commons-io - 2.5 + ${commons-io.version} com.google.code.gson gson - 2.8.0 + ${gson.version} From 0fcae56196e02170ff873b4aaec672c519442639 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 23 Feb 2017 16:03:49 +0100 Subject: [PATCH 178/192] BAEL-602 use Stream.of --- jooq/src/test/java/com/baeldung/JOOLTest.java | 8 ++++---- pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java index 5560e7ea14..18fca1f67a 100644 --- a/jooq/src/test/java/com/baeldung/JOOLTest.java +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -36,8 +36,8 @@ public class JOOLTest { @Test public void givenStreams_whenJoin_shouldHaveElementsFromTwoStreams() { //given - Stream left = Arrays.asList(1, 2, 4).stream(); - Stream right = Arrays.asList(1, 2, 3).stream(); + Stream left = Stream.of(1, 2, 4); + Stream right = Stream.of(1, 2, 3); //when List rightCollected = right.collect(Collectors.toList()); @@ -172,7 +172,7 @@ public class JOOLTest { @Test public void givenOperationThatThrowsCheckedException_whenExecuteAndNeedToWrapCheckedIntoUnchecked_shouldPass() { //when - List collect = Arrays.asList("a", "b", "c").stream().map(elem -> { + List collect = Stream.of("a", "b", "c").map(elem -> { try { return methodThatThrowsChecked(elem); } catch (Exception e) { @@ -192,7 +192,7 @@ public class JOOLTest { @Test public void givenOperationThatThrowsCheckedException_whenExecuteUsingUncheckedFuction_shouldPass() { //when - List collect = Arrays.asList("a", "b", "c").stream() + List collect = Stream.of("a", "b", "c") .map(Unchecked.function(elem -> methodThatThrowsChecked(elem))) .collect(Collectors.toList()); diff --git a/pom.xml b/pom.xml index 42ded9de0d..7694f29d3a 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,7 @@ jaxb jee7 jjwt + jooq jpa-storedprocedure jsf json-path @@ -193,7 +194,6 @@ struts2 apache-velocity - jooq From 9f108905017774816697c9e763b0c1a879bd321b Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 24 Feb 2017 13:50:46 +0200 Subject: [PATCH 179/192] initial commit of spring 5 project --- spring-5/.gitignore | 13 + spring-5/README.md | 6 + spring-5/pom.xml | 345 ++++++++++ .../java/org/baeldung/config/Application.java | 16 + .../java/org/baeldung/config/WebConfig.java | 57 ++ .../converter/KryoHttpMessageConverter.java | 57 ++ .../BarMappingExamplesController.java | 47 ++ .../web/controller/CompanyController.java | 16 + .../web/controller/FooController.java | 45 ++ .../FooMappingExamplesController.java | 101 +++ .../web/controller/ItemController.java | 39 ++ .../web/controller/MyFooController.java | 76 +++ .../web/controller/SimplePostController.java | 73 +++ .../advice/JsonpControllerAdvice.java | 13 + .../mediatypes/CustomMediaTypeController.java | 20 + .../redirect/RedirectController.java | 52 ++ .../controller/status/ExampleController.java | 24 + .../controller/status/ForbiddenException.java | 10 + .../org/baeldung/web/dto/BaeldungItem.java | 13 + .../org/baeldung/web/dto/BaeldungItemV2.java | 14 + .../java/org/baeldung/web/dto/Company.java | 38 ++ .../main/java/org/baeldung/web/dto/Foo.java | 45 ++ .../java/org/baeldung/web/dto/FooProtos.java | 597 ++++++++++++++++++ .../main/java/org/baeldung/web/dto/Item.java | 36 ++ .../org/baeldung/web/dto/ItemManager.java | 9 + .../main/java/org/baeldung/web/dto/Views.java | 9 + .../exception/ResourceNotFoundException.java | 8 + .../src/main/resources/application.properties | 2 + spring-5/src/main/resources/logback.xml | 20 + .../src/main/webapp/WEB-INF/api-servlet.xml | 56 ++ spring-5/src/main/webapp/WEB-INF/company.html | 44 ++ .../src/main/webapp/WEB-INF/spring-views.xml | 10 + spring-5/src/main/webapp/WEB-INF/web.xml | 41 ++ .../test/java/org/baeldung/client/Consts.java | 5 + .../client/RestTemplateBasicLiveTest.java | 216 +++++++ .../okhttp/DefaultContentTypeInterceptor.java | 24 + .../okhttp/OkHttpFileUploadingLiveTest.java | 65 ++ .../baeldung/okhttp/OkHttpGetLiveTest.java | 77 +++ .../baeldung/okhttp/OkHttpHeaderLiveTest.java | 45 ++ .../baeldung/okhttp/OkHttpMiscLiveTest.java | 99 +++ .../okhttp/OkHttpPostingLiveTest.java | 85 +++ .../okhttp/OkHttpRedirectLiveTest.java | 29 + .../okhttp/ProgressRequestWrapper.java | 73 +++ .../uribuilder/SpringUriBuilderTest.java | 49 ++ .../CustomMediaTypeControllerLiveTest.java | 37 ++ .../CustomMediaTypeControllerTest.java | 42 ++ .../web/controller/mediatypes/TestConfig.java | 11 + .../RedirectControllerIntegrationTest.java | 66 ++ .../ExampleControllerIntegrationTest.java | 42 ++ .../web/test/RequestMappingLiveTest.java | 63 ++ .../SpringHttpMessageConvertersLiveTest.java | 123 ++++ spring-5/src/test/resources/.gitignore | 13 + spring-5/src/test/resources/test.txt | 1 + 53 files changed, 3117 insertions(+) create mode 100644 spring-5/.gitignore create mode 100644 spring-5/README.md create mode 100644 spring-5/pom.xml create mode 100644 spring-5/src/main/java/org/baeldung/config/Application.java create mode 100644 spring-5/src/main/java/org/baeldung/config/WebConfig.java create mode 100644 spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/FooController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/ItemController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java create mode 100644 spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Company.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Foo.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Item.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java create mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Views.java create mode 100644 spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java create mode 100644 spring-5/src/main/resources/application.properties create mode 100644 spring-5/src/main/resources/logback.xml create mode 100644 spring-5/src/main/webapp/WEB-INF/api-servlet.xml create mode 100644 spring-5/src/main/webapp/WEB-INF/company.html create mode 100644 spring-5/src/main/webapp/WEB-INF/spring-views.xml create mode 100644 spring-5/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-5/src/test/java/org/baeldung/client/Consts.java create mode 100644 spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java create mode 100644 spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java create mode 100644 spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java create mode 100644 spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java create mode 100644 spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java create mode 100644 spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java create mode 100644 spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java create mode 100644 spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java create mode 100644 spring-5/src/test/resources/.gitignore create mode 100644 spring-5/src/test/resources/test.txt diff --git a/spring-5/.gitignore b/spring-5/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-5/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-5/README.md b/spring-5/README.md new file mode 100644 index 0000000000..0914388b49 --- /dev/null +++ b/spring-5/README.md @@ -0,0 +1,6 @@ +## Spring REST Example Project + +###The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: diff --git a/spring-5/pom.xml b/spring-5/pom.xml new file mode 100644 index 0000000000..c2545d920f --- /dev/null +++ b/spring-5/pom.xml @@ -0,0 +1,345 @@ + + 4.0.0 + com.baeldung + spring-5 + 0.1-SNAPSHOT + spring-5 + war + + + org.springframework.boot + spring-boot-starter-parent + + 2.0.0.BUILD-SNAPSHOT + + + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + + + + org.springframework + spring-web + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + + + org.springframework + spring-oxm + + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + + + javax.servlet + javax.servlet-api + provided + + + + javax.servlet + jstl + runtime + + + + + + com.fasterxml.jackson.core + jackson-databind + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + + + + com.google.guava + guava + ${guava.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + + org.slf4j + jcl-over-slf4j + + + + org.slf4j + log4j-over-slf4j + + + + + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + + + + + + junit + junit + test + + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + + org.mockito + mockito-core + test + + + + org.springframework + spring-test + + + + com.jayway.restassured + rest-assured + ${rest-assured.version} + + + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + + + com.googlecode.protobuf-java-format + protobuf-java-format + ${protobuf-java-format.version} + + + + com.esotericsoftware + kryo + ${kryo.version} + + + + + spring-5 + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + tomcat8x + embedded + + + + + + + 8082 + + + + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*IntegrationTest.java + + + + + + + + + + + + + + 1.3.2 + 4.0.0 + 1.4 + 3.1.0 + 3.5 + 1.4.9 + + + 20.0 + 2.9.0 + + + 1.6.0 + 3.0.4 + + + 3.4.1 + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + diff --git a/spring-5/src/main/java/org/baeldung/config/Application.java b/spring-5/src/main/java/org/baeldung/config/Application.java new file mode 100644 index 0000000000..077213b04d --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/config/Application.java @@ -0,0 +1,16 @@ +package org.baeldung.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@EnableAutoConfiguration +@ComponentScan("org.baeldung") +public class Application extends WebMvcConfigurerAdapter { + + public static void main(final String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/config/WebConfig.java b/spring-5/src/main/java/org/baeldung/config/WebConfig.java new file mode 100644 index 0000000000..f40c9477d4 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/config/WebConfig.java @@ -0,0 +1,57 @@ +package org.baeldung.config; + +import org.baeldung.config.converter.KryoHttpMessageConverter; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; +import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; +import org.springframework.oxm.xstream.XStreamMarshaller; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.text.SimpleDateFormat; +import java.util.List; + +/* + * Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml + */ +@Configuration +@EnableWebMvc +@ComponentScan({ "org.baeldung.web" }) +public class WebConfig extends WebMvcConfigurerAdapter { + + public WebConfig() { + super(); + } + + // + + @Override + public void configureMessageConverters(final List> messageConverters) { + final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + builder.indentOutput(true).dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); + messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); + // messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); + + // messageConverters.add(createXmlHttpMessageConverter()); + // messageConverters.add(new MappingJackson2HttpMessageConverter()); + + messageConverters.add(new ProtobufHttpMessageConverter()); + messageConverters.add(new KryoHttpMessageConverter()); + super.configureMessageConverters(messageConverters); + } + + private HttpMessageConverter createXmlHttpMessageConverter() { + final MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter(); + + final XStreamMarshaller xstreamMarshaller = new XStreamMarshaller(); + xmlConverter.setMarshaller(xstreamMarshaller); + xmlConverter.setUnmarshaller(xstreamMarshaller); + + return xmlConverter; + } + +} diff --git a/spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java b/spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java new file mode 100644 index 0000000000..7e63a3ba9e --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java @@ -0,0 +1,57 @@ +package org.baeldung.config.converter; + +import java.io.IOException; + +import org.baeldung.web.dto.Foo; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.AbstractHttpMessageConverter; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + +/** + * An {@code HttpMessageConverter} that can read and write Kryo messages. + */ +public class KryoHttpMessageConverter extends AbstractHttpMessageConverter { + + public static final MediaType KRYO = new MediaType("application", "x-kryo"); + + private static final ThreadLocal kryoThreadLocal = new ThreadLocal() { + @Override + protected Kryo initialValue() { + final Kryo kryo = new Kryo(); + kryo.register(Foo.class, 1); + return kryo; + } + }; + + public KryoHttpMessageConverter() { + super(KRYO); + } + + @Override + protected boolean supports(final Class clazz) { + return Object.class.isAssignableFrom(clazz); + } + + @Override + protected Object readInternal(final Class clazz, final HttpInputMessage inputMessage) throws IOException { + final Input input = new Input(inputMessage.getBody()); + return kryoThreadLocal.get().readClassAndObject(input); + } + + @Override + protected void writeInternal(final Object object, final HttpOutputMessage outputMessage) throws IOException { + final Output output = new Output(outputMessage.getBody()); + kryoThreadLocal.get().writeClassAndObject(output, object); + output.flush(); + } + + @Override + protected MediaType getDefaultContentType(final Object object) { + return KRYO; + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java b/spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java new file mode 100644 index 0000000000..1c3a1086ca --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java @@ -0,0 +1,47 @@ +package org.baeldung.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/ex") +public class BarMappingExamplesController { + + public BarMappingExamplesController() { + super(); + } + + // API + + // with @RequestParam + + @RequestMapping(value = "/bars") + @ResponseBody + public String getBarBySimplePathWithRequestParam(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + @RequestMapping(value = "/bars", params = "id") + @ResponseBody + public String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + @RequestMapping(value = "/bars", params = { "id", "second" }) + @ResponseBody + public String getBarBySimplePathWithExplicitRequestParams(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + // with @PathVariable + + @RequestMapping(value = "/bars/{numericId:[\\d]+}") + @ResponseBody + public String getBarsBySimplePathWithPathVariable(@PathVariable final long numericId) { + return "Get a specific Bar with id=" + numericId; + } + +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java b/spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java new file mode 100644 index 0000000000..aa694c08ed --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java @@ -0,0 +1,16 @@ +package org.baeldung.web.controller; + +import org.baeldung.web.dto.Company; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CompanyController { + + @RequestMapping(value = "/companyRest", produces = MediaType.APPLICATION_JSON_VALUE) + public Company getCompanyRest() { + final Company company = new Company(1, "Xpto"); + return company; + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/FooController.java b/spring-5/src/main/java/org/baeldung/web/controller/FooController.java new file mode 100644 index 0000000000..21ba3c6d13 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/FooController.java @@ -0,0 +1,45 @@ +package org.baeldung.web.controller; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import org.baeldung.web.dto.Foo; +import org.baeldung.web.dto.FooProtos; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +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.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Controller +public class FooController { + + public FooController() { + super(); + } + + // API - read + + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") + @ResponseBody + public Foo findById(@PathVariable final long id) { + return new Foo(id, randomAlphabetic(4)); + } + + // API - write + + @RequestMapping(method = RequestMethod.PUT, value = "/foos/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo updateFoo(@PathVariable("id") final String id, @RequestBody final Foo foo) { + return foo; + } + + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}", produces = { "application/x-protobuf" }) + @ResponseBody + public FooProtos.Foo findProtoById(@PathVariable final long id) { + return FooProtos.Foo.newBuilder().setId(1).setName("Foo Name").build(); + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java b/spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java new file mode 100644 index 0000000000..5fb92d6d87 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java @@ -0,0 +1,101 @@ +package org.baeldung.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/ex") +public class FooMappingExamplesController { + + public FooMappingExamplesController() { + super(); + } + + // API + + // mapping examples + + @RequestMapping(value = "/foos") + @ResponseBody + public String getFoosBySimplePath() { + return "Simple Get some Foos"; + } + + // with @PathVariable + + @RequestMapping(value = "/foos/{id}") + @ResponseBody + public String getFoosBySimplePathWithPathVariable(@PathVariable final long id) { + return "Get a specific Foo with id=" + id; + } + + @RequestMapping(value = "/foos/{fooid}/bar/{barid}") + @ResponseBody + public String getFoosBySimplePathWithPathVariables(@PathVariable final long fooid, @PathVariable final long barid) { + return "Get a specific Bar with id=" + barid + " from a Foo with id=" + fooid; + } + + // other HTTP verbs + + @RequestMapping(value = "/foos", method = RequestMethod.POST) + @ResponseBody + public String postFoos() { + return "Post some Foos"; + } + + // with headers + + @RequestMapping(value = "/foos", headers = "key=val") + @ResponseBody + public String getFoosWithHeader() { + return "Get some Foos with Header"; + } + + @RequestMapping(value = "/foos", headers = { "key1=val1", "key2=val2" }) + @ResponseBody + public String getFoosWithHeaders() { + return "Get some Foos with Header"; + } + + // @RequestMapping(value = "/foos", method = RequestMethod.GET, headers = "Accept=application/json") + // @ResponseBody + // public String getFoosAsJsonFromBrowser() { + // return "Get some Foos with Header Old"; + // } + + @RequestMapping(value = "/foos", produces = { "application/json", "application/xml" }) + @ResponseBody + public String getFoosAsJsonFromREST() { + return "Get some Foos with Header New"; + } + + // advanced - multiple mappings + + @RequestMapping(value = { "/advanced/bars", "/advanced/foos" }) + @ResponseBody + public String getFoosOrBarsByPath() { + return "Advanced - Get some Foos or Bars"; + } + + @RequestMapping(value = "*") + @ResponseBody + public String getFallback() { + return "Fallback for GET Requests"; + } + + @RequestMapping(value = "*", method = { RequestMethod.GET, RequestMethod.POST }) + @ResponseBody + public String allFallback() { + return "Fallback for All Requests"; + } + + @RequestMapping(value = "/foos/multiple", method = { RequestMethod.PUT, RequestMethod.POST }) + @ResponseBody + public String putAndPostFoos() { + return "Advanced - PUT and POST within single method"; + } + +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/ItemController.java b/spring-5/src/main/java/org/baeldung/web/controller/ItemController.java new file mode 100644 index 0000000000..1cc3eae432 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/ItemController.java @@ -0,0 +1,39 @@ +package org.baeldung.web.controller; + +import java.util.Date; + +import org.baeldung.web.dto.Item; +import org.baeldung.web.dto.ItemManager; +import org.baeldung.web.dto.Views; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.annotation.JsonView; + +@RestController +public class ItemController { + + @JsonView(Views.Public.class) + @RequestMapping("/items/{id}") + public Item getItemPublic(@PathVariable final int id) { + return ItemManager.getById(id); + } + + @JsonView(Views.Internal.class) + @RequestMapping("/items/internal/{id}") + public Item getItemInternal(@PathVariable final int id) { + return ItemManager.getById(id); + } + + @RequestMapping("/date") + public Date getCurrentDate() throws Exception { + return new Date(); + } + + @RequestMapping("/delay/{seconds}") + public void getCurrentTime(@PathVariable final int seconds) throws Exception { + + Thread.sleep(seconds * 1000); + } +} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java b/spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java new file mode 100644 index 0000000000..f19ddca435 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java @@ -0,0 +1,76 @@ +package org.baeldung.web.controller; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.baeldung.web.dto.Foo; +import org.baeldung.web.exception.ResourceNotFoundException; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +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.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +@Controller +@RequestMapping(value = "/myfoos") +public class MyFooController { + + private final Map myfoos; + + public MyFooController() { + super(); + myfoos = new HashMap(); + myfoos.put(1L, new Foo(1L, "sample foo")); + } + + // API - read + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public Collection findAll() { + return myfoos.values(); + } + + @RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = { "application/json" }) + @ResponseBody + public Foo findById(@PathVariable final long id) { + final Foo foo = myfoos.get(id); + if (foo == null) { + throw new ResourceNotFoundException(); + } + return foo; + } + + // API - write + + @RequestMapping(method = RequestMethod.PUT, value = "/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo updateFoo(@PathVariable("id") final long id, @RequestBody final Foo foo) { + myfoos.put(id, foo); + return foo; + } + + @RequestMapping(method = RequestMethod.POST) + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public Foo createFoo(@RequestBody final Foo foo, HttpServletResponse response) { + myfoos.put(foo.getId(), foo); + response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest().path("/" + foo.getId()).toUriString()); + return foo; + } + + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseStatus(HttpStatus.OK) + public void deleteById(@PathVariable final long id) { + myfoos.remove(id); + } + +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java b/spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java new file mode 100644 index 0000000000..f8407acb47 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java @@ -0,0 +1,73 @@ +package org.baeldung.web.controller; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.baeldung.web.dto.Foo; +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.RestController; +import org.springframework.web.multipart.MultipartFile; + +// used to test HttpClientPostingTest +@RestController +public class SimplePostController { + + @RequestMapping(value = "/users", method = RequestMethod.POST) + public String postUser(@RequestParam final String username, @RequestParam final String password) { + return "Success" + username; + } + + @RequestMapping(value = "/users/detail", method = RequestMethod.POST) + public String postUserDetail(@RequestBody final Foo entity) { + return "Success" + entity.getId(); + } + + @RequestMapping(value = "/users/multipart", method = RequestMethod.POST) + public String uploadFile(@RequestParam final String username, @RequestParam final String password, @RequestParam("file") final MultipartFile file) { + if (!file.isEmpty()) { + try { + final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); + final String fileName = dateFormat.format(new Date()); + final File fileServer = new File(fileName); + fileServer.createNewFile(); + final byte[] bytes = file.getBytes(); + final BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); + stream.write(bytes); + stream.close(); + return "You successfully uploaded " + username; + } catch (final Exception e) { + return "You failed to upload " + e.getMessage(); + } + } else { + return "You failed to upload because the file was empty."; + } + } + + @RequestMapping(value = "/users/upload", method = RequestMethod.POST) + public String postMultipart(@RequestParam("file") final MultipartFile file) { + if (!file.isEmpty()) { + try { + final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); + final String fileName = dateFormat.format(new Date()); + final File fileServer = new File(fileName); + fileServer.createNewFile(); + final byte[] bytes = file.getBytes(); + final BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); + stream.write(bytes); + stream.close(); + return "You successfully uploaded "; + } catch (final Exception e) { + return "You failed to upload " + e.getMessage(); + } + } else { + return "You failed to upload because the file was empty."; + } + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java b/spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java new file mode 100644 index 0000000000..996f229128 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java @@ -0,0 +1,13 @@ +package org.baeldung.web.controller.advice; + +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; + +@ControllerAdvice +public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice { + + public JsonpControllerAdvice() { + super("callback"); + } + +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java b/spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java new file mode 100644 index 0000000000..410c72d34f --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java @@ -0,0 +1,20 @@ +package org.baeldung.web.controller.mediatypes; + +import org.baeldung.web.dto.BaeldungItem; +import org.baeldung.web.dto.BaeldungItemV2; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value = "/", produces = "application/vnd.baeldung.api.v1+json") +public class CustomMediaTypeController { + + @RequestMapping(method = RequestMethod.GET, value = "/public/api/items/{id}", produces = "application/vnd.baeldung.api.v1+json") + public @ResponseBody BaeldungItem getItem(@PathVariable("id") String id) { + return new BaeldungItem("itemId1"); + } + + @RequestMapping(method = RequestMethod.GET, value = "/public/api/items/{id}", produces = "application/vnd.baeldung.api.v2+json") + public @ResponseBody BaeldungItemV2 getItemSecondAPIVersion(@PathVariable("id") String id) { + return new BaeldungItemV2("itemName"); + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java b/spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java new file mode 100644 index 0000000000..472c0c8bf5 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java @@ -0,0 +1,52 @@ +package org.baeldung.web.controller.redirect; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.view.RedirectView; + +@Controller +@RequestMapping("/") +public class RedirectController { + + @RequestMapping(value = "/redirectWithXMLConfig", method = RequestMethod.GET) + public ModelAndView redirectWithUsingXMLConfig(final ModelMap model) { + model.addAttribute("attribute", "redirectWithXMLConfig"); + return new ModelAndView("RedirectedUrl", model); + } + + @RequestMapping(value = "/redirectWithRedirectPrefix", method = RequestMethod.GET) + public ModelAndView redirectWithUsingRedirectPrefix(final ModelMap model) { + model.addAttribute("attribute", "redirectWithRedirectPrefix"); + return new ModelAndView("redirect:/redirectedUrl", model); + } + + @RequestMapping(value = "/redirectWithRedirectAttributes", method = RequestMethod.GET) + public RedirectView redirectWithRedirectAttributes(final RedirectAttributes redirectAttributes) { + redirectAttributes.addFlashAttribute("flashAttribute", "redirectWithRedirectAttributes"); + redirectAttributes.addAttribute("attribute", "redirectWithRedirectAttributes"); + return new RedirectView("redirectedUrl"); + } + + @RequestMapping(value = "/redirectWithRedirectView", method = RequestMethod.GET) + public RedirectView redirectWithUsingRedirectView(final ModelMap model) { + model.addAttribute("attribute", "redirectWithRedirectView"); + return new RedirectView("redirectedUrl"); + } + + @RequestMapping(value = "/forwardWithForwardPrefix", method = RequestMethod.GET) + public ModelAndView forwardWithUsingForwardPrefix(final ModelMap model) { + model.addAttribute("attribute", "redirectWithForwardPrefix"); + return new ModelAndView("forward:/redirectedUrl", model); + } + + @RequestMapping(value = "/redirectedUrl", method = RequestMethod.GET) + public ModelAndView redirection(final ModelMap model, @ModelAttribute("flashAttribute") final Object flashAttribute) { + model.addAttribute("redirectionAttribute", flashAttribute); + return new ModelAndView("redirection", model); + } +} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java b/spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java new file mode 100644 index 0000000000..ceda138768 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java @@ -0,0 +1,24 @@ +package org.baeldung.web.controller.status; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class ExampleController { + + @RequestMapping(value = "/controller", method = RequestMethod.GET) + @ResponseBody + public ResponseEntity sendViaResponseEntity() { + return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE); + } + + @RequestMapping(value = "/exception", method = RequestMethod.GET) + @ResponseBody + public ResponseEntity sendViaException() { + throw new ForbiddenException(); + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java b/spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java new file mode 100644 index 0000000000..458bdaf170 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java @@ -0,0 +1,10 @@ +package org.baeldung.web.controller.status; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "To show an example of a custom message") +public class ForbiddenException extends RuntimeException { + private static final long serialVersionUID = 6826605655586311552L; + +} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java b/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java new file mode 100644 index 0000000000..9b3ecd33b9 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java @@ -0,0 +1,13 @@ +package org.baeldung.web.dto; + +public class BaeldungItem { + private final String itemId; + + public BaeldungItem(String itemId) { + this.itemId = itemId; + } + + public String getItemId() { + return itemId; + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java b/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java new file mode 100644 index 0000000000..64df20a14e --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java @@ -0,0 +1,14 @@ +package org.baeldung.web.dto; + + +public class BaeldungItemV2 { + private final String itemName; + + public BaeldungItemV2(String itemName) { + this.itemName = itemName; + } + + public String getItemName() { + return itemName; + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Company.java b/spring-5/src/main/java/org/baeldung/web/dto/Company.java new file mode 100644 index 0000000000..3164d604ad --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/Company.java @@ -0,0 +1,38 @@ +package org.baeldung.web.dto; + +public class Company { + + private long id; + private String name; + + public Company() { + super(); + } + + public Company(final long id, final String name) { + this.id = id; + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + @Override + public String toString() { + return "Company [id=" + id + ", name=" + name + "]"; + } + +} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Foo.java b/spring-5/src/main/java/org/baeldung/web/dto/Foo.java new file mode 100644 index 0000000000..240b368b50 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/Foo.java @@ -0,0 +1,45 @@ +package org.baeldung.web.dto; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +@XStreamAlias("Foo") +public class Foo { + private long id; + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + + this.id = id; + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java b/spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java new file mode 100644 index 0000000000..8ca96c38fc --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java @@ -0,0 +1,597 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: FooProtos.proto + +package org.baeldung.web.dto; + +public final class FooProtos { + private FooProtos() { + } + + public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { + } + + public interface FooOrBuilder extends + // @@protoc_insertion_point(interface_extends:baeldung.Foo) + com.google.protobuf.MessageOrBuilder { + + /** + * required int64 id = 1; + */ + boolean hasId(); + + /** + * required int64 id = 1; + */ + long getId(); + + /** + * required string name = 2; + */ + boolean hasName(); + + /** + * required string name = 2; + */ + java.lang.String getName(); + + /** + * required string name = 2; + */ + com.google.protobuf.ByteString getNameBytes(); + } + + /** + * Protobuf type {@code baeldung.Foo} + */ + public static final class Foo extends com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:baeldung.Foo) + FooOrBuilder { + // Use Foo.newBuilder() to construct. + private Foo(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + + private Foo(boolean noInit) { + this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); + } + + private static final Foo defaultInstance; + + public static Foo getDefaultInstance() { + return defaultInstance; + } + + public Foo getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Foo(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readInt64(); + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + name_ = bs; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_fieldAccessorTable.ensureFieldAccessorsInitialized(org.baeldung.web.dto.FooProtos.Foo.class, org.baeldung.web.dto.FooProtos.Foo.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + public Foo parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return new Foo(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + + /** + * required int64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required int64 id = 1; + */ + public long getId() { + return id_; + } + + public static final int NAME_FIELD_NUMBER = 2; + private java.lang.Object name_; + + /** + * required string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * required string name = 2; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + + /** + * required string name = 2; + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0L; + name_ = ""; + } + + private byte memoizedIsInitialized = -1; + + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + + if (!hasId()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getNameBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) + return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, getNameBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + + @java.lang.Override + protected java.lang.Object writeReplace() throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(java.io.InputStream input) throws java.io.IOException { + return PARSER.parseFrom(input); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return PARSER.parseFrom(input); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { + return Builder.create(); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder(org.baeldung.web.dto.FooProtos.Foo prototype) { + return newBuilder().mergeFrom(prototype); + } + + public Builder toBuilder() { + return newBuilder(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code baeldung.Foo} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:baeldung.Foo) + org.baeldung.web.dto.FooProtos.FooOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_fieldAccessorTable.ensureFieldAccessorsInitialized(org.baeldung.web.dto.FooProtos.Foo.class, org.baeldung.web.dto.FooProtos.Foo.Builder.class); + } + + // Construct using org.baeldung.web.dto.FooProtos.Foo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; + } + + public org.baeldung.web.dto.FooProtos.Foo getDefaultInstanceForType() { + return org.baeldung.web.dto.FooProtos.Foo.getDefaultInstance(); + } + + public org.baeldung.web.dto.FooProtos.Foo build() { + org.baeldung.web.dto.FooProtos.Foo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.baeldung.web.dto.FooProtos.Foo buildPartial() { + org.baeldung.web.dto.FooProtos.Foo result = new org.baeldung.web.dto.FooProtos.Foo(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.baeldung.web.dto.FooProtos.Foo) { + return mergeFrom((org.baeldung.web.dto.FooProtos.Foo) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.baeldung.web.dto.FooProtos.Foo other) { + if (other == org.baeldung.web.dto.FooProtos.Foo.getDefaultInstance()) + return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasId()) { + + return false; + } + if (!hasName()) { + + return false; + } + return true; + } + + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + org.baeldung.web.dto.FooProtos.Foo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.baeldung.web.dto.FooProtos.Foo) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private long id_; + + /** + * required int64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required int64 id = 1; + */ + public long getId() { + return id_; + } + + /** + * required int64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + + /** + * required int64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object name_ = ""; + + /** + * required string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * required string name = 2; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * required string name = 2; + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * required string name = 2; + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + /** + * required string name = 2; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + + /** + * required string name = 2; + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:baeldung.Foo) + } + + static { + defaultInstance = new Foo(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:baeldung.Foo) + } + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_baeldung_Foo_descriptor; + private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_baeldung_Foo_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + return descriptor; + } + + private static com.google.protobuf.Descriptors.FileDescriptor descriptor; + static { + java.lang.String[] descriptorData = { "\n\017FooProtos.proto\022\010baeldung\"\037\n\003Foo\022\n\n\002id" + "\030\001 \002(\003\022\014\n\004name\030\002 \002(\tB!\n\024org.baeldung.web" + ".dtoB\tFooProtos" }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors(com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}, assigner); + internal_static_baeldung_Foo_descriptor = getDescriptor().getMessageTypes().get(0); + internal_static_baeldung_Foo_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(internal_static_baeldung_Foo_descriptor, new java.lang.String[] { "Id", "Name", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Item.java b/spring-5/src/main/java/org/baeldung/web/dto/Item.java new file mode 100644 index 0000000000..536c72020f --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/Item.java @@ -0,0 +1,36 @@ +package org.baeldung.web.dto; + +import com.fasterxml.jackson.annotation.JsonView; + +public class Item { + @JsonView(Views.Public.class) + public int id; + + @JsonView(Views.Public.class) + public String itemName; + + @JsonView(Views.Internal.class) + public String ownerName; + + public Item() { + super(); + } + + public Item(final int id, final String itemName, final String ownerName) { + this.id = id; + this.itemName = itemName; + this.ownerName = ownerName; + } + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public String getOwnerName() { + return ownerName; + } +} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java b/spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java new file mode 100644 index 0000000000..74ffada300 --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java @@ -0,0 +1,9 @@ +package org.baeldung.web.dto; + +public class ItemManager { + + public static Item getById(final int id) { + final Item item = new Item(2, "book", "John"); + return item; + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Views.java b/spring-5/src/main/java/org/baeldung/web/dto/Views.java new file mode 100644 index 0000000000..6231e12bcc --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/dto/Views.java @@ -0,0 +1,9 @@ +package org.baeldung.web.dto; + +public class Views { + public static class Public { + } + + public static class Internal extends Public { + } +} diff --git a/spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java b/spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java new file mode 100644 index 0000000000..aab737b6ec --- /dev/null +++ b/spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java @@ -0,0 +1,8 @@ +package org.baeldung.web.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.NOT_FOUND) +public class ResourceNotFoundException extends RuntimeException { +} diff --git a/spring-5/src/main/resources/application.properties b/spring-5/src/main/resources/application.properties new file mode 100644 index 0000000000..300589f561 --- /dev/null +++ b/spring-5/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port= 8082 +server.context-path=/spring-rest \ No newline at end of file diff --git a/spring-5/src/main/resources/logback.xml b/spring-5/src/main/resources/logback.xml new file mode 100644 index 0000000000..1146dade63 --- /dev/null +++ b/spring-5/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-5/src/main/webapp/WEB-INF/api-servlet.xml b/spring-5/src/main/webapp/WEB-INF/api-servlet.xml new file mode 100644 index 0000000000..0f80990c16 --- /dev/null +++ b/spring-5/src/main/webapp/WEB-INF/api-servlet.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + /WEB-INF/spring-views.xml + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-5/src/main/webapp/WEB-INF/company.html b/spring-5/src/main/webapp/WEB-INF/company.html new file mode 100644 index 0000000000..d2072bfd3c --- /dev/null +++ b/spring-5/src/main/webapp/WEB-INF/company.html @@ -0,0 +1,44 @@ + + + + + Company Data + + + + + + + +
+ + + \ No newline at end of file diff --git a/spring-5/src/main/webapp/WEB-INF/spring-views.xml b/spring-5/src/main/webapp/WEB-INF/spring-views.xml new file mode 100644 index 0000000000..2944828d6d --- /dev/null +++ b/spring-5/src/main/webapp/WEB-INF/spring-views.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/spring-5/src/main/webapp/WEB-INF/web.xml b/spring-5/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..a439de8a05 --- /dev/null +++ b/spring-5/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,41 @@ + + + + Spring MVC Application + + + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + org.baeldung.config + + + + org.springframework.web.context.ContextLoaderListener + + + + + api + org.springframework.web.servlet.DispatcherServlet + 1 + + + api + / + + + + + + + diff --git a/spring-5/src/test/java/org/baeldung/client/Consts.java b/spring-5/src/test/java/org/baeldung/client/Consts.java new file mode 100644 index 0000000000..b40561d9c3 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/client/Consts.java @@ -0,0 +1,5 @@ +package org.baeldung.client; + +public interface Consts { + int APPLICATION_PORT = 8082; +} diff --git a/spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java new file mode 100644 index 0000000000..a47c60e9d8 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java @@ -0,0 +1,216 @@ +package org.baeldung.client; + +import static org.apache.commons.codec.binary.Base64.encodeBase64; +import static org.baeldung.client.Consts.APPLICATION_PORT; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.net.URI; +import java.util.Arrays; +import java.util.Set; + +import org.baeldung.web.dto.Foo; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Charsets; + +public class RestTemplateBasicLiveTest { + + private RestTemplate restTemplate; + private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/myfoos"; + + @Before + public void beforeTest() { + restTemplate = new RestTemplate(); + } + + // GET + + @Test + public void givenResourceUrl_whenSendGetForRequestEntity_thenStatusOk() throws IOException { + final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); + + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenResourceUrl_whenSendGetForRequestEntity_thenBodyCorrect() throws IOException { + final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); + + final ObjectMapper mapper = new ObjectMapper(); + final JsonNode root = mapper.readTree(response.getBody()); + final JsonNode name = root.path("name"); + assertThat(name.asText(), notNullValue()); + } + + @Test + public void givenResourceUrl_whenRetrievingResource_thenCorrect() throws IOException { + final Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class); + + assertThat(foo.getName(), notNullValue()); + assertThat(foo.getId(), is(1L)); + } + + // HEAD, OPTIONS + + @Test + public void givenFooService_whenCallHeadForHeaders_thenReceiveAllHeadersForThatResource() { + final HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl); + + assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON)); + } + + // POST + + @Test + public void givenFooService_whenPostForObject_thenCreatedObjectIsReturned() { + final HttpEntity request = new HttpEntity<>(new Foo("bar")); + final Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class); + assertThat(foo, notNullValue()); + assertThat(foo.getName(), is("bar")); + } + + @Test + public void givenFooService_whenPostForLocation_thenCreatedLocationIsReturned() { + final HttpEntity request = new HttpEntity<>(new Foo("bar")); + final URI location = restTemplate.postForLocation(fooResourceUrl, request); + assertThat(location, notNullValue()); + } + + @Test + public void givenFooService_whenPostResource_thenResourceIsCreated() { + final RestTemplate template = new RestTemplate(); + + final HttpEntity request = new HttpEntity<>(new Foo("bar")); + + final ResponseEntity response = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); + final Foo foo = response.getBody(); + assertThat(foo, notNullValue()); + assertThat(foo.getName(), is("bar")); + } + + @Test + public void givenFooService_whenCallOptionsForAllow_thenReceiveValueOfAllowHeader() { + final Set optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl); + final HttpMethod[] supportedMethods = { HttpMethod.GET, HttpMethod.POST, HttpMethod.HEAD }; + + assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods))); + } + + // PUT + + @Test + public void givenFooService_whenPutExistingEntity_thenItIsUpdated() { + final RestTemplate template = new RestTemplate(); + final HttpHeaders headers = prepareBasicAuthHeaders(); + final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); + + // Create Resource + final ResponseEntity createResponse = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + + // Update Resource + final Foo updatedInstance = new Foo("newName"); + updatedInstance.setId(createResponse.getBody().getId()); + final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); + final HttpEntity requestUpdate = new HttpEntity<>(updatedInstance, headers); + template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class); + + // Check that Resource was updated + final ResponseEntity updateResponse = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final Foo foo = updateResponse.getBody(); + assertThat(foo.getName(), is(updatedInstance.getName())); + } + + @Test + public void givenFooService_whenPutExistingEntityWithCallback_thenItIsUpdated() { + final RestTemplate template = new RestTemplate(); + final HttpHeaders headers = prepareBasicAuthHeaders(); + final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); + + // Create entity + ResponseEntity response = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); + + // Update entity + final Foo updatedInstance = new Foo("newName"); + updatedInstance.setId(response.getBody().getId()); + final String resourceUrl = fooResourceUrl + '/' + response.getBody().getId(); + template.execute(resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null); + + // Check that entity was updated + response = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final Foo foo = response.getBody(); + assertThat(foo.getName(), is(updatedInstance.getName())); + } + + // DELETE + + @Test + public void givenFooService_whenCallDelete_thenEntityIsRemoved() { + final Foo foo = new Foo("remove me"); + final ResponseEntity response = restTemplate.postForEntity(fooResourceUrl, foo, Foo.class); + assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); + + final String entityUrl = fooResourceUrl + "/" + response.getBody().getId(); + restTemplate.delete(entityUrl); + try { + restTemplate.getForEntity(entityUrl, Foo.class); + fail(); + } catch (final HttpClientErrorException ex) { + assertThat(ex.getStatusCode(), is(HttpStatus.NOT_FOUND)); + } + } + + // + + private HttpHeaders prepareBasicAuthHeaders() { + final HttpHeaders headers = new HttpHeaders(); + final String encodedLogPass = getBase64EncodedLogPass(); + headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encodedLogPass); + return headers; + } + + private String getBase64EncodedLogPass() { + final String logPass = "user1:user1Pass"; + final byte[] authHeaderBytes = encodeBase64(logPass.getBytes(Charsets.US_ASCII)); + return new String(authHeaderBytes, Charsets.US_ASCII); + } + + private RequestCallback requestCallback(final Foo updatedInstance) { + return clientHttpRequest -> { + final ObjectMapper mapper = new ObjectMapper(); + mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); + clientHttpRequest.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + clientHttpRequest.getHeaders().add(HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); + }; + } + + // Simply setting restTemplate timeout using ClientHttpRequestFactory + + ClientHttpRequestFactory getSimpleClientHttpRequestFactory() { + final int timeout = 5; + final HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); + clientHttpRequestFactory.setConnectTimeout(timeout * 1000); + return clientHttpRequestFactory; + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java b/spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java new file mode 100644 index 0000000000..c4fc689fad --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java @@ -0,0 +1,24 @@ +package org.baeldung.okhttp; + +import java.io.IOException; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +public class DefaultContentTypeInterceptor implements Interceptor { + + private final String contentType; + + public DefaultContentTypeInterceptor(String contentType) { + this.contentType = contentType; + } + + public Response intercept(Interceptor.Chain chain) throws IOException { + + Request originalRequest = chain.request(); + Request requestWithUserAgent = originalRequest.newBuilder().header("Content-Type", contentType).build(); + + return chain.proceed(requestWithUserAgent); + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java new file mode 100644 index 0000000000..a33742b8de --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java @@ -0,0 +1,65 @@ +package org.baeldung.okhttp; + +import static org.baeldung.client.Consts.APPLICATION_PORT; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; + +import java.io.File; +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +import org.junit.Before; +import org.junit.Test; + +public class OkHttpFileUploadingLiveTest { + + private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; + + OkHttpClient client; + + @Before + public void init() { + client = new OkHttpClient(); + } + + @Test + public void whenUploadFile_thenCorrect() throws IOException { + + final RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", "file.txt", RequestBody.create(MediaType.parse("application/octet-stream"), new File("src/test/resources/test.txt"))).build(); + + final Request request = new Request.Builder().url(BASE_URL + "/users/upload").post(requestBody).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } + + @Test + public void whenGetUploadFileProgress_thenCorrect() throws IOException { + + final RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", "file.txt", RequestBody.create(MediaType.parse("application/octet-stream"), new File("src/test/resources/test.txt"))).build(); + + final ProgressRequestWrapper countingBody = new ProgressRequestWrapper(requestBody, (long bytesWritten, long contentLength) -> { + + final float percentage = (100f * bytesWritten) / contentLength; + assertFalse(Float.compare(percentage, 100) > 0); + }); + + final Request request = new Request.Builder().url(BASE_URL + "/users/upload").post(countingBody).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java new file mode 100644 index 0000000000..6aa33b06b1 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java @@ -0,0 +1,77 @@ +package org.baeldung.okhttp; + +import static org.baeldung.client.Consts.APPLICATION_PORT; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import org.junit.Before; +import org.junit.Test; + +public class OkHttpGetLiveTest { + + private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; + + OkHttpClient client; + + @Before + public void init() { + + client = new OkHttpClient(); + } + + @Test + public void whenGetRequest_thenCorrect() throws IOException { + final Request request = new Request.Builder().url(BASE_URL + "/date").build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } + + @Test + public void whenGetRequestWithQueryParameter_thenCorrect() throws IOException { + final HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/ex/bars").newBuilder(); + urlBuilder.addQueryParameter("id", "1"); + + final String url = urlBuilder.build().toString(); + + final Request request = new Request.Builder().url(url).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } + + @Test + public void whenAsynchronousGetRequest_thenCorrect() throws InterruptedException { + final Request request = new Request.Builder().url(BASE_URL + "/date").build(); + + final Call call = client.newCall(request); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) throws IOException { + System.out.println("OK"); + } + + @Override + public void onFailure(Call call, IOException e) { + fail(); + } + }); + + Thread.sleep(3000); + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java new file mode 100644 index 0000000000..cfec119fe0 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java @@ -0,0 +1,45 @@ +package org.baeldung.okhttp; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; + +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class OkHttpHeaderLiveTest { + + private static final String SAMPLE_URL = "http://www.github.com"; + + OkHttpClient client; + + @Before + public void init() { + + client = new OkHttpClient(); + } + + @Test + public void whenSetHeader_thenCorrect() throws IOException { + Request request = new Request.Builder().url(SAMPLE_URL).addHeader("Content-Type", "application/json").build(); + + Call call = client.newCall(request); + Response response = call.execute(); + response.close(); + } + + @Test + public void whenSetDefaultHeader_thenCorrect() throws IOException { + + OkHttpClient clientWithInterceptor = new OkHttpClient.Builder().addInterceptor(new DefaultContentTypeInterceptor("application/json")).build(); + + Request request = new Request.Builder().url(SAMPLE_URL).build(); + + Call call = clientWithInterceptor.newCall(request); + Response response = call.execute(); + response.close(); + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java new file mode 100644 index 0000000000..52662262e1 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java @@ -0,0 +1,99 @@ +package org.baeldung.okhttp; + +import static org.baeldung.client.Consts.APPLICATION_PORT; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import okhttp3.Cache; +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OkHttpMiscLiveTest { + + private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; + private static Logger logger = LoggerFactory.getLogger(OkHttpMiscLiveTest.class); + + OkHttpClient client; + + @Before + public void init() { + + client = new OkHttpClient(); + } + + @Test(expected = SocketTimeoutException.class) + public void whenSetRequestTimeout_thenFail() throws IOException { + final OkHttpClient clientWithTimeout = new OkHttpClient.Builder().readTimeout(1, TimeUnit.SECONDS).build(); + + final Request request = new Request.Builder().url(BASE_URL + "/delay/2") // This URL is served with a 2 second delay. + .build(); + + final Call call = clientWithTimeout.newCall(request); + final Response response = call.execute(); + response.close(); + } + + @Test(expected = IOException.class) + public void whenCancelRequest_thenCorrect() throws IOException { + final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + + final Request request = new Request.Builder().url(BASE_URL + "/delay/2") // This URL is served with a 2 second delay. + .build(); + + final int seconds = 1; + final long startNanos = System.nanoTime(); + + final Call call = client.newCall(request); + + // Schedule a job to cancel the call in 1 second. + executor.schedule(() -> { + + logger.debug("Canceling call: " + ((System.nanoTime() - startNanos) / 1e9f)); + call.cancel(); + logger.debug("Canceled call: " + ((System.nanoTime() - startNanos) / 1e9f)); + + }, seconds, TimeUnit.SECONDS); + + logger.debug("Executing call: " + ((System.nanoTime() - startNanos) / 1e9f)); + final Response response = call.execute(); + logger.debug("Call completed: " + ((System.nanoTime() - startNanos) / 1e9f), response); + } + + @Test + public void whenSetResponseCache_thenCorrect() throws IOException { + + final int cacheSize = 10 * 1024 * 1024; // 10 MiB + final File cacheDirectory = new File("src/test/resources/cache"); + final Cache cache = new Cache(cacheDirectory, cacheSize); + + final OkHttpClient clientCached = new OkHttpClient.Builder().cache(cache).build(); + + final Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); + + final Response response1 = clientCached.newCall(request).execute(); + logResponse(response1); + + final Response response2 = clientCached.newCall(request).execute(); + logResponse(response2); + } + + private void logResponse(Response response) throws IOException { + + logger.debug("Response response: " + response); + logger.debug("Response cache response: " + response.cacheResponse()); + logger.debug("Response network response: " + response.networkResponse()); + logger.debug("Response responseBody: " + response.body().string()); + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java new file mode 100644 index 0000000000..77a78c2634 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java @@ -0,0 +1,85 @@ +package org.baeldung.okhttp; + +import static org.baeldung.client.Consts.APPLICATION_PORT; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.io.File; +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.Credentials; +import okhttp3.FormBody; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +import org.junit.Before; +import org.junit.Test; + +public class OkHttpPostingLiveTest { + + private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; + private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://browserspy.dk/password-ok.php"; + + OkHttpClient client; + + @Before + public void init() { + + client = new OkHttpClient(); + } + + @Test + public void whenSendPostRequest_thenCorrect() throws IOException { + final RequestBody formBody = new FormBody.Builder().add("username", "test").add("password", "test").build(); + + final Request request = new Request.Builder().url(BASE_URL + "/users").post(formBody).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } + + @Test + public void whenSendPostRequestWithAuthorization_thenCorrect() throws IOException { + final String postBody = "test post"; + + final Request request = new Request.Builder().url(URL_SECURED_BY_BASIC_AUTHENTICATION).addHeader("Authorization", Credentials.basic("test", "test")).post(RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"), "test post")).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } + + @Test + public void whenPostJson_thenCorrect() throws IOException { + final String json = "{\"id\":1,\"name\":\"John\"}"; + + final RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "{\"id\":1,\"name\":\"John\"}"); + final Request request = new Request.Builder().url(BASE_URL + "/users/detail").post(body).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } + + @Test + public void whenSendMultipartRequest_thenCorrect() throws IOException { + final RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("username", "test").addFormDataPart("password", "test") + .addFormDataPart("file", "file.txt", RequestBody.create(MediaType.parse("application/octet-stream"), new File("src/test/resources/test.txt"))).build(); + + final Request request = new Request.Builder().url(BASE_URL + "/users/multipart").post(requestBody).build(); + + final Call call = client.newCall(request); + final Response response = call.execute(); + + assertThat(response.code(), equalTo(200)); + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java new file mode 100644 index 0000000000..58f84f06a2 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java @@ -0,0 +1,29 @@ +package org.baeldung.okhttp; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import org.junit.Test; + +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class OkHttpRedirectLiveTest { + + @Test + public void whenSetFollowRedirects_thenNotRedirected() throws IOException { + + OkHttpClient client = new OkHttpClient().newBuilder().followRedirects(false).build(); + + Request request = new Request.Builder().url("http://t.co/I5YYd9tddw").build(); + + Call call = client.newCall(request); + Response response = call.execute(); + + assertThat(response.code(), equalTo(301)); + } +} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java b/spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java new file mode 100644 index 0000000000..fcae69c609 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java @@ -0,0 +1,73 @@ +package org.baeldung.okhttp; + +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +import okio.Buffer; +import okio.BufferedSink; +import okio.ForwardingSink; +import okio.Okio; +import okio.Sink; + +public class ProgressRequestWrapper extends RequestBody { + + protected RequestBody delegate; + protected ProgressListener listener; + + protected CountingSink countingSink; + + public ProgressRequestWrapper(RequestBody delegate, ProgressListener listener) { + this.delegate = delegate; + this.listener = listener; + } + + @Override + public MediaType contentType() { + return delegate.contentType(); + } + + @Override + public long contentLength() throws IOException { + return delegate.contentLength(); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + + BufferedSink bufferedSink; + + countingSink = new CountingSink(sink); + bufferedSink = Okio.buffer(countingSink); + + delegate.writeTo(bufferedSink); + + bufferedSink.flush(); + } + + protected final class CountingSink extends ForwardingSink { + + private long bytesWritten = 0; + + public CountingSink(Sink delegate) { + super(delegate); + } + + @Override + public void write(Buffer source, long byteCount) throws IOException { + + super.write(source, byteCount); + + bytesWritten += byteCount; + listener.onRequestProgress(bytesWritten, contentLength()); + } + + } + + public interface ProgressListener { + + void onRequestProgress(long bytesWritten, long contentLength); + + } +} diff --git a/spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java b/spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java new file mode 100644 index 0000000000..84ae1063d9 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java @@ -0,0 +1,49 @@ +package org.baeldung.uribuilder; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; + +import org.junit.Test; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +public class SpringUriBuilderTest { + + @Test + public void constructUri() { + UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.baeldung.com").path("/junit-5").build(); + + assertEquals("http://www.baeldung.com/junit-5", uriComponents.toUriString()); + } + + @Test + public void constructUriEncoded() { + UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.baeldung.com").path("/junit 5").build().encode(); + + assertEquals("http://www.baeldung.com/junit%205", uriComponents.toUriString()); + } + + @Test + public void constructUriFromTemplate() { + UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.baeldung.com").path("/{article-name}").buildAndExpand("junit-5"); + + assertEquals("http://www.baeldung.com/junit-5", uriComponents.toUriString()); + } + + @Test + public void constructUriWithQueryParameter() { + UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.google.com").path("/").query("q={keyword}").buildAndExpand("baeldung"); + + assertEquals("http://www.google.com/?q=baeldung", uriComponents.toUriString()); + } + + @Test + public void expandWithRegexVar() { + String template = "/myurl/{name:[a-z]{1,5}}/show"; + UriComponents uriComponents = UriComponentsBuilder.fromUriString(template).build(); + uriComponents = uriComponents.expand(Collections.singletonMap("name", "test")); + + assertEquals("/myurl/test/show", uriComponents.getPath()); + } +} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java new file mode 100644 index 0000000000..e8d5ff9f17 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java @@ -0,0 +1,37 @@ +package org.baeldung.web.controller.mediatypes; + +import com.jayway.restassured.http.ContentType; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import static com.jayway.restassured.RestAssured.given; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) +public class CustomMediaTypeControllerLiveTest { + private static final String URL_PREFIX = "http://localhost:8082/spring-rest"; + + @Test + public void givenServiceEndpoint_whenGetRequestFirstAPIVersion_thenShouldReturn200() { + given() + .accept("application/vnd.baeldung.api.v1+json") + .when() + .get(URL_PREFIX + "/public/api/items/1") + .then() + .contentType(ContentType.JSON).and().statusCode(200); + } + + + @Test + public void givenServiceEndpoint_whenGetRequestSecondAPIVersion_thenShouldReturn200() { + given() + .accept("application/vnd.baeldung.api.v2+json") + .when() + .get(URL_PREFIX + "/public/api/items/2") + .then() + .contentType(ContentType.JSON).and().statusCode(200); + } +} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java new file mode 100644 index 0000000000..a38177f78b --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java @@ -0,0 +1,42 @@ +package org.baeldung.web.controller.mediatypes; + +import org.baeldung.config.WebConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = WebConfig.class) +@WebAppConfiguration +public class CustomMediaTypeControllerTest { + + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext webApplicationContext; + + @Before + public void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } + + @Test + public void givenServiceUrl_whenGetWithProperAcceptHeaderFirstAPIVersion_thenReturn200() throws Exception { + mockMvc.perform(get("/public/api/items/1").accept("application/vnd.baeldung.api.v1+json")).andExpect(status().isOk()); + } + + @Test + public void givenServiceUrl_whenGetWithProperAcceptHeaderSecondVersion_thenReturn200() throws Exception { + mockMvc.perform(get("/public/api/items/2").accept("application/vnd.baeldung.api.v2+json")).andExpect(status().isOk()); + } +} \ No newline at end of file diff --git a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java new file mode 100644 index 0000000000..66ffe4947d --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java @@ -0,0 +1,11 @@ +package org.baeldung.web.controller.mediatypes; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@ComponentScan({ "org.baeldung.web" }) +public class TestConfig { + +} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java b/spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java new file mode 100644 index 0000000000..c604db596a --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java @@ -0,0 +1,66 @@ +package org.baeldung.web.controller.redirect; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.flash; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("file:src/main/webapp/WEB-INF/api-servlet.xml") +@WebAppConfiguration +public class RedirectControllerIntegrationTest { + + private MockMvc mockMvc; + + @Autowired + protected WebApplicationContext wac; + + @Before + public void setup() { + mockMvc = webAppContextSetup(wac).build(); + } + + @Test + public void whenRedirectOnUrlWithUsingXMLConfig_thenStatusRedirectionAndRedirectedOnUrl() throws Exception { + mockMvc.perform(get("/redirectWithXMLConfig")).andExpect(status().is3xxRedirection()).andExpect(view().name("RedirectedUrl")).andExpect(model().attribute("attribute", equalTo("redirectWithXMLConfig"))) + .andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithXMLConfig")); + } + + @Test + public void whenRedirectOnUrlWithUsingRedirectPrefix_thenStatusRedirectionAndRedirectedOnUrl() throws Exception { + mockMvc.perform(get("/redirectWithRedirectPrefix")).andExpect(status().is3xxRedirection()).andExpect(view().name("redirect:/redirectedUrl")).andExpect(model().attribute("attribute", equalTo("redirectWithRedirectPrefix"))) + .andExpect(redirectedUrl("/redirectedUrl?attribute=redirectWithRedirectPrefix")); + } + + @Test + public void whenRedirectOnUrlWithUsingRedirectAttributes_thenStatusRedirectionAndRedirectedOnUrlAndAddedAttributeToFlashScope() throws Exception { + mockMvc.perform(get("/redirectWithRedirectAttributes")).andExpect(status().is3xxRedirection()).andExpect(flash().attribute("flashAttribute", equalTo("redirectWithRedirectAttributes"))) + .andExpect(model().attribute("attribute", equalTo("redirectWithRedirectAttributes"))).andExpect(model().attribute("flashAttribute", equalTo(null))).andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithRedirectAttributes")); + } + + @Test + public void whenRedirectOnUrlWithUsingRedirectView_thenStatusRedirectionAndRedirectedOnUrlAndAddedAttributeToFlashScope() throws Exception { + mockMvc.perform(get("/redirectWithRedirectView")).andExpect(status().is3xxRedirection()).andExpect(model().attribute("attribute", equalTo("redirectWithRedirectView"))).andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithRedirectView")); + } + + @Test + public void whenRedirectOnUrlWithUsingForwardPrefix_thenStatusOkAndForwardedOnUrl() throws Exception { + mockMvc.perform(get("/forwardWithForwardPrefix")).andExpect(status().isOk()).andExpect(view().name("forward:/redirectedUrl")).andExpect(model().attribute("attribute", equalTo("redirectWithForwardPrefix"))).andExpect(forwardedUrl("/redirectedUrl")); + } + +} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java b/spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java new file mode 100644 index 0000000000..e29bef501e --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java @@ -0,0 +1,42 @@ +package org.baeldung.web.controller.status; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.baeldung.config.WebConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = WebConfig.class) +@WebAppConfiguration +public class ExampleControllerIntegrationTest { + + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext webApplicationContext; + + @Before + public void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } + + @Test + public void whenGetRequestSentToController_thenReturnsStatusNotAcceptable() throws Exception { + mockMvc.perform(get("/controller")).andExpect(status().isNotAcceptable()); + } + + @Test + public void whenGetRequestSentToException_thenReturnsStatusForbidden() throws Exception { + mockMvc.perform(get("/exception")).andExpect(status().isForbidden()); + } +} diff --git a/spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java b/spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java new file mode 100644 index 0000000000..7828df7304 --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java @@ -0,0 +1,63 @@ +package org.baeldung.web.test; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import org.junit.Test; + +import com.jayway.restassured.RestAssured; + +public class RequestMappingLiveTest { + private static String BASE_URI = "http://localhost:8082/spring-rest/ex/"; + + @Test + public void givenSimplePath_whenGetFoos_thenOk() { + RestAssured.given().accept("text/html").get(BASE_URI + "foos").then().assertThat().body(equalTo("Simple Get some Foos")); + } + + @Test + public void whenPostFoos_thenOk() { + RestAssured.given().accept("text/html").post(BASE_URI + "foos").then().assertThat().body(equalTo("Post some Foos")); + } + + @Test + public void givenOneHeader_whenGetFoos_thenOk() { + RestAssured.given().accept("text/html").header("key", "val").get(BASE_URI + "foos").then().assertThat().body(equalTo("Get some Foos with Header")); + } + + @Test + public void givenMultipleHeaders_whenGetFoos_thenOk() { + RestAssured.given().accept("text/html").headers("key1", "val1", "key2", "val2").get(BASE_URI + "foos").then().assertThat().body(equalTo("Get some Foos with Header")); + } + + @Test + public void givenAcceptHeader_whenGetFoos_thenOk() { + RestAssured.given().accept("application/json").get(BASE_URI + "foos").then().assertThat().body(containsString("Get some Foos with Header New")); + } + + @Test + public void givenPathVariable_whenGetFoos_thenOk() { + RestAssured.given().accept("text/html").get(BASE_URI + "foos/1").then().assertThat().body(equalTo("Get a specific Foo with id=1")); + } + + @Test + public void givenMultiplePathVariable_whenGetFoos_thenOk() { + RestAssured.given().accept("text/html").get(BASE_URI + "foos/1/bar/2").then().assertThat().body(equalTo("Get a specific Bar with id=2 from a Foo with id=1")); + } + + @Test + public void givenPathVariable_whenGetBars_thenOk() { + RestAssured.given().accept("text/html").get(BASE_URI + "bars/1").then().assertThat().body(equalTo("Get a specific Bar with id=1")); + } + + @Test + public void givenParams_whenGetBars_thenOk() { + RestAssured.given().accept("text/html").get(BASE_URI + "bars?id=100&second=something").then().assertThat().body(equalTo("Get a specific Bar with id=100")); + } + + @Test + public void whenGetFoosOrBars_thenOk() { + RestAssured.given().accept("text/html").get(BASE_URI + "advanced/foos").then().assertThat().body(equalTo("Advanced - Get some Foos or Bars")); + RestAssured.given().accept("text/html").get(BASE_URI + "advanced/bars").then().assertThat().body(equalTo("Advanced - Get some Foos or Bars")); + } +} diff --git a/spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java b/spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java new file mode 100644 index 0000000000..7f250653ab --- /dev/null +++ b/spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java @@ -0,0 +1,123 @@ +package org.baeldung.web.test; + +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +import java.util.Arrays; + +import org.baeldung.config.converter.KryoHttpMessageConverter; +import org.baeldung.web.dto.Foo; +import org.baeldung.web.dto.FooProtos; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +/** + * Integration Test class. Tests methods hits the server's rest services. + */ +public class SpringHttpMessageConvertersLiveTest { + + private static String BASE_URI = "http://localhost:8082/spring-rest/"; + + /** + * Without specifying Accept Header, uses the default response from the + * server (in this case json) + */ + @Test + public void whenRetrievingAFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + final Foo resource = restTemplate.getForObject(URI, Foo.class, "1"); + + assertThat(resource, notNullValue()); + } + + @Test + public void givenConsumingXml_whenReadingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); + final HttpEntity entity = new HttpEntity(headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); + final Foo resource = response.getBody(); + + assertThat(resource, notNullValue()); + } + + @Test + public void givenConsumingJson_whenReadingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); + final HttpEntity entity = new HttpEntity(headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); + final Foo resource = response.getBody(); + + assertThat(resource, notNullValue()); + } + + @Test + public void givenConsumingXml_whenWritingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + final RestTemplate restTemplate = new RestTemplate(); + + final Foo resource = new Foo(4, "jason"); + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); + headers.setContentType((MediaType.APPLICATION_XML)); + final HttpEntity entity = new HttpEntity(resource, headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.PUT, entity, Foo.class, resource.getId()); + final Foo fooResponse = response.getBody(); + + Assert.assertEquals(resource.getId(), fooResponse.getId()); + } + + @Test + public void givenConsumingProtobuf_whenReadingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setMessageConverters(Arrays.asList(new ProtobufHttpMessageConverter())); + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(ProtobufHttpMessageConverter.PROTOBUF)); + final HttpEntity entity = new HttpEntity(headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, FooProtos.Foo.class, "1"); + final FooProtos.Foo resource = response.getBody(); + + assertThat(resource, notNullValue()); + } + + @Test + public void givenConsumingKryo_whenReadingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setMessageConverters(Arrays.asList(new KryoHttpMessageConverter())); + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(KryoHttpMessageConverter.KRYO)); + final HttpEntity entity = new HttpEntity(headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); + final Foo resource = response.getBody(); + + assertThat(resource, notNullValue()); + } + +} diff --git a/spring-5/src/test/resources/.gitignore b/spring-5/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-5/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-5/src/test/resources/test.txt b/spring-5/src/test/resources/test.txt new file mode 100644 index 0000000000..95d09f2b10 --- /dev/null +++ b/spring-5/src/test/resources/test.txt @@ -0,0 +1 @@ +hello world \ No newline at end of file From 07876a2855fc353070b835e6fac5654240d9ed72 Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 24 Feb 2017 13:57:32 +0200 Subject: [PATCH 180/192] work on initial state of the spring 5 project --- spring-5/pom.xml | 431 +++---------- .../java/com/baeldung/Spring5Application.java | 12 + .../java/org/baeldung/config/Application.java | 16 - .../java/org/baeldung/config/WebConfig.java | 57 -- .../converter/KryoHttpMessageConverter.java | 57 -- .../BarMappingExamplesController.java | 47 -- .../web/controller/CompanyController.java | 16 - .../web/controller/FooController.java | 45 -- .../FooMappingExamplesController.java | 101 --- .../web/controller/ItemController.java | 39 -- .../web/controller/MyFooController.java | 76 --- .../web/controller/SimplePostController.java | 73 --- .../advice/JsonpControllerAdvice.java | 13 - .../mediatypes/CustomMediaTypeController.java | 20 - .../redirect/RedirectController.java | 52 -- .../controller/status/ExampleController.java | 24 - .../controller/status/ForbiddenException.java | 10 - .../org/baeldung/web/dto/BaeldungItem.java | 13 - .../org/baeldung/web/dto/BaeldungItemV2.java | 14 - .../java/org/baeldung/web/dto/Company.java | 38 -- .../main/java/org/baeldung/web/dto/Foo.java | 45 -- .../java/org/baeldung/web/dto/FooProtos.java | 597 ------------------ .../main/java/org/baeldung/web/dto/Item.java | 36 -- .../org/baeldung/web/dto/ItemManager.java | 9 - .../main/java/org/baeldung/web/dto/Views.java | 9 - .../exception/ResourceNotFoundException.java | 8 - .../src/main/resources/application.properties | 2 - spring-5/src/main/resources/logback.xml | 20 - .../src/main/webapp/WEB-INF/api-servlet.xml | 56 -- spring-5/src/main/webapp/WEB-INF/company.html | 44 -- .../src/main/webapp/WEB-INF/spring-views.xml | 10 - spring-5/src/main/webapp/WEB-INF/web.xml | 41 -- .../com/baeldung/Spring5ApplicationTests.java | 16 + .../test/java/org/baeldung/client/Consts.java | 5 - .../client/RestTemplateBasicLiveTest.java | 216 ------- .../okhttp/DefaultContentTypeInterceptor.java | 24 - .../okhttp/OkHttpFileUploadingLiveTest.java | 65 -- .../baeldung/okhttp/OkHttpGetLiveTest.java | 77 --- .../baeldung/okhttp/OkHttpHeaderLiveTest.java | 45 -- .../baeldung/okhttp/OkHttpMiscLiveTest.java | 99 --- .../okhttp/OkHttpPostingLiveTest.java | 85 --- .../okhttp/OkHttpRedirectLiveTest.java | 29 - .../okhttp/ProgressRequestWrapper.java | 73 --- .../uribuilder/SpringUriBuilderTest.java | 49 -- .../CustomMediaTypeControllerLiveTest.java | 37 -- .../CustomMediaTypeControllerTest.java | 42 -- .../web/controller/mediatypes/TestConfig.java | 11 - .../RedirectControllerIntegrationTest.java | 66 -- .../ExampleControllerIntegrationTest.java | 42 -- .../web/test/RequestMappingLiveTest.java | 63 -- .../SpringHttpMessageConvertersLiveTest.java | 123 ---- spring-5/src/test/resources/.gitignore | 13 - spring-5/src/test/resources/test.txt | 1 - 53 files changed, 125 insertions(+), 3087 deletions(-) create mode 100644 spring-5/src/main/java/com/baeldung/Spring5Application.java delete mode 100644 spring-5/src/main/java/org/baeldung/config/Application.java delete mode 100644 spring-5/src/main/java/org/baeldung/config/WebConfig.java delete mode 100644 spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/FooController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/ItemController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Company.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Foo.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Item.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/dto/Views.java delete mode 100644 spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java delete mode 100644 spring-5/src/main/resources/logback.xml delete mode 100644 spring-5/src/main/webapp/WEB-INF/api-servlet.xml delete mode 100644 spring-5/src/main/webapp/WEB-INF/company.html delete mode 100644 spring-5/src/main/webapp/WEB-INF/spring-views.xml delete mode 100644 spring-5/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java delete mode 100644 spring-5/src/test/java/org/baeldung/client/Consts.java delete mode 100644 spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java delete mode 100644 spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java delete mode 100644 spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java delete mode 100644 spring-5/src/test/resources/.gitignore delete mode 100644 spring-5/src/test/resources/test.txt diff --git a/spring-5/pom.xml b/spring-5/pom.xml index c2545d920f..3b1d6c712b 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -1,345 +1,108 @@ + - 4.0.0 - com.baeldung - spring-5 - 0.1-SNAPSHOT - spring-5 - war + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - - 2.0.0.BUILD-SNAPSHOT - + com.baeldung + spring-5 + 0.0.1-SNAPSHOT + jar - + spring-5 + - + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.BUILD-SNAPSHOT + + - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - + + UTF-8 + UTF-8 + 1.8 + - + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - org.springframework - spring-oxm - + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - javax.servlet - javax.servlet-api - provided - - - - javax.servlet - jstl - runtime - - - - - - com.fasterxml.jackson.core - jackson-databind - - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - - - - com.thoughtworks.xstream - xstream - ${xstream.version} - - - - - - com.google.guava - guava - ${guava.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - - - org.slf4j - slf4j-api - - - ch.qos.logback - logback-classic - - - - org.slf4j - jcl-over-slf4j - - - - org.slf4j - log4j-over-slf4j - - - - - - com.squareup.okhttp3 - okhttp - ${com.squareup.okhttp3.version} - - - - - - junit - junit - test - - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - - org.mockito - mockito-core - test - - - - org.springframework - spring-test - - - - com.jayway.restassured - rest-assured - ${rest-assured.version} - - - - - com.google.protobuf - protobuf-java - ${protobuf-java.version} - - - com.googlecode.protobuf-java-format - protobuf-java-format - ${protobuf-java-format.version} - - - - com.esotericsoftware - kryo - ${kryo.version} - - - - - spring-5 - - - src/main/resources - true - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-war-plugin - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*LiveTest.java - - - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - true - - tomcat8x - embedded - - - - - - - 8082 - - - - - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*IntegrationTest.java - - - - - - - - - - - - - - 1.3.2 - 4.0.0 - 1.4 - 3.1.0 - 3.5 - 1.4.9 - - - 20.0 - 2.9.0 - - - 1.6.0 - 3.0.4 - - - 3.4.1 - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + diff --git a/spring-5/src/main/java/com/baeldung/Spring5Application.java b/spring-5/src/main/java/com/baeldung/Spring5Application.java new file mode 100644 index 0000000000..902af95afd --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/Spring5Application.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Spring5Application { + + public static void main(String[] args) { + SpringApplication.run(Spring5Application.class, args); + } +} diff --git a/spring-5/src/main/java/org/baeldung/config/Application.java b/spring-5/src/main/java/org/baeldung/config/Application.java deleted file mode 100644 index 077213b04d..0000000000 --- a/spring-5/src/main/java/org/baeldung/config/Application.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.config; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -@EnableAutoConfiguration -@ComponentScan("org.baeldung") -public class Application extends WebMvcConfigurerAdapter { - - public static void main(final String[] args) { - SpringApplication.run(Application.class, args); - } - -} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/config/WebConfig.java b/spring-5/src/main/java/org/baeldung/config/WebConfig.java deleted file mode 100644 index f40c9477d4..0000000000 --- a/spring-5/src/main/java/org/baeldung/config/WebConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.baeldung.config; - -import org.baeldung.config.converter.KryoHttpMessageConverter; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; -import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; -import org.springframework.oxm.xstream.XStreamMarshaller; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -import java.text.SimpleDateFormat; -import java.util.List; - -/* - * Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml - */ -@Configuration -@EnableWebMvc -@ComponentScan({ "org.baeldung.web" }) -public class WebConfig extends WebMvcConfigurerAdapter { - - public WebConfig() { - super(); - } - - // - - @Override - public void configureMessageConverters(final List> messageConverters) { - final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); - builder.indentOutput(true).dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); - messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); - // messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); - - // messageConverters.add(createXmlHttpMessageConverter()); - // messageConverters.add(new MappingJackson2HttpMessageConverter()); - - messageConverters.add(new ProtobufHttpMessageConverter()); - messageConverters.add(new KryoHttpMessageConverter()); - super.configureMessageConverters(messageConverters); - } - - private HttpMessageConverter createXmlHttpMessageConverter() { - final MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter(); - - final XStreamMarshaller xstreamMarshaller = new XStreamMarshaller(); - xmlConverter.setMarshaller(xstreamMarshaller); - xmlConverter.setUnmarshaller(xstreamMarshaller); - - return xmlConverter; - } - -} diff --git a/spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java b/spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java deleted file mode 100644 index 7e63a3ba9e..0000000000 --- a/spring-5/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.baeldung.config.converter; - -import java.io.IOException; - -import org.baeldung.web.dto.Foo; -import org.springframework.http.HttpInputMessage; -import org.springframework.http.HttpOutputMessage; -import org.springframework.http.MediaType; -import org.springframework.http.converter.AbstractHttpMessageConverter; - -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - -/** - * An {@code HttpMessageConverter} that can read and write Kryo messages. - */ -public class KryoHttpMessageConverter extends AbstractHttpMessageConverter { - - public static final MediaType KRYO = new MediaType("application", "x-kryo"); - - private static final ThreadLocal kryoThreadLocal = new ThreadLocal() { - @Override - protected Kryo initialValue() { - final Kryo kryo = new Kryo(); - kryo.register(Foo.class, 1); - return kryo; - } - }; - - public KryoHttpMessageConverter() { - super(KRYO); - } - - @Override - protected boolean supports(final Class clazz) { - return Object.class.isAssignableFrom(clazz); - } - - @Override - protected Object readInternal(final Class clazz, final HttpInputMessage inputMessage) throws IOException { - final Input input = new Input(inputMessage.getBody()); - return kryoThreadLocal.get().readClassAndObject(input); - } - - @Override - protected void writeInternal(final Object object, final HttpOutputMessage outputMessage) throws IOException { - final Output output = new Output(outputMessage.getBody()); - kryoThreadLocal.get().writeClassAndObject(output, object); - output.flush(); - } - - @Override - protected MediaType getDefaultContentType(final Object object) { - return KRYO; - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java b/spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java deleted file mode 100644 index 1c3a1086ca..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.baeldung.web.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -@RequestMapping(value = "/ex") -public class BarMappingExamplesController { - - public BarMappingExamplesController() { - super(); - } - - // API - - // with @RequestParam - - @RequestMapping(value = "/bars") - @ResponseBody - public String getBarBySimplePathWithRequestParam(@RequestParam("id") final long id) { - return "Get a specific Bar with id=" + id; - } - - @RequestMapping(value = "/bars", params = "id") - @ResponseBody - public String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") final long id) { - return "Get a specific Bar with id=" + id; - } - - @RequestMapping(value = "/bars", params = { "id", "second" }) - @ResponseBody - public String getBarBySimplePathWithExplicitRequestParams(@RequestParam("id") final long id) { - return "Get a specific Bar with id=" + id; - } - - // with @PathVariable - - @RequestMapping(value = "/bars/{numericId:[\\d]+}") - @ResponseBody - public String getBarsBySimplePathWithPathVariable(@PathVariable final long numericId) { - return "Get a specific Bar with id=" + numericId; - } - -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java b/spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java deleted file mode 100644 index aa694c08ed..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/CompanyController.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.web.controller; - -import org.baeldung.web.dto.Company; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class CompanyController { - - @RequestMapping(value = "/companyRest", produces = MediaType.APPLICATION_JSON_VALUE) - public Company getCompanyRest() { - final Company company = new Company(1, "Xpto"); - return company; - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/FooController.java b/spring-5/src/main/java/org/baeldung/web/controller/FooController.java deleted file mode 100644 index 21ba3c6d13..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/FooController.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.baeldung.web.controller; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import org.baeldung.web.dto.Foo; -import org.baeldung.web.dto.FooProtos; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -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.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Controller -public class FooController { - - public FooController() { - super(); - } - - // API - read - - @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") - @ResponseBody - public Foo findById(@PathVariable final long id) { - return new Foo(id, randomAlphabetic(4)); - } - - // API - write - - @RequestMapping(method = RequestMethod.PUT, value = "/foos/{id}") - @ResponseStatus(HttpStatus.OK) - @ResponseBody - public Foo updateFoo(@PathVariable("id") final String id, @RequestBody final Foo foo) { - return foo; - } - - @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}", produces = { "application/x-protobuf" }) - @ResponseBody - public FooProtos.Foo findProtoById(@PathVariable final long id) { - return FooProtos.Foo.newBuilder().setId(1).setName("Foo Name").build(); - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java b/spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java deleted file mode 100644 index 5fb92d6d87..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.baeldung.web.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -@RequestMapping(value = "/ex") -public class FooMappingExamplesController { - - public FooMappingExamplesController() { - super(); - } - - // API - - // mapping examples - - @RequestMapping(value = "/foos") - @ResponseBody - public String getFoosBySimplePath() { - return "Simple Get some Foos"; - } - - // with @PathVariable - - @RequestMapping(value = "/foos/{id}") - @ResponseBody - public String getFoosBySimplePathWithPathVariable(@PathVariable final long id) { - return "Get a specific Foo with id=" + id; - } - - @RequestMapping(value = "/foos/{fooid}/bar/{barid}") - @ResponseBody - public String getFoosBySimplePathWithPathVariables(@PathVariable final long fooid, @PathVariable final long barid) { - return "Get a specific Bar with id=" + barid + " from a Foo with id=" + fooid; - } - - // other HTTP verbs - - @RequestMapping(value = "/foos", method = RequestMethod.POST) - @ResponseBody - public String postFoos() { - return "Post some Foos"; - } - - // with headers - - @RequestMapping(value = "/foos", headers = "key=val") - @ResponseBody - public String getFoosWithHeader() { - return "Get some Foos with Header"; - } - - @RequestMapping(value = "/foos", headers = { "key1=val1", "key2=val2" }) - @ResponseBody - public String getFoosWithHeaders() { - return "Get some Foos with Header"; - } - - // @RequestMapping(value = "/foos", method = RequestMethod.GET, headers = "Accept=application/json") - // @ResponseBody - // public String getFoosAsJsonFromBrowser() { - // return "Get some Foos with Header Old"; - // } - - @RequestMapping(value = "/foos", produces = { "application/json", "application/xml" }) - @ResponseBody - public String getFoosAsJsonFromREST() { - return "Get some Foos with Header New"; - } - - // advanced - multiple mappings - - @RequestMapping(value = { "/advanced/bars", "/advanced/foos" }) - @ResponseBody - public String getFoosOrBarsByPath() { - return "Advanced - Get some Foos or Bars"; - } - - @RequestMapping(value = "*") - @ResponseBody - public String getFallback() { - return "Fallback for GET Requests"; - } - - @RequestMapping(value = "*", method = { RequestMethod.GET, RequestMethod.POST }) - @ResponseBody - public String allFallback() { - return "Fallback for All Requests"; - } - - @RequestMapping(value = "/foos/multiple", method = { RequestMethod.PUT, RequestMethod.POST }) - @ResponseBody - public String putAndPostFoos() { - return "Advanced - PUT and POST within single method"; - } - -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/ItemController.java b/spring-5/src/main/java/org/baeldung/web/controller/ItemController.java deleted file mode 100644 index 1cc3eae432..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/ItemController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.baeldung.web.controller; - -import java.util.Date; - -import org.baeldung.web.dto.Item; -import org.baeldung.web.dto.ItemManager; -import org.baeldung.web.dto.Views; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.fasterxml.jackson.annotation.JsonView; - -@RestController -public class ItemController { - - @JsonView(Views.Public.class) - @RequestMapping("/items/{id}") - public Item getItemPublic(@PathVariable final int id) { - return ItemManager.getById(id); - } - - @JsonView(Views.Internal.class) - @RequestMapping("/items/internal/{id}") - public Item getItemInternal(@PathVariable final int id) { - return ItemManager.getById(id); - } - - @RequestMapping("/date") - public Date getCurrentDate() throws Exception { - return new Date(); - } - - @RequestMapping("/delay/{seconds}") - public void getCurrentTime(@PathVariable final int seconds) throws Exception { - - Thread.sleep(seconds * 1000); - } -} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java b/spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java deleted file mode 100644 index f19ddca435..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/MyFooController.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.baeldung.web.controller; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; - -import org.baeldung.web.dto.Foo; -import org.baeldung.web.exception.ResourceNotFoundException; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -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.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -@Controller -@RequestMapping(value = "/myfoos") -public class MyFooController { - - private final Map myfoos; - - public MyFooController() { - super(); - myfoos = new HashMap(); - myfoos.put(1L, new Foo(1L, "sample foo")); - } - - // API - read - - @RequestMapping(method = RequestMethod.GET) - @ResponseBody - public Collection findAll() { - return myfoos.values(); - } - - @RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = { "application/json" }) - @ResponseBody - public Foo findById(@PathVariable final long id) { - final Foo foo = myfoos.get(id); - if (foo == null) { - throw new ResourceNotFoundException(); - } - return foo; - } - - // API - write - - @RequestMapping(method = RequestMethod.PUT, value = "/{id}") - @ResponseStatus(HttpStatus.OK) - @ResponseBody - public Foo updateFoo(@PathVariable("id") final long id, @RequestBody final Foo foo) { - myfoos.put(id, foo); - return foo; - } - - @RequestMapping(method = RequestMethod.POST) - @ResponseStatus(HttpStatus.CREATED) - @ResponseBody - public Foo createFoo(@RequestBody final Foo foo, HttpServletResponse response) { - myfoos.put(foo.getId(), foo); - response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest().path("/" + foo.getId()).toUriString()); - return foo; - } - - @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") - @ResponseStatus(HttpStatus.OK) - public void deleteById(@PathVariable final long id) { - myfoos.remove(id); - } - -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java b/spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java deleted file mode 100644 index f8407acb47..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/SimplePostController.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.baeldung.web.controller; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - -import org.baeldung.web.dto.Foo; -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.RestController; -import org.springframework.web.multipart.MultipartFile; - -// used to test HttpClientPostingTest -@RestController -public class SimplePostController { - - @RequestMapping(value = "/users", method = RequestMethod.POST) - public String postUser(@RequestParam final String username, @RequestParam final String password) { - return "Success" + username; - } - - @RequestMapping(value = "/users/detail", method = RequestMethod.POST) - public String postUserDetail(@RequestBody final Foo entity) { - return "Success" + entity.getId(); - } - - @RequestMapping(value = "/users/multipart", method = RequestMethod.POST) - public String uploadFile(@RequestParam final String username, @RequestParam final String password, @RequestParam("file") final MultipartFile file) { - if (!file.isEmpty()) { - try { - final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); - final String fileName = dateFormat.format(new Date()); - final File fileServer = new File(fileName); - fileServer.createNewFile(); - final byte[] bytes = file.getBytes(); - final BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); - stream.write(bytes); - stream.close(); - return "You successfully uploaded " + username; - } catch (final Exception e) { - return "You failed to upload " + e.getMessage(); - } - } else { - return "You failed to upload because the file was empty."; - } - } - - @RequestMapping(value = "/users/upload", method = RequestMethod.POST) - public String postMultipart(@RequestParam("file") final MultipartFile file) { - if (!file.isEmpty()) { - try { - final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); - final String fileName = dateFormat.format(new Date()); - final File fileServer = new File(fileName); - fileServer.createNewFile(); - final byte[] bytes = file.getBytes(); - final BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); - stream.write(bytes); - stream.close(); - return "You successfully uploaded "; - } catch (final Exception e) { - return "You failed to upload " + e.getMessage(); - } - } else { - return "You failed to upload because the file was empty."; - } - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java b/spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java deleted file mode 100644 index 996f229128..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.baeldung.web.controller.advice; - -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; - -@ControllerAdvice -public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice { - - public JsonpControllerAdvice() { - super("callback"); - } - -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java b/spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java deleted file mode 100644 index 410c72d34f..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.baeldung.web.controller.mediatypes; - -import org.baeldung.web.dto.BaeldungItem; -import org.baeldung.web.dto.BaeldungItemV2; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping(value = "/", produces = "application/vnd.baeldung.api.v1+json") -public class CustomMediaTypeController { - - @RequestMapping(method = RequestMethod.GET, value = "/public/api/items/{id}", produces = "application/vnd.baeldung.api.v1+json") - public @ResponseBody BaeldungItem getItem(@PathVariable("id") String id) { - return new BaeldungItem("itemId1"); - } - - @RequestMapping(method = RequestMethod.GET, value = "/public/api/items/{id}", produces = "application/vnd.baeldung.api.v2+json") - public @ResponseBody BaeldungItemV2 getItemSecondAPIVersion(@PathVariable("id") String id) { - return new BaeldungItemV2("itemName"); - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java b/spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java deleted file mode 100644 index 472c0c8bf5..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.baeldung.web.controller.redirect; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import org.springframework.web.servlet.view.RedirectView; - -@Controller -@RequestMapping("/") -public class RedirectController { - - @RequestMapping(value = "/redirectWithXMLConfig", method = RequestMethod.GET) - public ModelAndView redirectWithUsingXMLConfig(final ModelMap model) { - model.addAttribute("attribute", "redirectWithXMLConfig"); - return new ModelAndView("RedirectedUrl", model); - } - - @RequestMapping(value = "/redirectWithRedirectPrefix", method = RequestMethod.GET) - public ModelAndView redirectWithUsingRedirectPrefix(final ModelMap model) { - model.addAttribute("attribute", "redirectWithRedirectPrefix"); - return new ModelAndView("redirect:/redirectedUrl", model); - } - - @RequestMapping(value = "/redirectWithRedirectAttributes", method = RequestMethod.GET) - public RedirectView redirectWithRedirectAttributes(final RedirectAttributes redirectAttributes) { - redirectAttributes.addFlashAttribute("flashAttribute", "redirectWithRedirectAttributes"); - redirectAttributes.addAttribute("attribute", "redirectWithRedirectAttributes"); - return new RedirectView("redirectedUrl"); - } - - @RequestMapping(value = "/redirectWithRedirectView", method = RequestMethod.GET) - public RedirectView redirectWithUsingRedirectView(final ModelMap model) { - model.addAttribute("attribute", "redirectWithRedirectView"); - return new RedirectView("redirectedUrl"); - } - - @RequestMapping(value = "/forwardWithForwardPrefix", method = RequestMethod.GET) - public ModelAndView forwardWithUsingForwardPrefix(final ModelMap model) { - model.addAttribute("attribute", "redirectWithForwardPrefix"); - return new ModelAndView("forward:/redirectedUrl", model); - } - - @RequestMapping(value = "/redirectedUrl", method = RequestMethod.GET) - public ModelAndView redirection(final ModelMap model, @ModelAttribute("flashAttribute") final Object flashAttribute) { - model.addAttribute("redirectionAttribute", flashAttribute); - return new ModelAndView("redirection", model); - } -} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java b/spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java deleted file mode 100644 index ceda138768..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/status/ExampleController.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.baeldung.web.controller.status; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -public class ExampleController { - - @RequestMapping(value = "/controller", method = RequestMethod.GET) - @ResponseBody - public ResponseEntity sendViaResponseEntity() { - return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE); - } - - @RequestMapping(value = "/exception", method = RequestMethod.GET) - @ResponseBody - public ResponseEntity sendViaException() { - throw new ForbiddenException(); - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java b/spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java deleted file mode 100644 index 458bdaf170..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.baeldung.web.controller.status; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "To show an example of a custom message") -public class ForbiddenException extends RuntimeException { - private static final long serialVersionUID = 6826605655586311552L; - -} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java b/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java deleted file mode 100644 index 9b3ecd33b9..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItem.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.baeldung.web.dto; - -public class BaeldungItem { - private final String itemId; - - public BaeldungItem(String itemId) { - this.itemId = itemId; - } - - public String getItemId() { - return itemId; - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java b/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java deleted file mode 100644 index 64df20a14e..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.baeldung.web.dto; - - -public class BaeldungItemV2 { - private final String itemName; - - public BaeldungItemV2(String itemName) { - this.itemName = itemName; - } - - public String getItemName() { - return itemName; - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Company.java b/spring-5/src/main/java/org/baeldung/web/dto/Company.java deleted file mode 100644 index 3164d604ad..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/Company.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.baeldung.web.dto; - -public class Company { - - private long id; - private String name; - - public Company() { - super(); - } - - public Company(final long id, final String name) { - this.id = id; - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - public long getId() { - return id; - } - - public void setId(final long id) { - this.id = id; - } - - @Override - public String toString() { - return "Company [id=" + id + ", name=" + name + "]"; - } - -} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Foo.java b/spring-5/src/main/java/org/baeldung/web/dto/Foo.java deleted file mode 100644 index 240b368b50..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/Foo.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.baeldung.web.dto; - -import com.thoughtworks.xstream.annotations.XStreamAlias; - -@XStreamAlias("Foo") -public class Foo { - private long id; - private String name; - - public Foo() { - super(); - } - - public Foo(final String name) { - super(); - - this.name = name; - } - - public Foo(final long id, final String name) { - super(); - - this.id = id; - this.name = name; - } - - // API - - public long getId() { - return id; - } - - public void setId(final long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java b/spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java deleted file mode 100644 index 8ca96c38fc..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/FooProtos.java +++ /dev/null @@ -1,597 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: FooProtos.proto - -package org.baeldung.web.dto; - -public final class FooProtos { - private FooProtos() { - } - - public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { - } - - public interface FooOrBuilder extends - // @@protoc_insertion_point(interface_extends:baeldung.Foo) - com.google.protobuf.MessageOrBuilder { - - /** - * required int64 id = 1; - */ - boolean hasId(); - - /** - * required int64 id = 1; - */ - long getId(); - - /** - * required string name = 2; - */ - boolean hasName(); - - /** - * required string name = 2; - */ - java.lang.String getName(); - - /** - * required string name = 2; - */ - com.google.protobuf.ByteString getNameBytes(); - } - - /** - * Protobuf type {@code baeldung.Foo} - */ - public static final class Foo extends com.google.protobuf.GeneratedMessage implements - // @@protoc_insertion_point(message_implements:baeldung.Foo) - FooOrBuilder { - // Use Foo.newBuilder() to construct. - private Foo(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - - private Foo(boolean noInit) { - this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); - } - - private static final Foo defaultInstance; - - public static Foo getDefaultInstance() { - return defaultInstance; - } - - public Foo getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet getUnknownFields() { - return this.unknownFields; - } - - private Foo(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { - done = true; - } - break; - } - case 8: { - bitField0_ |= 0x00000001; - id_ = input.readInt64(); - break; - } - case 18: { - com.google.protobuf.ByteString bs = input.readBytes(); - bitField0_ |= 0x00000002; - name_ = bs; - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_fieldAccessorTable.ensureFieldAccessorsInitialized(org.baeldung.web.dto.FooProtos.Foo.class, org.baeldung.web.dto.FooProtos.Foo.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { - public Foo parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return new Foo(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - public static final int ID_FIELD_NUMBER = 1; - private long id_; - - /** - * required int64 id = 1; - */ - public boolean hasId() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - - /** - * required int64 id = 1; - */ - public long getId() { - return id_; - } - - public static final int NAME_FIELD_NUMBER = 2; - private java.lang.Object name_; - - /** - * required string name = 2; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - - /** - * required string name = 2; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } - } - - /** - * required string name = 2; - */ - public com.google.protobuf.ByteString getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - private void initFields() { - id_ = 0L; - name_ = ""; - } - - private byte memoizedIsInitialized = -1; - - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized == 1) - return true; - if (isInitialized == 0) - return false; - - if (!hasId()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasName()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeInt64(1, id_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeBytes(2, getNameBytes()); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) - return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream.computeInt64Size(1, id_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, getNameBytes()); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - - @java.lang.Override - protected java.lang.Object writeReplace() throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(java.io.InputStream input) throws java.io.IOException { - return PARSER.parseFrom(input); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { - return PARSER.parseFrom(input); - } - - public static org.baeldung.web.dto.FooProtos.Foo parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { - return Builder.create(); - } - - public Builder newBuilderForType() { - return newBuilder(); - } - - public static Builder newBuilder(org.baeldung.web.dto.FooProtos.Foo prototype) { - return newBuilder().mergeFrom(prototype); - } - - public Builder toBuilder() { - return newBuilder(this); - } - - @java.lang.Override - protected Builder newBuilderForType(com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - - /** - * Protobuf type {@code baeldung.Foo} - */ - public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements - // @@protoc_insertion_point(builder_implements:baeldung.Foo) - org.baeldung.web.dto.FooProtos.FooOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_fieldAccessorTable.ensureFieldAccessorsInitialized(org.baeldung.web.dto.FooProtos.Foo.class, org.baeldung.web.dto.FooProtos.Foo.Builder.class); - } - - // Construct using org.baeldung.web.dto.FooProtos.Foo.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - id_ = 0L; - bitField0_ = (bitField0_ & ~0x00000001); - name_ = ""; - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; - } - - public org.baeldung.web.dto.FooProtos.Foo getDefaultInstanceForType() { - return org.baeldung.web.dto.FooProtos.Foo.getDefaultInstance(); - } - - public org.baeldung.web.dto.FooProtos.Foo build() { - org.baeldung.web.dto.FooProtos.Foo result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public org.baeldung.web.dto.FooProtos.Foo buildPartial() { - org.baeldung.web.dto.FooProtos.Foo result = new org.baeldung.web.dto.FooProtos.Foo(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.id_ = id_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.name_ = name_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof org.baeldung.web.dto.FooProtos.Foo) { - return mergeFrom((org.baeldung.web.dto.FooProtos.Foo) other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(org.baeldung.web.dto.FooProtos.Foo other) { - if (other == org.baeldung.web.dto.FooProtos.Foo.getDefaultInstance()) - return this; - if (other.hasId()) { - setId(other.getId()); - } - if (other.hasName()) { - bitField0_ |= 0x00000002; - name_ = other.name_; - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasId()) { - - return false; - } - if (!hasName()) { - - return false; - } - return true; - } - - public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - org.baeldung.web.dto.FooProtos.Foo parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (org.baeldung.web.dto.FooProtos.Foo) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - - private int bitField0_; - - private long id_; - - /** - * required int64 id = 1; - */ - public boolean hasId() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - - /** - * required int64 id = 1; - */ - public long getId() { - return id_; - } - - /** - * required int64 id = 1; - */ - public Builder setId(long value) { - bitField0_ |= 0x00000001; - id_ = value; - onChanged(); - return this; - } - - /** - * required int64 id = 1; - */ - public Builder clearId() { - bitField0_ = (bitField0_ & ~0x00000001); - id_ = 0L; - onChanged(); - return this; - } - - private java.lang.Object name_ = ""; - - /** - * required string name = 2; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - - /** - * required string name = 2; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } else { - return (java.lang.String) ref; - } - } - - /** - * required string name = 2; - */ - public com.google.protobuf.ByteString getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - /** - * required string name = 2; - */ - public Builder setName(java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - name_ = value; - onChanged(); - return this; - } - - /** - * required string name = 2; - */ - public Builder clearName() { - bitField0_ = (bitField0_ & ~0x00000002); - name_ = getDefaultInstance().getName(); - onChanged(); - return this; - } - - /** - * required string name = 2; - */ - public Builder setNameBytes(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - name_ = value; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:baeldung.Foo) - } - - static { - defaultInstance = new Foo(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:baeldung.Foo) - } - - private static final com.google.protobuf.Descriptors.Descriptor internal_static_baeldung_Foo_descriptor; - private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_baeldung_Foo_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { - return descriptor; - } - - private static com.google.protobuf.Descriptors.FileDescriptor descriptor; - static { - java.lang.String[] descriptorData = { "\n\017FooProtos.proto\022\010baeldung\"\037\n\003Foo\022\n\n\002id" + "\030\001 \002(\003\022\014\n\004name\030\002 \002(\tB!\n\024org.baeldung.web" + ".dtoB\tFooProtos" }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors(com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}, assigner); - internal_static_baeldung_Foo_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_baeldung_Foo_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(internal_static_baeldung_Foo_descriptor, new java.lang.String[] { "Id", "Name", }); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Item.java b/spring-5/src/main/java/org/baeldung/web/dto/Item.java deleted file mode 100644 index 536c72020f..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/Item.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.baeldung.web.dto; - -import com.fasterxml.jackson.annotation.JsonView; - -public class Item { - @JsonView(Views.Public.class) - public int id; - - @JsonView(Views.Public.class) - public String itemName; - - @JsonView(Views.Internal.class) - public String ownerName; - - public Item() { - super(); - } - - public Item(final int id, final String itemName, final String ownerName) { - this.id = id; - this.itemName = itemName; - this.ownerName = ownerName; - } - - public int getId() { - return id; - } - - public String getItemName() { - return itemName; - } - - public String getOwnerName() { - return ownerName; - } -} \ No newline at end of file diff --git a/spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java b/spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java deleted file mode 100644 index 74ffada300..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/ItemManager.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.baeldung.web.dto; - -public class ItemManager { - - public static Item getById(final int id) { - final Item item = new Item(2, "book", "John"); - return item; - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/dto/Views.java b/spring-5/src/main/java/org/baeldung/web/dto/Views.java deleted file mode 100644 index 6231e12bcc..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/dto/Views.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.baeldung.web.dto; - -public class Views { - public static class Public { - } - - public static class Internal extends Public { - } -} diff --git a/spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java b/spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java deleted file mode 100644 index aab737b6ec..0000000000 --- a/spring-5/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.baeldung.web.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(value = HttpStatus.NOT_FOUND) -public class ResourceNotFoundException extends RuntimeException { -} diff --git a/spring-5/src/main/resources/application.properties b/spring-5/src/main/resources/application.properties index 300589f561..e69de29bb2 100644 --- a/spring-5/src/main/resources/application.properties +++ b/spring-5/src/main/resources/application.properties @@ -1,2 +0,0 @@ -server.port= 8082 -server.context-path=/spring-rest \ No newline at end of file diff --git a/spring-5/src/main/resources/logback.xml b/spring-5/src/main/resources/logback.xml deleted file mode 100644 index 1146dade63..0000000000 --- a/spring-5/src/main/resources/logback.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - web - %date [%thread] %-5level %logger{36} - %message%n - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-5/src/main/webapp/WEB-INF/api-servlet.xml b/spring-5/src/main/webapp/WEB-INF/api-servlet.xml deleted file mode 100644 index 0f80990c16..0000000000 --- a/spring-5/src/main/webapp/WEB-INF/api-servlet.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - /WEB-INF/spring-views.xml - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-5/src/main/webapp/WEB-INF/company.html b/spring-5/src/main/webapp/WEB-INF/company.html deleted file mode 100644 index d2072bfd3c..0000000000 --- a/spring-5/src/main/webapp/WEB-INF/company.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Company Data - - - - - - - -
- - - \ No newline at end of file diff --git a/spring-5/src/main/webapp/WEB-INF/spring-views.xml b/spring-5/src/main/webapp/WEB-INF/spring-views.xml deleted file mode 100644 index 2944828d6d..0000000000 --- a/spring-5/src/main/webapp/WEB-INF/spring-views.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/spring-5/src/main/webapp/WEB-INF/web.xml b/spring-5/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index a439de8a05..0000000000 --- a/spring-5/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - Spring MVC Application - - - - contextClass - - org.springframework.web.context.support.AnnotationConfigWebApplicationContext - - - - contextConfigLocation - org.baeldung.config - - - - org.springframework.web.context.ContextLoaderListener - - - - - api - org.springframework.web.servlet.DispatcherServlet - 1 - - - api - / - - - - - - - diff --git a/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java b/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java new file mode 100644 index 0000000000..e2bfe3a880 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java @@ -0,0 +1,16 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Spring5ApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-5/src/test/java/org/baeldung/client/Consts.java b/spring-5/src/test/java/org/baeldung/client/Consts.java deleted file mode 100644 index b40561d9c3..0000000000 --- a/spring-5/src/test/java/org/baeldung/client/Consts.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.client; - -public interface Consts { - int APPLICATION_PORT = 8082; -} diff --git a/spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java deleted file mode 100644 index a47c60e9d8..0000000000 --- a/spring-5/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java +++ /dev/null @@ -1,216 +0,0 @@ -package org.baeldung.client; - -import static org.apache.commons.codec.binary.Base64.encodeBase64; -import static org.baeldung.client.Consts.APPLICATION_PORT; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.net.URI; -import java.util.Arrays; -import java.util.Set; - -import org.baeldung.web.dto.Foo; -import org.junit.Before; -import org.junit.Test; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RequestCallback; -import org.springframework.web.client.RestTemplate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Charsets; - -public class RestTemplateBasicLiveTest { - - private RestTemplate restTemplate; - private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/myfoos"; - - @Before - public void beforeTest() { - restTemplate = new RestTemplate(); - } - - // GET - - @Test - public void givenResourceUrl_whenSendGetForRequestEntity_thenStatusOk() throws IOException { - final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); - - assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); - } - - @Test - public void givenResourceUrl_whenSendGetForRequestEntity_thenBodyCorrect() throws IOException { - final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); - - final ObjectMapper mapper = new ObjectMapper(); - final JsonNode root = mapper.readTree(response.getBody()); - final JsonNode name = root.path("name"); - assertThat(name.asText(), notNullValue()); - } - - @Test - public void givenResourceUrl_whenRetrievingResource_thenCorrect() throws IOException { - final Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class); - - assertThat(foo.getName(), notNullValue()); - assertThat(foo.getId(), is(1L)); - } - - // HEAD, OPTIONS - - @Test - public void givenFooService_whenCallHeadForHeaders_thenReceiveAllHeadersForThatResource() { - final HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl); - - assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON)); - } - - // POST - - @Test - public void givenFooService_whenPostForObject_thenCreatedObjectIsReturned() { - final HttpEntity request = new HttpEntity<>(new Foo("bar")); - final Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class); - assertThat(foo, notNullValue()); - assertThat(foo.getName(), is("bar")); - } - - @Test - public void givenFooService_whenPostForLocation_thenCreatedLocationIsReturned() { - final HttpEntity request = new HttpEntity<>(new Foo("bar")); - final URI location = restTemplate.postForLocation(fooResourceUrl, request); - assertThat(location, notNullValue()); - } - - @Test - public void givenFooService_whenPostResource_thenResourceIsCreated() { - final RestTemplate template = new RestTemplate(); - - final HttpEntity request = new HttpEntity<>(new Foo("bar")); - - final ResponseEntity response = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); - assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); - final Foo foo = response.getBody(); - assertThat(foo, notNullValue()); - assertThat(foo.getName(), is("bar")); - } - - @Test - public void givenFooService_whenCallOptionsForAllow_thenReceiveValueOfAllowHeader() { - final Set optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl); - final HttpMethod[] supportedMethods = { HttpMethod.GET, HttpMethod.POST, HttpMethod.HEAD }; - - assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods))); - } - - // PUT - - @Test - public void givenFooService_whenPutExistingEntity_thenItIsUpdated() { - final RestTemplate template = new RestTemplate(); - final HttpHeaders headers = prepareBasicAuthHeaders(); - final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); - - // Create Resource - final ResponseEntity createResponse = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); - - // Update Resource - final Foo updatedInstance = new Foo("newName"); - updatedInstance.setId(createResponse.getBody().getId()); - final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); - final HttpEntity requestUpdate = new HttpEntity<>(updatedInstance, headers); - template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class); - - // Check that Resource was updated - final ResponseEntity updateResponse = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); - final Foo foo = updateResponse.getBody(); - assertThat(foo.getName(), is(updatedInstance.getName())); - } - - @Test - public void givenFooService_whenPutExistingEntityWithCallback_thenItIsUpdated() { - final RestTemplate template = new RestTemplate(); - final HttpHeaders headers = prepareBasicAuthHeaders(); - final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); - - // Create entity - ResponseEntity response = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); - assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); - - // Update entity - final Foo updatedInstance = new Foo("newName"); - updatedInstance.setId(response.getBody().getId()); - final String resourceUrl = fooResourceUrl + '/' + response.getBody().getId(); - template.execute(resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null); - - // Check that entity was updated - response = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); - final Foo foo = response.getBody(); - assertThat(foo.getName(), is(updatedInstance.getName())); - } - - // DELETE - - @Test - public void givenFooService_whenCallDelete_thenEntityIsRemoved() { - final Foo foo = new Foo("remove me"); - final ResponseEntity response = restTemplate.postForEntity(fooResourceUrl, foo, Foo.class); - assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); - - final String entityUrl = fooResourceUrl + "/" + response.getBody().getId(); - restTemplate.delete(entityUrl); - try { - restTemplate.getForEntity(entityUrl, Foo.class); - fail(); - } catch (final HttpClientErrorException ex) { - assertThat(ex.getStatusCode(), is(HttpStatus.NOT_FOUND)); - } - } - - // - - private HttpHeaders prepareBasicAuthHeaders() { - final HttpHeaders headers = new HttpHeaders(); - final String encodedLogPass = getBase64EncodedLogPass(); - headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encodedLogPass); - return headers; - } - - private String getBase64EncodedLogPass() { - final String logPass = "user1:user1Pass"; - final byte[] authHeaderBytes = encodeBase64(logPass.getBytes(Charsets.US_ASCII)); - return new String(authHeaderBytes, Charsets.US_ASCII); - } - - private RequestCallback requestCallback(final Foo updatedInstance) { - return clientHttpRequest -> { - final ObjectMapper mapper = new ObjectMapper(); - mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); - clientHttpRequest.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); - clientHttpRequest.getHeaders().add(HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); - }; - } - - // Simply setting restTemplate timeout using ClientHttpRequestFactory - - ClientHttpRequestFactory getSimpleClientHttpRequestFactory() { - final int timeout = 5; - final HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); - clientHttpRequestFactory.setConnectTimeout(timeout * 1000); - return clientHttpRequestFactory; - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java b/spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java deleted file mode 100644 index c4fc689fad..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.baeldung.okhttp; - -import java.io.IOException; - -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.Response; - -public class DefaultContentTypeInterceptor implements Interceptor { - - private final String contentType; - - public DefaultContentTypeInterceptor(String contentType) { - this.contentType = contentType; - } - - public Response intercept(Interceptor.Chain chain) throws IOException { - - Request originalRequest = chain.request(); - Request requestWithUserAgent = originalRequest.newBuilder().header("Content-Type", contentType).build(); - - return chain.proceed(requestWithUserAgent); - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java deleted file mode 100644 index a33742b8de..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.baeldung.okhttp; - -import static org.baeldung.client.Consts.APPLICATION_PORT; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; - -import java.io.File; -import java.io.IOException; - -import okhttp3.Call; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; - -import org.junit.Before; -import org.junit.Test; - -public class OkHttpFileUploadingLiveTest { - - private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; - - OkHttpClient client; - - @Before - public void init() { - client = new OkHttpClient(); - } - - @Test - public void whenUploadFile_thenCorrect() throws IOException { - - final RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", "file.txt", RequestBody.create(MediaType.parse("application/octet-stream"), new File("src/test/resources/test.txt"))).build(); - - final Request request = new Request.Builder().url(BASE_URL + "/users/upload").post(requestBody).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } - - @Test - public void whenGetUploadFileProgress_thenCorrect() throws IOException { - - final RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", "file.txt", RequestBody.create(MediaType.parse("application/octet-stream"), new File("src/test/resources/test.txt"))).build(); - - final ProgressRequestWrapper countingBody = new ProgressRequestWrapper(requestBody, (long bytesWritten, long contentLength) -> { - - final float percentage = (100f * bytesWritten) / contentLength; - assertFalse(Float.compare(percentage, 100) > 0); - }); - - final Request request = new Request.Builder().url(BASE_URL + "/users/upload").post(countingBody).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java deleted file mode 100644 index 6aa33b06b1..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.baeldung.okhttp; - -import static org.baeldung.client.Consts.APPLICATION_PORT; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; - -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -import org.junit.Before; -import org.junit.Test; - -public class OkHttpGetLiveTest { - - private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; - - OkHttpClient client; - - @Before - public void init() { - - client = new OkHttpClient(); - } - - @Test - public void whenGetRequest_thenCorrect() throws IOException { - final Request request = new Request.Builder().url(BASE_URL + "/date").build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } - - @Test - public void whenGetRequestWithQueryParameter_thenCorrect() throws IOException { - final HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/ex/bars").newBuilder(); - urlBuilder.addQueryParameter("id", "1"); - - final String url = urlBuilder.build().toString(); - - final Request request = new Request.Builder().url(url).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } - - @Test - public void whenAsynchronousGetRequest_thenCorrect() throws InterruptedException { - final Request request = new Request.Builder().url(BASE_URL + "/date").build(); - - final Call call = client.newCall(request); - - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) throws IOException { - System.out.println("OK"); - } - - @Override - public void onFailure(Call call, IOException e) { - fail(); - } - }); - - Thread.sleep(3000); - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java deleted file mode 100644 index cfec119fe0..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.baeldung.okhttp; - -import java.io.IOException; - -import org.junit.Before; -import org.junit.Test; - -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -public class OkHttpHeaderLiveTest { - - private static final String SAMPLE_URL = "http://www.github.com"; - - OkHttpClient client; - - @Before - public void init() { - - client = new OkHttpClient(); - } - - @Test - public void whenSetHeader_thenCorrect() throws IOException { - Request request = new Request.Builder().url(SAMPLE_URL).addHeader("Content-Type", "application/json").build(); - - Call call = client.newCall(request); - Response response = call.execute(); - response.close(); - } - - @Test - public void whenSetDefaultHeader_thenCorrect() throws IOException { - - OkHttpClient clientWithInterceptor = new OkHttpClient.Builder().addInterceptor(new DefaultContentTypeInterceptor("application/json")).build(); - - Request request = new Request.Builder().url(SAMPLE_URL).build(); - - Call call = clientWithInterceptor.newCall(request); - Response response = call.execute(); - response.close(); - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java deleted file mode 100644 index 52662262e1..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.baeldung.okhttp; - -import static org.baeldung.client.Consts.APPLICATION_PORT; - -import java.io.File; -import java.io.IOException; -import java.net.SocketTimeoutException; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import okhttp3.Cache; -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class OkHttpMiscLiveTest { - - private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; - private static Logger logger = LoggerFactory.getLogger(OkHttpMiscLiveTest.class); - - OkHttpClient client; - - @Before - public void init() { - - client = new OkHttpClient(); - } - - @Test(expected = SocketTimeoutException.class) - public void whenSetRequestTimeout_thenFail() throws IOException { - final OkHttpClient clientWithTimeout = new OkHttpClient.Builder().readTimeout(1, TimeUnit.SECONDS).build(); - - final Request request = new Request.Builder().url(BASE_URL + "/delay/2") // This URL is served with a 2 second delay. - .build(); - - final Call call = clientWithTimeout.newCall(request); - final Response response = call.execute(); - response.close(); - } - - @Test(expected = IOException.class) - public void whenCancelRequest_thenCorrect() throws IOException { - final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - - final Request request = new Request.Builder().url(BASE_URL + "/delay/2") // This URL is served with a 2 second delay. - .build(); - - final int seconds = 1; - final long startNanos = System.nanoTime(); - - final Call call = client.newCall(request); - - // Schedule a job to cancel the call in 1 second. - executor.schedule(() -> { - - logger.debug("Canceling call: " + ((System.nanoTime() - startNanos) / 1e9f)); - call.cancel(); - logger.debug("Canceled call: " + ((System.nanoTime() - startNanos) / 1e9f)); - - }, seconds, TimeUnit.SECONDS); - - logger.debug("Executing call: " + ((System.nanoTime() - startNanos) / 1e9f)); - final Response response = call.execute(); - logger.debug("Call completed: " + ((System.nanoTime() - startNanos) / 1e9f), response); - } - - @Test - public void whenSetResponseCache_thenCorrect() throws IOException { - - final int cacheSize = 10 * 1024 * 1024; // 10 MiB - final File cacheDirectory = new File("src/test/resources/cache"); - final Cache cache = new Cache(cacheDirectory, cacheSize); - - final OkHttpClient clientCached = new OkHttpClient.Builder().cache(cache).build(); - - final Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); - - final Response response1 = clientCached.newCall(request).execute(); - logResponse(response1); - - final Response response2 = clientCached.newCall(request).execute(); - logResponse(response2); - } - - private void logResponse(Response response) throws IOException { - - logger.debug("Response response: " + response); - logger.debug("Response cache response: " + response.cacheResponse()); - logger.debug("Response network response: " + response.networkResponse()); - logger.debug("Response responseBody: " + response.body().string()); - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java deleted file mode 100644 index 77a78c2634..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.baeldung.okhttp; - -import static org.baeldung.client.Consts.APPLICATION_PORT; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; - -import java.io.File; -import java.io.IOException; - -import okhttp3.Call; -import okhttp3.Credentials; -import okhttp3.FormBody; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; - -import org.junit.Before; -import org.junit.Test; - -public class OkHttpPostingLiveTest { - - private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; - private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://browserspy.dk/password-ok.php"; - - OkHttpClient client; - - @Before - public void init() { - - client = new OkHttpClient(); - } - - @Test - public void whenSendPostRequest_thenCorrect() throws IOException { - final RequestBody formBody = new FormBody.Builder().add("username", "test").add("password", "test").build(); - - final Request request = new Request.Builder().url(BASE_URL + "/users").post(formBody).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } - - @Test - public void whenSendPostRequestWithAuthorization_thenCorrect() throws IOException { - final String postBody = "test post"; - - final Request request = new Request.Builder().url(URL_SECURED_BY_BASIC_AUTHENTICATION).addHeader("Authorization", Credentials.basic("test", "test")).post(RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"), "test post")).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } - - @Test - public void whenPostJson_thenCorrect() throws IOException { - final String json = "{\"id\":1,\"name\":\"John\"}"; - - final RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "{\"id\":1,\"name\":\"John\"}"); - final Request request = new Request.Builder().url(BASE_URL + "/users/detail").post(body).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } - - @Test - public void whenSendMultipartRequest_thenCorrect() throws IOException { - final RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("username", "test").addFormDataPart("password", "test") - .addFormDataPart("file", "file.txt", RequestBody.create(MediaType.parse("application/octet-stream"), new File("src/test/resources/test.txt"))).build(); - - final Request request = new Request.Builder().url(BASE_URL + "/users/multipart").post(requestBody).build(); - - final Call call = client.newCall(request); - final Response response = call.execute(); - - assertThat(response.code(), equalTo(200)); - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java b/spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java deleted file mode 100644 index 58f84f06a2..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.baeldung.okhttp; - -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; - -import java.io.IOException; - -import org.junit.Test; - -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -public class OkHttpRedirectLiveTest { - - @Test - public void whenSetFollowRedirects_thenNotRedirected() throws IOException { - - OkHttpClient client = new OkHttpClient().newBuilder().followRedirects(false).build(); - - Request request = new Request.Builder().url("http://t.co/I5YYd9tddw").build(); - - Call call = client.newCall(request); - Response response = call.execute(); - - assertThat(response.code(), equalTo(301)); - } -} diff --git a/spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java b/spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java deleted file mode 100644 index fcae69c609..0000000000 --- a/spring-5/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.baeldung.okhttp; - -import okhttp3.RequestBody; -import okhttp3.MediaType; - -import java.io.IOException; - -import okio.Buffer; -import okio.BufferedSink; -import okio.ForwardingSink; -import okio.Okio; -import okio.Sink; - -public class ProgressRequestWrapper extends RequestBody { - - protected RequestBody delegate; - protected ProgressListener listener; - - protected CountingSink countingSink; - - public ProgressRequestWrapper(RequestBody delegate, ProgressListener listener) { - this.delegate = delegate; - this.listener = listener; - } - - @Override - public MediaType contentType() { - return delegate.contentType(); - } - - @Override - public long contentLength() throws IOException { - return delegate.contentLength(); - } - - @Override - public void writeTo(BufferedSink sink) throws IOException { - - BufferedSink bufferedSink; - - countingSink = new CountingSink(sink); - bufferedSink = Okio.buffer(countingSink); - - delegate.writeTo(bufferedSink); - - bufferedSink.flush(); - } - - protected final class CountingSink extends ForwardingSink { - - private long bytesWritten = 0; - - public CountingSink(Sink delegate) { - super(delegate); - } - - @Override - public void write(Buffer source, long byteCount) throws IOException { - - super.write(source, byteCount); - - bytesWritten += byteCount; - listener.onRequestProgress(bytesWritten, contentLength()); - } - - } - - public interface ProgressListener { - - void onRequestProgress(long bytesWritten, long contentLength); - - } -} diff --git a/spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java b/spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java deleted file mode 100644 index 84ae1063d9..0000000000 --- a/spring-5/src/test/java/org/baeldung/uribuilder/SpringUriBuilderTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.baeldung.uribuilder; - -import static org.junit.Assert.assertEquals; - -import java.util.Collections; - -import org.junit.Test; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; - -public class SpringUriBuilderTest { - - @Test - public void constructUri() { - UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.baeldung.com").path("/junit-5").build(); - - assertEquals("http://www.baeldung.com/junit-5", uriComponents.toUriString()); - } - - @Test - public void constructUriEncoded() { - UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.baeldung.com").path("/junit 5").build().encode(); - - assertEquals("http://www.baeldung.com/junit%205", uriComponents.toUriString()); - } - - @Test - public void constructUriFromTemplate() { - UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.baeldung.com").path("/{article-name}").buildAndExpand("junit-5"); - - assertEquals("http://www.baeldung.com/junit-5", uriComponents.toUriString()); - } - - @Test - public void constructUriWithQueryParameter() { - UriComponents uriComponents = UriComponentsBuilder.newInstance().scheme("http").host("www.google.com").path("/").query("q={keyword}").buildAndExpand("baeldung"); - - assertEquals("http://www.google.com/?q=baeldung", uriComponents.toUriString()); - } - - @Test - public void expandWithRegexVar() { - String template = "/myurl/{name:[a-z]{1,5}}/show"; - UriComponents uriComponents = UriComponentsBuilder.fromUriString(template).build(); - uriComponents = uriComponents.expand(Collections.singletonMap("name", "test")); - - assertEquals("/myurl/test/show", uriComponents.getPath()); - } -} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java deleted file mode 100644 index e8d5ff9f17..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.baeldung.web.controller.mediatypes; - -import com.jayway.restassured.http.ContentType; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; - -import static com.jayway.restassured.RestAssured.given; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) -public class CustomMediaTypeControllerLiveTest { - private static final String URL_PREFIX = "http://localhost:8082/spring-rest"; - - @Test - public void givenServiceEndpoint_whenGetRequestFirstAPIVersion_thenShouldReturn200() { - given() - .accept("application/vnd.baeldung.api.v1+json") - .when() - .get(URL_PREFIX + "/public/api/items/1") - .then() - .contentType(ContentType.JSON).and().statusCode(200); - } - - - @Test - public void givenServiceEndpoint_whenGetRequestSecondAPIVersion_thenShouldReturn200() { - given() - .accept("application/vnd.baeldung.api.v2+json") - .when() - .get(URL_PREFIX + "/public/api/items/2") - .then() - .contentType(ContentType.JSON).and().statusCode(200); - } -} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java deleted file mode 100644 index a38177f78b..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.baeldung.web.controller.mediatypes; - -import org.baeldung.config.WebConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = WebConfig.class) -@WebAppConfiguration -public class CustomMediaTypeControllerTest { - - private MockMvc mockMvc; - - @Autowired - private WebApplicationContext webApplicationContext; - - @Before - public void setUp() { - mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); - } - - @Test - public void givenServiceUrl_whenGetWithProperAcceptHeaderFirstAPIVersion_thenReturn200() throws Exception { - mockMvc.perform(get("/public/api/items/1").accept("application/vnd.baeldung.api.v1+json")).andExpect(status().isOk()); - } - - @Test - public void givenServiceUrl_whenGetWithProperAcceptHeaderSecondVersion_thenReturn200() throws Exception { - mockMvc.perform(get("/public/api/items/2").accept("application/vnd.baeldung.api.v2+json")).andExpect(status().isOk()); - } -} \ No newline at end of file diff --git a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java b/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java deleted file mode 100644 index 66ffe4947d..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.baeldung.web.controller.mediatypes; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - - -@Configuration -@ComponentScan({ "org.baeldung.web" }) -public class TestConfig { - -} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java b/spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java deleted file mode 100644 index c604db596a..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.baeldung.web.controller.redirect; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.flash; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; -import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.web.context.WebApplicationContext; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("file:src/main/webapp/WEB-INF/api-servlet.xml") -@WebAppConfiguration -public class RedirectControllerIntegrationTest { - - private MockMvc mockMvc; - - @Autowired - protected WebApplicationContext wac; - - @Before - public void setup() { - mockMvc = webAppContextSetup(wac).build(); - } - - @Test - public void whenRedirectOnUrlWithUsingXMLConfig_thenStatusRedirectionAndRedirectedOnUrl() throws Exception { - mockMvc.perform(get("/redirectWithXMLConfig")).andExpect(status().is3xxRedirection()).andExpect(view().name("RedirectedUrl")).andExpect(model().attribute("attribute", equalTo("redirectWithXMLConfig"))) - .andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithXMLConfig")); - } - - @Test - public void whenRedirectOnUrlWithUsingRedirectPrefix_thenStatusRedirectionAndRedirectedOnUrl() throws Exception { - mockMvc.perform(get("/redirectWithRedirectPrefix")).andExpect(status().is3xxRedirection()).andExpect(view().name("redirect:/redirectedUrl")).andExpect(model().attribute("attribute", equalTo("redirectWithRedirectPrefix"))) - .andExpect(redirectedUrl("/redirectedUrl?attribute=redirectWithRedirectPrefix")); - } - - @Test - public void whenRedirectOnUrlWithUsingRedirectAttributes_thenStatusRedirectionAndRedirectedOnUrlAndAddedAttributeToFlashScope() throws Exception { - mockMvc.perform(get("/redirectWithRedirectAttributes")).andExpect(status().is3xxRedirection()).andExpect(flash().attribute("flashAttribute", equalTo("redirectWithRedirectAttributes"))) - .andExpect(model().attribute("attribute", equalTo("redirectWithRedirectAttributes"))).andExpect(model().attribute("flashAttribute", equalTo(null))).andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithRedirectAttributes")); - } - - @Test - public void whenRedirectOnUrlWithUsingRedirectView_thenStatusRedirectionAndRedirectedOnUrlAndAddedAttributeToFlashScope() throws Exception { - mockMvc.perform(get("/redirectWithRedirectView")).andExpect(status().is3xxRedirection()).andExpect(model().attribute("attribute", equalTo("redirectWithRedirectView"))).andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithRedirectView")); - } - - @Test - public void whenRedirectOnUrlWithUsingForwardPrefix_thenStatusOkAndForwardedOnUrl() throws Exception { - mockMvc.perform(get("/forwardWithForwardPrefix")).andExpect(status().isOk()).andExpect(view().name("forward:/redirectedUrl")).andExpect(model().attribute("attribute", equalTo("redirectWithForwardPrefix"))).andExpect(forwardedUrl("/redirectedUrl")); - } - -} diff --git a/spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java b/spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java deleted file mode 100644 index e29bef501e..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.baeldung.web.controller.status; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.baeldung.config.WebConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = WebConfig.class) -@WebAppConfiguration -public class ExampleControllerIntegrationTest { - - private MockMvc mockMvc; - - @Autowired - private WebApplicationContext webApplicationContext; - - @Before - public void setUp() { - mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); - } - - @Test - public void whenGetRequestSentToController_thenReturnsStatusNotAcceptable() throws Exception { - mockMvc.perform(get("/controller")).andExpect(status().isNotAcceptable()); - } - - @Test - public void whenGetRequestSentToException_thenReturnsStatusForbidden() throws Exception { - mockMvc.perform(get("/exception")).andExpect(status().isForbidden()); - } -} diff --git a/spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java b/spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java deleted file mode 100644 index 7828df7304..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.baeldung.web.test; - -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; - -import org.junit.Test; - -import com.jayway.restassured.RestAssured; - -public class RequestMappingLiveTest { - private static String BASE_URI = "http://localhost:8082/spring-rest/ex/"; - - @Test - public void givenSimplePath_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "foos").then().assertThat().body(equalTo("Simple Get some Foos")); - } - - @Test - public void whenPostFoos_thenOk() { - RestAssured.given().accept("text/html").post(BASE_URI + "foos").then().assertThat().body(equalTo("Post some Foos")); - } - - @Test - public void givenOneHeader_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").header("key", "val").get(BASE_URI + "foos").then().assertThat().body(equalTo("Get some Foos with Header")); - } - - @Test - public void givenMultipleHeaders_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").headers("key1", "val1", "key2", "val2").get(BASE_URI + "foos").then().assertThat().body(equalTo("Get some Foos with Header")); - } - - @Test - public void givenAcceptHeader_whenGetFoos_thenOk() { - RestAssured.given().accept("application/json").get(BASE_URI + "foos").then().assertThat().body(containsString("Get some Foos with Header New")); - } - - @Test - public void givenPathVariable_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "foos/1").then().assertThat().body(equalTo("Get a specific Foo with id=1")); - } - - @Test - public void givenMultiplePathVariable_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "foos/1/bar/2").then().assertThat().body(equalTo("Get a specific Bar with id=2 from a Foo with id=1")); - } - - @Test - public void givenPathVariable_whenGetBars_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "bars/1").then().assertThat().body(equalTo("Get a specific Bar with id=1")); - } - - @Test - public void givenParams_whenGetBars_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "bars?id=100&second=something").then().assertThat().body(equalTo("Get a specific Bar with id=100")); - } - - @Test - public void whenGetFoosOrBars_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "advanced/foos").then().assertThat().body(equalTo("Advanced - Get some Foos or Bars")); - RestAssured.given().accept("text/html").get(BASE_URI + "advanced/bars").then().assertThat().body(equalTo("Advanced - Get some Foos or Bars")); - } -} diff --git a/spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java b/spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java deleted file mode 100644 index 7f250653ab..0000000000 --- a/spring-5/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.baeldung.web.test; - -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; - -import java.util.Arrays; - -import org.baeldung.config.converter.KryoHttpMessageConverter; -import org.baeldung.web.dto.Foo; -import org.baeldung.web.dto.FooProtos; -import org.junit.Assert; -import org.junit.Test; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - -/** - * Integration Test class. Tests methods hits the server's rest services. - */ -public class SpringHttpMessageConvertersLiveTest { - - private static String BASE_URI = "http://localhost:8082/spring-rest/"; - - /** - * Without specifying Accept Header, uses the default response from the - * server (in this case json) - */ - @Test - public void whenRetrievingAFoo_thenCorrect() { - final String URI = BASE_URI + "foos/{id}"; - - final RestTemplate restTemplate = new RestTemplate(); - final Foo resource = restTemplate.getForObject(URI, Foo.class, "1"); - - assertThat(resource, notNullValue()); - } - - @Test - public void givenConsumingXml_whenReadingTheFoo_thenCorrect() { - final String URI = BASE_URI + "foos/{id}"; - - final RestTemplate restTemplate = new RestTemplate(); - - final HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); - final HttpEntity entity = new HttpEntity(headers); - - final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); - final Foo resource = response.getBody(); - - assertThat(resource, notNullValue()); - } - - @Test - public void givenConsumingJson_whenReadingTheFoo_thenCorrect() { - final String URI = BASE_URI + "foos/{id}"; - - final RestTemplate restTemplate = new RestTemplate(); - - final HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); - final HttpEntity entity = new HttpEntity(headers); - - final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); - final Foo resource = response.getBody(); - - assertThat(resource, notNullValue()); - } - - @Test - public void givenConsumingXml_whenWritingTheFoo_thenCorrect() { - final String URI = BASE_URI + "foos/{id}"; - final RestTemplate restTemplate = new RestTemplate(); - - final Foo resource = new Foo(4, "jason"); - final HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); - headers.setContentType((MediaType.APPLICATION_XML)); - final HttpEntity entity = new HttpEntity(resource, headers); - - final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.PUT, entity, Foo.class, resource.getId()); - final Foo fooResponse = response.getBody(); - - Assert.assertEquals(resource.getId(), fooResponse.getId()); - } - - @Test - public void givenConsumingProtobuf_whenReadingTheFoo_thenCorrect() { - final String URI = BASE_URI + "foos/{id}"; - - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setMessageConverters(Arrays.asList(new ProtobufHttpMessageConverter())); - final HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Arrays.asList(ProtobufHttpMessageConverter.PROTOBUF)); - final HttpEntity entity = new HttpEntity(headers); - - final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, FooProtos.Foo.class, "1"); - final FooProtos.Foo resource = response.getBody(); - - assertThat(resource, notNullValue()); - } - - @Test - public void givenConsumingKryo_whenReadingTheFoo_thenCorrect() { - final String URI = BASE_URI + "foos/{id}"; - - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setMessageConverters(Arrays.asList(new KryoHttpMessageConverter())); - final HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Arrays.asList(KryoHttpMessageConverter.KRYO)); - final HttpEntity entity = new HttpEntity(headers); - - final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); - final Foo resource = response.getBody(); - - assertThat(resource, notNullValue()); - } - -} diff --git a/spring-5/src/test/resources/.gitignore b/spring-5/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/spring-5/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/spring-5/src/test/resources/test.txt b/spring-5/src/test/resources/test.txt deleted file mode 100644 index 95d09f2b10..0000000000 --- a/spring-5/src/test/resources/test.txt +++ /dev/null @@ -1 +0,0 @@ -hello world \ No newline at end of file From f64e24e6de1e8c0295927af66094ac0275abb639 Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 24 Feb 2017 14:08:44 +0200 Subject: [PATCH 181/192] fully working version of Spring 5 project --- spring-5/src/main/java/com/baeldung/Spring5Application.java | 6 +++--- spring-5/src/main/resources/application.properties | 1 + .../src/test/java/com/baeldung/Spring5ApplicationTests.java | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spring-5/src/main/java/com/baeldung/Spring5Application.java b/spring-5/src/main/java/com/baeldung/Spring5Application.java index 902af95afd..4f5d431b0f 100644 --- a/spring-5/src/main/java/com/baeldung/Spring5Application.java +++ b/spring-5/src/main/java/com/baeldung/Spring5Application.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Spring5Application { - public static void main(String[] args) { - SpringApplication.run(Spring5Application.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Spring5Application.class, args); + } } diff --git a/spring-5/src/main/resources/application.properties b/spring-5/src/main/resources/application.properties index e69de29bb2..bafddced85 100644 --- a/spring-5/src/main/resources/application.properties +++ b/spring-5/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8081 \ No newline at end of file diff --git a/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java b/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java index e2bfe3a880..537ec56a89 100644 --- a/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java +++ b/spring-5/src/test/java/com/baeldung/Spring5ApplicationTests.java @@ -9,8 +9,8 @@ import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest public class Spring5ApplicationTests { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } From 355931f8260616faf25ef79f2c282d84fddc5733 Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 24 Feb 2017 15:12:23 +0200 Subject: [PATCH 182/192] adding some simple persistence --- spring-5/pom.xml | 200 +++++++++--------- .../java/com/baeldung/Spring5Application.java | 1 + .../baeldung/persistence/DataSetupBean.java | 26 +++ .../baeldung/persistence/FooRepository.java | 10 + .../src/main/java/com/baeldung/web/Foo.java | 84 ++++++++ .../java/com/baeldung/web/FooController.java | 62 ++++++ .../src/main/resources/application.properties | 5 +- 7 files changed, 291 insertions(+), 97 deletions(-) create mode 100644 spring-5/src/main/java/com/baeldung/persistence/DataSetupBean.java create mode 100644 spring-5/src/main/java/com/baeldung/persistence/FooRepository.java create mode 100644 spring-5/src/main/java/com/baeldung/web/Foo.java create mode 100644 spring-5/src/main/java/com/baeldung/web/FooController.java diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 3b1d6c712b..ab05918ae4 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -1,108 +1,116 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.baeldung - spring-5 - 0.0.1-SNAPSHOT - jar + com.baeldung + spring-5 + 0.0.1-SNAPSHOT + jar - spring-5 - + spring-5 + - - org.springframework.boot - spring-boot-starter-parent - 2.0.0.BUILD-SNAPSHOT - - + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.BUILD-SNAPSHOT + + - - UTF-8 - UTF-8 - 1.8 - + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - + + + org.apache.commons + commons-lang3 + - - org.springframework.boot - spring-boot-devtools - runtime - - - com.h2database - h2 - runtime - - - org.springframework.boot - spring-boot-starter-test - test - - + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + diff --git a/spring-5/src/main/java/com/baeldung/Spring5Application.java b/spring-5/src/main/java/com/baeldung/Spring5Application.java index 4f5d431b0f..41b5c1eed1 100644 --- a/spring-5/src/main/java/com/baeldung/Spring5Application.java +++ b/spring-5/src/main/java/com/baeldung/Spring5Application.java @@ -9,4 +9,5 @@ public class Spring5Application { public static void main(String[] args) { SpringApplication.run(Spring5Application.class, args); } + } diff --git a/spring-5/src/main/java/com/baeldung/persistence/DataSetupBean.java b/spring-5/src/main/java/com/baeldung/persistence/DataSetupBean.java new file mode 100644 index 0000000000..7936a2b7af --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/persistence/DataSetupBean.java @@ -0,0 +1,26 @@ +package com.baeldung.persistence; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import java.util.stream.IntStream; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.baeldung.web.Foo; + +@Component +public class DataSetupBean implements InitializingBean { + + @Autowired + private FooRepository repo; + + // + + @Override + public void afterPropertiesSet() throws Exception { + IntStream.range(1, 20).forEach(i -> repo.save(new Foo(randomAlphabetic(8)))); + } + +} diff --git a/spring-5/src/main/java/com/baeldung/persistence/FooRepository.java b/spring-5/src/main/java/com/baeldung/persistence/FooRepository.java new file mode 100644 index 0000000000..1f1e071158 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/persistence/FooRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import com.baeldung.web.Foo; + +public interface FooRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/spring-5/src/main/java/com/baeldung/web/Foo.java b/spring-5/src/main/java/com/baeldung/web/Foo.java new file mode 100644 index 0000000000..c4868a9958 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/web/Foo.java @@ -0,0 +1,84 @@ +package com.baeldung.web; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Foo { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + + this.id = id; + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + return "Foo [name=" + name + "]"; + } + +} \ No newline at end of file diff --git a/spring-5/src/main/java/com/baeldung/web/FooController.java b/spring-5/src/main/java/com/baeldung/web/FooController.java new file mode 100644 index 0000000000..de6928033e --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/web/FooController.java @@ -0,0 +1,62 @@ +package com.baeldung.web; + +import java.util.List; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +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 org.springframework.web.bind.annotation.RestController; + +import com.baeldung.persistence.FooRepository; + +@RestController("/foos") +public class FooController { + + @Autowired + private FooRepository repo; + + // API - read + + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") + @ResponseBody + @Validated + public Foo findById(@PathVariable @Min(0) final long id) { + return repo.findOne(id); + } + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public List findAll() { + return repo.findAll(); + } + + @RequestMapping(params = { "page", "size" }, method = RequestMethod.GET) + @ResponseBody + @Validated + public List findPaginated(@RequestParam("page") @Min(0) final int page, @Max(100) @RequestParam("size") final int size) { + final Page resultPage = repo.findAll(new PageRequest(page, size)); + return resultPage.getContent(); + } + + // API - write + + @RequestMapping(method = RequestMethod.PUT, value = "/foos/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo update(@PathVariable("id") final String id, @RequestBody final Foo foo) { + return foo; + } + +} diff --git a/spring-5/src/main/resources/application.properties b/spring-5/src/main/resources/application.properties index bafddced85..2e33b98523 100644 --- a/spring-5/src/main/resources/application.properties +++ b/spring-5/src/main/resources/application.properties @@ -1 +1,4 @@ -server.port=8081 \ No newline at end of file +server.port=8081 + +security.user.name=user +security.user.password=pass \ No newline at end of file From d67ace8e1e45a3b301a7358ae726f371468381dd Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Fri, 24 Feb 2017 16:19:28 +0100 Subject: [PATCH 183/192] BAEL-655 test for partially apllied function (#1227) * BAEL-655 test for partially apllied function * BAEL-655 example of tuple transformation --- jooq/src/test/java/com/baeldung/JOOLTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/jooq/src/test/java/com/baeldung/JOOLTest.java b/jooq/src/test/java/com/baeldung/JOOLTest.java index 18fca1f67a..13bf1a3ec3 100644 --- a/jooq/src/test/java/com/baeldung/JOOLTest.java +++ b/jooq/src/test/java/com/baeldung/JOOLTest.java @@ -1,8 +1,15 @@ package com.baeldung; +import junit.framework.Assert; import org.jooq.lambda.Seq; import org.jooq.lambda.Unchecked; +import org.jooq.lambda.function.Function1; +import org.jooq.lambda.function.Function2; +import org.jooq.lambda.tuple.Tuple; +import org.jooq.lambda.tuple.Tuple2; +import org.jooq.lambda.tuple.Tuple3; +import org.jooq.lambda.tuple.Tuple4; import org.junit.Test; import java.util.Arrays; @@ -203,4 +210,34 @@ public class JOOLTest { ); } + @Test + public void givenFunction_whenAppliedPartially_shouldAddNumberToPartialArgument() { + //given + Function2 addTwoNumbers = (v1, v2) -> v1 + v2; + addTwoNumbers.toBiFunction(); + Function1 addToTwo = addTwoNumbers.applyPartially(2); + + //when + Integer result = addToTwo.apply(5); + + //then + assertEquals(result, (Integer) 7); + } + + @Test + public void givenSeqOfTuples_whenTransformToLowerNumberOfTuples_shouldHaveProperResult() { + //given + Seq> personDetails = Seq.of(tuple("michael", "similar", 49), tuple("jodie", "variable", 43)); + Tuple2 tuple = tuple("winter", "summer"); + + //when + List> result = personDetails.map(t -> t.limit2().concat(tuple)).toList(); + + //then + assertEquals( + result, + Arrays.asList(tuple("michael", "similar", "winter", "summer"), tuple("jodie", "variable", "winter", "summer")) + ); + } + } From c7c3d822d94db058b8b2bb9f89ab8438a993c3c9 Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 24 Feb 2017 18:04:53 +0200 Subject: [PATCH 184/192] testing work with JUnit 5 --- .../src/main/resources/application.properties | 4 ++- .../com/baeldung/IntegrationTestExample1.java | 29 +++++++++++++++++++ .../com/baeldung/IntegrationTestExample2.java | 29 +++++++++++++++++++ .../com/baeldung/ParallelTestExample.java | 24 +++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 spring-5/src/test/java/com/baeldung/IntegrationTestExample1.java create mode 100644 spring-5/src/test/java/com/baeldung/IntegrationTestExample2.java create mode 100644 spring-5/src/test/java/com/baeldung/ParallelTestExample.java diff --git a/spring-5/src/main/resources/application.properties b/spring-5/src/main/resources/application.properties index 2e33b98523..886ea1978b 100644 --- a/spring-5/src/main/resources/application.properties +++ b/spring-5/src/main/resources/application.properties @@ -1,4 +1,6 @@ server.port=8081 security.user.name=user -security.user.password=pass \ No newline at end of file +security.user.password=pass + +logging.level.root=INFO \ No newline at end of file diff --git a/spring-5/src/test/java/com/baeldung/IntegrationTestExample1.java b/spring-5/src/test/java/com/baeldung/IntegrationTestExample1.java new file mode 100644 index 0000000000..0a27be4a95 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/IntegrationTestExample1.java @@ -0,0 +1,29 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class IntegrationTestExample1 { + + @Test + public void test1a() { + block(3000); + } + + @Test + public void test1b() { + block(3000); + } + + public static void block(long ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + System.out.println("Thread interrupted"); + } + } +} diff --git a/spring-5/src/test/java/com/baeldung/IntegrationTestExample2.java b/spring-5/src/test/java/com/baeldung/IntegrationTestExample2.java new file mode 100644 index 0000000000..0bb2d47ef5 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/IntegrationTestExample2.java @@ -0,0 +1,29 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class IntegrationTestExample2 { + + @Test + public void test1a() { + block(3000); + } + + @Test + public void test1b() { + block(3000); + } + + public static void block(long ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + System.out.println("Thread Interrupted"); + } + } +} diff --git a/spring-5/src/test/java/com/baeldung/ParallelTestExample.java b/spring-5/src/test/java/com/baeldung/ParallelTestExample.java new file mode 100644 index 0000000000..e73b8d4649 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/ParallelTestExample.java @@ -0,0 +1,24 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.experimental.ParallelComputer; +import org.junit.runner.Computer; +import org.junit.runner.JUnitCore; + +public class ParallelTestExample { + + @Test + public void runTests() { + final Class[] classes = { IntegrationTestExample1.class, IntegrationTestExample2.class }; + + JUnitCore.runClasses(new Computer(), classes); + } + + @Test + public void runTestsInParallel() { + final Class[] classes = { IntegrationTestExample1.class, IntegrationTestExample2.class }; + + JUnitCore.runClasses(new ParallelComputer(true, true), classes); + } + +} \ No newline at end of file From 9c5ecd8f8db8392e0f4e94c7ba91cf41de52ebf1 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Fri, 24 Feb 2017 23:28:45 +0530 Subject: [PATCH 185/192] Adding spring-security-stormpath module (#1226) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality * changing package name * testcase change * adding webutils * adding testcase for WebUtils and ServletRequestUtils * adding testcase * spring-security-stormpath --- spring-security-stormpath/pom.xml | 85 +++++++++++++++++++ .../main/java/com/baeldung/Application.java | 25 ++++++ .../security/SecurityConfiguration.java | 24 ++++++ .../src/main/resources/application.properties | 6 ++ 4 files changed, 140 insertions(+) create mode 100644 spring-security-stormpath/pom.xml create mode 100644 spring-security-stormpath/src/main/java/com/baeldung/Application.java create mode 100644 spring-security-stormpath/src/main/java/com/baeldung/security/SecurityConfiguration.java create mode 100644 spring-security-stormpath/src/main/resources/application.properties diff --git a/spring-security-stormpath/pom.xml b/spring-security-stormpath/pom.xml new file mode 100644 index 0000000000..44c6595e64 --- /dev/null +++ b/spring-security-stormpath/pom.xml @@ -0,0 +1,85 @@ + + 4.0.0 + com.baeldung + spring-security-stormpath + war + 1.0-SNAPSHOT + spring-security-stormpath + http://maven.apache.org + + + + abhinabkanrar@gmail.com + Abhinab Kanrar + https://github.com/AbhinabKanrar + abhinabkanrar + + + + + UTF-8 + UTF-8 + 1.8 + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.1.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + com.stormpath.spring + stormpath-default-spring-boot-starter + 1.5.4 + + + + + + spring-releases + Spring Releases + https://repo.spring.io/libs-release + + + + + spring-security-stormpath + + + src/main/resources + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + repackage + + + + + + + + diff --git a/spring-security-stormpath/src/main/java/com/baeldung/Application.java b/spring-security-stormpath/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..3d1409eaeb --- /dev/null +++ b/spring-security-stormpath/src/main/java/com/baeldung/Application.java @@ -0,0 +1,25 @@ +/** + * + */ +package com.baeldung; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author abhinab + * + */ +@SpringBootApplication +public class Application implements CommandLineRunner { + + @Override + public void run(String... args) throws Exception { + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-security-stormpath/src/main/java/com/baeldung/security/SecurityConfiguration.java b/spring-security-stormpath/src/main/java/com/baeldung/security/SecurityConfiguration.java new file mode 100644 index 0000000000..5d75ecea8a --- /dev/null +++ b/spring-security-stormpath/src/main/java/com/baeldung/security/SecurityConfiguration.java @@ -0,0 +1,24 @@ +/** + * + */ +package com.baeldung.security; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +import static com.stormpath.spring.config.StormpathWebSecurityConfigurer.stormpath; + +/** + * @author abhinab + * + */ +@Configuration +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.apply(stormpath()); + } + +} diff --git a/spring-security-stormpath/src/main/resources/application.properties b/spring-security-stormpath/src/main/resources/application.properties new file mode 100644 index 0000000000..64a9ca456c --- /dev/null +++ b/spring-security-stormpath/src/main/resources/application.properties @@ -0,0 +1,6 @@ +security.basic.enabled = false + +stormpath.web.stormpathFilter.order = 0 + +stormpath.client.apiKey.id = 668HU0EOZQ7F4MT53ND2HSGBA +stormpath.client.apiKey.secret = RPTaYX07csTJR0AMKjM462KRdiP6q037kBWoDrBC3DI From 9dab68a48e32d632ecc120dd60d13b6a112cfe56 Mon Sep 17 00:00:00 2001 From: Tian Baoqiang Date: Sat, 25 Feb 2017 14:41:07 +0800 Subject: [PATCH 186/192] add redirection after login with Spring Security(BAEL-648) (#1214) --- spring-security-mvc-login/pom.xml | 15 ++- .../controller/SecuredResourceController.java | 17 ++++ .../RefererAuthenticationSuccessHandler.java | 13 +++ .../spring/RedirectionSecurityConfig.java | 44 +++++++++ .../RedirectionWebSecurityConfig.xml | 29 ++++++ .../RedirectionSecurityIntegrationTest.java | 94 +++++++++++++++++++ .../src/test/resources/mvc-servlet.xml | 8 ++ 7 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java create mode 100644 spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java create mode 100644 spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java create mode 100644 spring-security-mvc-login/src/main/resources/RedirectionWebSecurityConfig.xml create mode 100644 spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java create mode 100644 spring-security-mvc-login/src/test/resources/mvc-servlet.xml diff --git a/spring-security-mvc-login/pom.xml b/spring-security-mvc-login/pom.xml index 965f4fe1de..3809dc9f26 100644 --- a/spring-security-mvc-login/pom.xml +++ b/spring-security-mvc-login/pom.xml @@ -152,6 +152,19 @@ test + + org.springframework + spring-test + ${org.springframework.version} + test + + + org.springframework.security + spring-security-test + ${org.springframework.security.version} + test + + @@ -222,7 +235,7 @@ - 4.3.5.RELEASE + 4.3.6.RELEASE 4.2.1.RELEASE diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java b/spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java new file mode 100644 index 0000000000..4b68eee983 --- /dev/null +++ b/spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java @@ -0,0 +1,17 @@ +package org.baeldung.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Controller +public class SecuredResourceController { + + @RequestMapping("/secured") + public void secureResource(HttpServletRequest request, HttpServletResponse response) { + System.out.println("accessing secured resource"); + } + +} diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java b/spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java new file mode 100644 index 0000000000..5b025d9fd1 --- /dev/null +++ b/spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java @@ -0,0 +1,13 @@ +package org.baeldung.security; + +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; + +public class RefererAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler implements AuthenticationSuccessHandler { + + public RefererAuthenticationSuccessHandler() { + super(); + setUseReferer(true); + } + +} \ No newline at end of file diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java b/spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java new file mode 100644 index 0000000000..b68e7eab50 --- /dev/null +++ b/spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java @@ -0,0 +1,44 @@ +package org.baeldung.spring; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; + +@Configuration +//@ImportResource({ "classpath:RedirectionWebSecurityConfig.xml" }) +@EnableWebSecurity +@Profile("!https") +public class RedirectionSecurityConfig extends WebSecurityConfigurerAdapter { + + public RedirectionSecurityConfig() { + super(); + } + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user1") + .password("user1Pass") + .roles("USER"); + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/login*") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .successHandler(new SavedRequestAwareAuthenticationSuccessHandler()); + //.successHandler(new RefererAuthenticationSuccessHandler()) + } + +} diff --git a/spring-security-mvc-login/src/main/resources/RedirectionWebSecurityConfig.xml b/spring-security-mvc-login/src/main/resources/RedirectionWebSecurityConfig.xml new file mode 100644 index 0000000000..231b5ab57e --- /dev/null +++ b/spring-security-mvc-login/src/main/resources/RedirectionWebSecurityConfig.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java b/spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java new file mode 100644 index 0000000000..1d7fae8b60 --- /dev/null +++ b/spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java @@ -0,0 +1,94 @@ +package org.baeldung.security; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration({ "/RedirectionWebSecurityConfig.xml", "/mvc-servlet.xml" }) +@WebAppConfiguration +public class RedirectionSecurityIntegrationTest { + + @Autowired private WebApplicationContext context; + + @Autowired private UserDetailsService userDetailsService; + + private MockMvc mvc; + private UserDetails userDetails; + + @Before + public void setup() { + mvc = MockMvcBuilders + .webAppContextSetup(context) + .apply(springSecurity()) + .build(); + userDetails = userDetailsService.loadUserByUsername("user1"); + } + + @Test + public void givenSecuredResource_whenAccessUnauthenticated_thenRequiresAuthentication() throws Exception { + mvc + .perform(get("/secured")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/login")); + + } + + @Test + public void givenCredentials_whenAccessSecuredResource_thenSuccess() throws Exception { + mvc + .perform(get("/secured").with(user(userDetails))) + .andExpect(status().isOk()); + } + + @Test + public void givenAccessSecuredResource_whenAuthenticated_thenRedirectedBack() throws Exception { + MockHttpServletRequestBuilder securedResourceAccess = get("/secured"); + MvcResult unauthenticatedResult = mvc + .perform(securedResourceAccess) + .andExpect(status().is3xxRedirection()) + .andReturn(); + + MockHttpSession session = (MockHttpSession) unauthenticatedResult + .getRequest() + .getSession(); + String loginUrl = unauthenticatedResult + .getResponse() + .getRedirectedUrl(); + mvc + .perform(post(loginUrl) + .param("username", userDetails.getUsername()) + .param("password", userDetails.getPassword()) + .session(session) + .with(csrf())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/secured")) + .andReturn(); + + mvc + .perform(securedResourceAccess.session(session)) + .andExpect(status().isOk()); + + } + +} diff --git a/spring-security-mvc-login/src/test/resources/mvc-servlet.xml b/spring-security-mvc-login/src/test/resources/mvc-servlet.xml new file mode 100644 index 0000000000..aa5488b116 --- /dev/null +++ b/spring-security-mvc-login/src/test/resources/mvc-servlet.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file From d260fb2ad63bcfcb6cfb4182295c66be96b08448 Mon Sep 17 00:00:00 2001 From: Aram89 Date: Sat, 25 Feb 2017 13:45:21 +0400 Subject: [PATCH 187/192] Added new module to demonstrate topic "Introduction to RabbitMQ". (#1197) --- pom.xml | 3 ++ rabbitmq/pom.xml | 43 +++++++++++++++++++ .../java/com/baeldung/consumer/Receiver.java | 31 +++++++++++++ .../java/com/baeldung/producer/Publisher.java | 27 ++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 rabbitmq/pom.xml create mode 100644 rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java create mode 100644 rabbitmq/src/main/java/com/baeldung/producer/Publisher.java diff --git a/pom.xml b/pom.xml index 9e95537775..1b7d0b419c 100644 --- a/pom.xml +++ b/pom.xml @@ -199,6 +199,9 @@ apache-velocity apache-solrj + rabbitmq + + diff --git a/rabbitmq/pom.xml b/rabbitmq/pom.xml new file mode 100644 index 0000000000..03f192e4e1 --- /dev/null +++ b/rabbitmq/pom.xml @@ -0,0 +1,43 @@ + + + + 4.0.0 + com.baeldung + rabbitmq + 0.1-SNAPSHOT + + rabbitmq + http://maven.apache.org + + + + com.rabbitmq + amqp-client + 3.6.6 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + + + + UTF-8 + + 3.6.0 + + + \ No newline at end of file diff --git a/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java b/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java new file mode 100644 index 0000000000..d0612406e9 --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java @@ -0,0 +1,31 @@ +package com.baeldung.consumer; + +import com.rabbitmq.client.*; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +public class Receiver { + + private static final String QUEUE_NAME = "products_queue"; + + public static void main (String[] args) throws IOException, TimeoutException { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + Connection connection = factory.newConnection(); + Channel channel = connection.createChannel(); + + channel.queueDeclare(QUEUE_NAME, false, false, false, null); + + Consumer consumer = new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, + Envelope envelope, AMQP.BasicProperties properties, + byte[] body) throws IOException { + String message = new String(body, "UTF-8"); + System.out.println(" [x] Received '" + message + "'"); + } + }; + channel.basicConsume(QUEUE_NAME, true, consumer); + } +} diff --git a/rabbitmq/src/main/java/com/baeldung/producer/Publisher.java b/rabbitmq/src/main/java/com/baeldung/producer/Publisher.java new file mode 100644 index 0000000000..f9130c5d86 --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/producer/Publisher.java @@ -0,0 +1,27 @@ +package com.baeldung.producer; + +import com.rabbitmq.client.*; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +public class Publisher { + + private final static String QUEUE_NAME = "products_queue"; + + public static void main(String[]args) throws IOException, TimeoutException { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + Connection connection = factory.newConnection(); + Channel channel = connection.createChannel(); + + String message = "product details"; + channel.queueDeclare(QUEUE_NAME, false, false, false, null); + + channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); + System.out.println(" [x] Sent '" + message + "'"); + + channel.close(); + connection.close(); + } +} From afee31e0814d79239978958440a3d11c6375e926 Mon Sep 17 00:00:00 2001 From: Daniele Demichelis Date: Sat, 25 Feb 2017 17:22:25 +0100 Subject: [PATCH 188/192] BAEL-554 - JUnit test that run server and clients (#1233) * Burlap & Hessian server added * Burlap & Hessian client work * Fixed main * Fixed formatting * Spring Remote example based on Burlap & Hessian runs in a JUnit test * Fixed main * Fixed formatting * Spring Remote example based on Burlap & Hessian runs in a JUnit test --- .../remoting-hessian-burlap/client/pom.xml | 24 ++++++ .../client/CabBookingServiceTest.java | 73 +++++++++++++++++++ .../src/test/resources/application.properties | 1 + .../remoting-hessian-burlap/server/pom.xml | 2 +- 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java create mode 100644 spring-remoting/remoting-hessian-burlap/client/src/test/resources/application.properties diff --git a/spring-remoting/remoting-hessian-burlap/client/pom.xml b/spring-remoting/remoting-hessian-burlap/client/pom.xml index 11250e63d2..1ae9b10019 100644 --- a/spring-remoting/remoting-hessian-burlap/client/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/client/pom.xml @@ -31,5 +31,29 @@ hessian 4.0.38 + + + + ${project.groupId} + remoting-hessian-burlap-server + ${project.version} + test + + + javax.servlet + javax.servlet-api + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-tomcat + test + + \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java b/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java new file mode 100644 index 0000000000..20746bbf09 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java @@ -0,0 +1,73 @@ +package com.baeldung.client; + +import com.baeldung.api.Booking; +import com.baeldung.api.BookingException; +import com.baeldung.api.CabBookingService; +import com.baeldung.server.Server; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static java.lang.Thread.sleep; + +@SpringBootTest(classes = {BurlapClient.class, HessianClient.class}) +@RunWith(SpringRunner.class) +public class CabBookingServiceTest { + + static Logger log = LoggerFactory.getLogger(CabBookingServiceTest.class); + @Autowired @Qualifier("burlapInvoker") CabBookingService burlapClient; + @Autowired @Qualifier("hessianInvoker") CabBookingService hessianClient; + static Thread serverThread; + + @BeforeClass + public static void startServer() throws InterruptedException { + serverThread = serverThread(); + log.info("Starting server."); + serverThread.start(); + sleep(4000); + } + + @org.junit.Test + public void bookACabWithBurlapClient() throws InterruptedException { + bookACab(this.burlapClient); + } + + @org.junit.Test + public void bookACabWithHessianClient() throws InterruptedException { + bookACab(this.hessianClient); + } + + private void bookACab(CabBookingService burlapClient) { + Booking booking; + try { + booking = burlapClient.bookRide("Duomo place"); + log.info("Booking success: {}", booking); + } catch (BookingException e) { + log.info("Booking failed: {}", e.getMessage()); + } + } + + @AfterClass + public static void stopServer() throws InterruptedException { + serverThread.interrupt(); + serverThread.join(); + log.info("Server terminated."); + } + + static Thread serverThread() { + Thread serverThread = new Thread(()-> { + log.info("Starting Burlap and Hessian server"); + Server.main(new String[]{}); + log.info("Burlap and Hessian server terminated"); + }); + serverThread.setDaemon(true); + return serverThread; + } + +} diff --git a/spring-remoting/remoting-hessian-burlap/client/src/test/resources/application.properties b/spring-remoting/remoting-hessian-burlap/client/src/test/resources/application.properties new file mode 100644 index 0000000000..13577dc391 --- /dev/null +++ b/spring-remoting/remoting-hessian-burlap/client/src/test/resources/application.properties @@ -0,0 +1 @@ +application.properties=9999 \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/server/pom.xml b/spring-remoting/remoting-hessian-burlap/server/pom.xml index c97092b247..f1fed73ed8 100644 --- a/spring-remoting/remoting-hessian-burlap/server/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/server/pom.xml @@ -15,7 +15,7 @@ com.baeldung spring-remoting-http-server - 1.0-SNAPSHOT + ${project.version} org.springframework.boot From 413bddc9935acd4ee688eb42e9326eb13aaea440 Mon Sep 17 00:00:00 2001 From: Mohamed Sanaulla Date: Sat, 25 Feb 2017 23:34:49 +0300 Subject: [PATCH 189/192] BAEL-654: Java 9 Process API Improvements (#1235) * code for BAEL-654: Java 9 Process API Improvements * incorporate review --- core-java-9/pom.xml | 9 +- .../process/ProcessAPIEnhancementsTest.java | 133 ++++++++++++++++++ 2 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 core-java-9/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsTest.java diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml index 9d1ff29ef7..23473ff161 100644 --- a/core-java-9/pom.xml +++ b/core-java-9/pom.xml @@ -21,6 +21,11 @@ slf4j-api ${org.slf4j.version} + + ch.qos.logback + logback-classic + ${ch.qos.logback.version} + org.hamcrest @@ -76,9 +81,9 @@ 1.7.21 - + 1.2.1 - 3.6-jigsaw-SNAPSHOT + 3.6.0 2.19.1 diff --git a/core-java-9/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsTest.java b/core-java-9/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsTest.java new file mode 100644 index 0000000000..1129a10d17 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsTest.java @@ -0,0 +1,133 @@ +package com.baeldung.java9.process; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by sanaulla on 2/23/2017. + */ + +public class ProcessAPIEnhancementsTest { + + Logger log = LoggerFactory.getLogger(ProcessAPIEnhancementsTest.class); + + @Test + public void givenCurrentProcess_whenInvokeGetInfo_thenSuccess() throws IOException { + ProcessHandle processHandle = ProcessHandle.current(); + ProcessHandle.Info processInfo = processHandle.info(); + assertNotNull(processHandle.getPid()); + assertEquals(false, processInfo.arguments() + .isPresent()); + assertEquals(true, processInfo.command() + .isPresent()); + assertTrue(processInfo.command() + .get() + .contains("java")); + + assertEquals(true, processInfo.startInstant() + .isPresent()); + assertEquals(true, processInfo.totalCpuDuration() + .isPresent()); + assertEquals(true, processInfo.user() + .isPresent()); + } + + @Test + public void givenSpawnProcess_whenInvokeGetInfo_thenSuccess() throws IOException { + + String javaCmd = ProcessUtils.getJavaCmd() + .getAbsolutePath(); + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd, "-version"); + Process process = processBuilder.inheritIO() + .start(); + ProcessHandle processHandle = process.toHandle(); + ProcessHandle.Info processInfo = processHandle.info(); + assertNotNull(processHandle.getPid()); + assertEquals(false, processInfo.arguments() + .isPresent()); + assertEquals(true, processInfo.command() + .isPresent()); + assertTrue(processInfo.command() + .get() + .contains("java")); + assertEquals(true, processInfo.startInstant() + .isPresent()); + assertEquals(true, processInfo.totalCpuDuration() + .isPresent()); + assertEquals(true, processInfo.user() + .isPresent()); + } + + @Test + public void givenLiveProcesses_whenInvokeGetInfo_thenSuccess() { + Stream liveProcesses = ProcessHandle.allProcesses(); + liveProcesses.filter(ProcessHandle::isAlive) + .forEach(ph -> { + assertNotNull(ph.getPid()); + assertEquals(true, ph.info() + .command() + .isPresent()); + assertEquals(true, ph.info() + .startInstant() + .isPresent()); + assertEquals(true, ph.info() + .totalCpuDuration() + .isPresent()); + assertEquals(true, ph.info() + .user() + .isPresent()); + }); + } + + @Test + public void givenProcess_whenGetChildProcess_thenSuccess() throws IOException { + int childProcessCount = 5; + for (int i = 0; i < childProcessCount; i++) { + String javaCmd = ProcessUtils.getJavaCmd() + .getAbsolutePath(); + ProcessBuilder processBuilder + = new ProcessBuilder(javaCmd, "-version"); + processBuilder.inheritIO().start(); + } + + Stream children = ProcessHandle.current() + .children(); + children.filter(ProcessHandle::isAlive) + .forEach(ph -> log.info("PID: {}, Cmd: {}", ph.getPid(), ph.info() + .command())); + Stream descendants = ProcessHandle.current() + .descendants(); + descendants.filter(ProcessHandle::isAlive) + .forEach(ph -> log.info("PID: {}, Cmd: {}", ph.getPid(), ph.info() + .command())); + } + + @Test + public void givenProcess_whenAddExitCallback_thenSuccess() throws Exception { + String javaCmd = ProcessUtils.getJavaCmd() + .getAbsolutePath(); + ProcessBuilder processBuilder + = new ProcessBuilder(javaCmd, "-version"); + Process process = processBuilder.inheritIO() + .start(); + ProcessHandle processHandle = process.toHandle(); + + log.info("PID: {} has started", processHandle.getPid()); + CompletableFuture onProcessExit = processHandle.onExit(); + onProcessExit.get(); + assertEquals(false, processHandle.isAlive()); + onProcessExit.thenAccept(ph -> { + log.info("PID: {} has stopped", ph.getPid()); + }); + } + +} From d04bed81e5869a7953beaabb1bd5ca9c6b48baaf Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 25 Feb 2017 16:40:42 -0600 Subject: [PATCH 190/192] BAEL-278: Updated README.md (#1238) --- algorithms/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms/README.md b/algorithms/README.md index 4789768fad..42f696d9be 100644 --- a/algorithms/README.md +++ b/algorithms/README.md @@ -1,3 +1,4 @@ ## Relevant articles: - [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra) +- [Introduction to Cobertura](http://www.baeldung.com/cobertura) From db5dc24fdb1e542912e747b20b7ec8f413ee30a7 Mon Sep 17 00:00:00 2001 From: baljeet20 Date: Sun, 26 Feb 2017 13:51:59 +0530 Subject: [PATCH 191/192] BAEL-700 Guide to Java Lock API (#1239) * BAEL-604 Introduction to apache velocity * BAEL-604 Introduction to apache velocity * BAEL-700 Guide to Java Lock APIs * BAEL-700 Guide to Java Lock APIs --- .../locks/ReentrantLockWithCondition.java | 83 ++++++++++++ .../locks/SharedObjectWithLock.java | 92 ++++++++++++++ .../concurrent/locks/StampedLockDemo.java | 104 +++++++++++++++ .../locks/SynchronizedHashMapWithRWLock.java | 120 ++++++++++++++++++ .../locks/SharedObjectWithLockManualTest.java | 75 +++++++++++ ...nchronizedHashMapWithRWLockManualTest.java | 58 +++++++++ 6 files changed, 532 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java create mode 100644 core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java create mode 100644 core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java create mode 100644 core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java create mode 100644 core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java create mode 100644 core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java b/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java new file mode 100644 index 0000000000..4f061d2efd --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java @@ -0,0 +1,83 @@ +package com.baeldung.concurrent.locks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Stack; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +import static java.lang.Thread.sleep; + +public class ReentrantLockWithCondition { + + static Logger logger = LoggerFactory.getLogger(ReentrantLockWithCondition.class); + + Stack stack = new Stack<>(); + int CAPACITY = 5; + + ReentrantLock lock = new ReentrantLock(); + Condition stackEmptyCondition = lock.newCondition(); + Condition stackFullCondition = lock.newCondition(); + + public void pushToStack(String item) throws InterruptedException { + try { + lock.lock(); + if (stack.size() == CAPACITY) { + logger.info(Thread.currentThread().getName() + " wait on stack full"); + stackFullCondition.await(); + } + logger.info("Pushing the item " + item); + stack.push(item); + stackEmptyCondition.signalAll(); + } finally { + lock.unlock(); + } + + } + + public String popFromStack() throws InterruptedException { + try { + lock.lock(); + if (stack.size() == 0) { + logger.info(Thread.currentThread().getName() + " wait on stack empty"); + stackEmptyCondition.await(); + } + return stack.pop(); + } finally { + stackFullCondition.signalAll(); + lock.unlock(); + } + } + + public static void main(String[] args) { + final int threadCount = 2; + ReentrantLockWithCondition object = new ReentrantLockWithCondition(); + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + service.execute(() -> { + for (int i = 0; i < 10; i++) { + try { + object.pushToStack("Item " + i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + }); + + service.execute(() -> { + for (int i = 0; i < 10; i++) { + try { + logger.info("Item popped " + object.popFromStack()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + }); + + service.shutdown(); + } +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java b/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java new file mode 100644 index 0000000000..b6a4615638 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java @@ -0,0 +1,92 @@ +package com.baeldung.concurrent.locks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; + +import static java.lang.Thread.sleep; + +public class SharedObjectWithLock { + + Logger logger = LoggerFactory.getLogger(SharedObjectWithLock.class); + + ReentrantLock lock = new ReentrantLock(true); + + int counter = 0; + + public void perform() { + + lock.lock(); + logger.info("Thread - " + Thread.currentThread().getName() + " acquired the lock"); + try { + logger.info("Thread - " + Thread.currentThread().getName() + " processing"); + counter++; + } catch (Exception exception) { + logger.error(" Interrupted Exception ", exception); + } finally { + lock.unlock(); + logger.info("Thread - " + Thread.currentThread().getName() + " released the lock"); + } + } + + public void performTryLock() { + + logger.info("Thread - " + Thread.currentThread().getName() + " attempting to acquire the lock"); + try { + boolean isLockAcquired = lock.tryLock(2, TimeUnit.SECONDS); + if (isLockAcquired) { + try { + logger.info("Thread - " + Thread.currentThread().getName() + " acquired the lock"); + + logger.info("Thread - " + Thread.currentThread().getName() + " processing"); + sleep(1000); + } finally { + lock.unlock(); + logger.info("Thread - " + Thread.currentThread().getName() + " released the lock"); + + } + } + } catch (InterruptedException exception) { + logger.error(" Interrupted Exception ", exception); + } + logger.info("Thread - " + Thread.currentThread().getName() + " could not acquire the lock"); + } + + public ReentrantLock getLock() { + return lock; + } + + boolean isLocked() { + return lock.isLocked(); + } + + boolean hasQueuedThreads() { + return lock.hasQueuedThreads(); + } + + int getCounter() { + return counter; + } + + public static void main(String[] args) { + + final int threadCount = 2; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final SharedObjectWithLock object = new SharedObjectWithLock(); + + service.execute(() -> { + object.perform(); + }); + service.execute(() -> { + object.performTryLock(); + }); + + service.shutdown(); + + } + +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java b/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java new file mode 100644 index 0000000000..0b0dbc72cb --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java @@ -0,0 +1,104 @@ +package com.baeldung.concurrent.locks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.StampedLock; + +import static java.lang.Thread.sleep; + +public class StampedLockDemo { + Map map = new HashMap<>(); + Logger logger = LoggerFactory.getLogger(StampedLockDemo.class); + + private final StampedLock lock = new StampedLock(); + + public void put(String key, String value) throws InterruptedException { + long stamp = lock.writeLock(); + + try { + logger.info(Thread.currentThread().getName() + " acquired the write lock with stamp " + stamp); + map.put(key, value); + } finally { + lock.unlockWrite(stamp); + logger.info(Thread.currentThread().getName() + " unlocked the write lock with stamp " + stamp); + } + } + + public String get(String key) throws InterruptedException { + long stamp = lock.readLock(); + logger.info(Thread.currentThread().getName() + " acquired the read lock with stamp " + stamp); + try { + sleep(5000); + return map.get(key); + + } finally { + lock.unlockRead(stamp); + logger.info(Thread.currentThread().getName() + " unlocked the read lock with stamp " + stamp); + + } + + } + + public String readWithOptimisticLock(String key) throws InterruptedException { + long stamp = lock.tryOptimisticRead(); + String value = map.get(key); + + if (!lock.validate(stamp)) { + stamp = lock.readLock(); + try { + sleep(5000); + return map.get(key); + + } finally { + lock.unlock(stamp); + logger.info(Thread.currentThread().getName() + " unlocked the read lock with stamp " + stamp); + + } + } + return value; + } + + public static void main(String[] args) { + final int threadCount = 4; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + StampedLockDemo object = new StampedLockDemo(); + + Runnable writeTask = () -> { + + try { + object.put("key1", "value1"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + Runnable readTask = () -> { + + try { + object.get("key1"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + Runnable readOptimisticTask = () -> { + + try { + object.readWithOptimisticLock("key1"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + service.submit(writeTask); + service.submit(writeTask); + service.submit(readTask); + service.submit(readOptimisticTask); + + service.shutdown(); + + } + +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java b/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java new file mode 100644 index 0000000000..83b8b34fe9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java @@ -0,0 +1,120 @@ +package com.baeldung.concurrent.locks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import static java.lang.Thread.sleep; + +public class SynchronizedHashMapWithRWLock { + + static Map syncHashMap = new HashMap<>(); + Logger logger = LoggerFactory.getLogger(SynchronizedHashMapWithRWLock.class); + + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final Lock readLock = lock.readLock(); + private final Lock writeLock = lock.writeLock(); + + public void put(String key, String value) throws InterruptedException { + + try { + writeLock.lock(); + logger.info(Thread.currentThread().getName() + " writing"); + syncHashMap.put(key, value); + sleep(1000); + } finally { + writeLock.unlock(); + } + + } + + public String get(String key) { + try { + readLock.lock(); + logger.info(Thread.currentThread().getName() + " reading"); + return syncHashMap.get(key); + } finally { + readLock.unlock(); + } + } + + public String remove(String key) { + try { + writeLock.lock(); + return syncHashMap.remove(key); + } finally { + writeLock.unlock(); + } + } + + public boolean containsKey(String key) { + try { + readLock.lock(); + return syncHashMap.containsKey(key); + } finally { + readLock.unlock(); + } + } + + boolean isReadLockAvailable() { + return readLock.tryLock(); + } + + public static void main(String[] args) throws InterruptedException { + + final int threadCount = 3; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); + + service.execute(new Thread(new Writer(object), "Writer")); + service.execute(new Thread(new Reader(object), "Reader1")); + service.execute(new Thread(new Reader(object), "Reader2")); + + service.shutdown(); + } + + private static class Reader implements Runnable { + + SynchronizedHashMapWithRWLock object; + + public Reader(SynchronizedHashMapWithRWLock object) { + this.object = object; + } + + @Override + public void run() { + for (int i = 0; i < 10; i++) { + object.get("key" + i); + } + } + } + + private static class Writer implements Runnable { + + SynchronizedHashMapWithRWLock object; + + public Writer(SynchronizedHashMapWithRWLock object) { + this.object = object; + } + + @Override + public void run() { + for (int i = 0; i < 10; i++) { + try { + object.put("key" + i, "value" + i); + sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + +} diff --git a/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java b/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java new file mode 100644 index 0000000000..9b82ced642 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java @@ -0,0 +1,75 @@ +package com.baeldung.concurrent.locks; + +import org.junit.Test; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static junit.framework.TestCase.assertEquals; + +public class SharedObjectWithLockManualTest { + + @Test + public void whenLockAcquired_ThenLockedIsTrue() { + final SharedObjectWithLock object = new SharedObjectWithLock(); + + final int threadCount = 2; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + + executeThreads(object, threadCount, service); + + assertEquals(true, object.isLocked()); + + service.shutdown(); + } + + @Test + public void whenLocked_ThenQueuedThread() { + final int threadCount = 4; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final SharedObjectWithLock object = new SharedObjectWithLock(); + + executeThreads(object, threadCount, service); + + assertEquals(object.hasQueuedThreads(), true); + + service.shutdown(); + + } + + public void whenTryLock_ThenQueuedThread() { + final SharedObjectWithLock object = new SharedObjectWithLock(); + + final int threadCount = 2; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + + executeThreads(object, threadCount, service); + + assertEquals(true, object.isLocked()); + + service.shutdown(); + } + + @Test + public void whenGetCount_ThenCorrectCount() throws InterruptedException { + final int threadCount = 4; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final SharedObjectWithLock object = new SharedObjectWithLock(); + + executeThreads(object, threadCount, service); + Thread.sleep(1000); + assertEquals(object.getCounter(), 4); + + service.shutdown(); + + } + + private void executeThreads(SharedObjectWithLock object, int threadCount, ExecutorService service) { + for (int i = 0; i < threadCount; i++) { + service.execute(() -> { + object.perform(); + }); + } + } + +} diff --git a/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java b/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java new file mode 100644 index 0000000000..fd6cf08442 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java @@ -0,0 +1,58 @@ +package com.baeldung.concurrent.locks; + +import jdk.nashorn.internal.ir.annotations.Ignore; +import org.junit.Test; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static junit.framework.TestCase.assertEquals; + +public class SynchronizedHashMapWithRWLockManualTest { + + @Test + public void whenWriting_ThenNoReading() { + SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); + final int threadCount = 3; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + + executeWriterThreads(object, threadCount, service); + + assertEquals(object.isReadLockAvailable(), false); + + service.shutdown(); + } + + @Test + public void whenReading_ThenMultipleReadingAllowed() { + SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); + final int threadCount = 5; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + + executeReaderThreads(object, threadCount, service); + + assertEquals(object.isReadLockAvailable(), true); + + service.shutdown(); + } + + private void executeWriterThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) { + for (int i = 0; i < threadCount; i++) { + service.execute(() -> { + try { + object.put("key" + threadCount, "value" + threadCount); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + } + } + + private void executeReaderThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) { + for (int i = 0; i < threadCount; i++) + service.execute(() -> { + object.get("key" + threadCount); + }); + } + +} From 86029a348782a1a16ad91d1aa2eabdde30fcb6d0 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 26 Feb 2017 10:06:21 +0100 Subject: [PATCH 192/192] Rename module (#1234) Rename libraries module --- {cglib => libraries}/pom.xml | 3 ++- .../src/main/java/com/baeldung/cglib/mixin/Class1.java | 0 .../src/main/java/com/baeldung/cglib/mixin/Class2.java | 0 .../src/main/java/com/baeldung/cglib/mixin/Interface1.java | 0 .../src/main/java/com/baeldung/cglib/mixin/Interface2.java | 0 .../main/java/com/baeldung/cglib/mixin/MixinInterface.java | 0 .../main/java/com/baeldung/cglib/proxy/PersonService.java | 0 .../java/com/baeldung/cglib/proxy/BeanGeneratorTest.java | 0 .../src/test/java/com/baeldung/cglib/proxy/MixinTest.java | 0 .../src/test/java/com/baeldung/cglib/proxy/ProxyTest.java | 0 pom.xml | 7 +++---- 11 files changed, 5 insertions(+), 5 deletions(-) rename {cglib => libraries}/pom.xml (94%) rename {cglib => libraries}/src/main/java/com/baeldung/cglib/mixin/Class1.java (100%) rename {cglib => libraries}/src/main/java/com/baeldung/cglib/mixin/Class2.java (100%) rename {cglib => libraries}/src/main/java/com/baeldung/cglib/mixin/Interface1.java (100%) rename {cglib => libraries}/src/main/java/com/baeldung/cglib/mixin/Interface2.java (100%) rename {cglib => libraries}/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java (100%) rename {cglib => libraries}/src/main/java/com/baeldung/cglib/proxy/PersonService.java (100%) rename {cglib => libraries}/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java (100%) rename {cglib => libraries}/src/test/java/com/baeldung/cglib/proxy/MixinTest.java (100%) rename {cglib => libraries}/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java (100%) diff --git a/cglib/pom.xml b/libraries/pom.xml similarity index 94% rename from cglib/pom.xml rename to libraries/pom.xml index 21309cf514..ee93ee934f 100644 --- a/cglib/pom.xml +++ b/libraries/pom.xml @@ -9,7 +9,8 @@ 4.0.0 - cglib + libraries + libraries diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java b/libraries/src/main/java/com/baeldung/cglib/mixin/Class1.java similarity index 100% rename from cglib/src/main/java/com/baeldung/cglib/mixin/Class1.java rename to libraries/src/main/java/com/baeldung/cglib/mixin/Class1.java diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java b/libraries/src/main/java/com/baeldung/cglib/mixin/Class2.java similarity index 100% rename from cglib/src/main/java/com/baeldung/cglib/mixin/Class2.java rename to libraries/src/main/java/com/baeldung/cglib/mixin/Class2.java diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java b/libraries/src/main/java/com/baeldung/cglib/mixin/Interface1.java similarity index 100% rename from cglib/src/main/java/com/baeldung/cglib/mixin/Interface1.java rename to libraries/src/main/java/com/baeldung/cglib/mixin/Interface1.java diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java b/libraries/src/main/java/com/baeldung/cglib/mixin/Interface2.java similarity index 100% rename from cglib/src/main/java/com/baeldung/cglib/mixin/Interface2.java rename to libraries/src/main/java/com/baeldung/cglib/mixin/Interface2.java diff --git a/cglib/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java b/libraries/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java similarity index 100% rename from cglib/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java rename to libraries/src/main/java/com/baeldung/cglib/mixin/MixinInterface.java diff --git a/cglib/src/main/java/com/baeldung/cglib/proxy/PersonService.java b/libraries/src/main/java/com/baeldung/cglib/proxy/PersonService.java similarity index 100% rename from cglib/src/main/java/com/baeldung/cglib/proxy/PersonService.java rename to libraries/src/main/java/com/baeldung/cglib/proxy/PersonService.java diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java b/libraries/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java similarity index 100% rename from cglib/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java rename to libraries/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorTest.java diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java b/libraries/src/test/java/com/baeldung/cglib/proxy/MixinTest.java similarity index 100% rename from cglib/src/test/java/com/baeldung/cglib/proxy/MixinTest.java rename to libraries/src/test/java/com/baeldung/cglib/proxy/MixinTest.java diff --git a/cglib/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java b/libraries/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java similarity index 100% rename from cglib/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java rename to libraries/src/test/java/com/baeldung/cglib/proxy/ProxyTest.java diff --git a/pom.xml b/pom.xml index 1b7d0b419c..9d6c5931e3 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,6 @@ parent-modules pom - UTF-8 refs/heads/master @@ -28,7 +27,6 @@ autovalue cdi - cglib core-java couchbase-sdk @@ -76,6 +74,7 @@ kotlin + libraries log-mdc log4j log4j2 @@ -206,11 +205,11 @@ - +