From 32c21f27221951c78f89782c6579b0814ee3599a Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sun, 19 Mar 2017 13:55:38 -0500 Subject: [PATCH 01/14] BAEL-731: Updated README (#1452) * Add files via upload * Update pom.xml * Update RunGuice.java * Update Communication.java * Update CommunicationMode.java * Update DefaultCommunicator.java * Update EmailCommunicationMode.java * Update IMCommunicationMode.java * Update SMSCommunicationMode.java * Update MessageLogger.java * Update MessageSentLoggable.java * Update AOPModule.java * Update BasicModule.java * Update CommunicationModel.java * Update Communicator.java * Update BasicModule.java * Update RunGuice.java * Update MessageLogger.java * Update Communicator.java * Update pom.xml * BAEL-278: Updated README.md * BAEL-554: Add and update README.md files * Update pom.xml * Update pom.xml * Update pom.xml * BAEL-345: fixed assertion * BAEL-109: Updated README.md * BAEL-345: Added README.md * Reinstating reactor-core module in root-level pom * BAEL-393: Adding guide-intro module to root pom * BAEL-9: Updated README.md * BAEL-157: README.md updated * Changed project name * Update RunGuice.java Removed references to message logging and output * Update Communication.java Removed message logging-related code * BAEL-566: Updated README.md * New project name * BAEL-393: removing guice-intro directory * BAEL-393: renamed module guice-intro to guice in root pom.xml * BAEL-393 and BAEL-541 README.md files * BAEL-731: Updated README.md --- spring-boot/README.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index d70e83525b..8aa5957bad 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -14,4 +14,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet) - [Guide to Spring WebUtils and ServletRequestUtils](http://www.baeldung.com/spring-webutils-servletrequestutils) - [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) +- [Guide to Internationalization in Spring Boot](http://www.baeldung.com/spring-boot-internationalization) From debde5ad67c020cdcf000a5ebb8b1ca126749e6c Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 20:02:04 +0100 Subject: [PATCH 02/14] Update README.md (#1439) --- spring-security-mvc-login/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-mvc-login/README.md b/spring-security-mvc-login/README.md index 35305112b4..f7eb314869 100644 --- a/spring-security-mvc-login/README.md +++ b/spring-security-mvc-login/README.md @@ -11,6 +11,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security Expressions – hasRole Example](http://www.baeldung.com/spring-security-expressions-basic) - [Spring HTTP/HTTPS Channel Security](http://www.baeldung.com/spring-channel-security-https) - [Spring Security - Customize the 403 Forbidden/Access Denied Page](http://www.baeldung.com/spring-security-custom-access-denied-page) +- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) ### Build the Project ``` From 7d670d2be6b1369561b02358cac3f64b5a181595 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 20:02:15 +0100 Subject: [PATCH 03/14] Update README.md (#1442) --- spring-ldap/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-ldap/README.md b/spring-ldap/README.md index 8dffadb685..f77572d982 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -1,8 +1,9 @@ +## Spring LDAP Example Project + ### Relevant articles - [Spring LDAP Overview](http://www.baeldung.com/spring-ldap) +- [Spring LDAP Example Project](http://www.baeldung.com/spring-ldap-overview/) -## Spring LDAP Example Project -- (http://www.baeldung.com/spring-ldap-overview/) From e693c47019d6d39c15e4596a8816984abcfe08d4 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 20:02:29 +0100 Subject: [PATCH 04/14] Delete README.md (#1440) --- spring-5/src/test/java/com/baeldung/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 spring-5/src/test/java/com/baeldung/README.md diff --git a/spring-5/src/test/java/com/baeldung/README.md b/spring-5/src/test/java/com/baeldung/README.md deleted file mode 100644 index f7b358ec3e..0000000000 --- a/spring-5/src/test/java/com/baeldung/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant articles - -- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) From 365d9b70230c644c5012ed367a39ad06ad3262b0 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 20:02:50 +0100 Subject: [PATCH 05/14] Update README.md (#1441) --- spring-5/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spring-5/README.md b/spring-5/README.md index 0914388b49..47a5314009 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -1,6 +1,8 @@ ## Spring REST Example Project -###The Course +### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring -### Relevant Articles: +### Relevant Articles + +- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) From e71367b3f3f972558097d56020ec46af26ea78e4 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 20:03:23 +0100 Subject: [PATCH 06/14] Assembly plugin fix (#1449) * Assembly plugin fix * Fix java opts * Fix java opts 2 * Fix java opts 3 * Add sudo: required * Remove sudo: required * Enable incremental builder * Disable incremental builder * Update * Update --- .travis.yml | 13 +++++-------- apache-poi/temp.xlsx | Bin 3510 -> 3492 bytes core-java/pom.xml | 1 + disruptor/pom.xml | 1 + jpa-storedprocedure/pom.xml | 1 + pom.xml | 14 +++++++++++++- xml/pom.xml | 1 + 7 files changed, 22 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6063fbf3e5..120d365569 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,9 @@ language: java -install: travis_wait 40 mvn -q clean install -Dgib.enabled=true +install: travis_wait 60 mvn -q clean install + +before_script: + - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:-UseGCOverheadLimit'" > ~/.mavenrc jdk: - oraclejdk8 @@ -14,10 +17,4 @@ cache: directories: - .autoconf - $HOME/.m2 - - sudo: required - - env: - global: - JAVA_OPTS="-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" - MAVEN_OPTS="-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" + diff --git a/apache-poi/temp.xlsx b/apache-poi/temp.xlsx index 50307a28c2ae5c64afdcaf6baae59a0648c28c6b..cbea3a410d193a848a5321af8e311bcf61f7160f 100644 GIT binary patch literal 3492 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 + ${project.basedir} org.baeldung.executable.ExecutableMavenJar diff --git a/disruptor/pom.xml b/disruptor/pom.xml index 7f2c78c9b0..2523cc2125 100644 --- a/disruptor/pom.xml +++ b/disruptor/pom.xml @@ -145,6 +145,7 @@ single + ${project.basedir} org.baeldung.executable.ExecutableMavenJar diff --git a/jpa-storedprocedure/pom.xml b/jpa-storedprocedure/pom.xml index 797303dc29..1672afd217 100644 --- a/jpa-storedprocedure/pom.xml +++ b/jpa-storedprocedure/pom.xml @@ -30,6 +30,7 @@ maven-assembly-plugin + ${project.basedir} jar-with-dependencies diff --git a/pom.xml b/pom.xml index 4e55d4686d..d68a7d0749 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ UTF-8 refs/heads/master - false + @@ -211,6 +211,18 @@ + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + maven + + + + + maven-assembly-plugin + ${project.basedir} jar-with-dependencies From 6bd430c4644e93e7cc400e22b8cfeae712cead12 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 21:37:44 +0100 Subject: [PATCH 07/14] Update .travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 120d365569..b5bd4684a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,8 @@ language: java install: travis_wait 60 mvn -q clean install +sudo: required + before_script: - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:-UseGCOverheadLimit'" > ~/.mavenrc From 6c3f4d868837fed7e5f880593fdebd8152821487 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 21:37:59 +0100 Subject: [PATCH 08/14] Update .travis.yml --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b5bd4684a3..120d365569 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,6 @@ language: java install: travis_wait 60 mvn -q clean install -sudo: required - before_script: - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:-UseGCOverheadLimit'" > ~/.mavenrc From 0b78cc9e4c0b5c32f6d7469f45cd96bd91275fdd Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Sun, 19 Mar 2017 21:29:10 +0000 Subject: [PATCH 09/14] Custom aop (#1451) --- spring-custom-aop/pom.xml | 53 +++++++++++++++++++ .../main/java/org/baeldung/Application.java | 13 +++++ .../main/java/org/baeldung/ExampleAspect.java | 25 +++++++++ .../java/org/baeldung/LogExecutionTime.java | 11 ++++ .../src/main/java/org/baeldung/Service.java | 12 +++++ .../org/baeldung/CustomAnnotationTest.java | 21 ++++++++ 6 files changed, 135 insertions(+) create mode 100644 spring-custom-aop/pom.xml create mode 100644 spring-custom-aop/src/main/java/org/baeldung/Application.java create mode 100644 spring-custom-aop/src/main/java/org/baeldung/ExampleAspect.java create mode 100644 spring-custom-aop/src/main/java/org/baeldung/LogExecutionTime.java create mode 100644 spring-custom-aop/src/main/java/org/baeldung/Service.java create mode 100644 spring-custom-aop/src/test/java/org/baeldung/CustomAnnotationTest.java diff --git a/spring-custom-aop/pom.xml b/spring-custom-aop/pom.xml new file mode 100644 index 0000000000..1c3b5bdccd --- /dev/null +++ b/spring-custom-aop/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + com.baeldung + spring-custom-aop + 0.0.1-SNAPSHOT + war + spring-custom-aop + + + org.springframework.boot + spring-boot-starter-parent + 1.5.2.RELEASE + + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + diff --git a/spring-custom-aop/src/main/java/org/baeldung/Application.java b/spring-custom-aop/src/main/java/org/baeldung/Application.java new file mode 100644 index 0000000000..e5c764ef7e --- /dev/null +++ b/spring-custom-aop/src/main/java/org/baeldung/Application.java @@ -0,0 +1,13 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-custom-aop/src/main/java/org/baeldung/ExampleAspect.java b/spring-custom-aop/src/main/java/org/baeldung/ExampleAspect.java new file mode 100644 index 0000000000..7c3b5fb599 --- /dev/null +++ b/spring-custom-aop/src/main/java/org/baeldung/ExampleAspect.java @@ -0,0 +1,25 @@ +package org.baeldung; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class ExampleAspect { + + @Around("@annotation(LogExecutionTime)") + public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { + final long start = System.currentTimeMillis(); + + final Object proceed = joinPoint.proceed(); + + final long executionTime = System.currentTimeMillis() - start; + + System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms"); + + return proceed; + } + +} diff --git a/spring-custom-aop/src/main/java/org/baeldung/LogExecutionTime.java b/spring-custom-aop/src/main/java/org/baeldung/LogExecutionTime.java new file mode 100644 index 0000000000..c10f97e78f --- /dev/null +++ b/spring-custom-aop/src/main/java/org/baeldung/LogExecutionTime.java @@ -0,0 +1,11 @@ +package org.baeldung; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface LogExecutionTime { +} diff --git a/spring-custom-aop/src/main/java/org/baeldung/Service.java b/spring-custom-aop/src/main/java/org/baeldung/Service.java new file mode 100644 index 0000000000..e4bee38438 --- /dev/null +++ b/spring-custom-aop/src/main/java/org/baeldung/Service.java @@ -0,0 +1,12 @@ +package org.baeldung; + +import org.springframework.stereotype.Component; + +@Component +public class Service { + + @LogExecutionTime + public void serve() throws InterruptedException { + Thread.sleep(2000); + } +} diff --git a/spring-custom-aop/src/test/java/org/baeldung/CustomAnnotationTest.java b/spring-custom-aop/src/test/java/org/baeldung/CustomAnnotationTest.java new file mode 100644 index 0000000000..d4712cc063 --- /dev/null +++ b/spring-custom-aop/src/test/java/org/baeldung/CustomAnnotationTest.java @@ -0,0 +1,21 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class CustomAnnotationTest { + + @Autowired + private Service service; + + @Test + public void shouldApplyCustomAnnotation() throws InterruptedException { + service.serve(); + } + +} From 3accbf88156f1aa4850dd29c7dae8a9b42e0f255 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 19 Mar 2017 22:31:11 +0100 Subject: [PATCH 10/14] UserController refactor (#1450) * Refactor UserController * Refactor UserController --- .../controller/UserController.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java index 880b224dd9..f5553cf2b7 100644 --- a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java @@ -1,48 +1,44 @@ package com.baeldung.springmvcforms.controller; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.validation.Valid; +import com.baeldung.springmvcforms.domain.User; +import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; -import com.baeldung.springmvcforms.domain.User; +import javax.validation.Valid; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; @Controller public class UserController { - List users = new ArrayList() { - { - add(new User("ana@yahoo.com", "pass", "Ana", 20)); - add(new User("bob@yahoo.com", "pass", "Bob", 30)); - add(new User("john@yahoo.com", "pass", "John", 40)); - add(new User("mary@yahoo.com", "pass", "Mary", 30)); - } - }; + private List users = Arrays.asList( + new User("ana@yahoo.com", "pass", "Ana", 20), + new User("bob@yahoo.com", "pass", "Bob", 30), + new User("john@yahoo.com", "pass", "John", 40), + new User("mary@yahoo.com", "pass", "Mary", 30)); @GetMapping("/userPage") public String getUserProfilePage() { return "user"; } - @PostMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping("/user") @ResponseBody public ResponseEntity saveUser(@Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { - List errors = new ArrayList<>(); - result.getAllErrors().forEach(item->{ - errors.add(item.getDefaultMessage()); - }); + final List errors = result.getAllErrors().stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.toList()); + return new ResponseEntity<>(errors, HttpStatus.OK); } else { if (users.stream().anyMatch(it -> user.getEmail().equals(it.getEmail()))) { @@ -54,7 +50,7 @@ public class UserController { } } - @GetMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping("/users") @ResponseBody public List getUsers() { return users; From ed70f6b3380c3a6e597209e3787e14a0c098f8f0 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 20 Mar 2017 09:15:49 +0100 Subject: [PATCH 11/14] Finite Automata refactor (#1445) --- .../src/main/java/com/baeldung/automata/RtState.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/automata/RtState.java b/algorithms/src/main/java/com/baeldung/automata/RtState.java index ba785eeff0..b4a5df7961 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtState.java +++ b/algorithms/src/main/java/com/baeldung/automata/RtState.java @@ -21,12 +21,12 @@ public final class RtState implements State { } public State transit(final CharSequence c) { - for(final Transition t : this.transitions) { - if(t.isPossible(c)) { - return t.state(); - } - } - throw new IllegalArgumentException("Input not accepted: " + c); + return transitions + .stream() + .filter(t -> t.isPossible(c)) + .map(Transition::state) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("Input not accepted: " + c)); } public boolean isFinal() { From 64c2ef150e7cbbc1e9b9001734698790576e1706 Mon Sep 17 00:00:00 2001 From: Devendra Tiwari Date: Mon, 20 Mar 2017 13:46:34 +0530 Subject: [PATCH 12/14] Guava 21 (#1411) Code for article Guava 21 | common.collect package --- guava21/README.md | 7 + guava21/pom.xml | 41 +++++ .../guava/tutorial/ComparatorsExamples.java | 27 +++ .../guava/tutorial/ConcatStreams.java | 11 ++ .../tutorial/InternerBuilderExample.java | 19 +++ .../guava/tutorial/MoreCollectorsExample.java | 17 ++ .../guava/tutorial/StreamsUtility.java | 42 +++++ .../src/test/java/ComparatorsUnitTests.java | 76 +++++++++ guava21/src/test/java/GauavaStreamsTests.java | 155 ++++++++++++++++++ .../src/test/java/InternBuilderUnitTests.java | 19 +++ .../test/java/MoreCollectorsUnitTests.java | 36 ++++ guava21/src/test/java/StreamUtility.java | 66 ++++++++ 12 files changed, 516 insertions(+) create mode 100644 guava21/README.md create mode 100644 guava21/pom.xml create mode 100644 guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java create mode 100644 guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java create mode 100644 guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java create mode 100644 guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java create mode 100644 guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java create mode 100644 guava21/src/test/java/ComparatorsUnitTests.java create mode 100644 guava21/src/test/java/GauavaStreamsTests.java create mode 100644 guava21/src/test/java/InternBuilderUnitTests.java create mode 100644 guava21/src/test/java/MoreCollectorsUnitTests.java create mode 100644 guava21/src/test/java/StreamUtility.java diff --git a/guava21/README.md b/guava21/README.md new file mode 100644 index 0000000000..8121cf2ea6 --- /dev/null +++ b/guava21/README.md @@ -0,0 +1,7 @@ +========= + +## Guava 21 + +**Important**: Guava 21.0 requires Java 8. If you need Java 6, 7 or Android compatibility, use Guava 20.0 for now. Guava 22.0 and on will introduce a Java 6/Android compatible backport of Guava that includes all of the latest changes that don't require Java 8. + +Article 1 : Introduction to Guava21 common.collect package. \ No newline at end of file diff --git a/guava21/pom.xml b/guava21/pom.xml new file mode 100644 index 0000000000..f393c65aec --- /dev/null +++ b/guava21/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + com.baeldung.guava + tutorial + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + + com.google.guava + guava + 21.0 + + + + + junit + junit + 4.11 + + + + + + \ No newline at end of file diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java b/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java new file mode 100644 index 0000000000..6eb5c7f5ba --- /dev/null +++ b/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java @@ -0,0 +1,27 @@ +package com.baeldung.guava.tutorial; + +import com.google.common.collect.Comparators; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +public class ComparatorsExamples { + + public static void main(String[] args){ + + List integers = Arrays.asList(1,2,3,4,4,6,7,8,9,10); + //This will return true + boolean isInAscendingOrder = Comparators.isInOrder(integers, new AscedingOrderComparator()); + + System.out.println(isInAscendingOrder); + + } + + private static class AscedingOrderComparator implements Comparator { + @Override + public int compare(Integer o1, Integer o2) { + return o1.compareTo(o2); + } + } +} diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java b/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java new file mode 100644 index 0000000000..ab95b85751 --- /dev/null +++ b/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java @@ -0,0 +1,11 @@ +package com.baeldung.guava.tutorial; + +import com.google.common.collect.Streams; + +import java.util.stream.Stream; + +public class ConcatStreams { + public static Stream concatStreams(Stream stream1, Stream stream2, Stream stream3){ + return Streams.concat(stream1,stream2,stream3); + } +} diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java b/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java new file mode 100644 index 0000000000..6b935ba2a8 --- /dev/null +++ b/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java @@ -0,0 +1,19 @@ +package com.baeldung.guava.tutorial; + +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; + +import static com.google.common.collect.Interners.newBuilder; + +public class InternerBuilderExample { + + public static void main(String[] args){ + Interner interners = Interners.newBuilder() + .concurrencyLevel(2) + .strong() + .build(); + + + } + +} diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java b/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java new file mode 100644 index 0000000000..6cf4b6b0ac --- /dev/null +++ b/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java @@ -0,0 +1,17 @@ +package com.baeldung.guava.tutorial; + +import com.google.common.collect.MoreCollectors; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +public class MoreCollectorsExample { + + public static void main(String[] args) { + List numbers = Arrays.asList(1); + Optional number = numbers.stream() + .map(e -> e * 2) + .collect(MoreCollectors.toOptional()); + } +} diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java b/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java new file mode 100644 index 0000000000..4ec3b44ef4 --- /dev/null +++ b/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java @@ -0,0 +1,42 @@ +package com.baeldung.guava.tutorial; + +import com.google.common.collect.Streams; + +import java.util.*; +import java.util.stream.DoubleStream; +import java.util.stream.IntStream; +import java.util.stream.LongStream; +import java.util.stream.Stream; + +public class StreamsUtility { + + public static void main(String[] args){ + + List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,11,12,13,14,15,16,17,18,19,20); + //Using Collection + Stream streamFromCollection = Streams.stream(numbers); + //Using Iterator + Stream streamFromIterator = Streams.stream(numbers.iterator()); + //Using Iterable + Stream streamFromIterable = Streams.stream((Iterable) numbers); + //Using Optional + Stream streamFromOptional = Streams.stream(Optional.of(1)); + //Using OptionalLong to LongStream + LongStream streamFromOptionalLong = Streams.stream(OptionalLong.of(1)); + //Using OptionalInt to IntStream + IntStream streamFromOptionalInt = Streams.stream(OptionalInt.of(1)); + //Using OptionalDouble to DoubleStream + DoubleStream streamFromOptionalDouble = Streams.stream(OptionalDouble.of(1.0)); + + Stream concatenatedStreams = Streams.concat(streamFromCollection,streamFromIterable,streamFromIterator); + + List integers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); + //This will return 10 + Optional lastItem = Streams.findLast(integers.stream()); + + Streams.zip( + Stream.of("candy", "chocolate", "bar"), + Stream.of("$1", "$2","$3"), + (arg1, arg2) -> arg1 + ":" + arg2); + } +} diff --git a/guava21/src/test/java/ComparatorsUnitTests.java b/guava21/src/test/java/ComparatorsUnitTests.java new file mode 100644 index 0000000000..f196c41a1b --- /dev/null +++ b/guava21/src/test/java/ComparatorsUnitTests.java @@ -0,0 +1,76 @@ +import com.google.common.collect.Comparators; +import org.junit.Assert; +import org.junit.Test; + +import java.util.*; +import java.util.function.Function; +import java.util.function.ToDoubleFunction; +import java.util.function.ToIntFunction; +import java.util.function.ToLongFunction; + +public class ComparatorsUnitTests { + + @Test + public void isInOrderTest(){ + + List numbers = Arrays.asList(1,2,3,4,4,6,7,8,9,10); + + boolean isInAscendingOrder = Comparators.isInOrder(numbers, new AscendingOrderComparator()); + + Assert.assertTrue(isInAscendingOrder); + } + + @Test + public void isInStrictOrderTest(){ + + List numbers = Arrays.asList(1,2,3,4,3,6,7,8,9,10); + + boolean isInAscendingOrder = Comparators.isInOrder(numbers, new AscendingOrderComparator()); + + Assert.assertFalse(isInAscendingOrder); + } + + + private class AscendingOrderComparator implements Comparator{ + + @Override + public int compare(Integer o1, Integer o2) { + return o1.compareTo(o2); + } + + @Override + public Comparator reversed() { + return null; + } + + @Override + public Comparator thenComparing(Comparator other) { + return null; + } + + @Override + public Comparator thenComparing(Function keyExtractor, Comparator keyComparator) { + return null; + } + + @Override + public > Comparator thenComparing(Function keyExtractor) { + return null; + } + + @Override + public Comparator thenComparingInt(ToIntFunction keyExtractor) { + return null; + } + + @Override + public Comparator thenComparingLong(ToLongFunction keyExtractor) { + return null; + } + + @Override + public Comparator thenComparingDouble(ToDoubleFunction keyExtractor) { + return null; + } + } +} diff --git a/guava21/src/test/java/GauavaStreamsTests.java b/guava21/src/test/java/GauavaStreamsTests.java new file mode 100644 index 0000000000..09e3e29b47 --- /dev/null +++ b/guava21/src/test/java/GauavaStreamsTests.java @@ -0,0 +1,155 @@ +import com.google.common.collect.Streams; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.*; +import java.util.stream.DoubleStream; +import java.util.stream.IntStream; +import java.util.stream.LongStream; +import java.util.stream.Stream; + +public class GauavaStreamsTests { + + List numbers; + + @Before + public void setUp(){ + numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,11,12,13,14,15,16,17,18,19,20); + } + + + @Test + public void createStreamsWithCollection(){ + //Deprecated API to create stream from collection + Stream streamFromCollection = Streams.stream(numbers); + + //Assert.assertNotNull(streamFromCollection); + StreamUtility.assertStreamEquals(streamFromCollection, numbers.stream()); + } + + @Test + public void createStreamsWithIterable(){ + Iterable numbersIterable = (Iterable) numbers; + + Stream streamFromIterable = Streams.stream(numbersIterable); + + Assert.assertNotNull(streamFromIterable); + StreamUtility.assertStreamEquals(streamFromIterable, numbers.stream()); + } + + @Test + public void createStreamsWithIterator(){ + Iterator numbersIterator = numbers.iterator(); + + Stream streamFromIterator = Streams.stream(numbersIterator); + + Assert.assertNotNull(streamFromIterator); + StreamUtility.assertStreamEquals(streamFromIterator, numbers.stream()); + } + + @Test + public void createStreamsWithOptional(){ + + Stream streamFromOptional = Streams.stream(Optional.of(1)); + + Assert.assertNotNull(streamFromOptional); + Assert.assertEquals(streamFromOptional.count(), 1); + } + + @Test + public void createStreamsWithOptionalLong(){ + + LongStream streamFromOptionalLong = Streams.stream(OptionalLong.of(1)); + + Assert.assertNotNull(streamFromOptionalLong); + Assert.assertEquals(streamFromOptionalLong.count(), 1); + } + + @Test + public void createStreamsWithOptionalInt(){ + + IntStream streamFromOptionalInt = Streams.stream(OptionalInt.of(1)); + + //Assert.assertNotNull(streamFromOptionalInt); + Assert.assertEquals(streamFromOptionalInt.count(), 1); + } + + @Test + public void createStreamsWithOptionalDouble(){ + + DoubleStream streamFromOptionalDouble = Streams.stream(OptionalDouble.of(1.0)); + + //Assert.assertNotNull(streamFromOptionalDouble); + Assert.assertEquals(streamFromOptionalDouble.count(), 1); + + } + + @Test + public void concatStreamsOfSameType(){ + Stream oddNumbers = Arrays.asList(1,3,5,7,9,11,13,15,17,19).stream(); + Stream evenNumbers = Arrays.asList(2,4,6,8,10,12,14,16,18,20).stream(); + + Stream combinedStreams = Streams.concat(oddNumbers,evenNumbers); + + //Assert.assertNotNull(combinedStreams); + StreamUtility.assertStreamEquals(combinedStreams, Stream.concat(oddNumbers, evenNumbers)); + } + + @Test + public void concatStreamsOfTypeLongStream(){ + LongStream firstTwenty = LongStream.range(1,20); + LongStream nextTwenty = LongStream.range(21,40); + + LongStream combinedStreams = Streams.concat(firstTwenty,nextTwenty); + + Assert.assertNotNull(combinedStreams); + StreamUtility.assertStreamEquals(combinedStreams, LongStream.concat(firstTwenty, nextTwenty)); + } + + @Test + public void concatStreamsOfTypeIntStream(){ + IntStream firstTwenty = IntStream.range(1,20); + IntStream nextTwenty = IntStream.range(21,40); + + IntStream combinedStreams = Streams.concat(firstTwenty,nextTwenty); + + Assert.assertNotNull(combinedStreams); + StreamUtility.assertStreamEquals(combinedStreams, IntStream.concat(firstTwenty, nextTwenty)); + } + + + @Test + public void findLastOfStream(){ + Optional lastElement = Streams.findLast(numbers.stream()); + + Assert.assertNotNull(lastElement.get()); + Assert.assertEquals(lastElement.get(), numbers.get(20)); + } + + @Test + public void mapWithIndexTest(){ + Stream stringSream = Stream.of("a","b","c"); + + Stream mappedStream = Streams.mapWithIndex(stringSream,(str,index) -> str +":"+ index); + + //Assert.assertNotNull(mappedStream); + Assert.assertEquals(mappedStream.findFirst().get(), "a:0"); + + } + + @Test + public void streamsZipTest(){ + Stream stringSream = Stream.of("a","b","c"); + Stream intStream = Stream.of(1,2,3); + Stream mappedStream = Streams.zip(stringSream,intStream, (str,index) -> str +":"+ index); + + //Assert.assertNotNull(mappedStream); + Assert.assertEquals(mappedStream.findFirst().get(), "a:1"); + + } + + + + +} diff --git a/guava21/src/test/java/InternBuilderUnitTests.java b/guava21/src/test/java/InternBuilderUnitTests.java new file mode 100644 index 0000000000..513b44f249 --- /dev/null +++ b/guava21/src/test/java/InternBuilderUnitTests.java @@ -0,0 +1,19 @@ +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; +import org.junit.Assert; +import org.junit.Test; + +public class InternBuilderUnitTests { + + @Test + public void interBuilderTest(){ + + Interner interners = Interners.newBuilder() + .concurrencyLevel(2) + .strong() + .build(); + + Assert.assertNotNull(interners); + } + +} diff --git a/guava21/src/test/java/MoreCollectorsUnitTests.java b/guava21/src/test/java/MoreCollectorsUnitTests.java new file mode 100644 index 0000000000..956331e25f --- /dev/null +++ b/guava21/src/test/java/MoreCollectorsUnitTests.java @@ -0,0 +1,36 @@ +import com.google.common.collect.MoreCollectors; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +public class MoreCollectorsUnitTests { + + @Test + public void toOptionalTest(){ + + List numbers = Arrays.asList(1); + + Optional number = numbers.stream() + .map( e -> e*2) + .collect(MoreCollectors.toOptional()); + + Assert.assertEquals(number.get(),new Integer(2)); + } + + + @Test + public void onlyElementTest(){ + List numbers = Arrays.asList(1); + + Integer number = numbers.stream() + .map( e -> e*2) + .collect(MoreCollectors.onlyElement()); + + Assert.assertEquals(number,new Integer(2)); + } + + +} diff --git a/guava21/src/test/java/StreamUtility.java b/guava21/src/test/java/StreamUtility.java new file mode 100644 index 0000000000..91a03be48d --- /dev/null +++ b/guava21/src/test/java/StreamUtility.java @@ -0,0 +1,66 @@ +import org.junit.Assert; + +import java.util.Iterator; +import java.util.stream.DoubleStream; +import java.util.stream.IntStream; +import java.util.stream.LongStream; +import java.util.stream.Stream; + +public class StreamUtility { + + public static boolean assertStreamEquals(Stream stream1, Stream stream2){ + + Iterator iterator1 = stream1.iterator(); + Iterator iterator2 = stream2.iterator(); + + while (iterator1.hasNext()){ + Assert.assertEquals(iterator1.next(), iterator2.next()); + } + + Assert.assertFalse(iterator2.hasNext()); + + return true; + } + + public static boolean assertStreamEquals(LongStream stream1, LongStream stream2) { + + Iterator iterator1 = stream1.iterator(); + Iterator iterator2 = stream2.iterator(); + + while (iterator1.hasNext()){ + Assert.assertEquals(iterator1.next(), iterator2.next()); + } + + Assert.assertFalse(iterator2.hasNext()); + + return true; + } + + public static boolean assertStreamEquals(DoubleStream stream1, DoubleStream stream2) { + + Iterator iterator1 = stream1.iterator(); + Iterator iterator2 = stream2.iterator(); + + while (iterator1.hasNext()){ + Assert.assertEquals(iterator1.next(), iterator2.next()); + } + + Assert.assertFalse(iterator2.hasNext()); + + return true; + } + + public static boolean assertStreamEquals(IntStream stream1, IntStream stream2) { + + Iterator iterator1 = stream1.iterator(); + Iterator iterator2 = stream2.iterator(); + + while (iterator1.hasNext()){ + Assert.assertEquals(iterator1.next(), iterator2.next()); + } + + Assert.assertFalse(iterator2.hasNext()); + + return true; + } +} From 52c1e6a3fbebf2d400d1a5182a26e7c5a99804ff Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 20 Mar 2017 09:18:03 +0100 Subject: [PATCH 13/14] Update README.md --- guava21/README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/guava21/README.md b/guava21/README.md index 8121cf2ea6..ff12555376 100644 --- a/guava21/README.md +++ b/guava21/README.md @@ -1,7 +1 @@ -========= - -## Guava 21 - -**Important**: Guava 21.0 requires Java 8. If you need Java 6, 7 or Android compatibility, use Guava 20.0 for now. Guava 22.0 and on will introduce a Java 6/Android compatible backport of Guava that includes all of the latest changes that don't require Java 8. - -Article 1 : Introduction to Guava21 common.collect package. \ No newline at end of file +## Relevant articles: From 29645fc0d12fdade2cdc03104aa8a04873ca8505 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 20 Mar 2017 12:18:41 +0100 Subject: [PATCH 14/14] BAEL-724 (#1422) Property testing with Javaslang * BAEL-724 add javaslang test and property testing example * BAEL-724 make test more readable * BAEL-724 change missspelled word to the Remainder --- javaslang/pom.xml | 9 +++ .../baeldung/javaslang/PropertyBasedTest.java | 69 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedTest.java diff --git a/javaslang/pom.xml b/javaslang/pom.xml index e111132aec..7bb23c0daf 100644 --- a/javaslang/pom.xml +++ b/javaslang/pom.xml @@ -22,8 +22,17 @@ javaslang 2.1.0-alpha + + io.javaslang + javaslang-test + ${javaslang.test.version} + + + 2.0.5 + + diff --git a/javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedTest.java b/javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedTest.java new file mode 100644 index 0000000000..3acac34550 --- /dev/null +++ b/javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedTest.java @@ -0,0 +1,69 @@ +package com.baeldung.javaslang; + + +import javaslang.CheckedFunction1; +import javaslang.collection.Stream; +import javaslang.test.Arbitrary; +import javaslang.test.CheckResult; +import javaslang.test.Property; +import org.junit.Test; + +public class PropertyBasedTest { + + public Stream stringsSupplier() { + return Stream.from(0).map(i -> { + boolean divByTwo = i % 2 == 0; + boolean divByFive = i % 5 == 0; + + if(divByFive && divByTwo){ + return "DividedByTwoAndFiveWithoutRemainder"; + }else if(divByFive){ + return "DividedByFiveWithoutRemainder"; + }else if(divByTwo){ + return "DividedByTwoWithoutRemainder"; + } + return ""; + }); + } + + @Test + public void givenArbitrarySeq_whenCheckThatEverySecondElementIsEqualToString_thenTestPass() { + //given + Arbitrary multiplesOf2 = Arbitrary.integer() + .filter(i -> i > 0) + .filter(i -> i % 2 == 0 && i % 5 != 0); + + //when + CheckedFunction1 mustEquals = + i -> stringsSupplier().get(i).equals("DividedByTwoWithoutRemainder"); + + + //then + CheckResult result = Property + .def("Every second element must equal to DividedByTwoWithoutRemainder") + .forAll(multiplesOf2) + .suchThat(mustEquals) + .check(10_000, 100); + + result.assertIsSatisfied(); + } + + @Test + public void givenArbitrarySeq_whenCheckThatEveryFifthElementIsEqualToString_thenTestPass() { + //given + Arbitrary multiplesOf5 = Arbitrary.integer() + .filter(i -> i > 0) + .filter(i -> i % 5 == 0 && i % 2 == 0); + + //when + CheckedFunction1 mustEquals = i -> + stringsSupplier().get(i).endsWith("DividedByTwoAndFiveWithoutRemainder"); + + //then + Property.def("Every fifth element must equal to DividedByTwoAndFiveWithoutRemainder") + .forAll(multiplesOf5) + .suchThat(mustEquals) + .check(10_000, 1_000) + .assertIsSatisfied(); + } +}