From b61b82cd2a31831c43df1993d36997c762e21907 Mon Sep 17 00:00:00 2001 From: Thai Nguyen Date: Fri, 28 Oct 2016 14:32:20 +0700 Subject: [PATCH 01/51] Change text/xml to application/xml --- .../cxf/jaxrs/implementation/CourseRepository.java | 2 +- .../cxf/jaxrs/implementation/ServiceLiveTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java b/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java index a2fd6be435..4a826b664d 100644 --- a/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java +++ b/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; @Path("baeldung") -@Produces("text/xml") +@Produces("application/xml") public class CourseRepository { private Map courses = new HashMap<>(); diff --git a/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java b/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java index 29c34ae16b..cf7af5070a 100644 --- a/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java +++ b/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java @@ -39,7 +39,7 @@ public class ServiceLiveTest { final HttpPut httpPut = new HttpPut(BASE_URL + "3"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("non_existent_course.xml"); httpPut.setEntity(new InputStreamEntity(resourceStream)); - httpPut.setHeader("Content-Type", "text/xml"); + httpPut.setHeader("Content-Type", "application/xml"); final HttpResponse response = client.execute(httpPut); assertEquals(404, response.getStatusLine().getStatusCode()); @@ -50,7 +50,7 @@ public class ServiceLiveTest { final HttpPut httpPut = new HttpPut(BASE_URL + "1"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("unchanged_course.xml"); httpPut.setEntity(new InputStreamEntity(resourceStream)); - httpPut.setHeader("Content-Type", "text/xml"); + httpPut.setHeader("Content-Type", "application/xml"); final HttpResponse response = client.execute(httpPut); assertEquals(304, response.getStatusLine().getStatusCode()); @@ -61,7 +61,7 @@ public class ServiceLiveTest { final HttpPut httpPut = new HttpPut(BASE_URL + "2"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("changed_course.xml"); httpPut.setEntity(new InputStreamEntity(resourceStream)); - httpPut.setHeader("Content-Type", "text/xml"); + httpPut.setHeader("Content-Type", "application/xml"); final HttpResponse response = client.execute(httpPut); assertEquals(200, response.getStatusLine().getStatusCode()); @@ -76,7 +76,7 @@ public class ServiceLiveTest { final HttpPost httpPost = new HttpPost(BASE_URL + "1/students"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("conflict_student.xml"); httpPost.setEntity(new InputStreamEntity(resourceStream)); - httpPost.setHeader("Content-Type", "text/xml"); + httpPost.setHeader("Content-Type", "application/xml"); final HttpResponse response = client.execute(httpPost); assertEquals(409, response.getStatusLine().getStatusCode()); @@ -87,7 +87,7 @@ public class ServiceLiveTest { final HttpPost httpPost = new HttpPost(BASE_URL + "2/students"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("created_student.xml"); httpPost.setEntity(new InputStreamEntity(resourceStream)); - httpPost.setHeader("Content-Type", "text/xml"); + httpPost.setHeader("Content-Type", "application/xml"); final HttpResponse response = client.execute(httpPost); assertEquals(200, response.getStatusLine().getStatusCode()); From f66494192ca6068147bbd2068a97a3bcdb691f5f Mon Sep 17 00:00:00 2001 From: Thai Nguyen Date: Sun, 30 Oct 2016 21:30:18 +0700 Subject: [PATCH 02/51] Revert "Change text/xml to application/xml" This reverts commit b61b82cd2a31831c43df1993d36997c762e21907. --- .../cxf/jaxrs/implementation/CourseRepository.java | 2 +- .../cxf/jaxrs/implementation/ServiceLiveTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java b/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java index 4a826b664d..a2fd6be435 100644 --- a/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java +++ b/apache-cxf/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; @Path("baeldung") -@Produces("application/xml") +@Produces("text/xml") public class CourseRepository { private Map courses = new HashMap<>(); diff --git a/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java b/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java index cf7af5070a..29c34ae16b 100644 --- a/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java +++ b/apache-cxf/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java @@ -39,7 +39,7 @@ public class ServiceLiveTest { final HttpPut httpPut = new HttpPut(BASE_URL + "3"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("non_existent_course.xml"); httpPut.setEntity(new InputStreamEntity(resourceStream)); - httpPut.setHeader("Content-Type", "application/xml"); + httpPut.setHeader("Content-Type", "text/xml"); final HttpResponse response = client.execute(httpPut); assertEquals(404, response.getStatusLine().getStatusCode()); @@ -50,7 +50,7 @@ public class ServiceLiveTest { final HttpPut httpPut = new HttpPut(BASE_URL + "1"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("unchanged_course.xml"); httpPut.setEntity(new InputStreamEntity(resourceStream)); - httpPut.setHeader("Content-Type", "application/xml"); + httpPut.setHeader("Content-Type", "text/xml"); final HttpResponse response = client.execute(httpPut); assertEquals(304, response.getStatusLine().getStatusCode()); @@ -61,7 +61,7 @@ public class ServiceLiveTest { final HttpPut httpPut = new HttpPut(BASE_URL + "2"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("changed_course.xml"); httpPut.setEntity(new InputStreamEntity(resourceStream)); - httpPut.setHeader("Content-Type", "application/xml"); + httpPut.setHeader("Content-Type", "text/xml"); final HttpResponse response = client.execute(httpPut); assertEquals(200, response.getStatusLine().getStatusCode()); @@ -76,7 +76,7 @@ public class ServiceLiveTest { final HttpPost httpPost = new HttpPost(BASE_URL + "1/students"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("conflict_student.xml"); httpPost.setEntity(new InputStreamEntity(resourceStream)); - httpPost.setHeader("Content-Type", "application/xml"); + httpPost.setHeader("Content-Type", "text/xml"); final HttpResponse response = client.execute(httpPost); assertEquals(409, response.getStatusLine().getStatusCode()); @@ -87,7 +87,7 @@ public class ServiceLiveTest { final HttpPost httpPost = new HttpPost(BASE_URL + "2/students"); final InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream("created_student.xml"); httpPost.setEntity(new InputStreamEntity(resourceStream)); - httpPost.setHeader("Content-Type", "application/xml"); + httpPost.setHeader("Content-Type", "text/xml"); final HttpResponse response = client.execute(httpPost); assertEquals(200, response.getStatusLine().getStatusCode()); From 1d692a99c4cb12cbbb3c369ff6442e5713cdb384 Mon Sep 17 00:00:00 2001 From: Thai Nguyen Date: Thu, 10 Nov 2016 05:21:00 +0700 Subject: [PATCH 03/51] Apache CXF Aegis data bindings --- apache-cxf/cxf-aegis/pom.xml | 20 ++++ .../java/com/baeldung/cxf/aegis/Course.java | 42 +++++++++ .../com/baeldung/cxf/aegis/CourseRepo.java | 11 +++ .../baeldung/cxf/aegis/CourseRepoImpl.java | 34 +++++++ .../com/baeldung/cxf/aegis/Course.aegis.xml | 5 + .../baeldung/cxf/aegis/CourseRepo.aegis.xml | 5 + .../com/baeldung/cxf/aegis/BaeldungTest.java | 93 +++++++++++++++++++ apache-cxf/pom.xml | 1 + 8 files changed, 211 insertions(+) create mode 100644 apache-cxf/cxf-aegis/pom.xml create mode 100644 apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/Course.java create mode 100644 apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepo.java create mode 100644 apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepoImpl.java create mode 100644 apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/Course.aegis.xml create mode 100644 apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/CourseRepo.aegis.xml create mode 100644 apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java diff --git a/apache-cxf/cxf-aegis/pom.xml b/apache-cxf/cxf-aegis/pom.xml new file mode 100644 index 0000000000..b436b03305 --- /dev/null +++ b/apache-cxf/cxf-aegis/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + cxf-aegis + + com.baeldung + apache-cxf + 0.0.1-SNAPSHOT + + + 3.1.8 + + + + org.apache.cxf + cxf-rt-databinding-aegis + ${cxf.version} + + + diff --git a/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/Course.java b/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/Course.java new file mode 100644 index 0000000000..b8004f1ba7 --- /dev/null +++ b/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/Course.java @@ -0,0 +1,42 @@ +package com.baeldung.cxf.aegis; + +import java.util.Date; + +public class Course { + private int id; + private String name; + private String instructor; + private Date enrolmentDate; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getInstructor() { + return instructor; + } + + public void setInstructor(String instructor) { + this.instructor = instructor; + } + + public Date getEnrolmentDate() { + return enrolmentDate; + } + + public void setEnrolmentDate(Date enrolmentDate) { + this.enrolmentDate = enrolmentDate; + } +} \ No newline at end of file diff --git a/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepo.java b/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepo.java new file mode 100644 index 0000000000..a125fb1f85 --- /dev/null +++ b/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepo.java @@ -0,0 +1,11 @@ +package com.baeldung.cxf.aegis; + +import java.util.Map; + +public interface CourseRepo { + String getGreeting(); + void setGreeting(String greeting); + Map getCourses(); + void setCourses(Map courses); + void addCourse(Course course); +} \ No newline at end of file diff --git a/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepoImpl.java b/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepoImpl.java new file mode 100644 index 0000000000..e483feed58 --- /dev/null +++ b/apache-cxf/cxf-aegis/src/main/java/com/baeldung/cxf/aegis/CourseRepoImpl.java @@ -0,0 +1,34 @@ +package com.baeldung.cxf.aegis; + +import java.util.HashMap; +import java.util.Map; + +public class CourseRepoImpl implements CourseRepo { + private String greeting; + private Map courses = new HashMap<>(); + + @Override + public String getGreeting() { + return greeting; + } + + @Override + public void setGreeting(String greeting) { + this.greeting = greeting; + } + + @Override + public Map getCourses() { + return courses; + } + + @Override + public void setCourses(Map courses) { + this.courses = courses; + } + + @Override + public void addCourse(Course course) { + courses.put(course.getId(), course); + } +} \ No newline at end of file diff --git a/apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/Course.aegis.xml b/apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/Course.aegis.xml new file mode 100644 index 0000000000..53c6c2fc45 --- /dev/null +++ b/apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/Course.aegis.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/CourseRepo.aegis.xml b/apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/CourseRepo.aegis.xml new file mode 100644 index 0000000000..7e13678b51 --- /dev/null +++ b/apache-cxf/cxf-aegis/src/main/resources/com/baeldung/cxf/aegis/CourseRepo.aegis.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java b/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java new file mode 100644 index 0000000000..559de037a9 --- /dev/null +++ b/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java @@ -0,0 +1,93 @@ +package com.baeldung.cxf.aegis; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.lang.reflect.Type; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.cxf.aegis.AegisContext; +import org.apache.cxf.aegis.AegisReader; +import org.apache.cxf.aegis.AegisWriter; +import org.apache.cxf.aegis.type.AegisType; + +public class BaeldungTest { + private AegisContext context; + private String fileName = "baeldung.xml"; + + @Test + public void whenMarshalingAndUnmarshalingCourseRepo_thenCorrect() throws Exception { + initializeContext(); + CourseRepo inputRepo = initCourseRepo(); + marshalCourseRepo(inputRepo); + CourseRepo outputRepo = unmarshalCourseRepo(); + Course restCourse = outputRepo.getCourses().get(1); + Course securityCourse = outputRepo.getCourses().get(2); + assertEquals("Welcome to Beldung!", outputRepo.getGreeting()); + assertEquals("REST with Spring", restCourse.getName()); + assertEquals(new Date(1234567890000L), restCourse.getEnrolmentDate()); + assertNull(restCourse.getInstructor()); + assertEquals("Learn Spring Security", securityCourse.getName()); + assertEquals(new Date(1456789000000L), securityCourse.getEnrolmentDate()); + assertNull(securityCourse.getInstructor()); + } + + private void initializeContext() { + context = new AegisContext(); + Set rootClasses = new HashSet(); + rootClasses.add(CourseRepo.class); + context.setRootClasses(rootClasses); + Map, String> beanImplementationMap = new HashMap<>(); + beanImplementationMap.put(CourseRepoImpl.class, "CourseRepo"); + context.setBeanImplementationMap(beanImplementationMap); + context.setWriteXsiTypes(true); + context.initialize(); + } + + private CourseRepoImpl initCourseRepo() { + Course restCourse = new Course(); + restCourse.setId(1); + restCourse.setName("REST with Spring"); + restCourse.setInstructor("Eugen"); + restCourse.setEnrolmentDate(new Date(1234567890000L)); + Course securityCourse = new Course(); + securityCourse.setId(2); + securityCourse.setName("Learn Spring Security"); + securityCourse.setInstructor("Eugen"); + securityCourse.setEnrolmentDate(new Date(1456789000000L)); + CourseRepoImpl courseRepo = new CourseRepoImpl(); + courseRepo.setGreeting("Welcome to Beldung!"); + courseRepo.addCourse(restCourse); + courseRepo.addCourse(securityCourse); + return courseRepo; + } + + private void marshalCourseRepo(CourseRepo courseRepo) throws Exception { + AegisWriter writer = context.createXMLStreamWriter(); + AegisType aegisType = context.getTypeMapping().getType(CourseRepo.class); + XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new FileOutputStream(fileName)); + writer.write(courseRepo, new QName("http://aegis.cxf.baeldung.com", "baeldung"), false, xmlWriter, aegisType); + xmlWriter.close(); + } + + private CourseRepo unmarshalCourseRepo() throws Exception { + AegisReader reader = context.createXMLStreamReader(); + XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(fileName)); + CourseRepo courseRepo = (CourseRepo) reader.read(xmlReader, context.getTypeMapping().getType(CourseRepo.class)); + xmlReader.close(); + return courseRepo; + } +} \ No newline at end of file diff --git a/apache-cxf/pom.xml b/apache-cxf/pom.xml index af7949bb6c..b382ee6506 100644 --- a/apache-cxf/pom.xml +++ b/apache-cxf/pom.xml @@ -9,6 +9,7 @@ cxf-introduction cxf-spring cxf-jaxrs-implementation + cxf-aegis From dfd2d7a23801729314528a0f094f4ca71b132b33 Mon Sep 17 00:00:00 2001 From: Ante Pocedulic Date: Thu, 15 Dec 2016 16:23:08 +0100 Subject: [PATCH 04/51] - changed test package name from org.baeldung to com.baeldung (#897) - streams are added where neccessary - format fixes --- spring-apache-camel/pom.xml | 8 ++++++-- .../camel/file/DeadLetterChannelFileRouter.java | 12 ++++-------- .../camel-context-ContentBasedFileRouterTest.xml | 2 +- .../camel-context-DeadLetterChannelFileRouter.xml | 2 +- ...camel-context-MessageTranslatorFileRouterTest.xml | 2 +- .../camel-context-MulticastFileRouterTest.xml | 2 +- .../resources/camel-context-SplitterFileRouter.xml | 2 +- .../destination-folder/2016-12-14 23-33-25File1.txt | 0 .../destination-folder/2016-12-14 23-33-25File2.txt | 0 .../ContentBasedFileRouterIntegrationTest.java | 2 +- .../DeadLetterChannelFileRouterIntegrationTest.java | 3 +-- .../file/processor/FileProcessorIntegrationTest.java | 2 +- .../camel/file/processor/FileProcessorTest.java | 2 +- .../MessageTranslatorFileRouterIntegrationTest.java | 2 +- .../MulticastFileRouterIntegrationTest.java | 2 +- .../processor/SplitterFileRouterIntegrationTest.java | 2 +- .../apache/camel/main/AppIntegrationTest.java | 2 +- 17 files changed, 23 insertions(+), 24 deletions(-) create mode 100755 spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File1.txt create mode 100755 spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File2.txt rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java (97%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java (94%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/FileProcessorIntegrationTest.java (98%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/FileProcessorTest.java (98%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java (97%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java (97%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java (97%) rename spring-apache-camel/src/test/java/{org => com}/apache/camel/main/AppIntegrationTest.java (96%) diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml index e68768a624..4daa3c1e9a 100644 --- a/spring-apache-camel/pom.xml +++ b/spring-apache-camel/pom.xml @@ -11,7 +11,7 @@ 2.16.1 4.3.4.RELEASE - 2.19.1 + 2.19.1 1.8 4.12 @@ -48,7 +48,11 @@ spring-context ${env.spring.version} - + + org.slf4j + slf4j-log4j12 + 1.7.21 + diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java b/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java index 0388560175..fdcad99f02 100644 --- a/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java +++ b/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java @@ -1,8 +1,6 @@ package com.baeldung.camel.file; -import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; -import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; public class DeadLetterChannelFileRouter extends RouteBuilder { @@ -10,13 +8,11 @@ public class DeadLetterChannelFileRouter extends RouteBuilder { @Override public void configure() throws Exception { - errorHandler(deadLetterChannel("log:dead?level=ERROR").maximumRedeliveries(3).redeliveryDelay(1000).retryAttemptedLogLevel(LoggingLevel.ERROR)); + errorHandler(deadLetterChannel("log:dead?level=ERROR").maximumRedeliveries(3) + .redeliveryDelay(1000).retryAttemptedLogLevel(LoggingLevel.ERROR)); - from("file://" + SOURCE_FOLDER + "?delete=true").process(new Processor() { - @Override - public void process(Exchange exchange) throws Exception { - throw new IllegalArgumentException("Exception thrown!"); - } + from("file://" + SOURCE_FOLDER + "?delete=true").process((exchange) -> { + throw new IllegalArgumentException("Exception thrown!"); }); } } diff --git a/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml b/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml index f6bf8c7503..d6d3e62f1c 100644 --- a/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml +++ b/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml b/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml index 3ed80da7e0..ef61174b32 100644 --- a/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml +++ b/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml b/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml index d3d2706e22..7ab988ca8a 100644 --- a/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml +++ b/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml b/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml index 4982b61dbd..6f7e7cbb60 100644 --- a/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml +++ b/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml b/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml index 1f5945707a..9d4a890cc6 100644 --- a/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml +++ b/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File1.txt b/spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File1.txt new file mode 100755 index 0000000000..e69de29bb2 diff --git a/spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File2.txt b/spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File2.txt new file mode 100755 index 0000000000..e69de29bb2 diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java similarity index 97% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java index 29a5b4fc0f..b0920fe3b5 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java similarity index 94% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java index 49d91aa661..eb684230c9 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java @@ -1,9 +1,8 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java similarity index 98% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java index e73ad1e4a4..1d88e8aeb4 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java similarity index 98% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java index 3d63f614e0..c4a3ced84f 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java similarity index 97% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java index d9d889c4df..bcd382dd6c 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java similarity index 97% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java index 960d310692..137480ac8e 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java similarity index 97% rename from spring-apache-camel/src/test/java/org/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java index 9e942dd4c2..1991dd8d21 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.file.processor; +package com.apache.camel.file.processor; import java.io.File; import java.io.FileWriter; diff --git a/spring-apache-camel/src/test/java/org/apache/camel/main/AppIntegrationTest.java b/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java similarity index 96% rename from spring-apache-camel/src/test/java/org/apache/camel/main/AppIntegrationTest.java rename to spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java index fc7fa9653b..b33e6a3b29 100644 --- a/spring-apache-camel/src/test/java/org/apache/camel/main/AppIntegrationTest.java +++ b/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java @@ -1,4 +1,4 @@ -package org.apache.camel.main; +package com.apache.camel.main; import com.baeldung.camel.main.App; import junit.framework.TestCase; From 502777e8e881fc745c9c2f686416080388326b58 Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Thu, 15 Dec 2016 15:12:36 -0500 Subject: [PATCH 05/51] Update FileCopyConfig.java (#840) Changed the extension search to look for a wildcard extension Set expectReply(false)[service activator will throw exception after copying file without it) From 1825710b7915891ac6627cd4038c714a9dffc10d Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:15:34 +0600 Subject: [PATCH 06/51] Added relevant articles --- spring-security-basic-auth/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-basic-auth/README.md b/spring-security-basic-auth/README.md index 37ea545a9b..54d09dbf32 100644 --- a/spring-security-basic-auth/README.md +++ b/spring-security-basic-auth/README.md @@ -8,6 +8,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: - [Spring Security - security none, filters none, access permitAll](http://www.baeldung.com/security-none-filters-none-access-permitAll) - [Spring Security Basic Authentication](http://www.baeldung.com/spring-security-basic-authentication) +- [Writing a Custom Filter in Spring Security](http://www.baeldung.com/spring-security-custom-filter) ### Notes From 0556c1fe615ce4f23d4ba02cf9436a62bd9aa708 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:17:00 +0600 Subject: [PATCH 07/51] Added relevant articles --- spring-data-dynamodb/README.MD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-data-dynamodb/README.MD b/spring-data-dynamodb/README.MD index 8b13789179..9a6855ea0b 100644 --- a/spring-data-dynamodb/README.MD +++ b/spring-data-dynamodb/README.MD @@ -1 +1,2 @@ - +### Relevant Articles: +- [DynamoDB in a Spring Boot Application Using Spring Data](http://www.baeldung.com/spring-data-dynamodb) From f53fe18755cd4333d04a5114185b08149d1b1b7c Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:19:16 +0600 Subject: [PATCH 08/51] Created README.md and added relevant articles --- core-java/src/main/java/com/baeldung/printscreen/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/printscreen/README.md diff --git a/core-java/src/main/java/com/baeldung/printscreen/README.md b/core-java/src/main/java/com/baeldung/printscreen/README.md new file mode 100644 index 0000000000..7b3b40c102 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/printscreen/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) From 346c38b02a1bdf46e1e2ecffe90ca228c43d0ee1 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:21:57 +0600 Subject: [PATCH 09/51] Created README.md and added relevant articles --- apache-cxf/cxf-jaxrs-implementation/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apache-cxf/cxf-jaxrs-implementation/README.md diff --git a/apache-cxf/cxf-jaxrs-implementation/README.md b/apache-cxf/cxf-jaxrs-implementation/README.md new file mode 100644 index 0000000000..28c01e6e36 --- /dev/null +++ b/apache-cxf/cxf-jaxrs-implementation/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Apache CXF Support for RESTful Web Services](http://www.baeldung.com/apache-cxf-rest-api) From b9a290fd7a8f957e7f2442fc0d793eb3a22fe5e9 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:28:55 +0600 Subject: [PATCH 10/51] Created README.md and added relevant articles: --- core-java/src/main/java/com/baeldung/java/networking/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/java/networking/README.md diff --git a/core-java/src/main/java/com/baeldung/java/networking/README.md b/core-java/src/main/java/com/baeldung/java/networking/README.md new file mode 100644 index 0000000000..e92122f3bb --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/networking/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) From 28e5917405e80eea782b3e661b1c00daf0a86521 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:30:26 +0600 Subject: [PATCH 11/51] Created README.md and added relevant articles --- hazelcast/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 hazelcast/README.md diff --git a/hazelcast/README.md b/hazelcast/README.md new file mode 100644 index 0000000000..b90f66a8d0 --- /dev/null +++ b/hazelcast/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to Hazelcast with Java](http://www.baeldung.com/java-hazelcast) From 71ab5b5ad1804d3354fffe5a5a95946c5e0b80de Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:31:41 +0600 Subject: [PATCH 12/51] Created README.md and added relevant articles --- java-cassandra/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 java-cassandra/README.md diff --git a/java-cassandra/README.md b/java-cassandra/README.md new file mode 100644 index 0000000000..3ab6f5f099 --- /dev/null +++ b/java-cassandra/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [A Guide to Cassandra with Java](http://www.baeldung.com/cassandra-with-java) From ab5e8a5e61b11c3f566dfc34e2f17976df6bdff8 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:32:47 +0600 Subject: [PATCH 13/51] Added relevant articles --- spring-security-custom-permission/README.MD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-security-custom-permission/README.MD b/spring-security-custom-permission/README.MD index 0812a73090..d59aea97b4 100644 --- a/spring-security-custom-permission/README.MD +++ b/spring-security-custom-permission/README.MD @@ -3,4 +3,5 @@ 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) \ No newline at end of file +- [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) From f20dfd4b549ff56b0f06ea2cad00652e86568cef Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:34:53 +0600 Subject: [PATCH 14/51] Created README.md and added relevant articles --- mapstruct/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mapstruct/README.md diff --git a/mapstruct/README.md b/mapstruct/README.md new file mode 100644 index 0000000000..e279a48f7a --- /dev/null +++ b/mapstruct/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [Quick Guide to MapStruct](http://www.baeldung.com/mapstruct) From e1692d66438874cc2c73cc61912e0903232a1f5e Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:36:23 +0600 Subject: [PATCH 15/51] Created README.md and added relevant articles --- spring-jms/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-jms/README.md diff --git a/spring-jms/README.md b/spring-jms/README.md new file mode 100644 index 0000000000..9093937f44 --- /dev/null +++ b/spring-jms/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [An Introduction To Spring JMS](http://www.baeldung.com/spring-jms) From 27bb95f572f5cc1cd8677214a0c8b27c416e5ad2 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:37:14 +0600 Subject: [PATCH 16/51] Added relevant articles --- spring-boot/README.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 1610d77e81..19203d2b8d 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -5,3 +5,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Quick Guide to @RestClientTest in Spring Boot](http://www.baeldung.com/restclienttest-in-spring-boot) - [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters) - [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) +- [Introduction to WebJars](http://www.baeldung.com/maven-webjars) From 804f7ebfa86103e648067e7d6e499bb89c537d04 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:43:14 +0600 Subject: [PATCH 17/51] Created README.md and added relevant articles --- .../src/main/java/com/baeldung/java/nio/selector/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/java/nio/selector/README.md diff --git a/core-java/src/main/java/com/baeldung/java/nio/selector/README.md b/core-java/src/main/java/com/baeldung/java/nio/selector/README.md new file mode 100644 index 0000000000..b28aae1397 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/nio/selector/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [Introduction to the Java NIO Selector](http://www.baeldung.com/java-nio-selector) From 2ef40b15a7b675d90133e2c2dec8570bd946a1df Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:44:13 +0600 Subject: [PATCH 18/51] Added relevant articles --- spring-thymeleaf/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 98fb4b043b..6b12bb676c 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -5,7 +5,9 @@ ### Relevant Articles: - [Introduction to Using Thymeleaf in Spring](http://www.baeldung.com/thymeleaf-in-spring-mvc) - [CSRF Protection with Spring MVC and Thymeleaf](http://www.baeldung.com/csrf-thymeleaf-with-spring-security) - +- [Thymeleaf: Custom Layout Dialect](http://www.baeldung.com/thymeleaf-spring-layouts) +- [Spring and Thymeleaf 3: Expressions](http://www.baeldung.com/spring-thymeleaf-3-expressions) +- [Spring MVC + Thymeleaf 3.0: New Features](http://www.baeldung.com/spring-thymeleaf-3) ### Build the Project From f162243755116f83d55d92721140e12d1afda775 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 11 Nov 2016 16:45:34 +0600 Subject: [PATCH 19/51] Added relevant Articles --- log4j/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/log4j/README.md b/log4j/README.md index 7355372f23..40e1f33b30 100644 --- a/log4j/README.md +++ b/log4j/README.md @@ -1,2 +1,5 @@ ### Relevant Articles: - [Introduction to Java Logging](http://www.baeldung.com/java-logging-intro) +- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback) +- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) +- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) From 43f3dc3ac9d3ef6c46277a96b7da3d5e0a00a060 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sat, 12 Nov 2016 01:08:48 +0600 Subject: [PATCH 20/51] Added relevant articles --- log4j/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/log4j/README.md b/log4j/README.md index 40e1f33b30..de07d0c5b7 100644 --- a/log4j/README.md +++ b/log4j/README.md @@ -3,3 +3,4 @@ - [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback) - [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) +- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback) From 0e8f896695365f6a1e2d8c3727e11efc60e81169 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sat, 12 Nov 2016 01:10:01 +0600 Subject: [PATCH 21/51] Added relevant articles --- core-java/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java/README.md b/core-java/README.md index aca8deb9c9..36dabbef41 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -39,3 +39,5 @@ - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [How to Convert String to different data types in Java](http://www.baeldung.com/java-string-conversions) - [Introduction to Java Generics](http://www.baeldung.com/java-generics) +- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) +- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) From 0d36fa8c582554c9746307339cc194aa1db718e8 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sat, 12 Nov 2016 01:13:46 +0600 Subject: [PATCH 22/51] Created README.md and added relevant articles --- play-framework/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 play-framework/README.md diff --git a/play-framework/README.md b/play-framework/README.md new file mode 100644 index 0000000000..0fd13fba27 --- /dev/null +++ b/play-framework/README.md @@ -0,0 +1,4 @@ +###Relevant Articles: +- [REST API with Play Framework in Java](http://www.baeldung.com/rest-api-with-play) +- [Routing In Play Applications in Java](http://www.baeldung.com/routing-in-play) +- [Introduction To Play In Java](http://www.baeldung.com/java-intro-to-the-play-framework) From b9071570148e93f65880d17df78f071d2aff5053 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sat, 12 Nov 2016 01:14:37 +0600 Subject: [PATCH 23/51] Added relevant articles --- wicket/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wicket/README.md b/wicket/README.md index 614446e7ba..e873ee1ba1 100644 --- a/wicket/README.md +++ b/wicket/README.md @@ -2,3 +2,7 @@ From the same directory where pom.xml is, execute the following command to run the project: mvn jetty:run + + +###Relevant Articles: +- [Introduction to the Wicket Framework](http://www.baeldung.com/intro-to-the-wicket-framework) From 27c38bcba4f58cf5c5f1966aa718e7a4e1104581 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sat, 12 Nov 2016 01:15:41 +0600 Subject: [PATCH 24/51] Created README.md and added relevant articles --- spring-mvc-tiles/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-mvc-tiles/README.md diff --git a/spring-mvc-tiles/README.md b/spring-mvc-tiles/README.md new file mode 100644 index 0000000000..58991005f5 --- /dev/null +++ b/spring-mvc-tiles/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [Apache Tiles Integration with Spring MVC](http://www.baeldung.com/spring-mvc-apache-tiles) From 29f673a2782024a92beab2536d145e58f7e13ad9 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sat, 12 Nov 2016 01:18:29 +0600 Subject: [PATCH 25/51] Created README.md and added relevant articles --- patterns/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 patterns/README.md diff --git a/patterns/README.md b/patterns/README.md new file mode 100644 index 0000000000..e5d8334a3e --- /dev/null +++ b/patterns/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern) From ff3574933872d8577463dc604035c89ddf6d5160 Mon Sep 17 00:00:00 2001 From: felipe-gdr Date: Fri, 16 Dec 2016 05:26:52 -0200 Subject: [PATCH 26/51] BAEL-127: @PreFilter and @PostFilter annotations (#898) * BAEL-127: simple app with filters * removed data rest dependency, final adjustments * added first live test for the rest api * move filters code to new module * moved to root of module, create service layer, standard pom --- spring-security-core/.gitignore | 13 ++ spring-security-core/README.md | 7 + spring-security-core/pom.xml | 168 ++++++++++++++++++ .../src/main/java/org/baeldung/app/App.java | 17 ++ .../org/baeldung/config/DatabaseLoader.java | 23 +++ .../baeldung/config/WebSecurityConfig.java | 39 ++++ .../baeldung/controller/TaskController.java | 32 ++++ .../main/java/org/baeldung/entity/Task.java | 46 +++++ .../baeldung/repository/TaskRepository.java | 8 + .../org/baeldung/service/TaskService.java | 26 +++ .../test/java/org/baeldung/test/LiveTest.java | 75 ++++++++ .../src/test/resources/.gitignore | 13 ++ 12 files changed, 467 insertions(+) create mode 100644 spring-security-core/.gitignore create mode 100644 spring-security-core/README.md create mode 100644 spring-security-core/pom.xml create mode 100644 spring-security-core/src/main/java/org/baeldung/app/App.java create mode 100644 spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java create mode 100644 spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java create mode 100644 spring-security-core/src/main/java/org/baeldung/controller/TaskController.java create mode 100644 spring-security-core/src/main/java/org/baeldung/entity/Task.java create mode 100644 spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java create mode 100644 spring-security-core/src/main/java/org/baeldung/service/TaskService.java create mode 100644 spring-security-core/src/test/java/org/baeldung/test/LiveTest.java create mode 100644 spring-security-core/src/test/resources/.gitignore diff --git a/spring-security-core/.gitignore b/spring-security-core/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-security-core/.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-security-core/README.md b/spring-security-core/README.md new file mode 100644 index 0000000000..c7e0f645c7 --- /dev/null +++ b/spring-security-core/README.md @@ -0,0 +1,7 @@ +## @PreFilter and @PostFilter annotations + +### Build the Project ### + +``` +mvn clean install +``` diff --git a/spring-security-core/pom.xml b/spring-security-core/pom.xml new file mode 100644 index 0000000000..519ee73296 --- /dev/null +++ b/spring-security-core/pom.xml @@ -0,0 +1,168 @@ + + 4.0.0 + com.baeldung + spring-security-core + 0.1-SNAPSHOT + + spring-security-core + war + + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + + + + + + spring-security-core + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + true + source + + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*LiveTest.java + **/*ManualTest.java + + + + + + + + + + + + + + live + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + + + + + + + + + 4.3.4.RELEASE + 4.2.0.RELEASE + + + 4.4.5 + 4.5.2 + + + 1.7.21 + 1.1.7 + + + 5.3.3.Final + 1.2 + 3.1.0 + 2.8.5 + + + 19.0 + 3.5 + + + 1.3 + 4.12 + 1.10.19 + + 2.9.0 + + + 3.6.0 + 2.6 + 2.19.1 + 1.6.1 + + + diff --git a/spring-security-core/src/main/java/org/baeldung/app/App.java b/spring-security-core/src/main/java/org/baeldung/app/App.java new file mode 100644 index 0000000000..06c295fcd7 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/app/App.java @@ -0,0 +1,17 @@ +package org.baeldung.app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableJpaRepositories("org.baeldung.repository") +@ComponentScan("org.baeldung") +@EntityScan("org.baeldung.entity") +public class App { + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } +} diff --git a/spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java b/spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java new file mode 100644 index 0000000000..e311f62fff --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java @@ -0,0 +1,23 @@ +package org.baeldung.config; + +import org.baeldung.entity.Task; +import org.baeldung.repository.TaskRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class DatabaseLoader implements CommandLineRunner { + + @Autowired + private TaskRepository taskRepository; + + @Override + public void run(String... strings) throws Exception { + this.taskRepository.save(new Task("Send a fax", "pam")); + this.taskRepository.save(new Task("Print a document", "pam")); + this.taskRepository.save(new Task("Answer the phone", "pam")); + this.taskRepository.save(new Task("Call a client", "jim")); + this.taskRepository.save(new Task("Organize a meeting", "michael")); + } +} \ No newline at end of file diff --git a/spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java b/spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java new file mode 100644 index 0000000000..02e60d29a2 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java @@ -0,0 +1,39 @@ +package org.baeldung.config; + +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.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 WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/css/**", "/js/**", "/loggedout").permitAll() + .anyRequest().authenticated() + .and() + .httpBasic() + .and() + .logout().disable() + .csrf().disable(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("jim").password("jim").roles("USER") + .and() + .withUser("pam").password("pam").roles("USER") + .and() + .withUser("michael").password("michael").roles("MANAGER"); + } +} diff --git a/spring-security-core/src/main/java/org/baeldung/controller/TaskController.java b/spring-security-core/src/main/java/org/baeldung/controller/TaskController.java new file mode 100644 index 0000000000..d99109c543 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/controller/TaskController.java @@ -0,0 +1,32 @@ +package org.baeldung.controller; + +import org.baeldung.entity.Task; +import org.baeldung.service.TaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping("api/tasks") +public class TaskController { + + @Autowired + private TaskService taskService; + + @RequestMapping(method = RequestMethod.GET) + public ResponseEntity> findAllTasks() { + Iterable tasks = taskService.findAll(); + + return ResponseEntity.ok().body(tasks); + } + + @RequestMapping(method = RequestMethod.POST, consumes = "application/json") + public ResponseEntity> addTasks(@RequestBody Iterable newTasks) { + Iterable tasks = taskService.save(newTasks); + + return ResponseEntity.ok().body(tasks); + } +} diff --git a/spring-security-core/src/main/java/org/baeldung/entity/Task.java b/spring-security-core/src/main/java/org/baeldung/entity/Task.java new file mode 100644 index 0000000000..5d3321ef2e --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/entity/Task.java @@ -0,0 +1,46 @@ +package org.baeldung.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Task { + private @Id @GeneratedValue Long id; + private String description; + + private String assignee; + + public Task() { + } + + public Task(String description, String assignee) { + this.description = description; + this.assignee = assignee; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getAssignee() { + return assignee; + } + + public void setAssignee(String assignee) { + this.assignee = assignee; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java b/spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java new file mode 100644 index 0000000000..651b11684f --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java @@ -0,0 +1,8 @@ +package org.baeldung.repository; + +import org.baeldung.entity.Task; +import org.springframework.data.repository.CrudRepository; + +public interface TaskRepository extends CrudRepository { + +} diff --git a/spring-security-core/src/main/java/org/baeldung/service/TaskService.java b/spring-security-core/src/main/java/org/baeldung/service/TaskService.java new file mode 100644 index 0000000000..4a0dae3aac --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/service/TaskService.java @@ -0,0 +1,26 @@ +package org.baeldung.service; + +import org.baeldung.entity.Task; +import org.baeldung.repository.TaskRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreFilter; +import org.springframework.stereotype.Service; + +@Service +public class TaskService { + + @Autowired + private TaskRepository taskRepository; + + @PostFilter("hasRole('MANAGER') or filterObject.assignee == authentication.name") + public Iterable findAll() { + return taskRepository.findAll(); + } + + @PreFilter("hasRole('MANAGER') or filterObject.assignee == authentication.name") + public Iterable save(Iterable entities) { + return taskRepository.save(entities); + } + +} diff --git a/spring-security-core/src/test/java/org/baeldung/test/LiveTest.java b/spring-security-core/src/test/java/org/baeldung/test/LiveTest.java new file mode 100644 index 0000000000..596476d058 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/test/LiveTest.java @@ -0,0 +1,75 @@ +package org.baeldung.test; + +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.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.baeldung.app.App; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class LiveTest { + + @Autowired + private WebApplicationContext context; + private MockMvc mockMvc; + + @Before + public void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).dispatchOptions(true).build(); + } + + @Test + @WithMockUser(roles = "MANAGER") + public void givenUserIsManager_whenGetTasks_thenAllTasks() throws Exception { + String allTasks = "[{'id':1,'description':'Send a fax','assignee':'pam'}," + + "{'id':2,'description':'Print a document','assignee':'pam'}," + + "{'id':3,'description':'Answer the phone','assignee':'pam'}," + + "{'id':4,'description':'Call a client','assignee':'jim'}," + + "{'id':5,'description':'Organize a meeting','assignee':'michael'}]"; + + mockMvc.perform(get("/api/tasks")).andExpect(status().isOk()).andExpect(content().json(allTasks)); + } + + @Test + @WithMockUser(username = "jim") + public void givenUserNotManager_whenGetTasks_thenReturnAssignedToMe() throws Exception { + String myTasks = "[{'id':4,'description':'Call a client','assignee':'jim'}]"; + + mockMvc.perform(get("/api/tasks")).andExpect(status().isOk()).andExpect(content().json(myTasks)); + } + + @Test + @WithMockUser(roles = "MANAGER") + public void givenUserIsManager_whenPostTasks_thenIncludeAllTasks() throws Exception { + String newTasks = "[{\"description\":\"New to Michael\",\"assignee\":\"michael\"}," + + "{\"description\":\"New to Pam\",\"assignee\":\"pam\"}]"; + + mockMvc.perform(post("/api/tasks").contentType(MediaType.APPLICATION_JSON).content(newTasks)).andExpect(status().isOk()).andExpect(content().json("[{'id': 6,'description':'New to Michael','assignee':'michael'}, {'id': 7,'description':'New to Pam','assignee':'pam'}]")); + } + + @Test + @WithMockUser(username = "jim") + public void givenUserNotManager_whenPostTasks_thenIncludeOnlyAssignedToMe() throws Exception { + String newTasks = "[{\"description\":\"New to Jim\",\"assignee\":\"jim\"}," + + "{\"description\":\"New to Pam\",\"assignee\":\"pam\"}]"; + + mockMvc.perform(post("/api/tasks").contentType(MediaType.APPLICATION_JSON).content(newTasks)).andExpect(status().isOk()).andExpect(content().json("[{'id': 8,'description':'New to Jim','assignee':'jim'}]")); + } + +} diff --git a/spring-security-core/src/test/resources/.gitignore b/spring-security-core/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-security-core/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 From e93714999e4343fefe9c599df6fc92f4c1ab615d Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Fri, 16 Dec 2016 09:58:13 +0100 Subject: [PATCH 27/51] Rename to spring-mvc-simple --- {spring-mvc-handlers => spring-mvc-simple}/pom.xml | 8 ++++---- .../controller/AnnotationMethodHandlerAdapterExample.java | 0 .../controller/RequestMappingHandlerAdapterExample.java | 0 .../controller/SimpleControllerHandlerAdapterExample.java | 0 .../spring-servlet_AnnotationMethodHandlerAdapter.xml | 0 .../spring-servlet_RequestMappingHandlerAdapter.xml | 0 .../spring-servlet_SimpleControllerHandlerAdapter.xml | 0 .../src/main/webapp/WEB-INF/Greeting.jsp | 0 .../src/main/webapp/WEB-INF/web.xml | 0 9 files changed, 4 insertions(+), 4 deletions(-) rename {spring-mvc-handlers => spring-mvc-simple}/pom.xml (92%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/webapp/WEB-INF/Greeting.jsp (100%) rename {spring-mvc-handlers => spring-mvc-simple}/src/main/webapp/WEB-INF/web.xml (100%) diff --git a/spring-mvc-handlers/pom.xml b/spring-mvc-simple/pom.xml similarity index 92% rename from spring-mvc-handlers/pom.xml rename to spring-mvc-simple/pom.xml index 0074898767..4ab5bd9d1e 100644 --- a/spring-mvc-handlers/pom.xml +++ b/spring-mvc-simple/pom.xml @@ -2,10 +2,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.baeldung - SpringMVCHandlers + spring-mvc-simple war 0.0.1-SNAPSHOT - SpringMVCHandlers Maven Webapp + Spring MVC simple Maven Webapp http://maven.apache.org @@ -59,12 +59,12 @@ ${maven-war-plugin.version} src/main/webapp - springMVCHandlers + springMvcSimple false - springMVCHandlers + springMvcSimple diff --git a/spring-mvc-handlers/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java similarity index 100% rename from spring-mvc-handlers/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java rename to spring-mvc-simple/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java diff --git a/spring-mvc-handlers/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java similarity index 100% rename from spring-mvc-handlers/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java rename to spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java diff --git a/spring-mvc-handlers/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java similarity index 100% rename from spring-mvc-handlers/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java rename to spring-mvc-simple/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java diff --git a/spring-mvc-handlers/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml b/spring-mvc-simple/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml similarity index 100% rename from spring-mvc-handlers/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml rename to spring-mvc-simple/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml diff --git a/spring-mvc-handlers/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml b/spring-mvc-simple/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml similarity index 100% rename from spring-mvc-handlers/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml rename to spring-mvc-simple/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml diff --git a/spring-mvc-handlers/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml b/spring-mvc-simple/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml similarity index 100% rename from spring-mvc-handlers/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml rename to spring-mvc-simple/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml diff --git a/spring-mvc-handlers/src/main/webapp/WEB-INF/Greeting.jsp b/spring-mvc-simple/src/main/webapp/WEB-INF/Greeting.jsp similarity index 100% rename from spring-mvc-handlers/src/main/webapp/WEB-INF/Greeting.jsp rename to spring-mvc-simple/src/main/webapp/WEB-INF/Greeting.jsp diff --git a/spring-mvc-handlers/src/main/webapp/WEB-INF/web.xml b/spring-mvc-simple/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from spring-mvc-handlers/src/main/webapp/WEB-INF/web.xml rename to spring-mvc-simple/src/main/webapp/WEB-INF/web.xml From 0087a4ab3b694d8f43686d926dd8bf9147c9bd2c Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Fri, 16 Dec 2016 09:58:23 +0100 Subject: [PATCH 28/51] Add spring-mvc-simple as a module --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 1dde581d13..211c3b2c4d 100644 --- a/pom.xml +++ b/pom.xml @@ -117,6 +117,7 @@ spring-mvc-velocity spring-mvc-web-vs-initializer spring-mvc-xml + spring-mvc-simple spring-openid spring-protobuf spring-quartz From 8844871e2bd38f035f05a1808c404f368ab02661 Mon Sep 17 00:00:00 2001 From: maibin Date: Fri, 16 Dec 2016 10:14:48 +0100 Subject: [PATCH 29/51] @Async and SecurityContext (#872) * @Async and Spring Security * @Async with SecurityContext propagated * Spring and @Async * Simulated Annealing algorithm * Rebase * Rebase --- .../algorithms/SimulatedAnnealingTest.java | 13 +++++ .../baeldung/spring/SecurityJavaConfig.java | 33 ++++++++---- .../web/controller/AsyncController.java | 13 +++++ .../baeldung/web/service/AsyncService.java | 11 ++++ .../web/service/AsyncServiceImpl.java | 36 +++++++++++++ .../src/main/resources/webSecurityConfig.xml | 51 +++++++++++-------- 6 files changed, 126 insertions(+), 31 deletions(-) create mode 100644 core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java create mode 100644 spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java create mode 100644 spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java diff --git a/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java b/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java new file mode 100644 index 0000000000..06b599dede --- /dev/null +++ b/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java @@ -0,0 +1,13 @@ +package com.baeldung.algorithms; + +import org.junit.Assert; +import org.junit.Test; + +public class SimulatedAnnealingTest { + + @Test + public void testSimulateAnnealing() { + Assert.assertTrue(SimulatedAnnealing.simulateAnnealing(10, 1000, 0.9) > 0); + } + +} diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java b/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java index 3302482f48..448968a6c8 100644 --- a/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java +++ b/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java @@ -1,8 +1,7 @@ package org.baeldung.spring; import org.baeldung.security.MySavedRequestAwareAuthenticationSuccessHandler; -import org.baeldung.security.RestAuthenticationEntryPoint; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.MethodInvokingFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -10,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.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; @Configuration @@ -17,11 +17,11 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa @ComponentScan("org.baeldung.security") public class SecurityJavaConfig extends WebSecurityConfigurerAdapter { - @Autowired - private RestAuthenticationEntryPoint restAuthenticationEntryPoint; +// @Autowired +// private RestAuthenticationEntryPoint restAuthenticationEntryPoint; - @Autowired - private MySavedRequestAwareAuthenticationSuccessHandler authenticationSuccessHandler; +// @Autowired +// private MySavedRequestAwareAuthenticationSuccessHandler authenticationSuccessHandler; public SecurityJavaConfig() { super(); @@ -38,17 +38,21 @@ public class SecurityJavaConfig extends WebSecurityConfigurerAdapter { protected void configure(final HttpSecurity http) throws Exception {// @formatter:off http .csrf().disable() + .authorizeRequests() + .and() .exceptionHandling() - .authenticationEntryPoint(restAuthenticationEntryPoint) +// .authenticationEntryPoint(restAuthenticationEntryPoint) .and() .authorizeRequests() .antMatchers("/api/csrfAttacker*").permitAll() .antMatchers("/api/customer/**").permitAll() .antMatchers("/api/foos/**").authenticated() + .antMatchers("/api/async/**").authenticated() .and() - .formLogin() - .successHandler(authenticationSuccessHandler) - .failureHandler(new SimpleUrlAuthenticationFailureHandler()) + .httpBasic() +// .and() +// .successHandler(authenticationSuccessHandler) +// .failureHandler(new SimpleUrlAuthenticationFailureHandler()) .and() .logout(); } // @formatter:on @@ -62,5 +66,14 @@ public class SecurityJavaConfig extends WebSecurityConfigurerAdapter { public SimpleUrlAuthenticationFailureHandler myFailureHandler() { return new SimpleUrlAuthenticationFailureHandler(); } + + @Bean + public MethodInvokingFactoryBean methodInvokingFactoryBean() { + MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean(); + methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class); + methodInvokingFactoryBean.setTargetMethod("setStrategyName"); + methodInvokingFactoryBean.setArguments(new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL}); + return methodInvokingFactoryBean; + } } \ No newline at end of file diff --git a/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java b/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java index bc59b4226a..9e78a62eed 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java +++ b/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java @@ -2,13 +2,20 @@ package org.baeldung.web.controller; import java.util.concurrent.Callable; +import org.baeldung.web.service.AsyncService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; 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; import org.springframework.web.multipart.MultipartFile; @Controller public class AsyncController { + + @Autowired + private AsyncService asyncService; @RequestMapping(method = RequestMethod.POST, value = "/upload") public Callable processUpload(final MultipartFile file) { @@ -20,5 +27,11 @@ public class AsyncController { } }; } + + @RequestMapping(method = RequestMethod.GET, value = "/async") + @ResponseBody + public Boolean checkIfContextPropagated() throws Exception{ + return asyncService.checkIfPrincipalPropagated().call() && asyncService.checkIfContextPropagated(SecurityContextHolder.getContext()); + } } diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java new file mode 100644 index 0000000000..b7cf2b9f0c --- /dev/null +++ b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java @@ -0,0 +1,11 @@ +package org.baeldung.web.service; + +import java.util.concurrent.Callable; + +public interface AsyncService { + + Callable checkIfPrincipalPropagated(); + + Boolean checkIfContextPropagated(Object context); + +} diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java new file mode 100644 index 0000000000..51f8c5157b --- /dev/null +++ b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java @@ -0,0 +1,36 @@ +package org.baeldung.web.service; + +import java.util.concurrent.Callable; + +import org.apache.log4j.Logger; +import org.springframework.scheduling.annotation.Async; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +@Service +public class AsyncServiceImpl implements AsyncService { + + private static final Logger log = Logger.getLogger(AsyncService.class); + + @Override + public Callable checkIfPrincipalPropagated() { + Object before = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + log.info("Before new thread: " + before); + return new Callable() { + public Boolean call() throws Exception { + Object after = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + log.info("New thread: " + after); + return before == after; + } + }; + } + + @Async + @Override + public Boolean checkIfContextPropagated(Object context) { + log.info("Before @Async: " + context); + log.info("Inside @Async: " + SecurityContextHolder.getContext()); + return context == SecurityContextHolder.getContext(); + } + +} diff --git a/spring-security-rest/src/main/resources/webSecurityConfig.xml b/spring-security-rest/src/main/resources/webSecurityConfig.xml index cf8357633c..4172fe036f 100644 --- a/spring-security-rest/src/main/resources/webSecurityConfig.xml +++ b/spring-security-rest/src/main/resources/webSecurityConfig.xml @@ -1,33 +1,42 @@ - + http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> - - + + - + - + - - + + - - + + - - - - - - - - + + + + + + + + + + \ No newline at end of file From 2fe2e2a971a1e545f3e881f64a4b33e9e831464b Mon Sep 17 00:00:00 2001 From: Sunil Mogadati Date: Fri, 16 Dec 2016 11:29:32 -0700 Subject: [PATCH 30/51] BAEL-40: Add NDC and JBoss Logging to the demo application (#880) * Add NDC and JBoss Logging to the demo application * NDC for Log4j, Log4j2 and JBoss Logging * Simplify NDC example by making it a single operation instead of two * Make NDC example as RestController, Use JBoss Logging only as a logging bridge * Fix merge conflicts in pull request - log-mdc pom.xml updated --- log-mdc/pom.xml | 90 +++++++++++++++---- .../com/baeldung/config/AppConfiguration.java | 19 ++++ .../com/baeldung/config/AppInitializer.java | 29 ++++++ .../java/com/baeldung/ndc/Investment.java | 41 +++++++++ .../controller/JBossLoggingController.java | 42 +++++++++ .../ndc/controller/Log4J2Controller.java | 41 +++++++++ .../ndc/controller/Log4JController.java | 41 +++++++++ .../ndc/service/InvestmentService.java | 31 +++++++ .../JBossLoggingInvestmentService.java | 21 +++++ .../ndc/service/Log4J2InvestmentService.java | 22 +++++ .../ndc/service/Log4JInvestmentService.java | 21 +++++ log-mdc/src/main/resources/log4j.properties | 6 +- log-mdc/src/main/resources/log4j2.xml | 9 +- .../java/com/baeldung/ndc/NDCLogTest.java | 61 +++++++++++++ 14 files changed, 457 insertions(+), 17 deletions(-) create mode 100644 log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java create mode 100644 log-mdc/src/main/java/com/baeldung/config/AppInitializer.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/Investment.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java create mode 100644 log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java create mode 100644 log-mdc/src/test/java/com/baeldung/ndc/NDCLogTest.java diff --git a/log-mdc/pom.xml b/log-mdc/pom.xml index 4cabce502e..28c8bb820e 100644 --- a/log-mdc/pom.xml +++ b/log-mdc/pom.xml @@ -5,20 +5,37 @@ logmdc 0.0.1-SNAPSHOT logmdc - tutorial on logging with MDC + war + tutorial on logging with MDC and NDC - - org.springframework - spring-context - ${springframework.version} - - - org.springframework - spring-webmvc - ${springframework.version} - + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-web + ${springframework.version} + + + org.springframework + spring-webmvc + ${springframework.version} + + + javax.servlet + javax.servlet-api + ${javax.servlet.version} + provided + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.library} + @@ -31,12 +48,12 @@ org.apache.logging.log4j log4j-api - 2.7 + ${log4j2.version} org.apache.logging.log4j log4j-core - ${log4j-api.version} + ${log4j2.version} @@ -52,6 +69,13 @@ logback-classic ${logback.version} + + + + org.jboss.logging + jboss-logging + ${jbosslogging.version} + junit @@ -59,15 +83,51 @@ ${junit.version} test + + org.springframework + spring-test + ${springframework.version} + test + 4.3.4.RELEASE 1.2.17 - 2.7 + 2.7 3.3.6 1.1.7 + 3.3.0.Final + 3.1.0 + 2.8.5 4.12 - \ No newline at end of file + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + src/main/webapp + logging-service + false + + + + + logging-service + + diff --git a/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java b/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java new file mode 100644 index 0000000000..5e52c5f25e --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java @@ -0,0 +1,19 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = "com.baeldung") +public class AppConfiguration extends WebMvcConfigurerAdapter { + + @Override + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + +} diff --git a/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java b/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java new file mode 100644 index 0000000000..828c2b2efa --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java @@ -0,0 +1,29 @@ +package com.baeldung.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + super.onStartup(servletContext); + } + + @Override + protected Class[] getRootConfigClasses() { + return new Class[] { AppConfiguration.class }; + } + + @Override + protected Class[] getServletConfigClasses() { + return null; + } + + @Override + protected String[] getServletMappings() { + return new String[] { "/" }; + } +} diff --git a/log-mdc/src/main/java/com/baeldung/ndc/Investment.java b/log-mdc/src/main/java/com/baeldung/ndc/Investment.java new file mode 100644 index 0000000000..4275c6ef21 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/Investment.java @@ -0,0 +1,41 @@ +package com.baeldung.ndc; + +public class Investment { + private String transactionId; + private String owner; + private Long amount; + + public Investment() { + } + + public Investment(String transactionId, String owner, Long amount) { + this.transactionId = transactionId; + this.owner = owner; + this.amount = amount; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + +} 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 new file mode 100644 index 0000000000..b024f3ec81 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java @@ -0,0 +1,42 @@ +package com.baeldung.ndc.controller; + +import org.jboss.logging.NDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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.RestController; + +import com.baeldung.ndc.Investment; +import com.baeldung.ndc.service.InvestmentService; + + +@RestController +public class JBossLoggingController { + @Autowired + @Qualifier("JBossLoggingInvestmentService") + private InvestmentService jbossLoggingBusinessService; + + @RequestMapping(value = "/ndc/jboss-logging", method = RequestMethod.POST) + public ResponseEntity postPayment(@RequestBody Investment investment) { + // Add transactionId and owner to NDC + NDC.push("tx.id=" + investment.getTransactionId()); + NDC.push("tx.owner=" + investment.getOwner()); + + try { + jbossLoggingBusinessService.transfer(investment.getAmount()); + } finally { + // take out owner from the NDC stack + NDC.pop(); + + // take out transactionId from the NDC stack + NDC.pop(); + + NDC.clear(); + } + return new ResponseEntity(investment, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java b/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java new file mode 100644 index 0000000000..9cc57d9fa7 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java @@ -0,0 +1,41 @@ +package com.baeldung.ndc.controller; + +import org.apache.logging.log4j.ThreadContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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.RestController; + +import com.baeldung.ndc.Investment; +import com.baeldung.ndc.service.InvestmentService; + +@RestController +public class Log4J2Controller { + @Autowired + @Qualifier("log4j2InvestmentService") + private InvestmentService log4j2BusinessService; + + @RequestMapping(value = "/ndc/log4j2", method = RequestMethod.POST) + public ResponseEntity postPayment(@RequestBody Investment investment) { + // Add transactionId and owner to NDC + ThreadContext.push("tx.id=" + investment.getTransactionId()); + ThreadContext.push("tx.owner=" + investment.getOwner()); + + try { + log4j2BusinessService.transfer(investment.getAmount()); + } finally { + // take out owner from the NDC stack + ThreadContext.pop(); + + // take out transactionId from the NDC stack + ThreadContext.pop(); + + ThreadContext.clearAll(); + } + return new ResponseEntity(investment, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java b/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java new file mode 100644 index 0000000000..daf7994a88 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java @@ -0,0 +1,41 @@ +package com.baeldung.ndc.controller; + +import org.apache.log4j.NDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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.RestController; + +import com.baeldung.ndc.Investment; +import com.baeldung.ndc.service.InvestmentService; + +@RestController +public class Log4JController { + @Autowired + @Qualifier("log4jInvestmentService") + private InvestmentService log4jBusinessService; + + @RequestMapping(value = "/ndc/log4j", method = RequestMethod.POST) + public ResponseEntity postPayment(@RequestBody Investment investment) { + // Add transactionId and owner to NDC + NDC.push("tx.id=" + investment.getTransactionId()); + NDC.push("tx.owner=" + investment.getOwner()); + + try { + log4jBusinessService.transfer(investment.getAmount()); + } finally { + // take out owner from the NDC stack + NDC.pop(); + + // take out transactionId from the NDC stack + NDC.pop(); + + NDC.remove(); + } + return new ResponseEntity(investment, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java b/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java new file mode 100644 index 0000000000..13d8e6a71b --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java @@ -0,0 +1,31 @@ +package com.baeldung.ndc.service; + +/** + * A fake investment service. + */ +public interface InvestmentService { + + /** + * Sample service transferring a given amount of money. + * @param amount + * @return {@code true} when the transfer complete successfully, {@code false} otherwise. + */ + default public boolean transfer(long amount) { + beforeTransfer(amount); + // exchange messages with a remote system to transfer the money + try { + // let's pause randomly to properly simulate an actual system. + Thread.sleep((long) (500 + Math.random() * 500)); + } catch (InterruptedException e) { + // should never happen + } + // let's simulate both failing and successful transfers + boolean outcome = Math.random() >= 0.25; + afterTransfer(amount, outcome); + return outcome; + } + + void beforeTransfer(long amount); + + void afterTransfer(long amount, boolean outcome); +} diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java b/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java new file mode 100644 index 0000000000..e1e5e0a083 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java @@ -0,0 +1,21 @@ +package com.baeldung.ndc.service; + +import org.jboss.logging.Logger; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +@Service +@Qualifier("JBossLoggingInvestmentService") +public class JBossLoggingInvestmentService implements InvestmentService { + private static final Logger logger = Logger.getLogger(JBossLoggingInvestmentService.class); + + @Override + public void beforeTransfer(long amount) { + logger.infov("Preparing to transfer {0}$.", amount); + } + + @Override + public void afterTransfer(long amount, boolean outcome) { + logger.infov("Has transfer of {0}$ completed successfully ? {1}.", amount, outcome); + } +} \ No newline at end of file diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java b/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java new file mode 100644 index 0000000000..6e55796574 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java @@ -0,0 +1,22 @@ +package com.baeldung.ndc.service; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +@Service +@Qualifier("log4j2InvestmentService") +public class Log4J2InvestmentService implements InvestmentService { + private static final Logger logger = LogManager.getLogger(); + + @Override + public void beforeTransfer(long amount) { + logger.info("Preparing to transfer {}$.", amount); + } + + @Override + public void afterTransfer(long amount, boolean outcome) { + logger.info("Has transfer of {}$ completed successfully ? {}.", amount, outcome); + } +} \ No newline at end of file diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java b/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java new file mode 100644 index 0000000000..1f581554e5 --- /dev/null +++ b/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java @@ -0,0 +1,21 @@ +package com.baeldung.ndc.service; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +@Service +@Qualifier("log4jInvestmentService") +public class Log4JInvestmentService implements InvestmentService { + private Logger logger = Logger.getLogger(Log4JInvestmentService.class); + + @Override + public void beforeTransfer(long amount) { + logger.info("Preparing to transfer " + amount + "$."); + } + + @Override + public void afterTransfer(long amount, boolean outcome) { + logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); + } +} \ No newline at end of file diff --git a/log-mdc/src/main/resources/log4j.properties b/log-mdc/src/main/resources/log4j.properties index 39be027f3f..575ebcca8d 100644 --- a/log-mdc/src/main/resources/log4j.properties +++ b/log-mdc/src/main/resources/log4j.properties @@ -3,6 +3,10 @@ log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout #note the %X{userName} - this is how you fetch data from Mapped Diagnostic Context (MDC) #log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c{1} %x - %m%n +# %x is used to fetch data from NDC. So below setting uses both MDC and NDC log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c{1} %x - %m - tx.id=%X{transaction.id} tx.owner=%X{transaction.owner}%n -log4j.rootLogger = TRACE, consoleAppender \ No newline at end of file +# NDC only setting - %x is used to fetch data from NDC +#log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c{1} - %m - [%x]%n + +log4j.rootLogger = INFO, consoleAppender \ No newline at end of file diff --git a/log-mdc/src/main/resources/log4j2.xml b/log-mdc/src/main/resources/log4j2.xml index 800cfacafe..cbdf02fc51 100644 --- a/log-mdc/src/main/resources/log4j2.xml +++ b/log-mdc/src/main/resources/log4j2.xml @@ -2,8 +2,15 @@ + + pattern="%-4r [%t] %5p %c{1} - %m - %x - tx.id=%X{transaction.id} tx.owner=%X{transaction.owner}%n" /> + + + + diff --git a/log-mdc/src/test/java/com/baeldung/ndc/NDCLogTest.java b/log-mdc/src/test/java/com/baeldung/ndc/NDCLogTest.java new file mode 100644 index 0000000000..8cba176f7e --- /dev/null +++ b/log-mdc/src/test/java/com/baeldung/ndc/NDCLogTest.java @@ -0,0 +1,61 @@ +package com.baeldung.ndc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +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 com.baeldung.config.AppConfiguration; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = AppConfiguration.class) +@WebAppConfiguration +public class NDCLogTest { + + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext webApplicationContext; + + private Investment investment; + + @Before + public void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + + investment = new Investment(); + investment.setTransactionId("123"); + investment.setOwner("Mark"); + investment.setAmount(1000L); + } + + @Test + public void givenLog4jLogger_whenNDCAdded_thenResponseOkAndNDCInLog() throws Exception { + mockMvc.perform(post("/ndc/log4j", investment).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(investment))).andExpect(status().is2xxSuccessful()); + + } + + @Test + public void givenLog4j2Logger_whenNDCAdded_thenResponseOkAndNDCInLog() throws Exception { + mockMvc.perform(post("/ndc/log4j2", investment).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(investment))).andExpect(status().is2xxSuccessful()); + + } + + @Test + public void givenJBossLoggerBridge_whenNDCAdded_thenResponseOkAndNDCInLog() throws Exception { + mockMvc.perform(post("/ndc/jboss-logging", investment).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(investment))).andExpect(status().is2xxSuccessful()); + + } + +} From 7f45d8f9c97949264852c68f7ebaac86a3aae4e0 Mon Sep 17 00:00:00 2001 From: maibin Date: Fri, 16 Dec 2016 21:10:54 +0100 Subject: [PATCH 31/51] Simulated Annealing algorithm (#900) * @Async and Spring Security * @Async with SecurityContext propagated * Spring and @Async * Simulated Annealing algorithm * Simulated Annealing algorithm * Rebase * Rebase --- core-java/pom.xml | 6 ++ .../java/com/baeldung/algorithms/City.java | 22 +++++++ .../algorithms/SimulatedAnnealing.java | 41 +++++++++++++ .../java/com/baeldung/algorithms/Travel.java | 60 +++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/algorithms/City.java create mode 100644 core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java create mode 100644 core-java/src/main/java/com/baeldung/algorithms/Travel.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 0c14da2245..f5a800d508 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -85,6 +85,12 @@ log4j-over-slf4j ${org.slf4j.version} + + org.projectlombok + lombok + 1.16.12 + provided + diff --git a/core-java/src/main/java/com/baeldung/algorithms/City.java b/core-java/src/main/java/com/baeldung/algorithms/City.java new file mode 100644 index 0000000000..1a96dc759d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/algorithms/City.java @@ -0,0 +1,22 @@ +package com.baeldung.algorithms; + +import lombok.Data; + +@Data +public class City { + + private int x; + private int y; + + public City() { + this.x = (int) (Math.random() * 500); + this.y = (int) (Math.random() * 500); + } + + public double distanceToCity(City city) { + int x = Math.abs(getX() - city.getX()); + int y = Math.abs(getY() - city.getY()); + return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + } + +} diff --git a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java new file mode 100644 index 0000000000..b62e861399 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java @@ -0,0 +1,41 @@ +package com.baeldung.algorithms; + +public class SimulatedAnnealing { + + private static Travel travel = new Travel(10); + + public static double simulateAnnealing(double startingTemperature, int numberOfIterations, double coolingRate) { + System.out.println("Starting SA with temperature: " + startingTemperature + ", # of iterations: " + + numberOfIterations + " and colling rate: " + coolingRate); + double t = startingTemperature; + travel.generateInitialTravel(); + double bestDistance = travel.getDistance(); + System.out.println("Initial distance of travel: " + bestDistance); + Travel bestSolution = travel; + Travel currentSolution = bestSolution; + + for (int i = 0; i < numberOfIterations; i++) { + if (t > 0.1) { + currentSolution.swapCities(); + double currentDistance = currentSolution.getDistance(); + if (currentDistance == 0) + continue; + if (currentDistance < bestDistance) { + bestDistance = currentDistance; + } else if (Math.exp((currentDistance - bestDistance) / t) < Math.random()) { + currentSolution.revertSwap(); + } + t *= coolingRate; + } + if (i % 100 == 0) { + System.out.println("Iteration #" + i); + } + } + return bestDistance; + } + + public static void main(String[] args) { + System.out.println("Optimized distance for travel: " + simulateAnnealing(10, 10000, 0.9)); + } + +} diff --git a/core-java/src/main/java/com/baeldung/algorithms/Travel.java b/core-java/src/main/java/com/baeldung/algorithms/Travel.java new file mode 100644 index 0000000000..9921b2516e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/algorithms/Travel.java @@ -0,0 +1,60 @@ +package com.baeldung.algorithms; + +import java.util.ArrayList; +import java.util.Collections; + +import lombok.Data; + +@Data +public class Travel { + + private ArrayList travel = new ArrayList<>(); + private ArrayList previousTravel = new ArrayList<>(); + + public Travel(int numberOfCities) { + for (int i = 0; i < numberOfCities; i++) { + travel.add(new City()); + } + } + + public void generateInitialTravel() { + if (travel.isEmpty()) + new Travel(10); + Collections.shuffle(travel); + } + + public void swapCities() { + int a = generateRandomIndex(); + int b = generateRandomIndex(); + previousTravel = travel; + travel.set(a, travel.get(b)); + } + + public void revertSwap() { + travel = previousTravel; + } + + private int generateRandomIndex() { + return (int) (Math.random() * travel.size()); + } + + public City getCity(int index) { + return travel.get(index); + } + + public int getDistance() { + int distance = 0; + for (int index = 0; index < travel.size(); index++) { + City starting = getCity(index); + City destination; + if (index + 1 < travel.size()) { + destination = getCity(index + 1); + } else { + destination = getCity(0); + } + distance += starting.distanceToCity(destination); + } + return distance; + } + +} From a2c022f4dd415a03841f5964f37214ddd8f40fb7 Mon Sep 17 00:00:00 2001 From: DOHA Date: Fri, 16 Dec 2016 23:01:10 +0200 Subject: [PATCH 32/51] create intelliJ formatter --- intelliJ/intelliJ-formatter.xml | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 intelliJ/intelliJ-formatter.xml diff --git a/intelliJ/intelliJ-formatter.xml b/intelliJ/intelliJ-formatter.xml new file mode 100644 index 0000000000..c9aa35122b --- /dev/null +++ b/intelliJ/intelliJ-formatter.xml @@ -0,0 +1,40 @@ + + \ No newline at end of file From 5faf49eae2535df4c8560f98d64b3d487cc615a0 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 17 Dec 2016 01:42:47 +0200 Subject: [PATCH 33/51] fix intelliJ formatter --- intelliJ/intelliJ-formatter.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/intelliJ/intelliJ-formatter.xml b/intelliJ/intelliJ-formatter.xml index c9aa35122b..8c072cd161 100644 --- a/intelliJ/intelliJ-formatter.xml +++ b/intelliJ/intelliJ-formatter.xml @@ -4,6 +4,7 @@ + - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - - - + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + - - - + + + + + integration @@ -336,35 +342,35 @@ - - - 2.8.5 + + + 2.8.5 - - 1.7.21 - 1.1.7 + + 1.7.21 + 1.1.7 - - 19.0 - 3.5 - 1.55 - 1.10 - 3.6.1 - 2.5 - 4.1 - 4.01 + + 19.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 2.5 + 4.1 + 4.01 - - 1.3 - 4.12 - 1.10.19 - 6.10 - 3.6.1 + + 1.3 + 4.12 + 1.10.19 + 6.10 + 3.6.1 - - 3.6.0 - 2.19.1 + + 3.6.0 + 2.19.1 - + \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/algorithms/City.java b/core-java/src/main/java/com/baeldung/algorithms/City.java index 1a96dc759d..32335cda80 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/City.java +++ b/core-java/src/main/java/com/baeldung/algorithms/City.java @@ -5,18 +5,18 @@ import lombok.Data; @Data public class City { - private int x; - private int y; + private int x; + private int y; - public City() { - this.x = (int) (Math.random() * 500); - this.y = (int) (Math.random() * 500); - } + public City() { + this.x = (int) (Math.random() * 500); + this.y = (int) (Math.random() * 500); + } - public double distanceToCity(City city) { - int x = Math.abs(getX() - city.getX()); - int y = Math.abs(getY() - city.getY()); - return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); - } + public double distanceToCity(City city) { + int x = Math.abs(getX() - city.getX()); + int y = Math.abs(getY() - city.getY()); + return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java index b62e861399..3ccba9b3e9 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java +++ b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java @@ -2,40 +2,39 @@ package com.baeldung.algorithms; public class SimulatedAnnealing { - private static Travel travel = new Travel(10); - - public static double simulateAnnealing(double startingTemperature, int numberOfIterations, double coolingRate) { - System.out.println("Starting SA with temperature: " + startingTemperature + ", # of iterations: " - + numberOfIterations + " and colling rate: " + coolingRate); - double t = startingTemperature; - travel.generateInitialTravel(); - double bestDistance = travel.getDistance(); - System.out.println("Initial distance of travel: " + bestDistance); - Travel bestSolution = travel; - Travel currentSolution = bestSolution; + private static Travel travel = new Travel(10); - for (int i = 0; i < numberOfIterations; i++) { - if (t > 0.1) { - currentSolution.swapCities(); - double currentDistance = currentSolution.getDistance(); - if (currentDistance == 0) - continue; - if (currentDistance < bestDistance) { - bestDistance = currentDistance; - } else if (Math.exp((currentDistance - bestDistance) / t) < Math.random()) { - currentSolution.revertSwap(); - } - t *= coolingRate; - } - if (i % 100 == 0) { - System.out.println("Iteration #" + i); - } - } - return bestDistance; - } + public static double simulateAnnealing(double startingTemperature, int numberOfIterations, double coolingRate) { + System.out.println("Starting SA with temperature: " + startingTemperature + ", # of iterations: " + numberOfIterations + " and colling rate: " + coolingRate); + double t = startingTemperature; + travel.generateInitialTravel(); + double bestDistance = travel.getDistance(); + System.out.println("Initial distance of travel: " + bestDistance); + Travel bestSolution = travel; + Travel currentSolution = bestSolution; - public static void main(String[] args) { - System.out.println("Optimized distance for travel: " + simulateAnnealing(10, 10000, 0.9)); - } + for (int i = 0; i < numberOfIterations; i++) { + if (t > 0.1) { + currentSolution.swapCities(); + double currentDistance = currentSolution.getDistance(); + if (currentDistance == 0) + continue; + if (currentDistance < bestDistance) { + bestDistance = currentDistance; + } else if (Math.exp((currentDistance - bestDistance) / t) < Math.random()) { + currentSolution.revertSwap(); + } + t *= coolingRate; + } + if (i % 100 == 0) { + System.out.println("Iteration #" + i); + } + } + return bestDistance; + } + + public static void main(String[] args) { + System.out.println("Optimized distance for travel: " + simulateAnnealing(10, 10000, 0.9)); + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/Travel.java b/core-java/src/main/java/com/baeldung/algorithms/Travel.java index 9921b2516e..6e6059b3eb 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/Travel.java +++ b/core-java/src/main/java/com/baeldung/algorithms/Travel.java @@ -8,53 +8,53 @@ import lombok.Data; @Data public class Travel { - private ArrayList travel = new ArrayList<>(); - private ArrayList previousTravel = new ArrayList<>(); + private ArrayList travel = new ArrayList<>(); + private ArrayList previousTravel = new ArrayList<>(); - public Travel(int numberOfCities) { - for (int i = 0; i < numberOfCities; i++) { - travel.add(new City()); - } - } + public Travel(int numberOfCities) { + for (int i = 0; i < numberOfCities; i++) { + travel.add(new City()); + } + } - public void generateInitialTravel() { - if (travel.isEmpty()) - new Travel(10); - Collections.shuffle(travel); - } + public void generateInitialTravel() { + if (travel.isEmpty()) + new Travel(10); + Collections.shuffle(travel); + } - public void swapCities() { - int a = generateRandomIndex(); - int b = generateRandomIndex(); - previousTravel = travel; - travel.set(a, travel.get(b)); - } + public void swapCities() { + int a = generateRandomIndex(); + int b = generateRandomIndex(); + previousTravel = travel; + travel.set(a, travel.get(b)); + } - public void revertSwap() { - travel = previousTravel; - } + public void revertSwap() { + travel = previousTravel; + } - private int generateRandomIndex() { - return (int) (Math.random() * travel.size()); - } + private int generateRandomIndex() { + return (int) (Math.random() * travel.size()); + } - public City getCity(int index) { - return travel.get(index); - } + public City getCity(int index) { + return travel.get(index); + } - public int getDistance() { - int distance = 0; - for (int index = 0; index < travel.size(); index++) { - City starting = getCity(index); - City destination; - if (index + 1 < travel.size()) { - destination = getCity(index + 1); - } else { - destination = getCity(0); - } - distance += starting.distanceToCity(destination); - } - return distance; - } + public int getDistance() { + int distance = 0; + for (int index = 0; index < travel.size(); index++) { + City starting = getCity(index); + City destination; + if (index + 1 < travel.size()) { + destination = getCity(index + 1); + } else { + destination = getCity(0); + } + distance += starting.distanceToCity(destination); + } + return distance; + } } diff --git a/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java b/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java index 06b599dede..3fe3650041 100644 --- a/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java +++ b/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java @@ -5,9 +5,9 @@ import org.junit.Test; public class SimulatedAnnealingTest { - @Test - public void testSimulateAnnealing() { - Assert.assertTrue(SimulatedAnnealing.simulateAnnealing(10, 1000, 0.9) > 0); - } + @Test + public void testSimulateAnnealing() { + Assert.assertTrue(SimulatedAnnealing.simulateAnnealing(10, 1000, 0.9) > 0); + } } diff --git a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java b/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java index 08f4e0b4bd..da615eef6f 100644 --- a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java +++ b/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java @@ -22,7 +22,6 @@ public class EncoderDecoderUnitTest { private static final String testUrl = "http://www.baeldung.com?key1=value+1&key2=value%40%21%242&key3=value%253"; private static final String testUrlWithPath = "http://www.baeldung.com/path+1?key1=value+1&key2=value%40%21%242&key3=value%253"; - private String encodeValue(String value) { String encoded = null; try { @@ -59,9 +58,7 @@ public class EncoderDecoderUnitTest { requestParams.put("key2", "value@!$2"); requestParams.put("key3", "value%3"); - String encodedURL = requestParams.keySet().stream() - .map(key -> key + "=" + encodeValue(requestParams.get(key))) - .collect(joining("&", "http://www.baeldung.com?", "")); + String encodedURL = requestParams.keySet().stream().map(key -> key + "=" + encodeValue(requestParams.get(key))).collect(joining("&", "http://www.baeldung.com?", "")); Assert.assertThat(testUrl, is(encodedURL)); } @@ -103,12 +100,9 @@ public class EncoderDecoderUnitTest { String path = "path+1"; - String encodedURL = requestParams.keySet().stream() - .map(key -> key + "=" + encodeValue(requestParams.get(key))) - .collect(joining("&", "http://www.baeldung.com/" + encodePath(path) + "?", "")); + String encodedURL = requestParams.keySet().stream().map(key -> key + "=" + encodeValue(requestParams.get(key))).collect(joining("&", "http://www.baeldung.com/" + encodePath(path) + "?", "")); Assert.assertThat(testUrlWithPath, is(encodedURL)); } - } diff --git a/core-java/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java index 4b900c31a7..ef7b642f89 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java @@ -17,9 +17,7 @@ public class Java8CollectionCleanupUnitTest { @Test public void givenListContainsNulls_whenFilteringParallel_thenCorrect() { final List list = Lists.newArrayList(null, 1, 2, null, 3, null); - final List listWithoutNulls = list.parallelStream() - .filter(Objects::nonNull) - .collect(Collectors.toList()); + final List listWithoutNulls = list.parallelStream().filter(Objects::nonNull).collect(Collectors.toList()); assertThat(listWithoutNulls, hasSize(3)); } @@ -27,9 +25,7 @@ public class Java8CollectionCleanupUnitTest { @Test public void givenListContainsNulls_whenFilteringSerial_thenCorrect() { final List list = Lists.newArrayList(null, 1, 2, null, 3, null); - final List listWithoutNulls = list.stream() - .filter(Objects::nonNull) - .collect(Collectors.toList()); + final List listWithoutNulls = list.stream().filter(Objects::nonNull).collect(Collectors.toList()); assertThat(listWithoutNulls, hasSize(3)); } @@ -45,9 +41,7 @@ public class Java8CollectionCleanupUnitTest { @Test public void givenListContainsDuplicates_whenRemovingDuplicatesWithJava8_thenCorrect() { final List listWithDuplicates = Lists.newArrayList(1, 1, 2, 2, 3, 3); - final List listWithoutDuplicates = listWithDuplicates.parallelStream() - .distinct() - .collect(Collectors.toList()); + final List listWithoutDuplicates = listWithDuplicates.parallelStream().distinct().collect(Collectors.toList()); assertThat(listWithoutDuplicates, hasSize(3)); } diff --git a/core-java/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java b/core-java/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java index c4920c51f6..c640932d6f 100644 --- a/core-java/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java @@ -18,13 +18,13 @@ public class JavaFileSizeUnitTest { @Before public void init() { final String separator = File.separator; - filePath = String.join(separator, new String[] {"src", "test", "resources", "testFolder", "sample_file_1.in"}); + filePath = String.join(separator, new String[] { "src", "test", "resources", "testFolder", "sample_file_1.in" }); } @Test public void whenGetFileSize_thenCorrect() { final File file = new File(filePath); - + final long size = getFileSize(file); assertEquals(EXPECTED_FILE_SIZE_IN_BYTES, size); @@ -34,16 +34,16 @@ public class JavaFileSizeUnitTest { public void whenGetFileSizeUsingNioApi_thenCorrect() throws IOException { final Path path = Paths.get(this.filePath); final FileChannel fileChannel = FileChannel.open(path); - + final long fileSize = fileChannel.size(); - + assertEquals(EXPECTED_FILE_SIZE_IN_BYTES, fileSize); } @Test public void whenGetFileSizeUsingApacheCommonsIO_thenCorrect() { final File file = new File(filePath); - + final long size = FileUtils.sizeOf(file); assertEquals(EXPECTED_FILE_SIZE_IN_BYTES, size); @@ -52,9 +52,9 @@ public class JavaFileSizeUnitTest { @Test public void whenGetReadableFileSize_thenCorrect() { final File file = new File(filePath); - + final long size = getFileSize(file); - + assertEquals(EXPECTED_FILE_SIZE_IN_BYTES + " bytes", FileUtils.byteCountToDisplaySize(size)); } diff --git a/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java b/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java index c0538931b0..bf2078186c 100644 --- a/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java +++ b/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java @@ -93,6 +93,7 @@ public class OptionalTest { boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent(); assertFalse(is2017); } + @Test public void whenFiltersWithoutOptional_thenCorrect() { assertTrue(priceIsInRange1(new Modem(10.0))); @@ -121,12 +122,9 @@ public class OptionalTest { } public boolean priceIsInRange2(Modem modem2) { - return Optional.ofNullable(modem2) - .map(Modem::getPrice) - .filter(p -> p >= 10) - .filter(p -> p <= 15) - .isPresent(); + return Optional.ofNullable(modem2).map(Modem::getPrice).filter(p -> p >= 10).filter(p -> p <= 15).isPresent(); } + // Transforming Value With map() @Test public void givenOptional_whenMapWorks_thenCorrect() { diff --git a/core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java b/core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java index d6efdfdf5c..79ba2e0b17 100644 --- a/core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java +++ b/core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java @@ -13,46 +13,43 @@ import static org.unix4j.unix.Grep.*; import static org.unix4j.unix.cut.CutOption.*; public class GrepWithUnix4JTest { - - private File fileToGrep; + + private File fileToGrep; @Before public void init() { final String separator = File.separator; - final String filePath = String.join(separator, new String[] {"src", "test", "resources", "dictionary.in"}); + final String filePath = String.join(separator, new String[] { "src", "test", "resources", "dictionary.in" }); fileToGrep = new File(filePath); } - - @Test - public void whenGrepWithSimpleString_thenCorrect() { - int expectedLineCount = 4; - - //grep "NINETEEN" dictionary.txt - List lines = Unix4j.grep("NINETEEN", fileToGrep).toLineList(); - - assertEquals(expectedLineCount, lines.size()); - } - @Test - public void whenInverseGrepWithSimpleString_thenCorrect() { - int expectedLineCount = 178687; - - //grep -v "NINETEEN" dictionary.txt - List lines = grep(Options.v, "NINETEEN", fileToGrep). - toLineList(); - - assertEquals(expectedLineCount, lines.size()); - } + @Test + public void whenGrepWithSimpleString_thenCorrect() { + int expectedLineCount = 4; + // grep "NINETEEN" dictionary.txt + List lines = Unix4j.grep("NINETEEN", fileToGrep).toLineList(); - @Test - public void whenGrepWithRegex_thenCorrect() { - int expectedLineCount = 151; - - //grep -c ".*?NINE.*?" dictionary.txt - String patternCount = grep(Options.c, ".*?NINE.*?", fileToGrep). - cut(fields, ":", 1).toStringResult(); - - assertEquals(expectedLineCount, Integer.parseInt(patternCount)); - } + assertEquals(expectedLineCount, lines.size()); + } + + @Test + public void whenInverseGrepWithSimpleString_thenCorrect() { + int expectedLineCount = 178687; + + // grep -v "NINETEEN" dictionary.txt + List lines = grep(Options.v, "NINETEEN", fileToGrep).toLineList(); + + assertEquals(expectedLineCount, lines.size()); + } + + @Test + public void whenGrepWithRegex_thenCorrect() { + int expectedLineCount = 151; + + // grep -c ".*?NINE.*?" dictionary.txt + String patternCount = grep(Options.c, ".*?NINE.*?", fileToGrep).cut(fields, ":", 1).toStringResult(); + + assertEquals(expectedLineCount, Integer.parseInt(patternCount)); + } } diff --git a/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java b/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java index 16b3509925..c594529f41 100644 --- a/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java @@ -15,8 +15,7 @@ public class JoinSplitCollectionsUnitTest { public void whenJoiningTwoArrays_thenJoined() { String[] animals1 = new String[] { "Dog", "Cat" }; String[] animals2 = new String[] { "Bird", "Cow" }; - String[] result = Stream.concat( - Arrays.stream(animals1), Arrays.stream(animals2)).toArray(String[]::new); + String[] result = Stream.concat(Arrays.stream(animals1), Arrays.stream(animals2)).toArray(String[]::new); assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" }); } @@ -25,9 +24,7 @@ public class JoinSplitCollectionsUnitTest { public void whenJoiningTwoCollections_thenJoined() { Collection collection1 = Arrays.asList("Dog", "Cat"); Collection collection2 = Arrays.asList("Bird", "Cow", "Moose"); - Collection result = Stream.concat( - collection1.stream(), collection2.stream()) - .collect(Collectors.toList()); + Collection result = Stream.concat(collection1.stream(), collection2.stream()).collect(Collectors.toList()); assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow", "Moose"))); } @@ -36,10 +33,7 @@ public class JoinSplitCollectionsUnitTest { public void whenJoiningTwoCollectionsWithFilter_thenJoined() { Collection collection1 = Arrays.asList("Dog", "Cat"); Collection collection2 = Arrays.asList("Bird", "Cow", "Moose"); - Collection result = Stream.concat( - collection1.stream(), collection2.stream()) - .filter(e -> e.length() == 3) - .collect(Collectors.toList()); + Collection result = Stream.concat(collection1.stream(), collection2.stream()).filter(e -> e.length() == 3).collect(Collectors.toList()); assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Cow"))); } @@ -67,9 +61,7 @@ public class JoinSplitCollectionsUnitTest { animals.put(2, "Cat"); animals.put(3, "Cow"); - String result = animals.entrySet().stream() - .map(entry -> entry.getKey() + " = " + entry.getValue()) - .collect(Collectors.joining(", ")); + String result = animals.entrySet().stream().map(entry -> entry.getKey() + " = " + entry.getValue()).collect(Collectors.joining(", ")); assertEquals(result, "1 = Dog, 2 = Cat, 3 = Cow"); } @@ -80,10 +72,7 @@ public class JoinSplitCollectionsUnitTest { nested.add(Arrays.asList("Dog", "Cat")); nested.add(Arrays.asList("Cow", "Pig")); - String result = nested.stream().map( - nextList -> nextList.stream() - .collect(Collectors.joining("-"))) - .collect(Collectors.joining("; ")); + String result = nested.stream().map(nextList -> nextList.stream().collect(Collectors.joining("-"))).collect(Collectors.joining("; ")); assertEquals(result, "Dog-Cat; Cow-Pig"); } @@ -91,17 +80,14 @@ public class JoinSplitCollectionsUnitTest { @Test public void whenConvertCollectionToStringAndSkipNull_thenConverted() { Collection animals = Arrays.asList("Dog", "Cat", null, "Moose"); - String result = animals.stream() - .filter(Objects::nonNull) - .collect(Collectors.joining(", ")); + String result = animals.stream().filter(Objects::nonNull).collect(Collectors.joining(", ")); assertEquals(result, "Dog, Cat, Moose"); } @Test public void whenSplitCollectionHalf_thenConverted() { - Collection animals = Arrays.asList( - "Dog", "Cat", "Cow", "Bird", "Moose", "Pig"); + Collection animals = Arrays.asList("Dog", "Cat", "Cow", "Bird", "Moose", "Pig"); Collection result1 = new ArrayList<>(); Collection result2 = new ArrayList<>(); AtomicInteger count = new AtomicInteger(); @@ -122,9 +108,8 @@ public class JoinSplitCollectionsUnitTest { @Test public void whenSplitArrayByWordLength_thenConverted() { - String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow", "Pig", "Moose"}; - Map> result = Arrays.stream(animals) - .collect(Collectors.groupingBy(String::length)); + String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow", "Pig", "Moose" }; + Map> result = Arrays.stream(animals).collect(Collectors.groupingBy(String::length)); assertTrue(result.get(3).equals(Arrays.asList("Dog", "Cat", "Cow", "Pig"))); assertTrue(result.get(4).equals(Arrays.asList("Bird"))); @@ -151,9 +136,7 @@ public class JoinSplitCollectionsUnitTest { public void whenConvertStringToMap_thenConverted() { String animals = "1 = Dog, 2 = Cat, 3 = Bird"; - Map result = Arrays.stream( - animals.split(", ")).map(next -> next.split(" = ")) - .collect(Collectors.toMap(entry -> Integer.parseInt(entry[0]), entry -> entry[1])); + Map result = Arrays.stream(animals.split(", ")).map(next -> next.split(" = ")).collect(Collectors.toMap(entry -> Integer.parseInt(entry[0]), entry -> entry[1])); assertEquals(result.get(1), "Dog"); assertEquals(result.get(2), "Cat"); @@ -164,10 +147,7 @@ public class JoinSplitCollectionsUnitTest { public void whenConvertCollectionToStringMultipleSeparators_thenConverted() { String animals = "Dog. , Cat, Bird. Cow"; - Collection result = Arrays.stream(animals.split("[,|.]")) - .map(String::trim) - .filter(next -> !next.isEmpty()) - .collect(Collectors.toList()); + Collection result = Arrays.stream(animals.split("[,|.]")).map(String::trim).filter(next -> !next.isEmpty()).collect(Collectors.toList()); assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow"))); } From a1fe0749c05693bfd582905cfa55189bb234583d Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Sat, 17 Dec 2016 08:12:32 -0600 Subject: [PATCH 36/51] BAEL-35: Added test methods using Apache Commons Collections4 --- .../CollectionsConcatenateUnitTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java b/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java index 0d913db1bd..d43075c925 100644 --- a/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java @@ -2,6 +2,9 @@ package org.baeldung.java.collections; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.IterableUtils; import org.junit.Assert; import org.junit.Test; @@ -107,4 +110,26 @@ public class CollectionsConcatenateUnitTest { } return list; } + + @Test + public void givenUsingApacheCommons_whenConcatenatingUsingUnion_thenCorrect() { + Collection collectionA = asList("S", "T"); + Collection collectionB = asList("U", "V"); + + Iterable combinedIterables = CollectionUtils.union(collectionA, collectionB); + Collection collectionCombined = Lists.newArrayList(combinedIterables); + + Assert.assertEquals(asList("S", "T", "U", "V"), collectionCombined); + } + + @Test + public void givenUsingApacheCommons_whenConcatenatingUsingChainedIterable_thenCorrect() { + Collection collectionA = asList("S", "T"); + Collection collectionB = asList("U", "V"); + + Iterable combinedIterables = IterableUtils.chainedIterable(collectionA, collectionB); + Collection collectionCombined = Lists.newArrayList(combinedIterables); + + Assert.assertEquals(asList("S", "T", "U", "V"), collectionCombined); + } } From 1b59823654adc781204ad0d62898cc8d60ea4441 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 18 Dec 2016 14:15:07 +0600 Subject: [PATCH 37/51] Created README.md and added relevant articles (#901) * Added relevant articles * Added relevant articles * Added relevant articles * Created README.md and added relevant articles * Created README.md and added relevant articles * Added relevant articles * Added relevant articles * Created README.md and added relevant articles * Created README.md and added relevant articles * Created README.md and added relevant articles * Added relevant articles * Created README.md and added relevant articles * Added relevant articles * Added relevant articles * Update README.md * Added relevant articles * Added relevant articles * Added relevant articles * Update README.md * Added relevant articles * Update README.md * Created README.md and added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Created README.md and added relevant articles * Update README.md --- apache-cxf/README.md | 2 ++ core-java-9/README.md | 3 +++ core-java/README.md | 2 ++ core-java/src/main/java/com/baeldung/README.md | 2 ++ core-java/src/main/java/com/baeldung/java/networking/README.md | 3 +++ core-java/src/test/java/com/baeldung/hexToAscii/README.md | 2 ++ core-java/src/test/java/com/baeldung/java/conversion/README.md | 2 ++ core-java/src/test/java/com/baeldung/java/nio2/README.md | 3 +++ junit5/README.md | 1 + log-mdc/README.md | 1 + patterns/README.md | 1 + pdf/README.md | 2 ++ spring-apache-camel/README.md | 1 + spring-cloud/README.md | 3 ++- spring-core/README.md | 2 +- spring-core/src/test/java/com/baeldung/beanfactory/README.md | 2 ++ spring-data-solr/README.md | 2 ++ spring-rest/README.md | 2 ++ spring-social-login/README.md | 2 ++ 19 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 apache-cxf/README.md create mode 100644 core-java/src/main/java/com/baeldung/README.md create mode 100644 core-java/src/test/java/com/baeldung/hexToAscii/README.md create mode 100644 core-java/src/test/java/com/baeldung/java/conversion/README.md create mode 100644 core-java/src/test/java/com/baeldung/java/nio2/README.md create mode 100644 pdf/README.md create mode 100644 spring-core/src/test/java/com/baeldung/beanfactory/README.md create mode 100644 spring-data-solr/README.md create mode 100644 spring-social-login/README.md diff --git a/apache-cxf/README.md b/apache-cxf/README.md new file mode 100644 index 0000000000..d8f1912070 --- /dev/null +++ b/apache-cxf/README.md @@ -0,0 +1,2 @@ +## Relevant Articles: +- [Introduction to Apache CXF Aegis Data Binding](http://www.baeldung.com/aegis-data-binding-in-apache-cxf) diff --git a/core-java-9/README.md b/core-java-9/README.md index fbe5f908aa..1b44239e40 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -3,3 +3,6 @@ ## Core Java 9 Examples [Java 9 New Features](http://www.baeldung.com/new-java-9) + +### Relevant Articles: +- [Java 9 Stream API Improvements](http://www.baeldung.com/java-9-stream-api) diff --git a/core-java/README.md b/core-java/README.md index 36dabbef41..9f9f6e596e 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -41,3 +41,5 @@ - [Introduction to Java Generics](http://www.baeldung.com/java-generics) - [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) +- [Sorting in Java](http://www.baeldung.com/java-sorting) +- [Getting Started with Java Properties](http://www.baeldung.com/java-properties) diff --git a/core-java/src/main/java/com/baeldung/README.md b/core-java/src/main/java/com/baeldung/README.md new file mode 100644 index 0000000000..51809b2882 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) diff --git a/core-java/src/main/java/com/baeldung/java/networking/README.md b/core-java/src/main/java/com/baeldung/java/networking/README.md index e92122f3bb..b9e827f085 100644 --- a/core-java/src/main/java/com/baeldung/java/networking/README.md +++ b/core-java/src/main/java/com/baeldung/java/networking/README.md @@ -1,2 +1,5 @@ ### Relevant Articles: - [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) +- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) +- [A Guide to the Java URL](http://www.baeldung.com/java-url) +- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) diff --git a/core-java/src/test/java/com/baeldung/hexToAscii/README.md b/core-java/src/test/java/com/baeldung/hexToAscii/README.md new file mode 100644 index 0000000000..c6d5826333 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/hexToAscii/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Convert Hex to ASCII in Java](http://www.baeldung.com/java-convert-hex-to-ascii) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/README.md b/core-java/src/test/java/com/baeldung/java/conversion/README.md new file mode 100644 index 0000000000..7c81180249 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/conversion/README.md @@ -0,0 +1,2 @@ +Relevant Articles: +- [Java String Conversions](http://www.baeldung.com/java-string-conversions) diff --git a/core-java/src/test/java/com/baeldung/java/nio2/README.md b/core-java/src/test/java/com/baeldung/java/nio2/README.md new file mode 100644 index 0000000000..65584f93b8 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/nio2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Introduction to the Java NIO2 File API](http://www.baeldung.com/java-nio-2-file-api) +- [Java NIO2 Path API](http://www.baeldung.com/java-nio-2-path) diff --git a/junit5/README.md b/junit5/README.md index d4e30cd257..2ca5b08766 100644 --- a/junit5/README.md +++ b/junit5/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [The Basics of JUnit 5 – A Preview](http://www.baeldung.com/junit-5-preview) +- [A Guide to JUnit 5](http://www.baeldung.com/junit-5) diff --git a/log-mdc/README.md b/log-mdc/README.md index c271cbc63a..e69507ae4d 100644 --- a/log-mdc/README.md +++ b/log-mdc/README.md @@ -1,5 +1,6 @@ ### Relevant Articles: - TBD +- [Improved Java Logging with Mapped Diagnostic Context (MDC)](http://www.baeldung.com/mdc-in-log4j-2-logback) ### References diff --git a/patterns/README.md b/patterns/README.md index e5d8334a3e..bcd54a64b1 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -1,2 +1,3 @@ ###Relevant Articles: - [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern) +- [Introduction to Intercepting Filter Pattern in Java](http://www.baeldung.com/intercepting-filter-pattern-in-java) diff --git a/pdf/README.md b/pdf/README.md new file mode 100644 index 0000000000..7160df4081 --- /dev/null +++ b/pdf/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [PDF Conversions in Java](http://www.baeldung.com/pdf-conversions-java) diff --git a/spring-apache-camel/README.md b/spring-apache-camel/README.md index 4015760f7d..ab7cf5c575 100644 --- a/spring-apache-camel/README.md +++ b/spring-apache-camel/README.md @@ -8,6 +8,7 @@ This article will demonstrate how to configure and use Apache Camel with Spring

Framework Versions:

diff --git a/spring-cloud/README.md b/spring-cloud/README.md index 60acdaeed5..2ffb3a86d0 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -16,4 +16,5 @@ - [Dockerizing a Spring Boot Application](http://www.baeldung.com/dockerizing-spring-boot-application) - [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) - +### Relevant Articles: +- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) diff --git a/spring-core/README.md b/spring-core/README.md index f05ba9384f..30ba30f889 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -2,4 +2,4 @@ - [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire) - [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) diff --git a/spring-core/src/test/java/com/baeldung/beanfactory/README.md b/spring-core/src/test/java/com/baeldung/beanfactory/README.md new file mode 100644 index 0000000000..cff20a184b --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/beanfactory/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to the Spring BeanFactory](http://www.baeldung.com/spring-beanfactory) diff --git a/spring-data-solr/README.md b/spring-data-solr/README.md new file mode 100644 index 0000000000..fbce5280e3 --- /dev/null +++ b/spring-data-solr/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Spring Data Solr](http://www.baeldung.com/spring-data-solr) diff --git a/spring-rest/README.md b/spring-rest/README.md index 671fa4996b..3331b9c69f 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -10,3 +10,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) - [A Guide to OkHttp](http://www.baeldung.com/guide-to-okhttp) - [Binary Data Formats in a Spring REST API](http://www.baeldung.com/spring-rest-api-with-binary-data-formats) +- [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) +- [Introduction to FindBugs](http://www.baeldung.com/intro-to-findbugs) diff --git a/spring-social-login/README.md b/spring-social-login/README.md new file mode 100644 index 0000000000..f745a90acb --- /dev/null +++ b/spring-social-login/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [A Secondary Facebook Login with Spring Social](http://www.baeldung.com/facebook-authentication-with-spring-security-and-social) From 38eef2d1c080fbd887d4dca438a4b3709ad0defa Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 18 Dec 2016 10:00:11 +0100 Subject: [PATCH 38/51] Refactor EJBClient.java --- .../src/main/java/com/baeldung/ejb/client/EJBClient.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java b/ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java index 08286d580e..ebd6ef1b97 100755 --- a/ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java +++ b/ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java @@ -45,8 +45,7 @@ public class EJBClient { final String distinctName = ""; final String beanName = "HelloWorld"; final String viewClassName = HelloWorld.class.getName(); - final String toLookup = "ejb:" + appName + "/" + moduleName - + "/" + distinctName + "/" + beanName + "!" + viewClassName; + final String toLookup = String.format("ejb:%s/%s/%s/%s!%s", appName, moduleName, distinctName, beanName, viewClassName); return (HelloWorld) context.lookup(toLookup); } From 64b7412a9afdc2ed646a9aab88fa84aeea84f6c2 Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Sun, 18 Dec 2016 16:04:15 +0530 Subject: [PATCH 39/51] BAEL-282 - Grep in Java after code review (#903) * BAEL-242 Package refactoring after code review for article Grep in Java * BAEL-282 Updated readme file --- core-java/.gitignore | 4 +++- core-java/README.md | 1 + core-java/pom.xml | 9 ++++++--- .../{java8/unix => }/grep/GrepWithUnix4JTest.java | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) rename core-java/src/test/java/com/baeldung/{java8/unix => }/grep/GrepWithUnix4JTest.java (97%) diff --git a/core-java/.gitignore b/core-java/.gitignore index 6ecc6405c2..464f7e5e38 100644 --- a/core-java/.gitignore +++ b/core-java/.gitignore @@ -13,4 +13,6 @@ *.ear # Files generated by integration tests -*.txt \ No newline at end of file +*.txt +/bin/ +/temp diff --git a/core-java/README.md b/core-java/README.md index 9f9f6e596e..ef31a7c46e 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -43,3 +43,4 @@ - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Sorting in Java](http://www.baeldung.com/java-sorting) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) +- [Grep in Java](http://www.baeldung.com/pattern-search-grep-in-java) \ No newline at end of file diff --git a/core-java/pom.xml b/core-java/pom.xml index 0cafeae16a..cd04d7c3e1 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -55,13 +55,13 @@ org.unix4j unix4j-command - 0.4 + ${unix4j.version} com.googlecode.grep4j grep4j - 1.8.7 + ${grep4j.version} @@ -100,7 +100,7 @@ org.projectlombok lombok - 1.16.12 + ${lombok.version} provided @@ -359,6 +359,9 @@ 2.5 4.1 4.01 + 0.4 + 1.8.7 + 1.16.12 1.3 diff --git a/core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java b/core-java/src/test/java/com/baeldung/grep/GrepWithUnix4JTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java rename to core-java/src/test/java/com/baeldung/grep/GrepWithUnix4JTest.java index 79ba2e0b17..628518a12f 100644 --- a/core-java/src/test/java/com/baeldung/java8/unix/grep/GrepWithUnix4JTest.java +++ b/core-java/src/test/java/com/baeldung/grep/GrepWithUnix4JTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8.unix.grep; +package com.baeldung.grep; import java.io.File; import java.util.List; From 5c8f44b2c6f55389033f837ba8d26047198490a9 Mon Sep 17 00:00:00 2001 From: Eugen Date: Sun, 18 Dec 2016 14:13:57 +0200 Subject: [PATCH 40/51] Update README.md --- core-java/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java/README.md b/core-java/README.md index ef31a7c46e..a17e01e8d2 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -43,4 +43,4 @@ - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Sorting in Java](http://www.baeldung.com/java-sorting) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) -- [Grep in Java](http://www.baeldung.com/pattern-search-grep-in-java) \ No newline at end of file +- [Grep in Java](http://www.baeldung.com/grep-in-java) From 73d82faf520c15f85b69a125d8f940b482591e0e Mon Sep 17 00:00:00 2001 From: eugenp Date: Sun, 18 Dec 2016 17:31:20 +0200 Subject: [PATCH 41/51] maven cleanup work --- core-java/pom.xml | 1 + mockito/pom.xml | 3 +++ .../data-flow-shell/pom.xml | 19 ------------------- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index cd04d7c3e1..6979d980b7 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -193,6 +193,7 @@ **/*LongRunningUnitTest.java **/*ManualTest.java + true diff --git a/mockito/pom.xml b/mockito/pom.xml index 83005668f3..dc5797e78a 100644 --- a/mockito/pom.xml +++ b/mockito/pom.xml @@ -94,6 +94,9 @@ org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version} + + true + diff --git a/spring-cloud-data-flow/data-flow-shell/pom.xml b/spring-cloud-data-flow/data-flow-shell/pom.xml index 6711edcb42..55fa995052 100644 --- a/spring-cloud-data-flow/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/data-flow-shell/pom.xml @@ -77,23 +77,4 @@ - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - From bfb062d57f46f7a6ce67b5bcdfcb0075422bdc41 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sun, 18 Dec 2016 17:35:41 +0200 Subject: [PATCH 42/51] maven cleanup work --- redis/pom.xml | 22 ++++++++++++++----- .../data-flow-server/pom.xml | 19 ---------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/redis/pom.xml b/redis/pom.xml index 8443564ffd..e3affdd7ef 100644 --- a/redis/pom.xml +++ b/redis/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 com.baeldung @@ -44,16 +43,29 @@ 1.8 + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + + UTF-8 - + 2.9.0 0.6 - + 4.12 diff --git a/spring-cloud-data-flow/data-flow-server/pom.xml b/spring-cloud-data-flow/data-flow-server/pom.xml index 05684008c6..b1f920c94e 100644 --- a/spring-cloud-data-flow/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/data-flow-server/pom.xml @@ -112,23 +112,4 @@
- - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - From b74df6163a4b45f4ec8ceebb9e0247b3f4925419 Mon Sep 17 00:00:00 2001 From: Daniele Demichelis Date: Sun, 18 Dec 2016 16:36:34 +0100 Subject: [PATCH 43/51] Pull Request for "A Guide to Rolling File Appenders" article. (#876) * First test with log4j rolling appenders * small fix * Log4j rolling appender * First set up with rolling file on log4j 2 * Added logback code. * log4j2 more detailed example * log4j2 more detailed example * Improved names and examples * Fixed configurations * improved configs * formatted * Final fix * fixed formatting * Formatting fix * Fix sample apps to avoid try / catch * Fix request to replace files * Fix end lines --- log4j/pom.xml | 29 ++++--- .../baeldung/log4j/Log4jRollingExample.java | 18 +++++ .../baeldung/log4j2/Log4j2RollingExample.java | 19 +++++ .../logback/LogbackRollingExample.java | 19 +++++ .../baeldung/slf4j/Slf4jRollingExample.java | 19 +++++ log4j/src/main/resources/log4j.xml | 75 ++++++++++++++++++- log4j/src/main/resources/log4j2.xml | 56 +++++++++++++- log4j/src/main/resources/logback.xml | 59 ++++++++++++++- 8 files changed, 279 insertions(+), 15 deletions(-) create mode 100644 log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java create mode 100644 log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java create mode 100644 log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java create mode 100644 log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java diff --git a/log4j/pom.xml b/log4j/pom.xml index 9b87c131b9..856548327f 100644 --- a/log4j/pom.xml +++ b/log4j/pom.xml @@ -8,13 +8,24 @@ log4j 1.0-SNAPSHOT - - - - log4j - log4j - ${log4j.version} - + + + + log4j + log4j + ${log4j.version} + + + log4j + apache-log4j-extras + ${log4j.version} + + + + log4j + apache-log4j-extras + ${log4j.version} + @@ -58,14 +69,14 @@ - + 1.2.17 2.7 2.7 3.3.6 1.1.7 - + 3.6.0 diff --git a/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java b/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java new file mode 100644 index 0000000000..c0c05e1759 --- /dev/null +++ b/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java @@ -0,0 +1,18 @@ +package com.baeldung.log4j; + +import java.util.stream.IntStream; + +import org.apache.log4j.Logger; + +public class Log4jRollingExample { + + private final static Logger logger = Logger.getLogger(Log4jRollingExample.class); + + public static void main(String[] args) throws InterruptedException { + for(int i = 0; i<2000; i++){ + logger.info("This is the " + i + " time I say 'Hello World'."); + Thread.sleep(100); + } + } + +} diff --git a/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java b/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java new file mode 100644 index 0000000000..8e0b9fccab --- /dev/null +++ b/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java @@ -0,0 +1,19 @@ +package com.baeldung.log4j2; + +import java.util.stream.IntStream; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class Log4j2RollingExample { + + private static final Logger logger = LogManager.getLogger(Log4j2RollingExample.class); + + public static void main(String[] args) throws InterruptedException { + for(int i = 0; i<2000; i++){ + logger.info("This is the {} time I say 'Hello World'.", i); + Thread.sleep(100); + } + } + +} diff --git a/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java b/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java new file mode 100644 index 0000000000..60d55752b3 --- /dev/null +++ b/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java @@ -0,0 +1,19 @@ +package com.baeldung.logback; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.stream.IntStream; + +public class LogbackRollingExample { + + private static final Logger logger = LoggerFactory.getLogger(LogbackRollingExample.class); + + public static void main(String[] args) throws InterruptedException { + for(int i = 0; i<2000; i++){ + logger.info("This is the {} time I say 'Hello World'.", i); + Thread.sleep(100); + } + } + +} diff --git a/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java b/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java new file mode 100644 index 0000000000..f5cc4a280a --- /dev/null +++ b/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java @@ -0,0 +1,19 @@ +package com.baeldung.slf4j; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.stream.IntStream; + +public class Slf4jRollingExample { + + private static Logger logger = LoggerFactory.getLogger(Slf4jRollingExample.class); + + public static void main(String[] args) throws InterruptedException { + for(int i = 0; i<2000; i++){ + logger.info("This is the {} time I say 'Hello World'.", i); + Thread.sleep(100); + } + } + +} diff --git a/log4j/src/main/resources/log4j.xml b/log4j/src/main/resources/log4j.xml index 58a924f970..562d6920f9 100644 --- a/log4j/src/main/resources/log4j.xml +++ b/log4j/src/main/resources/log4j.xml @@ -1,28 +1,95 @@ - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/log4j/src/main/resources/log4j2.xml b/log4j/src/main/resources/log4j2.xml index 76a20bcd61..b5724c5bee 100644 --- a/log4j/src/main/resources/log4j2.xml +++ b/log4j/src/main/resources/log4j2.xml @@ -8,16 +8,70 @@ # File appender - + # Pattern of log message for file appender + + # Rolling appender + + + %d{yyyy-MM-dd HH:mm:ss} %p %m%n + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss} %p %m%n + + + + + + + %d{yyyy-MM-dd HH:mm:ss} %p %m%n + + + + + + + + + + + + + # Override log level for specified package + + + + + + diff --git a/log4j/src/main/resources/logback.xml b/log4j/src/main/resources/logback.xml index fc66d560aa..f567962cb6 100644 --- a/log4j/src/main/resources/logback.xml +++ b/log4j/src/main/resources/logback.xml @@ -18,8 +18,65 @@ + # Rolling appenders + + target/slf4j/roll-by-size/app.log + + target/slf4j/roll-by-size/app.%i.log.zip + + 1 + 3 + 1MB + + + 5KB + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + + + + + target/slf4j/roll-by-time/app.log + + target/slf4j/roll-by-time/app.%d{yyyy-MM-dd-HH-mm}.log.zip + + 20 + 1MB + + + %d{yyyy-MM-dd HH:mm:ss} %p %m%n + + + + + target/slf4j/roll-by-time-and-size/app.log + + target/slf4j/roll-by-time-and-size/app.%d{yyyy-MM-dd-mm}.%i.log.zip + + 5KB + 20 + 1MB + + + %d{yyyy-MM-dd HH:mm:ss} %p %m%n + + + # Override log level for specified package - + + + + + From 8ff889bc7da823c7c81872ba8e0bbc61ba1d630f Mon Sep 17 00:00:00 2001 From: eugenp Date: Sun, 18 Dec 2016 18:11:05 +0200 Subject: [PATCH 44/51] maven work --- pom.xml | 7 +++-- ...File1.txt => 2016-12-18 17-36-38File1.txt} | 0 ...File2.txt => 2016-12-18 17-36-38File2.txt} | 0 spring-cloud-data-flow/pom.xml | 31 ++++++++++--------- spring-core/pom.xml | 1 + 5 files changed, 22 insertions(+), 17 deletions(-) rename spring-apache-camel/src/test/destination-folder/{2016-12-14 23-33-25File1.txt => 2016-12-18 17-36-38File1.txt} (100%) mode change 100755 => 100644 rename spring-apache-camel/src/test/destination-folder/{2016-12-14 23-33-25File2.txt => 2016-12-18 17-36-38File2.txt} (100%) mode change 100755 => 100644 diff --git a/pom.xml b/pom.xml index 211c3b2c4d..36b1a57773 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.baeldung parent-modules @@ -151,7 +152,7 @@ xml xmlunit2 xstream - pdf - + pdf + \ No newline at end of file diff --git a/spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File1.txt b/spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File1.txt old mode 100755 new mode 100644 similarity index 100% rename from spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File1.txt rename to spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File1.txt diff --git a/spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File2.txt b/spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File2.txt old mode 100755 new mode 100644 similarity index 100% rename from spring-apache-camel/src/test/destination-folder/2016-12-14 23-33-25File2.txt rename to spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File2.txt diff --git a/spring-cloud-data-flow/pom.xml b/spring-cloud-data-flow/pom.xml index 509c185d61..520ff63d49 100644 --- a/spring-cloud-data-flow/pom.xml +++ b/spring-cloud-data-flow/pom.xml @@ -1,15 +1,18 @@ - - 4.0.0 - org.baeldung.spring.cloud - spring-cloud-data-flow - 0.0.1-SNAPSHOT - pom - - data-flow-server - data-flow-shell - time-source - time-processor - log-sink - batch-job - + + 4.0.0 + org.baeldung.spring.cloud + spring-cloud-data-flow + 0.0.1-SNAPSHOT + pom + + + data-flow-server + + time-source + time-processor + log-sink + batch-job + + diff --git a/spring-core/pom.xml b/spring-core/pom.xml index cca6e7f08f..bf05f6a6f0 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -72,6 +72,7 @@ **/*IntegrationTest.java **/*LiveTest.java + true From b6e8cf95c7996658455af440d71aa7d1dd85b4c0 Mon Sep 17 00:00:00 2001 From: prd Date: Sun, 18 Dec 2016 20:59:24 +0100 Subject: [PATCH 45/51] init --- imageprocessing/pom.xml | 19 +++++++++ .../src/main/java/imagej/DrawRect.java | 22 ++++++++++ .../src/main/java/swing/DrawRect.java | 40 ++++++++++++++++++ imageprocessing/src/main/resources/lena.jpg | Bin 0 -> 95154 bytes 4 files changed, 81 insertions(+) create mode 100644 imageprocessing/pom.xml create mode 100644 imageprocessing/src/main/java/imagej/DrawRect.java create mode 100644 imageprocessing/src/main/java/swing/DrawRect.java create mode 100644 imageprocessing/src/main/resources/lena.jpg diff --git a/imageprocessing/pom.xml b/imageprocessing/pom.xml new file mode 100644 index 0000000000..36e1b57028 --- /dev/null +++ b/imageprocessing/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.baeldung + imageprocessing + 1.0-SNAPSHOT + + + + net.imagej + ij + 1.51h + + + + \ No newline at end of file diff --git a/imageprocessing/src/main/java/imagej/DrawRect.java b/imageprocessing/src/main/java/imagej/DrawRect.java new file mode 100644 index 0000000000..53354d89d0 --- /dev/null +++ b/imageprocessing/src/main/java/imagej/DrawRect.java @@ -0,0 +1,22 @@ +package imagej; + +import ij.IJ; +import ij.ImagePlus; +import ij.process.ImageProcessor; + +import java.awt.*; + +public class DrawRect { + public static void main(String[] args) { + ImagePlus imp = IJ.openImage(DrawRect.class.getClassLoader().getResource("lena.jpg").getPath()); + drawRect(imp); + imp.show(); + } + + private static void drawRect(ImagePlus imp) { + ImageProcessor ip = imp.getProcessor(); + ip.setColor(Color.BLUE); + ip.setLineWidth(4); + ip.drawRect(10, 10, imp.getWidth() - 20, imp.getHeight() - 20); + } +} diff --git a/imageprocessing/src/main/java/swing/DrawRect.java b/imageprocessing/src/main/java/swing/DrawRect.java new file mode 100644 index 0000000000..8fc7f5184e --- /dev/null +++ b/imageprocessing/src/main/java/swing/DrawRect.java @@ -0,0 +1,40 @@ +package swing; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +public class DrawRect { + public static void main(String[] args) throws IOException { + BufferedImage image = loadImage(); + drawRectangle(image); + displayImage(image); + } + + private static BufferedImage loadImage() throws IOException { + String imagePath = DrawRect.class.getClassLoader().getResource("lena.jpg").getPath(); + return ImageIO.read(new File(imagePath)); + } + + private static void drawRectangle(BufferedImage image) { + Graphics2D g = (Graphics2D) image.getGraphics(); + g.setStroke(new BasicStroke(3)); + g.setColor(Color.BLUE); + g.drawRect(10, 10, image.getWidth() - 20, image.getHeight() - 20); + } + + private static void displayImage(BufferedImage image) { + JLabel picLabel = new JLabel(new ImageIcon(image)); + + JPanel jPanel = new JPanel(); + jPanel.add(picLabel); + + JFrame f = new JFrame(); + f.setSize(new Dimension(image.getWidth(), image.getHeight())); + f.add(jPanel); + f.setVisible(true); + } +} diff --git a/imageprocessing/src/main/resources/lena.jpg b/imageprocessing/src/main/resources/lena.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1a1657bb5e15d9930f2140dc531ba68df779527 GIT binary patch literal 95154 zcmb4}Q*<2M7wDtLwrw}I(b#6=Ol;eB(oAg3L=&@ZY)#BIo~Vt{q`lw&<*xgB_c?F- z>~r?o>v;eEZT$NIhpVcjq67yI4-fb0zXJDf8%`b$5dq^yCmlEs_mH`PWeY!z%P9x`e}b*Bz=w#NWSy3Fi8YDef@ZUrP+IGI=GiQI32_d z_`ppw%^)tta6?_{#3j3_VTtJjP1i9 zOI3Q(+6klZvZZ`;XDQu}W;k&%{Z(IBt*?_*U7)7QnTnjB{Sq-k^_{Tli-{aFHKd33 z=Qf_}P|PA%bgX_F;)n>#=SwWpm;tnEaPvf=Wh0HMYPH%QMzmgtI-5S<0KvY{KGFGxJ>wj4G$%DBZxljq z!gxLGm^ICD)zU9p`H7d*1gR~gkjAJ^4<+^DIBmKgU9@vJ2*GhejU_rqz9S=I^y>0T zXjzqm_{}Jsq{@0d^cTDgKcE3R3g>s|S!gzPuSS!;`3TjxrVtV$yhhUwydfCt8Gbe;jUgT7Ajw0V?$U&pr3_o#_o#W;y z$GJ2tYUw{J$jvCFFjAqg5PuI4%MUi8(W(yyjyJNFxcfkGW4%oiU@cToTF#(8zM12T z`THiibJLFHV0{X+?3`>a<5snXT!s{}=`IPD8F3U$|7k|f)21^?7YTjmx~P&A3IW3j zCE}qZrcg5Wov7N+C8YLTc7Hv88V!rZB){o>Gi9nvO2}3*Qp(dR^FP0Nr+VA3btbOIOR`DEY zEr%(@%L(gcz&AQdkT^Tm(1wq+*x>hmjpjUtKw?a)ym%9&5M*C(_UT@d&US>+m;-zp z_{(Cx(}DtD=txDk@-dGIF&g_BL27+YgX2oLaHt^AC%np-Z*ZH~v9i^)3}k@X4#{|z@h}3ATt)q;PL$pW@h~+5~2J{WGEWINN zA=65Ax1Siv3H(Ir$zs=S?x|;qXUG2brnVN&GrI?zjz3Q_GsI9Y&617hc)&@$Snh;X z-QVr@ZgKbc3=---U2&IM3)|_|SYfKgp z)tS2++(4zS>&O3ng+7YDi;+a9B&V^hTM?3pU_t_)Ts!I~m*~w2Jk1d;u;)+9h3V4$ zPNw@-qw9HP0scFmBr|&g^_;|LB8M3Ib}4S2I_=EIK`|aMyjk<2h}?|J>JF+!QAZ#W z7~FLb(}pmTw2=ED+ZMp;qGBD=~d512tbPQnH$oF~bjzWjE!@w!ye5wM!00i|WqOJ#pD%Y5p^ z_qD3OdDRm=oY#vX()g*F6W-HA-X+ zTlY(SLD&tG%HEm{bjCGO+22cn>HRA3vL&qQ@-=p>Dpb5A3DexGw?{RW_Ocle5`uDn z&8%fY#D|6A$0ymD^`W1(x*eMwBqrGbqF#?o`-RI(FI~haF^j>XK9&odacxuNcG^-= zj~Yc8p0}wn5%Q58rt8Unn%U7%R{;KVgxsZijo!p#-|lhNesN^6ci1f`?bgTI z%c+2mb+Mdt%9VClG&yQWdl*`*V#TIO5aWX7$}clMTw>tU@w_Z3H!O>GlPA`ijy>8* z?wPyYJB!|h;Z06@DiQxm8zer73UfU~ifkZt2Knr5Mvs7uGOHt?<7d)mn%Oal zQY{PH4Nw}=?b4hPbB^#0^MW?`z_EAMpVroMSH7gyEFL%(zgn?7l zchDa$1exXR5V{VYnXsmNH*($P9UivhykC@Ra}DV=y6EahqNSw;QR*(pYVKqZ8Uu}X z-A9*&SKm+T7|rw1Uq0!^lRpV(m7HJ716rbzjh#|bCYrw+XpSBlv38XDbj<2kJKNq+ zC)ZaChVxpF2`UPPqJZm>f;;qj_p(RYGx*+4-Q>`P$#kVSxMObCE6(HuuRyo>j7y%I z;ityB^!bd0xLh-(4u^_Cy8IL#3*)TseJ@TPm<-%+GaIZ8mE^FT{Rh`j zDpyNK^X-*H0cNqCFHgmlx}a@dZUsddq?!ttDv6b6Sg1ffr|9uC4^6fH%+;8RhiFnM6!h5})gs}Xl3DKz+6hvA+)zgWqcx3bNE#dwj( ze$%ixrn*ivqFQkPQSEc_rp{U(WdDv&Way*^Oow!h*;`rHQ|s5U=!#fzu?~x~sSW-8 z*7~H1T`{pDxANME=#PyC6UDXy)lE^Waf-V3*o_196YqEXeA1hA4V3d25Nb-}6^?gB zih+YAA|V26f?FDSJ*xu4s`<_Z`E*V+(c+q)FBMGGO9Sv`_sj?%eoOd0Q0NGCeraq# znSYkOnL{u*=?|@Ctu*!*$d*8%G)Xhctr$WrZQ^cI+xQpwH zR}v{Lfw7D8e{@#@(C_!PlQ(Gwh}h4ke+>L>uq!KO`9H=fp0IgNW0^e6M!d$BPQ= zTw^nP%mw+DSqx1J^l%xKKwH$Apf2yr#gEBNzRkpcR*h#;#`PyV8ApBBmHG|ChG2lT z{fVPl=of82GIgEylp zzan@!+xMc`G^MN^o_IbsY%y4hJ&v zCkvpbp6&PWvMCcbZSEbs>@n4SJxbtj%i7J9wz=i}J;NzidDLI)YP)EIW~^4#3!A%4eb@2xW5KpY+=?Z4PQ@{{Bes|XICLf^0vVuN zb>FA6-DZva#_P9>k7-*jX5IxB>5=?M1k6*7w@t+h%8yEx5q zJ-S47-O-?j5e8FzUpImB03$ir-2r#~dcE=GH#H23Q)heK{;oX|xnG7d!nVK)-292= zSc4&b`~1+@Jl{2#X_KT@abMBTKFYc60!yZ)4yT1E7@Sj=MMj?MqjA{h6c$E5me0O8 zxN)pZkj;k@r7yhdb2t%WKvgizsKIp;_|X0ZY+)$U1Ve8sGrCMcP-F$1o-~IC3^F`f zCmQBvm7DP|s|ebDSQaS}AE%RgW)O7DsUKcnQgs#6H$5o`Z6OL~0B5b9y<8|)&5I9E z&E#%6%-CKUEut^+&W^1IuFsw}P2tO_0AxM15Xucx4{}i!cwm)ENnfh>Z;rETn>q9a zuII!>)8yO?S!p=%Q|K!{tz4f76 z$cwUP>edsm!d}-69snH+15e6OI`EB;2~rrtj<8 z+Dk~bQ#(>OcTn}6f*(B*s0e3+vbRT{)7fEJQnP83+X`}5S*m3iP@>XKqK z^e*R%VFz>|IMNm%S{^zT&JXHtmgKaB(PJLAm?*dMPR~pmSd1qkj}Kv%|q4iSGeyz;QCAVIFjUi>e4|qt@&~JHH#L zQ$=!Tq+$=M?-uCq7Ig@H?^?SzqG`vNtjD zy0i>5Ud);8M|&H!_~a0rZBx%MC)gZq@_+FhB{(C%L3JIsFb;AUvq(XBR*-o4HMl`I z`A649aBH89*?GR4J>Z`2Z)=wPXVLV{si;k0OL-J$=XOa=;c77BZ2KTPm>|XvLpOOw z&}1{P$QS7-^k(sVqj$GqEQf%xe*TZ%hA5`?Dw&{ib4pXOn(LwNg!hox$M|WX9lz29 ziR}Kb>}93F-2yWK6Al>*d>tSqrUW|IQC|BPWYdpKRb^JWt;g#vCt8XdPLY=?vweQo zsn`)}im1^2&i5B2~4%J>k8xpf}2{(8Q+M>MYy))N_7Wuv`_TAKHl)n(Y z{o0f=Y4E-`zg;<3$b|B7qQYa7^2rqj9U9go+xx$kwMps!dc?h;ur3{I|9qqZxO;3j z`s#1A(Y&!yGY_yluMs!`^#fs!xq6N3=4vwZ&=f}tKPlgZdr9eVjfI51RY!v3^u28s zVNmdiZ%yW;AU>k#a9pdKDYhHj4yOynPv}DaJW5q6`2o|Wa6oc7Vw>>%r}4fd(z(vx z_X|3@bZYF>eCIn{kZ$sqaTUr#aE(*N3`kXYMsjcCkx_CufVre7-Jx;eC@&=7c()N8 z9euT+1GANSTf9k0a>~^m2ObBslK;%#My4{L+60-_ulI_%znqP{&RBL{?OfN?l?{C+ z-86w@e^8hPrdhhxin(@cXTPJ&6NAWgycl6#axZXegUx93c$J5&5O0)f>z;+Wc6 zh1%b%Q0Q$x_IU&Djz;c^OJDx8DUb-_-ff06YiZT z{_O6{rYpk7)r*$u7v-k2UevDj&=J2s9~`w~6`Q0k>so7BA%bKJKG`mYi%0@(CJJ%R ziW>f!TFT<*KRXt;n30n~c6Zj_gO85<<@bBT*it14v~#D;8#dxqNeK08q2pXfg_D$ifRB;2YGDLL~^?NEfy?H)0w3bAr$o2)eD?# zaq1-Aj;ZoP$e($=_Np5fk8YOBq#*rmhf4q6U*r{4q;@HWt|pE7B{|hoz;W~=7-3Q8 zsU&B4N?OzRPG9cu-f#~?Mbhk8!EoFh(*wo{dn4h)dayUFj=I@?Wkl=jGdqa+qibT1 z)@*mN;mlnyzT3hfNPWsqmW{54!*EF?kH*2zwAi}N$O9A`>b3Jrs^!?_QF$>4Mkgm$ z*|B{)w5u1LZNk5|E+~s{pFAB%Da)yp2=41lw+2@5)m^RzOKjb&P$Y@DB7gUp@GX-D zeO_?M#$OdBM%&y##p^*c)+mg25qq!+`zu{8R8#|TO6igGcMHf0>hUjel&npYxY3{7 zOdVF#s`k2_bedkV7wZN1Pru=e?WI88jfm4Crre&sKm-hrOxNZFhVtNNFuDafK=IfZ z6g6%9!zRw)wzH>j%?n3<4V%^Ur2_i%Scbm*+$=5@9}|Y08i$ek81%?H8JmqMXC$@F zc>QB{3FDcA zr}v1sVqVQvn%7eGZ2%GS3>xVMwMz^8wCREIxqdP>Yo9OJxJ+sjIXK4u?4(DZ8ygtT z>N$boR*NEjnD4s&To^Bo1L1XJPVxp7L$$}|V5MF#(&q6)-;Ct<`0EkRQ`ZhVsNabB zuIP%r*MEN<)$JzHO-r)`hFpo0Zss-*(LxiC7L@W;HxwT(Ot69n4X*Nj+BXFEOTrUv zaukH6Femlx9JD9|8@{Qq$;-sfr9Su=_EFwm_!&7nyN__Hbl$(_HI@J%gw)z3F5F zG0F8Dnu^@l94x#juO5UTRkhW~+-dZE-bzQz{X`6rFI>!^Ysz=%nO%)Cy1fPld^?9m zIMx2K|IV+az=O?XOUj2`k2dnP7|zOB8hRS?PY)T>ORSpIB2VOiEq0lLOXBWZHFUxzdgN5{R2z zvRsdY3~0ra4AyJ;EmbY6%hZtU+0nN7X9&+wKb)o+-fgTiLo41wM*5;$Evp!_aqmCo z?uMS+*EF;Z$H6IJByF@;QKjCY6X|p}3orNO`Q=N5FmZfd9^E$_91nDn8UJ?0sd!TzB+Rrf)12}$C-*&{XPmwZ0U%y;8yS(G)PFH=n z{R@cW^V6^{N@}u~b%1mt8*mT;oXDfy?q$JL$-QFfek6Pc|KO(1RSkmh+w~hY$0Qtz z&2{T2&g)e3r_vrZrR%D=G}2bRy7U@vIpvpUluY3sl|QC*sU7#>!|s(!PgJ;AS$OuB zM*CaOn}ph7_7__Co^~|`>*d=Zj~^Eh$Eo9wrY&*jx4f3aV0lbl1u=1=+e+emI|#X} zA5_0ZuhT@`MV44VmAaB6JfZdO6_@^OWou5iP%uux<2GHyB3FOX=q!@B~5X-1tH%JFZIVHnxyF%Z- z-CmFR-akU-qF^Qqym^Iy|4W@QOZi#XlTPg5P)c4zGUxmw}W}iZzzSa!} zrKgn^m*9VRJeA7GD7^Q{1%J#|hYa@+4L-@CLd>*sH}%Bx$T2q^DvNKrbMuw=)f(pw z{QhLDgFGfYM;d*ED&<6pbgTfArqj7a>}+?`z14AwW@_`T%%MKJ7w42SEh1Su+VVmi z>Za^`yA`*J*{P1(rQ9WfEFSGtf!PhikdDm9)LttioW*B84SSE00Kb5ik4qiUj7C~3 zf0c7l!uO8UrU|vp1xw;&N;ay`5~~~34J-BM>ys-lVPeh6-#JI!zNU^WwmO-|mf zv@EmI7BVXJZF3W8SZp(hyu5JP3#fCSOM%E+fY|RtcmBco2QUiA?wWrZ!Jho1Vv`-; z&y^dQfo8B8eDB}?Nf!~kC%HakrLf34sOcXwbxuk@T+MF>Mww$$RTU(}J(*yA(F&df zyec{f`5A?)&Pv5BmdBF|b*bDvS$?!GZU12ZUoOq4jU-HiFTtz@$YuBkW5`b?RnD^05h=gN076NWKa+3Uj0hYb}J zKUs#1SB1`r-U9-AM_w^!n##@CkXQ2b9Y*!4)oLiJGPGtap)t&C0XDGFi(SZP-$cXp zf>+Bh9RH6MT+x;H)bU8s$@AL=yG{*Q=uHK}cg^A7%isa z@PM0t)NEgHNDl$nZhBunO6ngb>~5v{J;#8hZoaVQdSJIXyOIcDxWc5?kG;o*Szn=k zL_cwcp^CETG%W8}Rev?j`J%6h#9QXP62~yCYTU=jgScr)+J9;{DhTD*> z#(lNZ(Zy@33OYBBqh0FgewRYVW}#(SyuajgChpT<;z<{^WT=KO$s$Xazr>ns<_z^QfY&=nJXkiE9N2k3q5yW@1@B^|fO>t*8S@Ce^4l??Pch3e+ znO>~JhQqA*@V64{DSnt_K^(M$=27d4^j-e`=iCepBOZ z=rhC-BW7u<53I@MozO$q5;&8r*XhCYGXu2NX{%h#E=L5iY=pGQrPJG{QvN_XhbSComo27XEQ3whXdGb z4)sOA51kdJ<@tk3AR+9uBI2rs)-i+VA1QGg1_%eu46(lHk&y;O-&%mP08Q7EAr+Qs zpS2_N{JnUu@F^v|bM&c!AgBDbTT(ZoLI1!m%tCvGYyiN`EqGPI-)-R|%F2#=Xjs5$ zN3i%f<>)j_l4K-|8X2APGu_+6O!5H}#9#jvBs0u4ZC_>=Uwhg+m_p2zy<)72GJ2UF zug#5jW|0U<|9&RM@ST7mi<(tW|E2zEg7(FZx*&NCJC!6rVaz%8(w{r>W=0;bf=<|m z#L#_Zf?=ybP)|*dD;XcUu>T+C!GjA2j|Bf8n(`m)@gE-YAMo)%?gQxq9zGo|!AE35 zdOikOT1I{%CILBl6yE>X57hrP`GCMAQW;2Xtf%)(hWPs*+?jW$Y0Gwy{6!0EX_|a< zJr!}ouC(c0Bek7aE{@g`j3qfvN#}Tw(hv6fPLv#|aq}f_L)D}rM(fUd%H zZY8?$522_|w`O)JcPY;1pmKg~#T!Z%)Zq1QT{Fsg<$#(!0MKcA zzg}Wg8d-?) z)@o49>B~x>LLD~GMa6oE7@A1{jU%yPgHL6vNMm zPRKrPq?V|9OZHq9m8sP5z7KXK-SxLi^=N~kJnI^MoQVTt1OnLT$lZoc9fv^}2ggFxXsgBQ58B??htuzs#eQ1a zK^em+b#cup-uqC?+^Z00o175KZ;vN!rOWeXEZdYl@hzym#4X#Vwf@OhX~{W%;%U(S z^3hoRgHy`vlquIU{5lFaq;w5rCT6qa(HXe9F24Z?%PFbO*YO%VSYh2Gg`sk0usrjj|e7iE0PUiK$P=23kyvlbb1fCV!BemEax|G+>!t5!-L^Z0>XO zUy!UcXpy`)|2G&Gu7^zYx+d@;Il^f&B~np%#Bbd{spWSjsE zj{Ze^ugbQ^@sdct5@?n~)9CqMq{S4}-3xfI#KLP9rb^l?JuobYmk$DUCI;2tF0W1>931Zoy(?X^BTwj@~=P1|A=qL;??-yI5IPGBP#)VrhCN6%K$}j5W|E6p-%^ zM<{yNs6SH!heMK@HsJH^`KP*zBi4A(JxJd0UdX@7&=xI$3~C!yLfrl^M-s27I@EkD zJ}a!(KCifieuJN!MJyzQ)DDmPrCqG{Xa!+K9& zbnQD#OH5Y``_uao8F+MryJr14cT0P4h3OpiDZbyOX_ulGVg99P__WKb;SzB8g zdr8?7nE*ElpVpsA4hQEjdPNGaeOtm{QEA|-rbl? zoiMI|y}b{a7aDI$+fGQ265t${u{|%0ZFX9zlg<=(yR9H^^tIpzjndhg?Pk91WfVsw zO0b1m{=R1X{1;2(wUgJ~cNy>xZqdq4K*N2lGqy=|UBMFQtFtiX>h02j6$mvr_WlGw z)J(T!cC3GAU4w`k5X@3ZoAA_>GLP?Y`H4QoEXWk!U(de94WJMm-Gep;2O6DFMPyLFo*5-Zc)SR*u^Np-s*g)Sv z;|CO#|7LVEjmQA}c*-LQ#&YX*=Q&ygzp68qPKi8e8FQl2Y4b_i>Rn&HU@Ic4vlExJ z{ez4rWojhtx`eRImv=4JAStCN!JXh7ynk@g4En!IzD-Lj%?yoYXarLVg0rBgKV7k| zYo)y(R=uoNG!$+cQS`5gQK+sNpw2IztqvgEaIxm@KtfKuUQKW@8}aj5@$4HZw+1g?O(pc$ zyt#NfA?1OD1jjumTot#tjs^Ge+!{vufcNP8l{@IyXDv8B2C2R$U2IK?*Xl8fgF%+K z$NW*}XzzQzv4`bON6Lf25u^;7Vzp^i&w-4$4XmQ@(id63fAt5+m&<1=oo-vF4|cgL zan*a8b#TE;vz3ku5sPkbAl71uEBkoch3IFu(k^7L5>(oLQ#OHn?trKNAZE9I?Nhzj z7uJ&DiJRY=*qtqp=S`Ve#=Eyqa@CbaeOR4I0O}RS9H!zVq{Iur;0lLDdO`Ah+T$34fUT8jFQ(VyC*gL7#~ZTXGj0 zSS46EOZ#d5w%vQkwX*z!6X*By-RWs{3C6OE`E| z&R|0#%|2!Piu?(-{n!fG;p^{_ar<)YHc;12^h*&y%F*|k3|(xP*XlRds$ilZ{8ELT z>*GQHmt;IkGf`2n`o5O+Qz0Xh(zUIJ*9LHCt6%BxtrPZB003YOWeJ>0GyQd+@lAdK zw)fE+ebeM^*I_M%T+LnMHUVzq$v86Ji)3e}<<`=efW(+8lxk$suYQ&p>7{wJrIk1et2CC2O{=Pi2T9QNSj9p=!K z%|YviKL9XA**~~v!q5-u^%4w+4EGVQ9Zm@v+NET1(iO6slhEsqtU(qg*@*V}>n4EereCo6x)spp)MTm!1L?Ic#aZb!gl3~e`yzbEd^H>4Is=!2k_hu77cwFJ@YUrkGRwhOA0 zuaOz432P32or=C;OsLL%4o$yS>CVtHdlbddSBf}`s7xAc^J_A6fLD=vvd8{oE`XD` z=NA@uoc2&tfR<6ktU1SymCowY#p_XPWMfWZ`O1nMy@%X_0Q52-uulQAg@dILu{9;}s+lXSC!2nC({Swe7ceCmqRCE z8YDdQw8(1*RbkSRQA{2lACpFSC7_?|7ISIA;k7KVhmelIdV6-diviam_ za0bQeHn(k0%z3Nx_pL(6s+l(z>0mE*&A51|i_^0@oLagD1e z^eOULHd`5}R44(Ou`GFMcV<-sc2ep8-M1Hi&;qXr;U>=x1k)q%Y<9s^DmUHyB-MOI zjsvAmM}rQ7@nU1fU-_AE%IHYC@;k0u7_&#Vzc2lRs{rKbFm@go3bxr?%TbzZ4soi! z<@wKL#aHcK9;Mmb8rsskP4{=2va#TT_R8D(%m}o&dO#PPAvo0~wf|v3YldYLqNcQa z7w5{GARQp$8#>2R9S*=p$856qd%$LZYJu9a!T|@sWA44%!~mPaB-+me`-;@}n_#N+MfbAU-}s*z9cT z*jTz>{ayD#IbWfVf8b~PPr#>~4@OdNU~Y7hFDz4?rDt^fF}$9MM5OPXPV|Q?IrgYm ztH3Q_Re763j&WPy=~ljJ+t6UD9>;Fd{4xokt?m4m!L~2qrA@!?XVA>Gq!|G!QtT&V zt9YZ8wB?RQJrfz`samNt)h1`3L$2)c0~ZqXS^&y_Tryz(ZPse{gFb z$Dto*>v1Sngh@1?^eezBUX4*pLuzQ{O);e!lS-tHohAbp< ztGyV*7H(cxiibu{q;NI;T2Yq%R3hpk4mqrNTy+tSdqo?ij;*}L$Zr&L&r_5I0wJ{MY0ovBSb~J@pwoubsZ( zT)>G4B!OMVki72goX{E7<%mZ#9N9@a&>O;uqqj~z zN5Tv;g&XHGbAT15&bB0Z)1p%)_K5hZ>sK7@d05 zygNg6ktK(84+Zb#$cj`>!<>y{K4O@?l&NcTfdNvjA*-7V6Ab|>OdKtZk7`CH?XxvJ zZzr1#yqJZbVIhB>&)(;LLORGeXYMw|W|y*9p`p&>ivt*l`ZwQ=m3=~B(vvF3hpAt2 z5^1jrF{{L%Pru$iJJ$Z#IVblO6P>XS`*uc`(P|AT9?#FfBr zdAI)u7uX3%oBFNcA4DoVrINkTZfm#(p~--VyLc%5x-?lfIamKqQ{T1>?e57-Xu9;; z=qmvZ_00Xsq26Um7$HDUf;DTgjj8@MzZQJ4v4W@-uVzNp=yG;?`^0g~veE=%*q=i^45{mQa5a>X?g*1cg?sP7(O4$^sTA=8(nJO5*AkDfLR zaWDRZ;b7{r&h8M{_pLPe1}rEj+Plyi=cwU9`6Ba%f$|UT+GA6?Zf!)*5d7nHL05~! z8X=AclRwp^Yp8gFLFycp3(=)+5k1EUg@t(i51Nz=JcbL|^N{AR`OVU84E|=I2Y`*U z28RLN!S-XK*-fYzIyVKZ>_YR`0)M`y7gkun(AVX4ervm52a-m(Ze^PC`)%DugogDG zK})u@JMRMI%xQS%<|RKbSFC?5u91Iu9ja?RQ6u9P%m23K)+TWi!pUecb%ki3Npoou zi+Q%Sd1;WZ+BS_ILOXU)JTV!@qy7(WC35uU{Fe?XBW;0&KrXlz{tclt3)K$3#i>`k*$}b0+nt#r#OL#aF|_yCeEjJ0YeCr$z1e zBs)2_MrgSGmp2+ArgWDejHde&hVGtzpG|XTn{T@k=JDsiC=K~(PqZ5Z&|%2sxW4U& zdGgzqd5-mvlwAxz4LC)P02)QLu5rJ(-vL{ zbY1-p`~5@b4v<^ZOr`iHuj#}hi+;KvNuo4OHLcnL#SMU_Z%Iq({#7gfPin7`p1<&K z7gYM))#&HeD##T?P?}57mh?~jaZ->=Ld%x9S7Js)!)aON;KLy_Mxz%bUcU62cFVFW^zTK@XN>SPaEc*gSJWoeq8X9^tx+tS8Hu34r`3FO$t zROd1;wwKqirQb9{#Am-nQ@i)msEW1zVDjPIZ(|NVvAHx>5A?tkXN=e#;9$5-5*EvC zXwhJ6w$yL?u;~D{)hBWpP&UkUADaH@3O`gm`BVe&;Bj946TyghyZF4DRVKX!txdeo z1dHr)YW!##R56QQKkiS)+VM(%`F5rKJG{Hv$He6yoc+Ys()2u{YdDS8l65xJ4bl0x zR2QyMdJwzlZw*Fu>!wV6!y1~u_zxRl;u%0klRQxL&Gc_(x?$mK1I8^Ac3Y?x7V9nL zuHkZQI^bG`4s(OA`yK2(Fl6}de+I&OoY>-d2kuiS0QUDa1eK$MRShu;BNu(ekWO8o z&SnK1q`Mr;lxwipuMb_)tuTd$owXUs+aEhlFZ{PcE=OyPreorat_GCM;9V#AjLCIS z%>fjJf)2ccJu)OQ)p?L5F(4NsG%d;diBga&7Y3v0fo8)VK=Ldo2@+_%*G^@!vrr zZ-TH(>j=Vu8tmcn2502y5cvp{M!NF3ZC&41D&;haLY@7XCaSl0gOG6K~@s5f6k;Hv;DR}Bo^121WHcIJ~~6{z0CePSbO7N#%& z$gNLN+`KB2Sz3W=kV+uy(Cww)uj-~faroFK;ZZAd*MuWn?61%ydCKs5ZNo%$O|SzO z!}+Nbny!hR>Jy0Fz)VMs(&rKEyItM1pbW%Gde^*8 zq+ymdr&w!zE~c?^&~3yC=_zdELD8QRCmMRKdi221e_}OfvLoI5nS#Db%q|pfxK#;o zPgCeTTffG5Cc9kgjp@#iVD6>X6x=V|Q--=9e*VMYd(D>L^CXc%+w`Nd)K~Z1keqr| z_qcJVwycXky!w&;Z}93JB~PYCN~oMMs&=^0L6fr}i#vckPeMlq(#t_+RzOR-qt0_R zCk2@@H0+z}D{1g5#F-15^$kqMRru5OzVfi=8(*C7egvMl=F#<+`Wf)xd>bL3S#^xt zK$9o?dtD#>H_*rnu`$w%1hp+2v!Kd(*Th59d^Cp^IVLwj4NDCDA6)j_Un6T4qpehT zz}`vi7RSER;70HhmT!mF!^27$eo523<6-r7{_&*72c3FrXxBQZXUt}3+&1HMA_9mM zmnqhv?MBAmEq!J$xMa(IVOWd5?bt2A({;w!87>i1!g(hzqnD{f7yC3z)$Xr!Ouy6{ zYF6?dtYH@DQP9b++vT3z`nKBZ5_GoKf;R94SRqDxwC)tON}NP-?x7&0gE$w&9Pvmo z<0U_spL5Fg-!(Z+1-Vgm+Bngmd`;AryIZyh(Ah^nD0?n#Q~ctc^BAd~6e#E_cpZWi z!=dHs8`z!x%Coe69j0X4o$I@M+?H&ZKl-QnN;(uEQ5|P}oQ@%`uD9X|XyB+Sp4xKZ z=!*yZj3EjU*4o&wC5TUS?vp8pYt->b#h%+rdm}GMEbK(mLvV~Q!3|G>FuzArhgreA z97I`GuRJmDw*yY1R+hsWIgZKfGVuv(+)wQt>sax0=0q8>s6v2 z&8-o4?g=fQuw2I`-~9rjD=5b4iwdP-6N=|W+en;?okf}31Zsa`;g&wZxT!ThPn~US z1lYChYptLET3^AuT-=^XPZ|KbMfe1)cx-2N?HwoIiS<2UwFxRyaT4qe_y0boC%y?p zdvpj3`&_e9^z4Y(B{2_b?|F`ba?W)*r3;)YHm4Z0V9E*#3e@5TD_n=Eq>zQGb-D~v z3aw?t=Nf|apFGE(sFcatGRG;FcZP}WIYU4)?&>xruU`r)DZd1UBRyG92^;SS+1*5( zd^M5?1{y8=mzc?@Shclv;B>I#+m6IfjinbFqg-&g)s|AWspMVlyd(1ZUH~xx2%Rf} z4UWX3MQ__W118tvF-x=U*gV%BD189{0JU;p#O? zZz$T@8XByG%T??G(0X<6e{ip1ST@7_-5Ixg&A(f*-j-=nExG2l)9>G5)jADF+G%8fgP z38gfq6xSws>FTN<^srd*+o;(=YAf{Ns0>uBdr4V+vZip{#JeDo>R0MZyKJrurOw&| zwOlZM{VS(#RzJ6uAK%0O0GCUgH#Yv|xkiufzh{#hc8JGzNhHw7{j6*Iba3&1YavwC zv5m^UI|Yq7YMCy?4wcp=VbB+7ql~>!iAJ*adsXo8aMU_zh+nXR38|+ z!D>R+Q(7M5sKS8JWpDT0hN0VId=7dyq3PuUn&cBavE0N{4?yMXDxLgX2T=BErGync zJh&F0LdMxfM3CBmMGvX7EUOH&I>W&XRbeE}F2%cYiJCUi)j6Lkx=yGDvF-Z$jB2qT zR+P^f-~AlRwpSdW)Xp6K4QNZ#Te{WA`*T)_vsR6T?1%?L1Wt~YLd!0|PN~P3hNi83 z7rTa-vyz(n$Ktz2Ht3p%fzYCeKy(SGRKvqK5j&XNf!C#|1)7Wo8Fy+NK2pW;H20rK zMcbBO*0U$-Ce|0MzU<6q!CDgX_XybMZ*^F8G99AJ_MJ2oESS|PwU)Dik2=lc6~JeJ zvaIe@zhun=cv14=-<8(vu|w}&!S}K?8zdO-oRB&6FIa>!N)j?U`6}WGn$o-|$px&l zFozTzV5G>ySOOd-lsQ_Uhf=iY-wjMDiKQ^~3)GdprfH7UZQP4BA`UUL`x$b6p^`|R z*GPLi6in_vaD|gixYUcgBvF7Y5YZ{s@=3#8pvTHhjD2lu=II8*i{VH03qLH3uOpY$ zMe#sxQ+{fg$jhrzZno>_>w%y0@;SB%T}9&MY<<_j{DWTC4ih8QRH~tb1lH|9AiSZ# z)eaAz;riON-~RAn&m3I%%ZvWTV?8xaY^Q0Vs~7RJ4soCj&LO6MIns#SJ2R|Yoa zjZt=~taOK+xY;({s_kLPpX*~3e6@OlXF@C;UH<^&(YVLAYg_$;AF#yI8*WW0ZbvH@ z{V1%4j4fG4`QG+R9sRAyeq{i%n2kauW)S=$KPZy**7+ z-QmL>0*(5ZoxK?N?I8eYw*3*8Vh%Ew4HY{2xHL3gv$0Jnd4;=;db?Zy!~io900II5 z0|NvC0{{U70|fv8009CK0}vrG5+FeYA~I1EVK72*6eBb61yX?|Vseq8|Jncu0RsU6 zKLMd3A)$;#a>l*HRTZ+)t;BiJi%QXyR*!*bxjbmscZ0=iBbTKKb|cg$LohlK&YTI4 zbRxDq=_aEqdT_5+&O|;BIz4E5zvH9*{uVb~mS1ySN{q1SVwD)Cq=@|u6{h`}a;Pna z@3HEJ{)^L{``O9kweD7%`0Vl9M+XOu&4sx1efja)>KdaA`dGg7-?uJh9uB71yBpOW z4?AgnoDcXIv}4uj{%hbzI&e^_GE03IeNXqqQ%d18qsLGy-q%saC&T>7?|GXOsXn| z?dfl`k|=SZ^P)T+bwUwE6jgTd$&)gN1oKW_N57I*J_pYFe#rWqkn&>nahB5CN;XCJ zJs)j$WrtcaN2HA0S%)IY6DCfLi@j)C#EMB}d)pak52tL;aR=^x(tlr;GeC=8jF`QRG@Pkq>PdUq>Io>akzB64>;Ot=|KalhJLZ zYgR!Lk;)#3;v?j;*KPJs-LXybRcW@0HMvBU8}L0WmWoae(dqqPU$%UU>`zCzk%mu$I)`ybtKDBy_Qj>HdtN z(be=r)?|$s@+^_GUY0MR>qjRKMXhU}ExwrPT0O=jH%2&K?1V`>dUzg)Z`-e)>g;;4 z>{Sx_Cq$7(=;_+WG`Jgb*Mrk%{BEBD(~>Bbh;L#u-i9vLX35bWlvcNA2OQ}bk=uf9 zxYxk>(I3=qg}-xM{PJJXy^(Low2@X$OCRlyPFm3Q^qK8+GVDYNX=B|ImrTe{sH2|8 zE|lcS$<5f2L;5(;kU}nt>eluoSrPDg6772IRLLz zP}As>6Cz7j!I@hy%8plOCVZVvgo@F9joHAr67ASr4@7u8iD`Y7MqOE7=z9LN+fH^8 z(sN1lu17y`;w9k!07m|_{q`{)mok#4${@$3`5y*OMX`$_CpgD;$Y#ekN=H(A8K==2 zIS|ft;N(iRqQr162cqPB9!1@jeGzg!G-?+7>)^k$^l(Ur+Fh0E|emNOG+9WNRxB_07~;N zOaB1f!1r4hTn%~CrAKy8{{Z0DwQpikQR7+@aCVPN>VM=zepZPdr_{q9#GJBj$0Z%2 zawIVr{wPRHXMuZ|koy>xztm$B@Gb^L-)lZzp|PB4dbxC+HhgIh_DTJTHup9~O6X}u ztCExCuMDp!YTvYYpOJfZh}M)*(t26`EUB_{jwNz4ddW|0TL~q*9Glq{tI=(-9eEUM zy+1l3y@?D$_~?eT^P?~}16so5M&Zz5HV zS{wZN4qcRVoRD5gJvl7C)v**yf?7mh6V8jXBzmIKG4NoOv!`u~8Oi>P{b^egeNSOJ z+9a)fiOSZ;T%#11B8!&tE2EB1sd+Aj$lQr#SoVnI+rIc?o==J)=+`r3BNVnnafzEF zp2&oHBVS@ddyirY^m?<#t3*VX1hhiDmgttN;(07u_!;VzO-zg5Vlv*DR=4Ea$k|?WeSSDUB6|{-Lpqz>ttIY#B}N02 zZr=sg?0dQ)i9vPD&6VWSl83gj!~X!hZ=?Jf3av6`@e;a!(P+!0MPBEEPV`;>0Or04 z7A{EeK6G8VamOS&SqqG*@{X>is8_*bepvHCc@{{$hbH_I>he9x8{J1lsA|XZIhl^2 zzcVsqbL3hpBPHI%;@^EK3O4p7?bwRyRyKtb&W%~qqS%W3 zxc4NgM3<8lH%!g8#daf+4`RFPRifaYi;_GXv3E3j`OMX@XrdGOnl`G5wQP`%t*kj@uV%(Qr>i$qokh7h=;UPsbNBc`hn)KQ=4t;*5X& zT%4Z8B)2j>hvTwDS8aCLXHt5-#lbxnBzPYp?QFF@nUSk$5Q~($89DSW zD9w`5@m4jp=+PHwaVhyB4yI&xSfl>{$(JQ?L)i;4VV|g%=!Pibk4#BMgspCL*8|1W zw>l`yt4P7jkEep3s;p7US11 zB~bD&qIp{2>Uku2vTsRnayyRXT4Uym{4l>PYoQm^%s8HJ@akCAM0q4RzD1X>$%`er zVkZ;Sa9-qV6nEtOr&p0kp67x;1=$5`;9tkjWC`eqaoZ`RWS3Nvf8ifjTT6mjVO*Iq zsXdBp{SE9d>LKs33+dlSw&p%EBL)|h{)G;h(i}b8nHNbptZK;hH)bq$ zlW5?P>ZP&h;H3JWf=bzvqOZw@AM~_mf-l)xSjg-*-o`!3JQc4DfslI<d5XP~`r45gM zM+G(RC+TsYgYo=%F=WYp+4Gf1ZXpTfZ_2gIB z_27E9Mkle8Mahiwu#JrIPjX2mY;)>o91W`6=)MRlR&0mtsf2}NR^!V%C%$Y7u zL?bNHqYgEWG>HwJXXN@Nl(IhNezf(b2~mz@YDjT1X)T!_mWYocJnFQ1Jsi6mI3!{+ zX%iXbzLjjAOt0Y|{{Up3T#w%}Sl{-Qkb;K;WUGQc;)zDemxJ*)vmuU$@*5!@re>E+ zIuSWJI!C2~h=xdI??+QPWHuuA5$lnMnjpGJ@up!9|W6>}%b*9rrvOm$^OK9kt(t zdwnCJLxghfLfE%sd-WLnp>S5_I7O0mvLNM-buT2ElDQ)qa%O4%EJP#J_uxv|h+0UJ z8qpBf)W+7s_RK_i)6`1kNQpm?_H6P;cV%;>cOmH5-S$x~4^Cv!a$_YbI-LF^^ziE^ z14EeBv+B666r+U>yPwG3hju^@}=a- zR4CK4BmSscY(5$<{-5|nlIkpvx!=(3?sQ5-qclV9oSsY^3rC|`A}?}RUeY~Z*xE~S zc;hUzL`SKg^%mmbkuC|4jUsyAVkM-Xg8MIXlgOX6cdjygh|1RKa!rz#NR@NQ_8pSh z>|u9CHn?Pyv2^i6$xCEoP7$_FUz&FKLVJ;`viChZ*jh36Cdkao>be=~vN;$z5+^>9 z%HHI8D`YY7e2A*po45QDPfe&)ku(n!B(-gkWHyl&ogK6B1@|3Ho zQHBpRx=G47U~eb6ik66ckbDt(vdxiK!O(sZXOLmHOspS6+q64cpPN zZY5e?okSMaE(z<1$<3R>QY3Ia6n7=|Dzh42mOWlf_`e=WL~61pWS>_WBgsTYB0Dk@ z@F$}i9O(}wj!f#YGIF_pnnXlzR%79rIoA7R{k^-CR=D28Oq$~|J~XG@CTSif;K zWl?=c=2?DRk8!(tMwqz~z@C@5+gqX;e#Io#kA4RejS^zya^$iaE*SKmf(vFp;K=qC zsRY7B}`d$s5F#(Prp#Yr+2jFKVN$J+zP6ehBD^*$Df8`4m3K4fZ+;?aA~d zr4fznV}ug963qCC(%&Z197t@8Pjey>YCE&4c@<+E79~*|y~H}xl5zgXkK9a>b-@_) zt;hG|>!D+GrR2xC#7J+V?1Q0di6f^>godo$a7KPKj}~|mCCMLxFTkGVqop&U4jY{e z>1IW_!qE`MlD0S1u?P(pTad|OF>+)-)1^L0DkVO-Ha)$+M+Bu+XXIW4npDmZ;Fr6B zCn8JeZ(R!=tR{>#AE*exMbHEmR8$15XnoWS&!qm#*PUH z%g)9-jEB5hFr#aRyEcB9ug4rXoIdyj@^;ld9Ft-sw5!Q zSryY3JsP%QkKUR7NX5rv+@X(240?NlHv2gr*uPqN(rBU-)idzK=#)21>Y7zVWqhMz9GKSHWZq^zJ6O>4 zk|Z(g^k~JrT0S`TA8Ipv2=Y&p3_6&j(ubsmbGY=#yqL^*%9>9Ws#^ZDb`D_B~X*7$MZg)De9{bc@mKwWMX>qXXEN#c0TIOXT!R?B}xe$&UCG zx@EYZ-z0X^{2>z@G|!s-kuc$~Hw2!OgQTzD5Xi zE~ZLOPKUOZZc1J?>ZDES>BjwoBrl63`>$5Z+;82|$VQ(!a79^;Ba~pbC!SefPBdb{ z)4YUG_a9<OphF6Vf z%OZ63Mwu8#8?WNI@nendL_{D% z7^1s*(eAsfy%@>vNNaP0_Ihb^9T=a23bb)LD{@1AG-E&0jTCyAkMNf!9!UI0q@6^N z_!ghBd!{}a9titArTeH_I9sC zaY8dgQUxPG|Jncu0RjO5KLN<(Hhi2~Jd~KY?B}svKIO>IIqXN1z`Hp-lUcU{vpm@z z3cTcx1R9M@v%$sPz78ze8Wk!_DI6TTvjRmk!22EZ-v0o4*ud6FA(XrC^@{yNk@+CTADl#*}osR``L@D60FR5V%yug*lNlpPfgJWd&uhTZE24qL{#@(xXG285W{+X>3$p?~*HCIX^N-G`N8X~e%h89^=cc;nV2 zb~UeKZymX|PrExWgOPn0OlZQgShS99wV&vFkk;OaohMAXc;)kcZpg>WwJ2quMN!_L zCxMyn#hbz*mAIAA?%!wd`?ljhBz&0ownT|7vPjLMIFGvq?_;Iu)i~;W_HZGIW$txV z^ejY*DaT5+UPpRdoye($ zZ&s#)qjTh?4>zhiBAMWJ^V{P17?wx32L?yCXOmCK{O*=>k`mO6TBZkh5ss)8VUFrF z{{SqoMk)&kc1OC%t5G7PwLFhygBovCW&~5@@IK~e1aovQ%wG&%oshoFj^EzR*6|}( zS3Hg+$7ECFr2Qp$WSnu?hTaaEkK>5!hwv?xrzHiFbJTIaZBgEt;CwZHR!bY3Gmp~IN$HtfW<*1hp8`dB#t79Zn?%Z! z+=Nn!!22Dm)$oMANlUdAM|ymo2W*+LI){j0>5%P%B16JCdx?CGS=i*pEy%dGOc^uU z)<*Th%tbZ1PB=wwrAN~f-@J_HgFxehrg@}3#8#e!XH&^1-&A%*Bf#wLj-~H{g2l3t zxVGfYlE&iA`cW31HsyI#2lzvHByDr1i*q zc4M-j%-WwPf%eCetJP4Z&U+F#-I8tFf$lqG{`P-OR#xKmBbbqcmc(MC_HQS+mJD`F zl8VJNhkgq6cEz7=FEl&Tt&K&;tW#B{2ol~CGt0u2OXbB9ow5SKSVp)1lncYlUIdlMr5NbWb_Uo3LeV1A$Nyx;2izB^fzjZK$ZxY|i->IkaSP$nwoOGNN)V`#*wB z>@|a)4Uv=je=Yp8p4$=6lTfo|+x;2SLrptiNUuF8<&X5TW4$g#!0hi+*kf@#TASGA zpTpb1yAtxxqxxa9@hJP)qXtD(i`#)z-_(gvl)Y5=B}#GkAwxV4n~u#9>7>a)!QqXh zZ!S(YFk;y3Y*BJF#yg2>nu);M1pQkJZTOQ+@>mVI56K&RB;gm7KoC*{cSbNYJ8v zvU56GS{AlDEz0xJ6OsOhW=oOYmm=VOh>qn&h9WO3VlO8PEY3u>?21uZh(*+psK=IQ zNaWzocsH|ZD=e*D*7QSxwGE;r*sT5!#V_O$m#lJ1*%+`vm&r{Gt}@u z*2#|axfcT;WLeb1)wQE6EhR7ghV#J%k-V5aFJaPr#HUHrh@zsfug2t6=TTExWm>YY zv)K*!LS4BbN>ks2Mi8g6C&5xuGneWXHb+g<>GjOb`DICIi1&G8`7sM+M~TbMZo)`$z3f>gVQ1lx*uSDqFG_8+Ln=tgf;VzoX+!22K3{k27vpMsyKVSSHso5SFYb$BBj4R6~1 z$<0$)WT*Kh`6Opi(`}r54tn{scsa5-5XN+}8r-U}G8?2~$Ygjc%T%yQnG-Nz$LK{- zpW9P=i-C``_+gFURNP+TPETX;W0I8x%Q3fp%W|~cN&O;kR^AAro5AF4eeDz_hH{Gh zl%J%0*;=F16L-5C%f3w8V@ZP@h^k7=ha%v1c6RZ(LK3Mg$7D~WoIP5HB@Locrs_{D zTP?4i-lDd*_~KNlm!(-*#LzX1r+nd(k<-IFu^mG6N;AHj5lR@##HkXg&6Y^l{_4qU5VSMtN7!E$mOCxWKn^?izOzq zh)RA9dE}ap`LeSWJo}iGVkt|(O`S)u>Db8GY*cxfH{-J=Zl7{RWJ=s@Ly>WO7$qpv zj)LS;prh{X31l0;{i>{6C?9~qge1FYO~V$mYCJ;+q_ z>`CQ3l;rhU6*q$@T^&rk4`tqjD{%K6RD>ZF#&Bn10^oM(;~A#pPO^^BCHWtzl)5)9 z=dvLf!D(HHe4(z&ll*YV<+i3re#pxPuYt;MY>hryv5R;kh>@t%^pc%Qn=%nld65}v zw7=%gosk*B$yMr+Cw7NyStA3hq?LBfa(9Y4gi7CJMeQAn`J9=O_Y7YBvg81XWfAua#gS45}rlPwAv?8 z!7IRA7~D!Ll0KE`iAoJ`!N%76C9#n_8IO}XyppQ*X+q#ddHy(L_N<6-{7@e^=GpB> zj>-gu>}5BJ5D{`6PeT0Q;n`TcHVZj~ZM6B~7U6>fH zTBejq4@+NST6aY+Zl-T6Y2w(};S6@GQc-v_g_cTrskZ{6;af1^ ztu;;!i-MImRp5S@>`!z)-1m91wFu%Qz6xH_T(Xz^$$DbPyBLMr#^qV%*&!?l!_AW- zb$kx+Bf+viBXPk^Vkq%uPljhB7X?WzvQ9NMZnh&yHC%igB>g0~ zCCL8(N@MYQQPj>B3G!3ms<9)cd00A^glDz!dh^1--fbV7M(9lH9!Xi0`P@%ovY*)o z*_Pyg4+B{jwGZTslx2osmZvQ~1%3wUcCpp7`Tete4}@q{Ccx zbg|8zMt{vL{rwOrrF>m8Gg# z?Zw{6o68c&wlnZ2WQ-Ue1j+4q5cZfM?!plFx@Ji&F>)zpq;)aW#|1{@^4PZ$&!q|~ zjBr1(y~n{nQ7bOqZ63~+o))`E`6J2H{{YN}FxdT4{S`Kd$n9;2uGhg(pWWg^+iG6? zb}lW+j|F*Yjw8uEG4{R3nGq;MO4Q2Rt4ku@BPt=A*|9~*WYZ*WX_Fek2;|4f6{+A$ zOmJkEHscJdycs8mi`{e~eT+qCh@88}l0047MM73ZDou-VlvX8Vc{24RA&UoJm5nTn zUIx@RXHOSeTAu`oZiU66!6K|o2_8pnO$q$=Go`1GTNvKM<0sJG5iR1%p3*$sJ7&o0 zc0^ZVcru4FNWoKLsU>ABF;C#9?X?I#Sj1#cGh}cqp|=!OqU7~_kI=GGruv$KN-GGH zJP+#7B#NkLYWN&X8{V8X5m-p_GG5asgZz~R*tZeLj-*Qp$q!?blSub4R(_&nu8Mxs z1a?O^isZvjBSmcK^pvW8RGKSOokyVQ=&BIYW^j)q*zz&^Nx*Bj7Fo48X{NsH*^;NW z&)|;*PH&4Y&aGhaZSTKjSngCEut280B|X@-6VGHt=|$k$+#XJ;=47}Px#HPmI(oG{8MR`n9qFvG zRQz$$xe}Z)k?w`{d_HWLo;DKo?lj`{NKH$DkK9z_wG-Knt_N6kQ#B{ph-p&GBPA{^ zBLzdq`61+c%GfYs%FuYpQRZWQEx@-abgrRGq^C@BiZ$Sj(KXEGWKVLxw3jy3u}^V4$4p8v z(HmoZkLawJ*qHWP6ZJ%fc1)M0@8nU;%DyeivopC<+D~VGdohzACl-vF-4uGf`f3w~ za$_iblK%jkBK+A|J1#O#dy$u+woiF6ZEl~Zl~?dp#wkdjJ zpOb?oSCbzW=G+K;VU21kMamdli!~|wxgomASHOqC5_=V%A1At*SCbgsne9T{{t5UK z64>eMKl#W@Ve)kk6p>{fX&Luy4%e@e1Kw2{!ycM`MJRh)LSsARYxOLkL^ z5QaqzTM_xSQ_21cyxx~5Pb|bp;LY*k%GpbE`f_Pxy)ih5)}a+-OL1<=tuav^?&|BY zZbf6Vl)oKB$GqDyY+bUV)v(he!42d^3*^S*SR-YNRDKCy&!nr(>AW+h+5$IyzD6!a zW#ZKn`5(aS-U_ljoisH_>LSfk(QUG5gXj; z=(@5a6$E>R(Su^HAwm>=RSMlkt&rdC zLf}_>NaV%^u(ma{b)LIY>74f|K~q>8$o>(h6Rl&>z?e6-S3<5?CmKPDiV`2WY6!7mFRg^#(5^mJcv@kuTc>!*$zU;vh3cQKW*z6 zw?`dP+(NcRxsi>E&*s_KoUySv8H zC4uZzng7H9KM()`0|EmE1Oo>H0|WvC000310ucit5;0K(5FjE!VG}SiaU()f6hLBu zk)gpea<|vco8J*Gh4LEL(6z;Lz9#@8cEzW9l4q)*~PNzvp z&&VK43QLyhIZ@-h_yD_?}oJKE~-AUk`$8lI%hXLapFLnGv--br0$&;$h zTYzd1T57UFR-fm78jTM3UL!f_e~-C`w>9HccxZ*yv>WMf3=P;DxT!;c@#(+;$r90p zg3TNB3VLoQGJs$1vxRKeb^goQX1PKk@J5O6rBJY*ofGKQvzx#?(&uEbgYd>d9xMYi zE7r&x0*dXpa33z&oxw@{H=R+rME>eO;79&SZ%)B~0Y+y)ugVqqkA4reQ6CwZ_X-a2 zz)FNT{0e8@H~T11tg#_c{*)Ttiw_y{yY8~@s+qdF0Dh}I!hMuw3q|zyKsVu2AG*}) zv|q~az8Bi54~J0P4u_2HZxn;fQ=IXLl`+0lpb+{{3Vv07JkjWUj>yJb7FXRmA$32x z{nRs_pIWF$K1Eu`abH6D;96na_0(3v0U7Z&?sP8=aP(+9M{sU7j@rud%Gs>6oZc_h zrQy@dtCpbVP-`yK1390sL`$x9S;mSo-G!I@NcDGh3TJef_OTOH=w#07mkv$I8}&xS*v51kgOfiac~%ks}rRr*6}_vu;$m zTa~K_upL#hMC8;%Ela6APz@Za*IM>dH|XSM%uvvzC^kByj>v!sgdJ4-1(fcM#TXpI z;X?$Kj=2u}D+MuxXcW6W6}WcFvu_ZN9}tVE9!TIjg1-Yss+}-w&=l&mDpnr7w_$CY z)S($HM$8CEh7Ne~kcn7FMFaKGPfzl>Y~HFH zmsDQs0Hxfl=*8JbMaj*oz&W%!EPpco6dy_*MymYFIa+S*yS|I}2w||*at{&TQC!#J zC$2$a>71-A^bWeJdn->pbN-O0aViv?{@{4FR%=ir`+vGEn-lt{geKuYvqohGwtG`j)*d{3wwfzF%bxZWgR$<(iXi0)Vi$ zKCAgq)o;yz`iDc+cyveSqQci@o24@yX~N)90_D9=L~t}d{{S-aD#Z#qqA65+7zL!} zoE%EQM3+6yxCJ@;UR4Z=D--!y(V;*bc&gM49no&i((lAo+(6JKhKX38n9P;-dNn6z zp{LAucHM~NpnbvHhYYF}g~Qk~{{RS)o>oM-Tx7%@rbkeRM)V367Uoy-pj|?BJenYt za~+lnRLw$jDc=(h;c5UAh^J$|AKa@`4Li<|>k!E$;dM`n3$ z$j|kicn4H1bN3U#cppT%T}jp*VLK6yzFRtb~URN7v7h=zpPZ3hmC^ys>48$PE&**|BZVvR8` ze??HyWS2dxzL}v*WF98a?^Q*K{MB{i`!>z-_KvzWRCd!+YEyTkpipC&N*sWdVFdp#!M zsaEwJpiS6zad2Vo)>W?lr+}hWf^%_}+oHcC!L$DW-3Nw4@;`}7GW9hD;_X!f8yR&g z17?oOGGOcPx;KD})M@t<$EN0o-wTUDRT|>}s2-7Eq~sJgH7_^QMS;z#f;>DKz+pVO-aHpWL<{{=+U?X=&8z3oQo`>wkrtC_0>m+;0VYf z#yi9_)dr9T9RdIg28dj@!ZTR9rhP>d=&gqgere&t^dBO0geg-Wo{75_%a_jmRtkQd zbyQ@0$d=`zg{fGbp6vJ>jj~t{PO@X2bAW^H6+kQ|#PEOC6a@5aaUQ29LR) zA(We&imgPEwA7KyqWd7(eO+`w)dir51gs7ItJPWNeOPbj)ooRc+k+(}#FSdbW-jei zl=^|E&~jD&tv^LdoRe&14y3QORBy+t{WfT%-)O0yV1=_O1j@co~;_-}lQ-||LjXUAY_fl*XKMGIbK(WMIAiPbf{{Ru< z%q#4}maE1801stMeGSG+sPFE&rBcHip~JfF7l%;buFRdP<`UniWQ96+bGcPLg_$&C ztnTW<8Y~B80dj!trQVkR04dLVi>kXaRoy5=lhF#b1BfHkn#%m`$Q=+l_1`@^r%|EI zTWnnr7@R?O%DR?XBnyBF+(er6ekwm;MefEFhV0nX%Zz0{-p?qxRqeS*aw{cW1f z8kAl2FRG)xEY%vdU5VutG0d=@aCKOlL^H5hOI+6BnNlCtVOb5$#^Tr=5fx902C3d1 z5)5<;m9g%ED`Fa9R4V8JP;?N2Yh^S-o&g*^)z#KsLEr+Y%HhN!X*UnzAsV%@F}k@3 zuw0q6W~s8Pd`i*k12h?gHZNs{Ck&KdN*S~U;c#;BOjW=ygeIEpBDx;EKz%m zxT|`4g^H)cB=WdjIgFy(wZHQlChZjr)^*%mogSW>nA80+cNOB1@ac|G{uAodaBCPP z&M3a(i)~H4kn*8V01Moz9g9=hs|ii^jm7>}BcBDlf{GnCJ~=6Y>RuZi;=ks2$R}Yj zO`fL};n8eTo1IWJ$!KYZ`zn-T?R4Eq-0VNoZfUQ{uDYX6uc7X_MdVF4_0beR^47oP znAqk#&i7yZWfyX^%~Cp@6n8;ef^y+%Cxh8Bdlf+REmc}ZPL0hvqUrK69JnvLw;PdE zOAn^b8Z0bmsZ*<+kV24t8hT_G+1q-qv!9?%q|RD1$^p;0M*jfPZhE+;P-wfE&F-je z6U_GEd}F#{`>=k?z%qQ1p<$FTPwdLL}zry_e^RWU?JpA;k=?6B?D2=et?O9u{)vV zPpeYo*{RO4dCot;R5oC9^`7NmH{=*r+e_x8{{RqwDqYIdEdcc^7mG=OjOt=aZ7MZz zJ-3H7I-M%Dag%$%{S#?0OX?dZ7W36}V8W?}k!@3(osds=i{fGB9?GBh1n%g05~T$S zrkIZB5~W=P!=X*6K9#Ip0pwync?{)JWT)Gr4*9UkZ#O*MRNAVy;I_aXr9Qj4PB>dN zQ=9}G02H>GW`9I!)W{MFWoEPBve=MiPfnpoICj^YJMg0CbGW8$6`O^uxW&|=a2MG2 zSA+GqbnK-5>X-KfJ&@u%h@f!2d`AbYu$>oB6RU4YIVQGHH_PuYA+HF$eGF@WK3e(2mgZLekre7)8pWS|VHdSVD3oE`X#r*a7h zZgbsaTusjEKZweC>Z?=wmJja#04a?}j3MV8-+*RQqSV+d6u7{5?wLZ9u+t5^DQ{cC zcVi>E?B!CGQxzPnFjQ-Vs+4Fr7PC&P8|T7x?wL$B7%sd9e_Eiw;R*Y8(QTfWPpIgs zZ51x#)1V5)9aDQ1Jwft{sUjPxQ@ON3vu;(<)T(jOXul-DfATrMvJLVA9&uP2B$PI0 zf9yw6sy*49g7MvU(;TC^d)etD^g!oi=UbK5M6>fjlZR+$q@Jm*+8lgGH?KwGGN7iw zWz2S|_`s=8A!J_Qz1E6(T ztyZ6sFiHcN{>U|~vDG@G`UGC`HgyvZwBkc7%M1@-^IaMGfwPjNGbJ*#MG2ZNKWOCB-tA&6!NUJKrgT zFfN=OX1&;i^i<17F~w2>X3_Q36Wys_n*Gyzs=Ap?(Nq59&h7FFK3U*9 zsL!dkT-I+?#!TS~tF&qs<_l)|PlVh4Y3<35<{AQ=8)9=RwLGAHi)E(cjjpMgRVvhB z0+%uFje4B3=^73qyM#dMpy#-7M(npd=E`yg_|Z~N{Qm&Toe*}U5UG13jp?y9>7Bg86h!|dd0HW>o7>2~VUNL|hV{%lM6L zl`7RfTVT~h1olCKZQH6;GNg@QgZCB;=NF#5*Je{zw;!oPEpHI@%$7q=53299|F(<`>8y#%AN_9P|TXmcI%FJTxTue$p#)I;ew;4Ys>bZENz9YS@LPwgn9+i^h=q;t+06FGsUHooT7A2MEZ0K~5wdXZo4u|g zKr)|Ewxr7WHXVjvN9opnhS<LyQ-F|3-htGD%4}1CBEwk5J6R6tGJ2{9Z)1F+(}L+B^#ki?1E(U zN7+03kl?1!d2opx(fYSQyr3V=wN-|OkCi#m0SA2vu2_>|_=s|2sekMTMCy6-CO2lP zJW4JEuys{7*U)PjOyUj}y4tBRkE^xUc!wT|U|Wh zM|=0&HxjB;)dA=2G^3a|5cdk4^Z^JwIVtFbb=-GC?umB!>ASkVksF)7RVR*=%7up@ zuA}oSL|SeZ5Q9Eyg#hwF87x5Iapn#kbzU8AdR~(v@S=tCC0}vfdzJ6GuI`57o!-inW+bO~ zT9wVw8Ob%jQai97xfIiUL1C@w%M$oTRYrk?Me0gB`wjjL8|w%?!u$iy@p{rYxSZ$a z6GKL5BG6^XsOqGs8>FaFxN9gzOT3_l=aJItTaXZf16{-rq#NV{EjdayfO1a6V2-KH z&EuGNKu^TYr%;`=Z0utC`*V@KtYRO^Yib*%G6s5JIFhekAERr#wuK zWZ|7Ra=8W(@mPBGUL_gu+-0rPP_ej8C%2!v@hLkN&i5k$cU+=M_2CPeUb2M)aq|Zi zYe0W6-6|GJRt9@Yz2}3noyAUjg_8hHC#o+OvKz>x*~QeL2)e#Lo)s#Y9-isp!wxMLGk=u#RI53>zJe2~P&}VAPeeS7xb5Xt z9b0vKAfRua5x9kPA!T*{!~iA`0RRF50s;X90|5a5000000RRypF+ovbae)w#p~11y z@Zs_Q+5iXv0RRC%A<^Py_j3fAC5m{140f>5&I%7ENtYZ=r5Sj!Vd|l2@d4_@Tl+xV zsfGH2oz2Jo#?r(_W>@az;XKRQHWLiyqQ&boAWO}61AgI=ix^yRJ|@G=G66)zt|pi| zWsCTpBNwb+)B|qU7{R%1L_o2UGtrrOW(8(d^pAcf8bc*P2eGQJ>N2yeUSp3CDQMFh zj!nVxl%>}*9n4E=;HBbcTo4--%yEu9MMuYT7jaqYZ47*M4lXm2<|awK>O3_Muw~fN zRn8_?Gf;S$ov}BaPCJ9Chy&iDR|8G%WK5j;W!l|bs_B$^j1{HkTIHEkqb4WV>NQ?t zc$bLh!3d{hB^@%7Qs$*b{?kjIp^_GJ9N9lGK4k|8cLxulcqUrak0h+dj-f79bE}wR zrZEo#4=`|p)Od?{ww#mE#}MCVn1vgURj4(cl??F)l)j$g+Xd;kB+pU0-aL@F{@~M^ z%&A(AwlPb2bq290XATuBd08=i%(bo}F@Jb;_X)eW=LwKb=7h2ysu&QI`06O5^>c}n zG1?f6Oyd&zN?P3LJ-}KS`y%9vjJ41vM>iz zgx9tmD6er(nMH9cV?mZyt1xu(OE)@Sx2dO6g1Pz_OUmwV=(cT5zs#@M`^H=MJ+jUi ziwt>tiw(=Mm{MM{MRSVrGVtyi+|<0OXJ&NGte~E2a1C#mHO#IK;Zdj2{B<4N-#-y! z&2D7m`IHho6hf+)C81EQ%P(HvuIjm3hcSchqQu6mbJt!4K53Th=qK-mhz95Bf{{EC!H zR%;{~Fdt}0yf0B(EqR4`Ie}W04VG~?o@PQ1WU1WZtnTVL5cG|Ab1q7Z9iQB~toVkz zg1=aoCM5#3Egj$D7R(Pa`9%wOpBEhi(K?V!##qY2D9cQ5re$~YE@|LdG8{abjdKAS zLPvXjpj2E}QeI-Z=3k9VVV?_^!y4Vpk8x2gOh5zFF@H+$>JZl~a{WfnQztRhxiIkr zNfnvC=Od3nnJ%7Q65W#ByvDL#ue7fXF)rC@2XF!q`AmpuYj7G7Dw1E7Lv{V4*4N;i zV_m|vo6Jp271uFhyYn{3<_#Vot+z}YKXUOZ$>SN8m#Uq?06dQ-Aw^q(DMlSjjsS)= zR>%)-tK6gVo&Ny85}PTE^^PHcw?MD;N|h_Z{{S$@YkDSJgTt@1cTaB-=Ou8;)%loS ze8ty}W=`=cJ$m!1F9`WUod;VnrxR`l{yNa>-gIA({@o>w& zH6I#*z?qI-p`u?HRoYw~mcokk=c#*5JB7!M-*XnZIE^Kut}0WxYtQ#Ki>s~vBNcDK z{#lYJasL1bTG;Hf^)0Qu?J_4fmu&uHQ4h$M>f7@r=(8Nl@iy@m<~*foe?smv1v4Kk z%?=rz{X^VN-$2|IDQIrvQA4Rz4%?P8&cAaEr-Ip1yy|8&J+kzIrx+vUE*O1GDa=&1 z)q_Sm`YDN@OWf4)Hh71M%*%Fkz`uwyb1|q>F3}vyS5axiG}$G+PdnjpFF@0bK}VTX zrp|kfSWqZ9gM{LW;xx#<2btuz+YpL_*RTl2x6|bgcS`*ZwuPo1bms`XggkJbcRx16k%^ zH_J8mn3PW%zY`SIXnqM>M7&|tEW+jAF@(Io+c8QZ{+48#@x*^}k*{3&!Et!;FYhSc znEA-#DsK{EerQ^qhG)`T!UZ8KE|=U29YcADQklat_=7E{6lQ0l>n@YvOnagV*QB!v z!xsZ-ex?~$<_vCj6$=0`mB8hcH=i^9F*HwO=oF3*Y}3rZKe%d4+!gW6%CUGs#{Eh& z0`z=K)TL@y!iFx|ASgfOC>wAiBcHhFDT>7hSJ(F`?(?0nA-0t-Xndc{!Ffya`jz#> zx^43-0xi^B0?oa_s48bL6+v(VuXCR<1ycE$hQy!XnNfwm*E4rDtB*ZG3z$s5c<)%u ze924dCI0}AqRg?3K;j6^9d~t8p*m%+q7no1E^xL{l68vWV@rWaR7YJ;<|fN)iCC(J z#Y@wPre!*gxyy|-=3GOPVTT?601~wa2Cbd76Tr+B*Y!OkZ;8@eO@zffP4Y_-ma}jw zrQ@l?HQ)0Zv~Ql+oCZh14!fmeqdPRaX& zTD)-e4L5Z&M5boDiOHWc6Tanv)VOEFVnDy3m@TY zRRqzvLE<}^`j4gs+aD8<7xaoJ9LxvI)`@0#H3vWPTf!W$4#RT<(Y6%=iOx&^05K?T zvSuM6Cos5zqm1}U zxt`MfarC~=akoD))rT9JhPjmv{7iFKQuLf})N$ec&P_}Tg+fp-M=;Y=)5UcSEAb1K zldfP)d?l%3j{gAc23kBt^A8Y?0U7ZE?2eNN+`wS>+})^Shs@RX@EDW>?(x$X&@`GN zUEAugGn*DFc`+30jlc&l98CQG0BKx>@)!w^v@vbPdE64&)!~vYda6xkA&{xY@etyk zhUVav-J2QqKe+V|#PYKgi!Cz`bpdxQ_Ao3TFsx=4p2WJ_FhawEqkag&rw1>@1yH#1Fcx?in?_q8 z*AMXk<>rojk;1+i%P8`G;CP%&n;s)~`=S29+I1VG+SrAw=?F&Y}^oPqQ% zynRhv#F5+-V)&FrUA@C$sao6x!)E3*hF*S#PL}7uf7qze;ObqYJ|(3ZTuhPIn1qa!+IoQ*<{4iJfl%9Vo*|`oEuJO@dV>p}TmuLN3cRQ4 zWIRL60>J8Df>0eFK*@e}SNnlOxw*x`A!151tC&vMu!6{LC9b1_E!e~50syNmuHIBS`YRP`t}zvEG8`48qjL*)HV zIW+GqOJ{WDaerABKxMtJuv)l{$M-cx2rvn)u#H)+n;$2*HZ`A()(JXnyd8GVUO6od5 zaUJpz=iiB8X6TOx3zvAl-fr$#&Nc68OmdnBJ+Ydv-+EPjJqG z*p}xgxI6PcFFi&_OxkguWYbdW0lD4MU17BtmyFtMz`&M7_$Dxbx#lvn0bgtpK{tJi z8OU*QEdc_7P(VRcaW@lD$tm3D18mqTnU!u{62wgVl-7AgzdmP>mA%|J#0nQReN3@) zw8-$^^GZ4eukwVjuTKYl;(ltf7c261v?eyAm~1Xp#56d4-eDBs9k4l3>bNvqpbMj! zLXG%hVkIB_5YuaWS*C#twC%|YNAaL|rv&#`2Qa#`)0vHRtnn|%xaxYu6K`b;1{(gt zBzw3`FyYieg8q6ZCuD4ZsAa#**qOXRwae~C8g5)bfY{Nr_{sdrv72=`x=t!tF8O7y zpAd|4&R{@MHy06Myu#`x8@tRkh_48N1`Nz5p|u6R;T)6lsiW~f5{`L|hMJq3ZjLTG zftJT!QqL-9muz!r!k4$q*ev6?h?PA)B}vfZm|eE5uTr8^d=92ybXPK^+GD)3UJaa* zxtGI1_QW8&E$(4Jzi43a%?vOF)!Pi(a`Hy&+vNMi;0E$M%T(isOv@R?SL!ME4oN{< z#r2&<1Iu7_?gFs&ul~x^i>Maq3wFv&ox-0`2`hpwys^2EMyJXb-Y^)CJ%4M5ex1xC zDW@cDPGu#S*{#8#rsYeicFV-=FD%1(fm*+ql)t1c#K_C*^9xqWINuTSZ!@F!iHfaD z8_PEx6>ehzog-Yyv18fs9!YiGd{JO7!g)OrtgP5^>LX!S8;Z`3d%R9}InUaZoD6he z^U>~Aad#JQX^xf;s0p}c2m|lPM9*+Kxp)GWvB`iYV#duIjj4EmoLaShBTkzYDImbn zJf-H^G8I#3j%=sM#tE9m`IrX{lEhvuSk$B92HS*ueGZSP6!82bN)AkXqsuhc_CTR_ zuRKq@wRTkY%0n7scV7gx2G*EW*_(+HfcCT3OX&iXa;D}Qr9-dslkd+uS|69h0!yT79}ySTsg8C>pRg>|nG-XzCky0Yw-801+90 zHW=$iQz{LfYM}`#tYnm>f^2w3Sh084#x70%lESvdsacu%`UZOLssvx%lyvyx@5~nvAQN*g}KTEH0 z?!MEA<}B_vi9~sc^n%9L&r{5c?8379$~YgG6Pd>5T_?3)`!UpNodcuHp&$7txk`d5 zpRyyWrjDgSIrf2X%J&Qys}%DIA}*CD%=b?0`G9rIt9jyC2V;K-aH`iQv&=~>pM9QCiZ+p$h_xltO%$ygrz$=KgKRL zt+Ac;eF*)`q=9M7$bJaH+xnL-Uw)C@`+gwpz8O`Sb_7uK3XTXmNookeCGD|{^YMgH zv(cgbd55l#*m#yRX_>_sU+hay^iC+PQcYM~Zj@#hY%|YN%s%|YJ{d5e;yK6j^`qu) zFeYv0UM4|+X13>jI zEE^x(qt4CB25J$H4O5}3)j6+)Qsf>B_>%xnu2>G3c>m@2!uhXk}l?7AKjSibf6LK^4! zl{aTLI+$|;?iIyrYXdE;pj2Ozu!gI312UCYajYMf^wA|-$F5(*;R48KHdK#UHemr41Ic#!@vv1|pq@rbz! z`H9s>S~1D5o7}$hyw$@1V&bqxE5yeNo(42p&!P3aM*%69nNYeaEB7n`!_zd*(|4$< zb~^jSrhUo^NkEyo+R!$9O87Q30ym}CP~O-4*f+?GQ@~-TlyOFs!u1HtirS->SUi%! zzlcO2fpg_AQqDEpYp+8bO0_=0a5-fQ9DzNcI0=A{`wJ;`3?p$~s+ZuNp&dO+p>SNw z2T2iU;am`vuDFJ|z=$Y>tz?8WAv2mNmXIVLz+|MW3=N{(Red@Sa{Ej-y%9v=a+_3a z;yY(D+@<`9X(?_mn6ctr%dZ)hPjOab4ZvRQhpj_X7{W=>m`MW=+v!;242;NR{$)m0 zdWW3kFw`8$w3%KZBUah{Ml=swi3!`vl|N&W+CRA4ay=1xN30lMbEuoqOFT@BOMup@ z3ej1kMIKs}XGq$(Kknmad)1qavRuE^F4Kr3EpBpX!zX~sL`L>l{FzB}-vHFaNEAcNV)H+_bEIPJIYMj3@`pg%` zzlxfN>aJYRC57F@H92V&Zz+RkgD-$a+!CL;DvQL$@!z?~Qh1pyFWh#fTl~(vy~{en zbJRA^lvelVSm?7qANZO0ays6BGcan8xhsC%R2xyKL&sEcnwJ?uFwArG1y1Gn1`&2a zR&MC2LBEJV@6>LE`-@nEQ*0~hge>0`GB>`U@-rpVQCM8q43lF_qS(zilrJ;4Ey5aL zH;avi*2NP5e37~(@CdNtmp>_(3G0vcq8jw8=3g;@wNcbl`PDjt%Xx-GmyJb>oBseM znFeHGtsjVc9R0L+W9|;3A?5}rKHiDc%3Af7=6{TGMR#5${x4<;r-eYJSpH?kzYJDU zk?@aKtZ>FajtF-t^;=x1O68e-ZxQ%}HMJ+nhNf02d}sFn({JKr-^~)YBYK#An#{59 z7G|zo9_8nxE0m+53d8XnHHdPsp@TlAzF=^-nwDvEJR#(pCHnOO)nj>L1_*w=%5D#_ z_>A~U-N0Z1V&(oNgAbN*CgZf!a4n04cyYC<6ek{ZugR3?jE6@D`?%vf{wA4JDRFeU zk6uKK)f<~hj+W7xOI%$J$%11a@PtRl)KwrDi9ml}l+R6Fm_piW;Q4kJnSA(c;#ce! zyUk?=E70O*Dgr7FVL7pG1_G!6FczkKhU4zxaB0CF-(Sc6P6G^cd_)6a>6Ws))U8V` zvl}{UR+*SJIw$0VaZUV2nd7NaUg~_4$(d1Kh$_>Q;sU#jr*oJbAfUOO&Uu#RekUJr z`LPh_UU`_tP_e;=AI$f(^KjBY*ww;qYHt0rU9_6=&Zk~1<|G4NNYWrm^#1@{Epi{5 zm;72L1v*|Yh|pYwK$b2@I#kDhJY3)1{v#nlz}&=UFMq!gM44$dGU7M^L7zBi?o2z% zlpXeXjct-*O!Q-6-0oCvpk>=9QSWUThq!wNMwu5WaSDK9q6$mBOd@Z8ViVkawCC*~IL+Od zLbm)Gp(@U$#s;R$7jV3&-pyRX+gw~RFk7fow7GrBfpnCLYZC`Kj`GdtzM;DQ zB~PK<0RX0<;^jaqj;2^L!FI|ka;-hf7Jk!q>Ys36RKhw=r{cwLb=-P}@0dx_g=w8R zmS#9)P)c9q1s`ZHNc{?$N<-?qd_Z#8rpxd19lRixVte> z-YP=n8-^ZvhnM100hmdC8kZmRsYcp?G7EKa2F1H!re1Ll-PUJV`I&J<`#nvbqrJo( z&2s%fAlmK#SLSELZmyzetWSUO6c%-oTa`zLnCKdV?J-KRSK{tfNZU-vJj}rc+eBmW zlTVK`BQo_b+$&(@_0Q@dAqOvLmy??1!TiBf^2-78MB0rWH+)1npeCglRItX4%XBM0 ziU0>OkF4xum2dfw!SG7UKWJ~l1?<&4#eBz5*OL;8eCAO_T(bM9C<6S1ta-$2CAh}s z^$y0RdAgslhRgFXwgUVp_bo*@sb!oD1Jvzo@#^6nbnkKs-!O@eFFR$52_1 z#IJ~(MZ3%qJg}*C9Q`1nN}^Os&b&&TZeKKrzn`QfEpYY3YnM{jcvCZkTQU4YRxW^R z6KLIBrQ!mjm|6!A&vZP)3kJ!u@tLym`r}{7l^5;i{Y^fU*;6~7G@`ov60uEJ1?H*? z;@!+sQ9}tO@V;4qop474 zujG+@1g?s{%1vR9D&?30lMVRE2JjX!oj&y&1BN(?$w$eVuR3xO3R(&9;$B)ZnOlR* zn0f@r0`e^2fL1(@oVIH2<58VM?hZ}(LW4gz@P6X1^8)y@n}S~R28Mc>4byN6E|-a7 zcchf9@5}|NT$$A!%XG#k^>V|*bV?2^N3F1Yvf2Lmh`2dEG5tgMZ-f_Y>NvjY7RSZ= ziwdaC4~fw#RHHvj5X8H276p(F%giCm?30`82_;?}7s4&NfTAoN(IShH6VZ3fK=!y?8_^Os- zawcHZ#CG|b))@2Du%cSUZ-U>%0(lkjJJCU%=6Kvy!AN|435%%;xG8+aJK>ySS@D^J z^&b+eo!m22xdOhFJV3v4sgUp7xG({jIOZ%S-XMR}F>8h*=EhgxnD36}K4N6ex`iEw z=&y3W6S=Sn;^=-mexS0TX}&+qbzN6OoImd2fsokaPxmN*BCYE%9r}$k^EUp1jIWu8 zMri*4Ho^B6x$ubUq_F5{m|RKBr+9wivy2z_o0kKha%)sho ziTQ-cJbUBB%WVz9!puP3z0SP@&k-Dla-uR7h(I*c%y~0r-@N4W+u0i|GCkUKg-Z@j z=R*?9+}vp{{mPoSe>!3bNW^}H`XyEqsg$Z^xs*%l#Avq+MyS5WFVQn3F38Y01J2Bts}mzyS7?QB z<9=mP;Enj1#G>ZIHx(P6*N+mz>QkxlD=&RVI#i(&$U*0RVy*uG8k<#h+!5C^M9bC8 zaESu5R~xL;_$axAWJ7f10w~1d`(g5|lyfwWGc3LWMw;wKLy{XO;aIuE=KJaw?D`>9*mX2kDY9SM0$ofW;ixv$p3?F41gc=Qd#Q1N z`;l8aOQ<6Uxm|O-A$uz?mfmbgPo0OH@?^)^r<8rSOzGWD?V@BQa$Zl+yQ8&`r8@O}>8yxpZYYQJz|X1TeQXmf~|{43!) zJaueq+#}cz;$q~itkk;y0H`hh08nAL!x3VB2IJLS;%ajnRsR4pKbMv?;Jw8;uTTV# zCVBCxVQeu`i%~Hy*~j4yP=&^BK4j7USV-w#b23h^hH#uK?&hJ}E&l)k;NR{LIJKsy z5OV1m6kAf*-J5u3W^rBhgpX`_P+_Kr6maT34~UB9i+2V_Ag0@`GQxDlr|kloab_9a z9$>@=n(k~Ho$C+79^&yyiB!WM%&1*d8aZOI(;W31eJ&Y7lG^C2&!|v&+?26}ako}m zueNCqX;q_vzc2v3kJ>p)n4=R9o}%W?_cS{C3pKhYlabUj^^V9|jXPjq2jzq7;w7B- zEMLUB7w$Si#K~$ToGA6}bbFOLo3F2C*=2)5ssZ{H&og3WM9>1g4mGXN}@m0=Q8C?mkRGUxybqcxt#%U9Gf#>N=zInGC|U%xgR7f*r|U&djb$y7?6PbrR987qJK%Xn!!eFXCeGmNmiq1`t;v1Ua1x_XMiKEha`dkAZ5o94_Vj zwal$Rs6H6KymBdO!xsFwiQT-U%ximwyQ6%{*o_s1%0ag+oPtbcFZE&L8KHTn!-fTL zsut95Hx*CvANvgAr!%4Xo!$U0e++By1BWpHxrX0zP|qcndEZc}U1H)v8vT&zIb1-$ zO!Y3m#lVgo^qLoEY&6~C3$v(u=iC%{myY9F1IYg4$@+?zsB7jh9=_N6nzbyqaYc6#k%NcZ5Q)r#tyj1x5qBh#S0{w1{*&!{}6V7alScN7At ztjus;ZPfn&Fd}+@gOG6_geUfykV`?fQHswVmHUaCAn4!Rh|q~Wr2gZNEdKD*CKN2% zH@J1WH#m=$Dz0fX6258xiq1K6{{STl1@$x^=1`EI6sg%$8SX+Z$kPz{^93p^jJ?b- zscDVO)1`Cb5T?L=viE#P!{%Q3xn?glm_oDo_ETEr^ ztqhHUA>hzDa{J8XNMjAg z*pYck2nN7k#Gub-#H#J1GW)pXnkw+XHOe+uaI?5J+Wq}kSm(rL=TV}Q8Rim;95S<< zpGQ+9kQ2fx3#DL*foTkooV7MiF0_-{#`mDE&kzePWog z<^qnQ%fiYrFBD9e46Y&FlHw+EmmW*F`45QcuY~Q!tNTr)TA1-mI*cO>y?jA{9&vmL zl&tOsLCA@9SrMG2TRmB^SIOMljJ{qW z7J%FF0Xd*6n%D6f0Xs+aATfRBt*7xa#KS06L2-Mr2{|@Z_8={LI5YNN>2k zM^I?ot9`-oip;>9A$3Gu@pBGnCNBwoE^Q_^JA$KiXA=R!7H8rQMY)Xa+djbtiFjfF z-LjR}KDsyk$}p_CMs?Ko{o&yfp`z{$qv9`K zK+{nu&)y>6s1V92@n16Bzj;koVU6-k!tOmUA4f907@6$-K%uH%VkZW;hln=Sc!?Ji z*n5lswTgw6(E3~lnM&NjGUjs_O-xKt$L4+S@f!`Uk8y9bTN~(VGZry)#7(wD_^J-O zh11N{86kld!RDbp3J^1HIwtyVSD?vM8`?3>y|{j4`FF z5l0tpGA(bAQNzcXrqaHGm8 zgNUi)GZePwHsP|MeL@_}U79JFQXsAlBMx_V5!xRyAh5;VuljmbXI~*d`yRWN)IE zh<6`}{Ck;PjyvuJ`ElJ8V9FCzCZ_tJ71VBRL4D!JT8aTf_N5s=kBb4zsZ`#491^C> z!Y~Tf=JRe$*K@G0Wisly?TtEjIFy<(HNs7srfyF%%^Ktk(a3m~ISm}n@BN5qnzvBU z&$2kZ%9}Z$)$ssbg%>T_gI$vZOLGVmT|+p#l)jU71~Z#86B&g9W~i2OF;(U}@|rrB zhNk1^=~$TV*fk7ak1z|=5p{8oDIH0V4BXK;xIIv|9d`=0Wz-EW~M?+`Z_=AdH@?u%U(N(+nj-V7_HY?&# ztE~{QZLCa2t1D1)niv^l+vk1I94_0K1%7Pah9S3f6NkD$C@Dh}tVnEL36< zI&bk3q;H}%TgKU!UpPub!pAX_j8!lgQ`9T@2$9(M`UC?6=`0ar&r@!<67R$q;%TU3 z@ARu%`^rcb_^9Ntgz?0|Fid&e_%0?xLZ+R}60UwYiAPV~T?$wyt+_IpwS3IusCliN z#IYJi;t`h2M@~4oZ2YP+!#9`;+V?wpuZSr$x`KWR$OI)LM-V#bQ&U41ej+DeQ6R1K zeq(o8QRKM3a>w;8+K67=M5Ny+l}ecVrT!)E6>wjKbuu~V!}@+^dOk-+-#VPAwtJrh zg15&Rh@o~?bIcV%ZX-0LULf|D?gFh4D&+!FkLFg6W=19xF5FAzT&@0~Lu&Cb7@qcV zKAc_78*wfVQp<_1<^ySeFoT`b)DX4zfR+pIxr(V~)9DJzE)JZLaBATu7u2fTUSQB` zX5#{!az}50Yg>hFGpL-H<`7#zQE-|WXWo;6l>Q;uFg?S53=~7m3eN}4OV4Ve9f86< zb)&bO!VX9lxWYY$F>N-n4u9zk{05ry`HbNKaX^7uW&Uw1k{Nt~r|_R?q5)I42@E*e zPP{=XzA?Ism=!{<>by!hW~ZqRippm&RdZ0|874N%VvjJ}EMt^#nYs2{Lk;l^W^D;& z#}C?K#wI*?g)LI`)T_*}^NB$WS3Y3_t&R9*8C#lXT;k$aXcl;sd(4tJ=LElKZ_g89 zqs+B^bqc|6xkog0E#$YJ?^K=^5_V^#eQ!KbJ+!iYDL986l)vIJtljKoa<^T*}bky3cH*0<0;8OIGF#gzpdJ zHv$Y6Gyedkeu+6Y|=vq@N@t`@iL<9DZ$Dcb3yqea} zBf7V3)HvQtN~pT@cdTWXY)Aw-a;-YGpG)zWNr3ge3+g0iAc8l1E1MvRCH5aK2@Xzn zfth7{M&#i6tkvF%S;rWYhw2f>2N31*FY|J=wrRoUqPyGt`5Uy?9(b+QZ4Az4FSp@* zjl6*;b}U`+=LKYKh=aXrKOZRn0A^xIQOu+nkRWr3XP>+kv&nKW0}H_kfH7vtV4`d0 zDa|lW8)Pwg%*^yNUCk9@OO4Af5eP?`{)(V86{<#+X zfX1_f$6c>(6_g5wTR8pK zd$Wfzr)j{0TBZ3>WB1dl(s@6ze^91JnSrUE{jlhYr$x3?7LUBgv06d0=z=mHTo)a@ zPP7`JYQu|;{P_pI3)pQZFWx-2og=bPX<|?P?T;#GGTc#A@+yqh=hrS|lT-vHJma8u zZ8;FX3oe;RX20#a6O?CGrkb9icjl!-R50Ht5mF1&K+vJ!o+OH>6|2j`Th zQ?{B z_*h_lZCU%GvDqeSB!?tyJIidUSMkVO>&4synY)^moBH`6mQvPx3f_~;v$rl~!0_Ng zL;=c?!iqPpJlY#EpULb^4}R^)MS0*3qVP?KzJdZ_15Y98PQH$)-?`*qj;}u)j6C1r zpsV4QyE{K?u7&1DvJ7EdnNEf(Txo3<+;JZlXjvD6r(i~f@@otvV#bQX8tQopoeEOk zB{9s+QL3&-;5m=lA>zu5+&IT<3W` z?)Urco*=8Sy$^{}iSDsf(r1XT%1z?bS4k;;WG^Z=TCu>>-1EGev^+3T^lS3wOa?x} zp3y>O(OwmPGv^Q7^&5&q@16pMFfYCaU|0URN#5Dw_o^;!xy&nD+ylAg!=7Z@+01}r5AY*dg8*uUODT=)d8mkN|zK0kBlChQ7lJr!kd*FzmI+n68>Lak@T(DF@pcX@T>?*+Ok<@dF->yM!oQ@5CcW`vbziY+HQ>PG_nZxpvCX!*@wtelT{RK<0Zh=MGLqY{kAIO-srbZrwv>_4tKxMTHjw zyZCY$6zFKU$MO<@WJyN5Ndh@^<}^Law&jlZR0&bKYm!yHHkAxUn;0Xs)l8syQXCzM zK_zWnM+@55omwjLn;@%(5)UiXD3H$&L$I&N%?u>I6 z+_-N>fMR_uC7D;eG>mNSF(E=U3X}`Rd^~Ed^Y%fL6)!z_8NhCMfp+$B?uQZiHHsxi zc18&sMIs2~={#HezBBh7B9#y$0BZQ>;>DX-h_|sw6cz5J-+R zoS>JA7<4ba#*8!*VnFkoobF4t0(-%gt%j`G4@M-rCAb;J_CDPBuIEyVmpfVQ0)zwA z%Zu;Plx(oH^syQHK@`CTTb7~Kgp6BL%qi0%HEP5#pgv=Nje+65PNf}_-0GOy+H^=t zj#VvNP*P+{^+7qj8kHCTscO%U5tBi>CGzHjH^)FSB+L>^+cDo5Y7g|nh|9bq+$-Xf zqe1VyNJL%NayKZ{(jV{P3Ne?pNRo0(lTt}RgMcbR{&YV$%4uX5hhY0*uebF{)Hc2K{W$H2;M>zoHNv1*)_+gHj5>q_GkEE$Xf>d^^(4-6=mz3r21jJ4Aqsu}e^ zIy$!P<-8a9UZ7*gPav`s?!L9#_%p%%{erT{o6Wt}yE5u_{1?4w#aN4}+Yk|P2=1Uj zMM#%rZ#-4jE@51@m&7Dwtek+wHdTf+unqk3CwT)c1m99(3G)-scijN@A+%WAB_1{LM~&6rhjilQn)GC-R2;{dB37)bsWP-#Of6<5Ge<7&p34iMjV> zwv)xI8@D+nUl-7q?WRfZsEyW3nI}`8mQ_Y`qR?49$x0&QNhL!1ztrov+$;x#c*H28 zK6{Y?UKaDDEEa2EAnEp0vI_)y2A)5@X4bQMo5`CveV_YnKPRN!yKZamp78WX?*3$( z95^0=NFv@uMV`WWC$2T#w1CNs*i!dX@b=MflB4AQg~-#5yEJI@`IS-d!aRrXa7flL zCZUszQRw*Zb@6)YIJwn$?~#a%v|Yiv5bhyX14kQJR%^b`a{5E1+qz5R)hGbOt3i%{ zGjMqtyaF!23BV9<0RF6Y&+v78ux3>WW*=SQ3|bL%&}3edMvOM;%HA>RT#?bEwHw_< z^AY=vJ4#~Dzk+DqV_Pma>s#NyfOk1R8A+YHMChuIzg>79;?nr%c>T_;5779t>oV&< z8zqmDo*1GX(B6fAFS%NmU_|%l9d00xNwu8$alcNEWO3lU^51nWGILHlCw^BAqSB?9K@5P85;=jbW&iGo9$k)qa;i|$N!1^ z9yOu(=daGfgTv>)kkWn^QwNeZzcJ}{3-8xm(tc^~_66A8D~YU|Yton|BPr}MQv{Z? zoQe&K>du2l<{Sf!L;2VXxHqkQJ4k@7{muaS9VrA%?BPP|=oZ;E zlub+TT-ZCtxIdadvJ_&}^W^w30***-z^`?I0%*>R7*20JW!xh%aQICGd zu{@o-yu5Q7pN77Cu-v5d^T|f5!QAt8rcZ;_tLpPhc!l3c#-KeFd8}}az*RV^Sb+?x z*2H!J*cgxVOW0#@%j309(^7*AQl>0jzr9u+XTPxt;in#tz3b%priMi$U)Eba$6Bm5 zJ#7g(wgGKi&;Ly{Uj|73ab=lW7=tDwyed3dsK6t1a9YOe5$I(SgWK4E?>rW$&v zq8g2Q<@IB)ib?1<8;7s|hd-oc>mjWLk zRn)qv(drS)B#l*gPQu{48+wGX-3Uf2tHcEI#9LCt2a}U(j_=;qX3I)@7nh4iHe@)s zs9jYX#kGGCAZRr=5BbeaSgdgU{DtKHj_?_|bIs_1efhHcmsIYHQ$8+L;KQEo@4oON zJGz<~h=>!7j~UoHtV7G(bf;>!_#^lg@?`oJnVmg&>@nqucs2TZ!D;r z2{?B=Uwu90JPhzT_HXaLQI}@XD9#g+V1w&!ld%znOYH)=KXUdhg0?UkZPAqIe8Eoy zf<0k8)xl%(XZug}km+xrckF}uXsxlAAH{nK(hM_ny9-_G8F3}U%4}nw&SL)oLh$>i zzpuUW0MJluWQ};n@x|T22sFt3S>{h|n@2x>=Lor2aK??I^)<&O84k_fxkD6l*m2~Z zj%`Fm{8m!hy1lAsxn<+)EjG48zzNoJv?@v6_h6-kX|2r+h#N))5%mW|r*15SqhP;Ch}IjP3qmzQF%-j_rp49*A^~K%PX- zv)xiV?Y6%qkwHtvKhJe-Vm2964gp;gyGZHWt7uah1K89H66F}ja<`yjEkCl1IloF| z$t~R?RP7sOkp_ruqCy%cG&m2OmE46y6%(|+ik)dLQR_Jh1$qhFZw0+#dFLOByAI#K z&|tX{uI{{kodoq9iTsnO918X&yMV#OoBI+FCtI!U*z2R^^M#;PXF@jlLIQ_h~r-*icVSOR#knfv&ih2K?HdP zf~5T0h?7;tX*h0tpGUPq_I1WMSB5z2%9Dw@u5-NWd|61&64{&WPaAI!dE_UT%E*dw zY(2~$tNT%AEr{bEYxMqf<2R~I&BvKYGD2N8$LrLlom4hbMazNE%8Z{Pz`X}wF6P+h zBADrJ*AfT&Q2u4jWfqSQd4pCizFlURg8%xhc)!e}xOr#qP~5@pA0W;JtKqaV@NJzk z$mCwc{Efzi4R4ATRhReYWIoOje?xElRBsu2GND-%b`cl%ETu?^qo;qNwGfouxUsuP z^6a^}h!oJV>g2n+j#96^U{Iin9eQG@;%n5z9Q@;V7B=be4>8TzvnR2{Pdx@TJv|$L z&BoY#Oi7$e+!J}CdOuCJni#EDDy)ly)~qb=8XK4?3U*qC*YeLI1_L+ z@15q=_&3X87eG+jtsED-%3H4!9=a?WNq^hhElyI;!E4;tnK(C!Ypp#AaB*+-IM)Ea zPs^VLvY()&8~4wS@AA%1WnKff^7|Ymc73L)7uNrt<5NXy_jgIv6*+;P`}HgLKDAh6 z%zutn40gdt?L3LR(w)e;vk#%4(8c?0HZp5|Iln@gy^B*1ERA$!Km9v(BWFteHAk3M zuFOsY$3lstNhjzfSOonjn>hkeDWg#TQ$)>^{RK-=U$^Ii4>U@zT#0YcNW?Nr0_#E$_xr_&B)veqZ@9t&M3XQq&}$F^2bX?0OKvwy z`gOV2Fm2SDl0dd@64|Kj@3lXoBLl|qN}WTYhv3}w^wX*EC_o;oyqz)&kc>hF%e z&XfURvD7ZtF@#@lrtduVLr>QQkh#`LZ&4Z~bXGI=->c1eh-1z?aFrx{wjk z`w$mid%6I#qh!7Vaj$(*eHFgTwNvPGa%W+N%#xD8SZS3_KB1f3zc7y6rXDHwe8>v5 zxZ+zmBAGzM{ zKA)iuFWsmTP?EI&qy7OAbb5L@-n-pea^yF|y;j)zm8R|ecVRvzf7LY9dK5mVQcESfChag6uugZjU~4(!~TU zn+<9K&Sq&wQWm^v+P~|b&gexO!zF9fH|{NUlT+s3NQEBmfj>kI1!Ity-$j8p;VNb6 zX~QRSLr`U$jj)JvVXu$<->I3Yq6@r6iY11tko{5%OSTobb1%--Hb*_Uv3M(M41@(qdORMX67Ct$lw%q7F)O3+ zv{-I9UUK+mb8$H@?|A*&TI3s2dc!uj$})6V-MqCfm8MTbjZ%rHU(7-1`IJ>^eYm{i z4OCviCooFJbz!tPxGtVhB^zYiR%BA^8LVqtU_W`aU!O~sTwN|>jTSkexHf1$#4u~U(R|pt%bdU^KUn=i2+zRXbT#iH3|bsl*e10Ygd z2isE2t(zlr)c-Ls2s!=(*a=FmTs28U>4;8Wxdc>os2Pn-j1|g}^B__o%@{hdNVFl#OKD_b2}Vxp2zpoTi35%6t3k zwnDLcXO|Nx{i(LVz8E!KnOcTlXP%Okb5|8R0uiH+Hh-3jB{{7RB|n;fWo-I1@y?;j z_?MGR6w>Ae!XnGahup5$H@7U?aSOp}r{h%f5Gae>>G09{{74t{x)8L*>uH(sqGCXs zJ0+L`kuH(Fc~r+B<~QF)Er-gKlXAj*Pbki}f&?uC=c_%AC^&R4uVP%s$4X^!6@V8< ze-aY%rJ;BaTajRMf~J^H;F+r8PyFSR^s`$az@N<28s5e9c|M+G8%pmwA%Fo^b9YyDZ|Tkh!(W zZ|fGaj#?luGOh>4nToA)b7uV?sb56nH0B1*erFqrOZ)xaKTn`E=k;ncGIW9{YtMVa z;=5Do)gy43ww=>;PZj1Ztz(zIUA1AGHfNhjFf_zk81EI6|0k7($R zWn7q;}?)70;+hIh!$1m*b$!gsIv*u6d#~=O7U$RUZSUA%AO>z*c ze-)-)WH8|^i8(k6k`5R1aP+(&V|Jm$ z7sS!>;@Yp|*^`v?VYdZlns;)gmrOng1Bdh6_~^Obu0LDgv-5t%1qgB&|KS#e+P~7c ztBG2BJ`{R`iRKZfcng?%b|#yRcku7-ifG7e%4KYfNF8-lK9TRM6`?FA(lIpbj__Vj z!^TGdozEn1;anir&=XRAGmV923D`EfBdW;5d&d z3pK^Pe}HNKZ#fUXbA&C_9x#D~$C&AcRT9A(n0S&>m!MA=g}6y>EL@GNOzeIY6kvGg z7)Yt};CY9wLG#Php?6A*J6JIgWQ*hNk5|YFm2pmRuqDG};_BnF7NS0d1IU%ZaY|R$ zYs8)!XRHxSExUK6j{*H@9o~RA+`YAib(7#MG^aBy5A;su@TFROn-3G^7jn1dH(MTM zr44#Hn-gefJ}3x?KARImjO}m3izz_vdm(9y z9kcNwolcgWSuD|)2`bBGx{$DLt(;-Ws6zmkXPEw2iolYTC?W8QI){R4R;ibYvuOhN=LZ*Ey!8Q-g+NrNpCDHrS<&(Qv6#Dl`FWO&+~x4_L%S?3 zT-Xb3|J>^kLuPX+7tmtW2n(xgF(wNVvJ};w6gByaf#ny z{Rt>IqUtb4c_6Bt5$5c-DDAQz&-J0~MP}SXYJ^oDv*2Y#S4wgYt5_|5xZD-?ZJh56 z=g7Vaq?hb9KRglnqzbQj9?Li5I_pN!1Lol#CVIQK+IjaH z{{sx@YxHNE4!QZOVqKnnycNtjU|R|+5t(KiFZG>*$lFEPF0cn%cN144Q;JGK+j<(_ zJ@;OzuWF=UjQ}v@MOt)3isg#`7Ud>pXpF3wLtR6Q2j6}-%pB{h5K#t1CVfU(9dlpI zJe%G}aqoiLB8cAbP%{CEE~ zE)v2o=E@fTyIiD`BU$<7iyAASxqn|RaJ9zjCfJ@p&iVG+C0egv3rMo62*(ntwOZ9u zWr$v^J{h~E-&cmXtL(En>hKd{@J&tlhe)eRWOi%ZE8%8rV?t9!o%5eGWN5rWIyO;CcWcm60fPYrdLu~dH zs^3jJhS>4y>dvv;j%bg+dG>v$CwSnp%(l((yjZ@-{fDeFWhc1h-mX-BBLA!pc67up#q#f13!s#zec;2d;bbg3NUQp> z$Xy~xS#Y_x{fXZDU>o?p7{i_Awm-Ll!Wf9#kHkPTiL_k&rdZB+UShk9H3ePc@uXUy zdEl`t9M%as8;U^`eU7OtN3iNTAE+zsOJy#eqQz((x4D0(7`mRF{&ov{D!@3x9^CH1 zK+aHY6=@**NX#4eB_3)Ga!U_@Pe_$vEH6W4roF(PtGa^~Uydzh3?AX~e_iCQWk@5J ze`R2TIU3BSAL9lLK{xN`SKd&|bC8M7e_dbIJSiMeAe6|J#SH@HPvN5HwhENIzm zkM`ODal-V%Lng_{gKB3|aU}bSWbR_D!Ni;#abWIM>ix$gbGsr!F!wXLIb-F-CWNp)Zt_s-5*|21@!!oT3swq3uF%ok^=hG`&D$xxU|mFEjSWECmKF#pH% z`^Lgl6O`pZunIEDWQZ|h3%#L3+?hgxoa4$-j z85zx&o=1M>%DL6=e76rh8>eu%W5~VQ8n;E|PMOE%lR{5o4;jh9i`iw87M5I-$j$O$ z-|sBLAg7V(KTC~6GU$r-BntFuRgz#LK0nZn1E!)rZrA#Vm_-c_O2_K1Xu-72Q|I4* zS6GuC6s50oSxgEU7J}C;s)t<8sq$S{y$aF%TzQ(?EK{syV@=U4ETTKZ^$p9cPx3df z^!gPjELkfQny0XlsaY}rOJotTxieym;mQ-)TXU=VFT5;vdb|hnhOo zvjv;4&i#*1v+Cz>jsJP%3v_|lEIP1*n+Y=4;!OPm9lc7O4-@wb&0KF&(0xZ0 zp@J;U^ulUkNzpS~?D?TkYL>#h9M!S;BVT9k_CCXQi}ZnIE2wiUkzL+uJ*SG3F|fea zO7o50D2aR5EE!x|bPV~XuKutG)=1TYzv4xVzEt=2A#c5{;`hbSi^c(!v1I-d-`*C_ zJ5yE`HAl{AGFnbge|(XBQ#ZB(Bzto!n|;ESp{&DPd~)yKckdT7aL(mG!(+s#1Zok{){lVx^Dy5I4> z!t7KxaC&@N9X_dkY_lT62HGEY-~Qz<)ct+EnFvAE8QlUL9uN3WxZdiCKr~VCb8mr~ z?l)OjmOUQv00u>MwW^buih?^Lj282C-(l;%V(%kA7px244W`pl)3?}NAPlta$(r}3 znu~du_uMh<{*OCi;M+p$fRXGM3{Ohd>^wYJP84xklLN07OsbNbVG>`H(c(dv*F1_E z69s-q@%*#!k*V2?;?eNK6MNf_FpuQ;J@&B?V3Mc~s5ZjxDWXMC3z>&k!a#4{(UVf* zvX8xPny`L`!d90la2uQsBc_c=+hp`=$mG7VhqrQ_wNb-9&MlJeI0X#~^8BqY^8b?4s}-R^gN+I{0JI-w5rL zZ7GXJ{F!d=%la&xE`h&4cbXI|857wtv`lRb)i!_gxe`D-sgBQMuLqPh;!_MpMJWWp zvwFD9^#eM!`GtG`fDTodoCH57Ev~(s+P}9@BeGO%P~cvuB4H+FXrV+7>-2qMzHxiu z#C2IDxg26*axa$`o1OQEJ`#lrF@t-Ypva_C9Eeg?%A$^5kQ0WhTe!zeV%D5pFPDAo zmxa?XceqWQ&|IdQ20py$<^}?n7}6d`sce+S~-L<8AAY#$a-41;~P`UaD)O z0RzTO-5%s-~Nn8R~QPs(a5hwa?<+3D(*0vRY}o60ZNgJtcW6J$~P zAur9t)T8dyX$9~^6CmC_u5W@>hseFfAB z|3EY@U=m+CI2Qu!+6U*qe@5?Qqhj9SY-ai4LVY!xL>_#=UC$lZOqH`(IoCMLJqGX9 z-Y_o6dZ&z>CFjfIbeW2=4?(VBnP$kp1cr{+ph=jFYM>8>U_M%xj$Efv1XYl+mpt7L z#So>9<8(p`$7}*E8qI2UNR-%kV?$?@TOy5M>*^j!Jt%%9`a)O#QHVJ?3dPnS>nyzF zowH&hVnoNA;_Q~JRmN7As6dt^70zc^EZEKCD{cJt{msf!LhmA8BXHX`n5sG}lOem3 zIWjf|kx$b#S`Jm5rCH2&UnHY_MA$dnGOz44V_+skioJKpympwTSyCt&B@|XQNTCDW zeXw=rG4pUiP1m7N9v@<5<&&+` zFJ(ho%r#UrLEh6oDd2pQlS~ zu*q&D-VdWsl^yBw-;azCcyN`>4=v$%MlFVDLrG@pPF6j$@eZ>R_0?xy>aRs=q(7$z z*9D1U3{@mfF1V_E3M7{M@zWY})o+}MvvhD9VKGI>ZV{%OYMj4g(zPQj^R>n+!IH&l z+$_}I^;cHc=g*keTUjj+pb~mh%&$kZ@P@}yN_z9Og%XM4w1%Q|VM(09tRZVzQbBXP zg)6j(2~KL5bmGpKu_1}a9`P*aI}Jg40O!>+`&Z_NP7fK3#5+%VC=cT}%_`_f!hVH2 zxHm`sL{flP>zgKA!;0b1pw1<{zh;H%*+|$mc%@E3aHpjO8X)# z-4@Ts-W;9mo`RNypuH-JMo^1qx5oio`53qoUH(T(O*e5`(;<2l;lypv1NpszFiK6M zy3iPR1>$Y-6+yDQZnl_T%<}64$9pu^1S60I$?T)8;#YnREyEOz?#bw*d|rY;Cz(0J zj9Fqn2fY93Hs+*Y=&fkJ)jAQ5S@c6;Kb#G})>YH?{9QT#5_q90S-HP+LDGfV7~S~B zrE(9v7ep&rEBBT7-kUy=-B!9dpQ9r=SU{pg_0+RnsCsTBdc(YnHtmt!qdAK&*5pTHF0M)RQ>;Vu3cN#u1Wj<&$#w~ z&b1%rz-!iiUi)JC=>Iv_$p7bDyZ3Hq~kviSsu0^a3cx(U0eSWux->0ObW{9exQZwWgZaGLdJPU8qcwcI! z4nIL3C`0&BU}bkUAuuq7w?7QyM?$u^$>p_`qppM(xu;^vR=^9|0IP2xr1hX0;2UOy{L;a6xLL46p=^RAOv3B@I2!tIxQ^Av# zDio3iwwNp^i$IDww$YkKCS}e_vSi+*#$VjIO zMwHjpstLCo5X@I3C@y+uR*!ow*N?e-u59d8A%EwL8a6+e74ubSvTVf;kE=^})JOoG zDilH_P?iyBgUvq8MEfRmG_HB3E*;;riT2mYj>cj5wed@Hvmukk>Bae*rZL+Ov;$tnkBVbxmhP9 zG3zvFkxzkNGg3+X@$;{4p_1T-|Iy)Q(vtZms-YX$PF5;m58;=Xdl4z$GXh4exxy^t z(M7k#(|he*z$>mvLAFabAu&7l!BRvX=kj+vKid}-L5f?$I-(dcstO0J5pu_W#nZiR z+bk1fEyI%mUCpkn*CjdOLM4$fev)!^zO^A5*8oxJYZ_I~m*K;cKOFAsc&g^nr-`)Q z2vbQ>Apc6%&F$^>d6t=`oqb@E8Gi$G;3l)Vj+E*aYf#Ldub>!Hg_~vH<|^YcO5$ig zGV6p?GKW*B;A})^i;&t8>6tN=e9T76I?Lfy)YH;U3y%ii49t9cWLbs=TSDk3STDm6?1C`0!>(^>$zY!nPi?&xHA zDPi_fAFOygIPrLbSS23aBFT_^YUE0na#;9WbRHkx+@Wa8xk&A^7=E z*M0JJtE+YxUSs!eImLHu$1Qw8o2vc%2e4#GTXTtZOW~VHJ>R%|&X1!LWfFSiNoA&F zY0&a?7iHP%(A zjGo|l7yevNkPm5)6332|t>bs%x^PKvCzQaqSArrCQDBW9uw6N%D{?CPpAcg3`21 zb_Y0nrA$5y9)`CgcD>n*^#ZlJ}bxO)k2Een1gB$l3aVyVnp(egxT`XViE-% z&QUigBlF3BFa6Pg=3r$&K`3pD@KXEw`Q?u5^9t5sT$R%%$p)&tEX#D-7w>~MXyG~p z4njGDm;~vQRbNbYG5|Ut;v%1gf(tyU46?EgsP4zYql_&>N|OQRrb0~y zdd*QGW!*IlV9dP)0aiZ4x@~4pnawQae}Fb}XP^A++bKH32CwQ?umLAm_e5WWpROgO zqcDmLI+4_nhX;3}ql^VrmTSH4N7hw*FWfdimTNX9(*xlrUyBAyL}o6z8cLGs2gUw8 zkT;;}hm)N4vASdAWC3z3nePg%bq6QrW9Wma0^MYe$P%C0yp5hkVLn;uj8o(JXO|bH z!?kv zZwCJze7QSJDD%ODi~rI3i;h4m2+;PHOR~7%UCl;}dHHA>!^c2xG_2tE(k0@*Jj;w} zApTO@=0=#`c}8ttAHSX?Lfm`xT7xf&_!{ z>yb%Np!*vCAo8_Mli zP{xG}2R%rTfViWNsG;=IK_=S%JO+)HnHfaJrm)~(c7v!HM{ax>S8-nwWr}&QV&Pub z=$5zwzKR5>3>D$Q$lk;UwOqQ*-jO}#K%b;^;zHtLu9bPLcS6hQWqvSa@3%|rwS{8+ z6vw{azox`VC44g!Oxm%DDAdnq^Q6>$LOBpeR`At{f)`W>8kYG}YzkY2k=>%$2G1`1 z(peD+lJvLvDva}J)&XR@g{xrMbdSh?>NYWZ@+`adcY7IV)L_o_nIX=J+sp^2f3Rat zGN*tF>tl}JfLS2$@m6tf>VsI4c{nc5Y!-%PP2=?v(p3AseiL~S%N>o_`sd}-Q)7%rdAO++t94z|P+ zAngg^JPN__+TlDRxaDo|LvfC=RS<3$N)i+FgW!148NVdK2x~_gdLi2DxN%G+$trNe z>qz;Y8{ zInrqyF=iM%JSTB4L$Kjg6z|^-9lef70F06$FuL{$_9)B@-muSS(C8ku>A4}86WLv_ z(FKEP^z#Tzk}i7VQ0^eqS# zQ-Hiq3yFc%?=~a@Pg+d^zZujST;r2VZcj496XwJVgVFfu)M$MkltWRvJN7Xn_{iLh z8(pnZoL_iHS#_F(N;k?GnZ6mgyW_))BS(ay^WmNjnIX-^A&_4nYAQ3d>DWK4H}+!YVqprm+f}_a5}+MGb-{1ssrZA#drv1 zQ{=&>5dyUu9+JRkle`6($#QU{u&&zhU(-*27ZW0%t+1%=9`C# zW1y&^*rh)uvHt*{6;k8+rX8;0%>AJfJR;46ox^CY8NLD?9LqWkctwMt0jPVxUw+?R zn8MM3sdMJxwVCFAfK8l{>@A$~iV}#P(vV0-*`J@pf!F>|s|C@pNGp>C3`ELvM{S%) z5{w-|m_+O5^x5Z&AZm(wYuR-e0hfmU3MmGQZR~d;nAoi(?!gKZA~pszk&@E&Hmgtgb#Dcc>JZTlN+Zbp=aSgl)7W(djvwz71!>jojup5fB5I*PsC|~zQI=t z2j=BfZhx^d#iBjlLL5_cb4-~JDZqdlV+|9XeKn%jEIO|mEBkYh+?3ZKUZ$Nr^zbaDjjx5W`R4hhaZmj4VU?$HycJPiV{V2dD+M%?f&aNM<$S<0 z@$mTgCR8{Rd`XS_VbsCxtNJU$fWA_psFamZf?wGrQHh~^2JyLgcCw&%V36xw2uHP} z!R}%W@G+OeAGrOF+FE|$(-}oWxh#iJYWVirgJh1cW-b`F0=vZbzV=2yvoNmS5SJ1H zh0KPJsa@So2}fg(i5fwjoE-D8{#_!Bp2V%^o_<9nsswt0joWXv%ViF8*4F^%VP5y* zb0d2dms!6l?qYSE0wAZ~1Nx&itjev~SU& z=V=P^5z(i2U@=F{^p+kB47M(Q8_vwN4EA`g~x4!c<-2$e*mb8tycBod%2xrp- z$+ZxhoBX>T#!d}a-ohve7-n&45E(-i>a7U8*{4((OPo|W2%$-Qc4NR;K1(H;W~YL} zfy-AgqR@^e0BOOKKx1r#iA?9odfFNs>S4}PY{@dKX8SQiekz#*=1_={sem7dCz7n~ z;J0Q19^iaWR76c}r`JUpN6Bo*hmpJmPDVDg1>6gvjCYTKTB0?K?J^1<6FgLV%ai0j zwVQTwde1yIYLHrE(7R1}c*Gv0?*WMVsvxj-uGjDvlafsE%)1qPvW1@taHZo^xgX?oVob+;GcvWd}_f`g-Z*m zPw4q*@%Gz}SL&wE0V@CFdC7gZySeXNyOVPN)gzu z5RWyV!|gu|=E#pM$+50#1sw zsOOmf)aWl?*Xywq>M)2o)HS_)f^Lu@l9xl1j^w}JrNO^j2a*Y+p74) zJi(u1OEquInME@)Plxf<_HnO&WbkCSe+lj@hj59~KK{l$4~lrdaG6-rUMh!jU-)`s zhaQT*7UcXEzTP`dwYdfS8?R9M6+}k{njr+316ydM=Ix21?%8n*kp*}y+I)Lde~Gh* zLmq_78ZPDr$&#MinoS6`Q(rKQ$abr(_B|rU+Tj|CQlXSYmIgWkHI5u9$&K}WxVHtR z)e&QTdWAm|0iCs@x8a1TmZ0AANO`x{>&Nw~JgLZ(a3NN)H!UODF}eEc}^nA{2O)2@oZdaCE1-+^2;0|CjBUFkB6ITL^Ij{%96}+o-_Xd8G|IL#y9p;)rGh0 z;#2*J@@nhLvyh|(j9V{Fa({xc(Nq=8tXah80hC>|;lt0dvfRcRMl=|z_=_A**4w~Y zv)R2(WW^i;M|D~;3Y3k(61`}_ZoeW^>f?jhSHA3yKQBc?0t&r8pB^$xXMu?}x>FZo zyio+*8gY6_VH%5pQ5lA~jTe`(pDhNIvoQ@DQb+gJPt}2JUzjV@a^$*jO;EG>S*%LB zH4tY6BI#|_Kk~yk!bBZ(rrY05w7b$*_7n8v4JG-TexiECFxCW_n&4pXtHs9NC|wJ# z3aU&Z7X^ep0NY8=a#pXq$`dkp7@axpDLXBxoqg#B6v~kMy6VpA(3{^5Barnrdxox% zR{kiRDkoECnc5&_{=~@GP7arLDbf@?VEr#5Q4Y^faNC!eb~=onAqK*B5=a61a{GRG z4)?hkhP=kQuO0XdP9>@}@_>4?SG@qZGZ*7n5piTdBTanUcmaHu!`B=eYZgcrkw_eq zQ2^j7ZgM9?6ehYa3_-|Zmb&x(re)nH?`?b*H!EnBs`-;f5o=C`ybQrPL|?Qq$=PWO zJT0%!cX>1;$>L=(UBUU(nO}5kOlknR9jy(+HWX&i^RVo)8!RnUV7!2deHe@p<*S^Y zN_X=w#RP>e-F-4M9-|(X7S15e9w1Vx%eS-MFY((=%*7Xt`YQXLAYDAg7P8vms`tW} z146cNL_&;T&a`?&hCLK(gV)A-HsL4tm}+rr=}s;*AQp6A}1Dn-qZ zZ=wG6)?Zo-=;90cM_>khSt}y%yC^&HW8@!@_g_Ln#<=heQ5zA`Z*cnmLHD7w&&Y;0 z=S1fSzFVMn7Hp=y&1Ng4@@7P8S=03}*KlO=`Lq9&*ljd|!pXG4F%lQFpQHOvuU!Ha zyQQC^mW3diVbUEQ;KG@$+IfZ%+F5fh+RlX%9~K<$TE#ovK3njEFb5up*O`+UGj| zaU$so%)2_O3!h3x6a-%f$+Xm#8_D6->C=fP+4-YdS(^EtjKI#|kNiZMcHmRqgdp-( zGfEQ;Lk010DBOpglUK^|t=tW69R0d*4-xRRyZ;cd0!WJ@dcRo@rFM7o7$WZQnuno<%vc4Cb2`Qtj^dSYSir5Eznp~goq-s zi+G2VtLX5$hHOae&ZM0{CjEmz3xGvUZP!A0z;(q8_|jJxF8S{M!`FzSBTRCrOUcy^ z%i8QAKhbm7JgatwKTB&`#Z;*OjO265Oh-Wh)ak4lkyfl$0uMxO;ha=)GFb=mnqW}4a9L(2*pi-5{zpsQt>r% zgrjT_`*-P`e8ZFqQ|41^fFTAP#rDt40_ve&_lPGE@`f=o!8w6L>SYLG7WXB`56rf)F{WcR0)sEc<)m$O8a|WSXP74v?TwM4g5x$) zMJU!ktH_dQ0$>qdxuqrG@G!yYF`ZHuoI_EkflLV|YN` zVpb+?pxmfaI*QSQgbtG_L=}Tw@BD>9E%H`<4Htc&l`AZ1iovMZIED@+Bl zR8y&YmZHBIM6UFfP^#~Lhk5z?MdOK_VPqEWaB3qi_YhWvd3_~U5R8>3LNyg4zQPrP zC8>-s#o$GtW6Zf9>NcW>^⋘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 Date: Sun, 18 Dec 2016 22:04:12 +0200 Subject: [PATCH 46/51] cleanup work --- ...File1.txt => 2016-12-18 22-00-11File1.txt} | 0 ...File2.txt => 2016-12-18 22-00-11File2.txt} | 0 .../file/processor/FileProcessorTest.java | 68 ----- spring-integration/pom.xml | 245 +++++++++--------- ...Test.java => FileCopyIntegrationTest.java} | 39 +-- spring-mvc-java/pom.xml | 1 + .../htmlunit/HtmlUnitAndJUnitLiveTest.java | 32 +++ .../htmlunit/HtmlUnitAndJUnitTest.java | 34 --- ...st.java => HtmlUnitAndSpringLiveTest.java} | 2 +- ...ping.java => HtmlUnitWebLiveScraping.java} | 2 +- 10 files changed, 169 insertions(+), 254 deletions(-) rename spring-apache-camel/src/test/destination-folder/{2016-12-18 17-36-38File1.txt => 2016-12-18 22-00-11File1.txt} (100%) rename spring-apache-camel/src/test/destination-folder/{2016-12-18 17-36-38File2.txt => 2016-12-18 22-00-11File2.txt} (100%) delete mode 100644 spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java rename spring-integration/src/test/java/com/baeldung/samples/{FileCopyTest.java => FileCopyIntegrationTest.java} (52%) create mode 100644 spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java delete mode 100644 spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java rename spring-mvc-java/src/test/java/com/baeldung/htmlunit/{HtmlUnitAndSpringTest.java => HtmlUnitAndSpringLiveTest.java} (97%) rename spring-mvc-java/src/test/java/com/baeldung/htmlunit/{HtmlUnitWebScraping.java => HtmlUnitWebLiveScraping.java} (97%) diff --git a/spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File1.txt b/spring-apache-camel/src/test/destination-folder/2016-12-18 22-00-11File1.txt similarity index 100% rename from spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File1.txt rename to spring-apache-camel/src/test/destination-folder/2016-12-18 22-00-11File1.txt diff --git a/spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File2.txt b/spring-apache-camel/src/test/destination-folder/2016-12-18 22-00-11File2.txt similarity index 100% rename from spring-apache-camel/src/test/destination-folder/2016-12-18 17-36-38File2.txt rename to spring-apache-camel/src/test/destination-folder/2016-12-18 22-00-11File2.txt diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java b/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java deleted file mode 100644 index c4a3ced84f..0000000000 --- a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.apache.camel.file.processor; - -import java.io.File; - -import org.apache.camel.CamelContext; -import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.impl.DefaultCamelContext; -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.camel.file.FileProcessor; - - -public class FileProcessorTest { - - private static final long DURATION_MILIS = 10000; - private static final String SOURCE_FOLDER = "src/test/source-folder"; - private static final String DESTINATION_FOLDER = "src/test/destination-folder"; - - @Before - public void setUp() throws Exception { - File sourceFolder = new File(SOURCE_FOLDER); - File destinationFolder = new File(DESTINATION_FOLDER); - - cleanFolder(sourceFolder); - cleanFolder(destinationFolder); - - sourceFolder.mkdirs(); - File file1 = new File(SOURCE_FOLDER + "/File1.txt"); - File file2 = new File(SOURCE_FOLDER + "/File2.txt"); - file1.createNewFile(); - file2.createNewFile(); - } - - private void cleanFolder(File folder) { - File[] files = folder.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isFile()) { - file.delete(); - } - } - } - } - - @Test - public void moveFolderContentJavaDSLTest() throws Exception { - final CamelContext camelContext = new DefaultCamelContext(); - camelContext.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("file://" + SOURCE_FOLDER + "?delete=true").process(new FileProcessor()).to("file://" + DESTINATION_FOLDER); - } - }); - camelContext.start(); - Thread.sleep(DURATION_MILIS); - camelContext.stop(); - } - - @Test - public void moveFolderContentSpringDSLTest() throws InterruptedException { - ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("camel-context-test.xml"); - Thread.sleep(DURATION_MILIS); - applicationContext.close(); - - } -} \ No newline at end of file diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index 6083afcf76..2fe7e1ad37 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -1,135 +1,132 @@ - 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.samples.spring.integration - spring-integration - 1.0.0.BUILD-SNAPSHOT - jar + com.baeldung.samples.spring.integration + spring-integration + 1.0.0.BUILD-SNAPSHOT + jar - spring-integration - http://www.springsource.org/spring-integration + spring-integration + http://www.springsource.org/spring-integration - - 2.2.1 - + + UTF-8 + 4.3.5.RELEASE + 1.1.4.RELEASE + 1.4.7 + 1.1.1 + 1.2.17 + 4.12 - - UTF-8 - 4.3.5.RELEASE - 1.1.4.RELEASE - 1.4.7 - 1.1.1 - 1.2.17 - 4.12 - - 2.10 - 3.6.0 - 1.5.0 - + 2.10 + 3.6.0 + 1.5.0 + - - - repo.springsource.org.milestone - Spring Framework Maven Milestone Repository - https://repo.springsource.org/milestone - - + + + repo.springsource.org.milestone + Spring Framework Maven Milestone Repository + https://repo.springsource.org/milestone + + - - - - maven-eclipse-plugin - ${maven-eclipse-plugin.version} - - - org.springframework.ide.eclipse.core.springnature - - - org.springframework.ide.eclipse.core.springbuilder - - true - true - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - -Xlint:all - true - true - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - com.baeldung.samples.Main - - - - + + + + maven-eclipse-plugin + ${maven-eclipse-plugin.version} + + + org.springframework.ide.eclipse.core.springnature + + + org.springframework.ide.eclipse.core.springbuilder + + true + true + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + -Xlint:all + true + true + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + com.baeldung.samples.Main + + + + - + - + - - junit - junit - ${junit.version} - test - - - org.springframework.integration - spring-integration-core - ${spring.integration.version} - - - javax.activation - activation - ${javax-activation.version} - true - - - javax.mail - mail - ${javax-mail.version} - - - log4j - log4j - ${log4j.version} - - - org.springframework.integration - spring-integration-twitter - ${spring.integration.version} - - - org.springframework.integration - spring-integration-mail - ${spring.integration.version} - - - org.springframework.integration - spring-integration-ftp - ${spring.integration.version} - - - org.springframework.social - spring-social-core - ${spring-social.version} - - - org.springframework.integration - spring-integration-file - ${spring.integration.version} - - + + junit + junit + ${junit.version} + test + + + org.springframework.integration + spring-integration-core + ${spring.integration.version} + + + javax.activation + activation + ${javax-activation.version} + true + + + javax.mail + mail + ${javax-mail.version} + + + log4j + log4j + ${log4j.version} + + + org.springframework.integration + spring-integration-twitter + ${spring.integration.version} + + + org.springframework.integration + spring-integration-mail + ${spring.integration.version} + + + org.springframework.integration + spring-integration-ftp + ${spring.integration.version} + + + org.springframework.social + spring-social-core + ${spring-social.version} + + + org.springframework.integration + spring-integration-file + ${spring.integration.version} + + + diff --git a/spring-integration/src/test/java/com/baeldung/samples/FileCopyTest.java b/spring-integration/src/test/java/com/baeldung/samples/FileCopyIntegrationTest.java similarity index 52% rename from spring-integration/src/test/java/com/baeldung/samples/FileCopyTest.java rename to spring-integration/src/test/java/com/baeldung/samples/FileCopyIntegrationTest.java index 567d181972..55c0916e60 100644 --- a/spring-integration/src/test/java/com/baeldung/samples/FileCopyTest.java +++ b/spring-integration/src/test/java/com/baeldung/samples/FileCopyIntegrationTest.java @@ -15,40 +15,27 @@ */ package com.baeldung.samples; -import org.apache.log4j.Logger; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +public final class FileCopyIntegrationTest { -/** - * Starts the Spring Context and will initialize the Spring Integration routes. - * - * @author Baeldung - * @since 1.0 - * - */ -public final class FileCopyTest { + // - private static final Logger LOGGER = Logger.getLogger(FileCopyTest.class); + @Test + public void whenFileCopyConfiguration_thanFileCopiedSuccessfully() throws InterruptedException { + final AbstractApplicationContext context = new AnnotationConfigApplicationContext(FileCopyConfig.class.getCanonicalName()); + context.registerShutdownHook(); + Thread.sleep(5000); + } - @Test - public void whenFileCopyConfiguration_thanFileCopiedSuccessfully() throws InterruptedException { - final AbstractApplicationContext context = new AnnotationConfigApplicationContext(FileCopyConfig.class.getCanonicalName()); - context.registerShutdownHook(); - Thread.sleep(5000); - } + @Test + public void publish() throws InterruptedException { + final AbstractApplicationContext context = new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/spring-integration-file-publish-context.xml"); - @Test - public void publish() throws InterruptedException { + Thread.sleep(15000); + } - - final AbstractApplicationContext context = - new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/spring-integration-file-publish-context.xml"); - - Thread.sleep(15000); - - - } } diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 3c1e44d13a..b507a1c629 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -203,6 +203,7 @@ **/*IntegrationTest.java + true diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java new file mode 100644 index 0000000000..c9c23f267b --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java @@ -0,0 +1,32 @@ +package com.baeldung.htmlunit; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.html.HtmlPage; + +public class HtmlUnitAndJUnitLiveTest { + + private WebClient webClient; + + @Before + public void init() throws Exception { + webClient = new WebClient(); + } + + @After + public void close() throws Exception { + webClient.close(); + } + + @Test + public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk() throws Exception { + webClient.getOptions().setThrowExceptionOnScriptError(false); + HtmlPage page = webClient.getPage("http://www.baeldung.com/"); + Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText()); + } + +} diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java deleted file mode 100644 index 46a95ae694..0000000000 --- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.htmlunit; - -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class HtmlUnitAndJUnitTest { - - private WebClient webClient; - - @Before - public void init() throws Exception { - webClient = new WebClient(); - } - - @After - public void close() throws Exception { - webClient.close(); - } - - @Test - public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk() - throws Exception { - webClient.getOptions().setThrowExceptionOnScriptError(false); - HtmlPage page = webClient.getPage("http://www.baeldung.com/"); - Assert.assertEquals( - "Baeldung | Java, Spring and Web Development tutorials", - page.getTitleText()); - } - -} diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java similarity index 97% rename from spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java rename to spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java index da1b0e484a..ba66e7ac13 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java @@ -20,7 +20,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlTextInput; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(classes = { TestConfig.class }) -public class HtmlUnitAndSpringTest { +public class HtmlUnitAndSpringLiveTest { @Autowired private WebApplicationContext wac; diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebLiveScraping.java similarity index 97% rename from spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java rename to spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebLiveScraping.java index 327bfc4596..e8869e8232 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java +++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebLiveScraping.java @@ -12,7 +12,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlAnchor; import com.gargoylesoftware.htmlunit.html.HtmlHeading1; import com.gargoylesoftware.htmlunit.html.HtmlPage; -public class HtmlUnitWebScraping { +public class HtmlUnitWebLiveScraping { private WebClient webClient; From 51a96d14de27e100954c36e219daa7db54425a75 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sun, 18 Dec 2016 22:13:53 +0200 Subject: [PATCH 47/51] cleanup work --- .../spring-cloud-ribbon-client/pom.xml | 142 +++++++++--------- ... => ServerLocationAppIntegrationTest.java} | 2 +- ...tomUserDetailsServiceIntegrationTest.java} | 12 +- 3 files changed, 80 insertions(+), 76 deletions(-) rename spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/{ServerLocationAppTests.java => ServerLocationAppIntegrationTest.java} (94%) rename spring-security-custom-permission/src/test/java/org/baeldung/web/{CustomUserDetailsServiceTest.java => CustomUserDetailsServiceIntegrationTest.java} (97%) diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml index d4862fc4e8..b85db03383 100644 --- a/spring-cloud/spring-cloud-ribbon-client/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-client/pom.xml @@ -1,80 +1,80 @@ - 4.0.0 - com.baeldung - spring-cloud-ribbon - 0.0.1-SNAPSHOT - jar - spring-cloud-ribbon-client - Introduction to Spring Cloud Rest Client with Netflix Ribbon + 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-cloud-ribbon + 0.0.1-SNAPSHOT + jar + spring-cloud-ribbon-client + Introduction to Spring Cloud Rest Client with Netflix Ribbon - - org.springframework.boot - spring-boot-starter-parent - 1.4.2.RELEASE - - + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + - - UTF-8 - 1.8 - Brixton.SR7 - + + UTF-8 + 1.8 + Brixton.SR7 + - - - org.springframework.cloud - spring-cloud-starter-ribbon - - - org.springframework.boot - spring-boot-starter-web - + + + org.springframework.cloud + spring-cloud-starter-ribbon + + + org.springframework.boot + spring-boot-starter-web + - - org.springframework.boot - spring-boot-starter-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud-dependencies.version} - pom - import - - - + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + 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 + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppIntegrationTest.java similarity index 94% rename from spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java rename to spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppIntegrationTest.java index b3606537a2..b971565c44 100644 --- a/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java +++ b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppIntegrationTest.java @@ -20,7 +20,7 @@ import org.springframework.test.context.junit4.SpringRunner; @SuppressWarnings("unused") @RunWith(SpringRunner.class) @SpringBootTest(classes = ServerLocationApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class ServerLocationAppTests { +public class ServerLocationAppIntegrationTest { ConfigurableApplicationContext application2; ConfigurableApplicationContext application3; diff --git a/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceTest.java b/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java similarity index 97% rename from spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceTest.java rename to spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java index fbc0c20144..616e80e6e9 100644 --- a/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceTest.java +++ b/spring-security-custom-permission/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java @@ -7,9 +7,9 @@ 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.junit.After; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.security.authentication.AuthenticationProvider; @@ -23,7 +23,7 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = { MvcConfig.class, SecurityConfig.class, PersistenceConfig.class }) @WebAppConfiguration -public class CustomUserDetailsServiceTest { +public class CustomUserDetailsServiceIntegrationTest { public static final String USERNAME = "user"; public static final String PASSWORD = "pass"; @@ -34,10 +34,12 @@ public class CustomUserDetailsServiceTest { @Autowired AuthenticationProvider authenticationProvider; - + @Autowired PasswordEncoder passwordEncoder; + // + @Test public void givenExistingUser_whenAuthenticate_thenRetrieveFromDb() { User user = new User(); @@ -63,7 +65,9 @@ public class CustomUserDetailsServiceTest { UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME2, PASSWORD); authenticationProvider.authenticate(auth); } - + + // + @After public void tearDown() { myUserRepository.removeUserByUsername(USERNAME); From ac6a6962a24719ba0072138bdc65fcb507e7252a Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sun, 18 Dec 2016 18:03:11 -0600 Subject: [PATCH 48/51] 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 a17e01e8d2..ec475c1167 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -44,3 +44,4 @@ - [Sorting in Java](http://www.baeldung.com/java-sorting) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Grep in Java](http://www.baeldung.com/grep-in-java) +- [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) From 39cc3511ad2253e330f6ce243e3915a4897aa3d9 Mon Sep 17 00:00:00 2001 From: maibin Date: Mon, 19 Dec 2016 19:13:52 +0100 Subject: [PATCH 49/51] Simulated Annnealing fixes (#907) * @Async and Spring Security * @Async with SecurityContext propagated * Spring and @Async * Simulated Annealing algorithm * Simulated Annealing algorithm * Rebase * Rebase --- core-java/README.md | 1 + .../java/com/baeldung/algorithms/City.java | 22 +++++++++---------- .../algorithms/SimulatedAnnealing.java | 4 +++- .../java/com/baeldung/algorithms/Travel.java | 5 ++++- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index ec475c1167..3abe1ba808 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -45,3 +45,4 @@ - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Grep in Java](http://www.baeldung.com/grep-in-java) - [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) +- [Simulated Annealing for Travelling Salesman Problem](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) diff --git a/core-java/src/main/java/com/baeldung/algorithms/City.java b/core-java/src/main/java/com/baeldung/algorithms/City.java index 32335cda80..1a96dc759d 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/City.java +++ b/core-java/src/main/java/com/baeldung/algorithms/City.java @@ -5,18 +5,18 @@ import lombok.Data; @Data public class City { - private int x; - private int y; + private int x; + private int y; - public City() { - this.x = (int) (Math.random() * 500); - this.y = (int) (Math.random() * 500); - } + public City() { + this.x = (int) (Math.random() * 500); + this.y = (int) (Math.random() * 500); + } - public double distanceToCity(City city) { - int x = Math.abs(getX() - city.getX()); - int y = Math.abs(getY() - city.getY()); - return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); - } + public double distanceToCity(City city) { + int x = Math.abs(getX() - city.getX()); + int y = Math.abs(getY() - city.getY()); + return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java index 3ccba9b3e9..cf1dad098e 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java +++ b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java @@ -25,6 +25,8 @@ public class SimulatedAnnealing { currentSolution.revertSwap(); } t *= coolingRate; + } else { + continue; } if (i % 100 == 0) { System.out.println("Iteration #" + i); @@ -34,7 +36,7 @@ public class SimulatedAnnealing { } public static void main(String[] args) { - System.out.println("Optimized distance for travel: " + simulateAnnealing(10, 10000, 0.9)); + System.out.println("Optimized distance for travel: " + simulateAnnealing(10, 10000, 0.9995)); } } diff --git a/core-java/src/main/java/com/baeldung/algorithms/Travel.java b/core-java/src/main/java/com/baeldung/algorithms/Travel.java index 6e6059b3eb..af03b0abbb 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/Travel.java +++ b/core-java/src/main/java/com/baeldung/algorithms/Travel.java @@ -27,7 +27,10 @@ public class Travel { int a = generateRandomIndex(); int b = generateRandomIndex(); previousTravel = travel; - travel.set(a, travel.get(b)); + City x = travel.get(a); + City y = travel.get(b); + travel.set(a, y); + travel.set(b, x); } public void revertSwap() { From c2f77119237572bba9014a980ebc23c62607e466 Mon Sep 17 00:00:00 2001 From: Danil Kornishev Date: Mon, 19 Dec 2016 16:16:49 -0500 Subject: [PATCH 50/51] Nashorn (#896) --- .../java/com/baeldung/scripting/Nashorn.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/scripting/Nashorn.java diff --git a/core-java/src/main/java/com/baeldung/scripting/Nashorn.java b/core-java/src/main/java/com/baeldung/scripting/Nashorn.java new file mode 100644 index 0000000000..ba9b778de5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/scripting/Nashorn.java @@ -0,0 +1,48 @@ +package com.baeldung.scripting; + +import javax.script.Bindings; +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +public class Nashorn { + public static void main(String[] args) throws ScriptException, NoSuchMethodException { + ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); + + Object result = engine.eval( + "var greeting='hello world';" + + "print(greeting);" + + "greeting"); + + System.out.println(result); + + Bindings bindings = engine.createBindings(); + bindings.put("count", 3); + bindings.put("name", "baeldung"); + + String script = "var greeting='Hello ';" + + "for(var i=count;i>0;i--) { " + + "greeting+=name + ' '" + + "}" + + "greeting"; + + Object bindingsResult = engine.eval(script, bindings); + System.out.println(bindingsResult); + + engine.eval("function composeGreeting(name) {" + + "return 'Hello ' + name" + + "}"); + Invocable invocable = (Invocable) engine; + + Object funcResult = invocable.invokeFunction("composeGreeting", "baeldung"); + System.out.println(funcResult); + + Object map = engine.eval("var HashMap = Java.type('java.util.HashMap');" + + "var map = new HashMap();" + + "map.put('hello', 'world');" + + "map"); + + System.out.println(map); + } +} From daa711d5a3d7627afb990e42e45e526a2d15a075 Mon Sep 17 00:00:00 2001 From: maibin Date: Mon, 19 Dec 2016 22:38:56 +0100 Subject: [PATCH 51/51] Simulated Annealing fix (#910) * @Async and Spring Security * @Async with SecurityContext propagated * Spring and @Async * Simulated Annealing algorithm * Simulated Annealing algorithm * Rebase * Rebase * SA further fixes --- .../main/java/com/baeldung/algorithms/SimulatedAnnealing.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java index cf1dad098e..f2db61c3b1 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java +++ b/core-java/src/main/java/com/baeldung/algorithms/SimulatedAnnealing.java @@ -17,11 +17,9 @@ public class SimulatedAnnealing { if (t > 0.1) { currentSolution.swapCities(); double currentDistance = currentSolution.getDistance(); - if (currentDistance == 0) - continue; if (currentDistance < bestDistance) { bestDistance = currentDistance; - } else if (Math.exp((currentDistance - bestDistance) / t) < Math.random()) { + } else if (Math.exp((bestDistance - currentDistance) / t) < Math.random()) { currentSolution.revertSwap(); } t *= coolingRate;