From 3af6986dab25cf0a03358e45c671d8b5b6a99496 Mon Sep 17 00:00:00 2001 From: glopez Date: Mon, 8 Jul 2019 07:25:28 -0300 Subject: [PATCH 01/43] BAEL-2804 JPA Query Parameters Usage - move article files to new module Move article files to other maven module since the previous one is already full. --- persistence-modules/java-jpa-2/README.md | 3 + persistence-modules/java-jpa-2/pom.xml | 94 +++++++++++++++++++ .../baeldung/jpa/queryparams/Employee.java | 0 .../main/resources/META-INF/persistence.xml | 31 ++++++ .../java-jpa-2/src/main/resources/logback.xml | 13 +++ .../queryparams/JPAQueryParamsUnitTest.java | 0 .../src/test/resources/queryparams.sql} | 0 persistence-modules/java-jpa/pom.xml | 57 ----------- .../main/resources/META-INF/persistence.xml | 22 ----- persistence-modules/pom.xml | 1 + 10 files changed, 142 insertions(+), 79 deletions(-) create mode 100644 persistence-modules/java-jpa-2/README.md create mode 100644 persistence-modules/java-jpa-2/pom.xml rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/queryparams/Employee.java (100%) create mode 100644 persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/java-jpa-2/src/main/resources/logback.xml rename persistence-modules/{java-jpa => java-jpa-2}/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java (100%) rename persistence-modules/{java-jpa/src/test/resources/employees2.sql => java-jpa-2/src/test/resources/queryparams.sql} (100%) diff --git a/persistence-modules/java-jpa-2/README.md b/persistence-modules/java-jpa-2/README.md new file mode 100644 index 0000000000..ca31627ebc --- /dev/null +++ b/persistence-modules/java-jpa-2/README.md @@ -0,0 +1,3 @@ +# Relevant Articles + +- [JPA Query Parameters Usage](http://www.baeldung.com/jpa-query-parameters-usage) diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml new file mode 100644 index 0000000000..0bfd040222 --- /dev/null +++ b/persistence-modules/java-jpa-2/pom.xml @@ -0,0 +1,94 @@ + + 4.0.0 + java-jpa-2 + java-jpa-2 + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + + + com.h2database + h2 + ${h2.version} + + + + + javax.persistence + javax.persistence-api + 2.2 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + -proc:none + + + + org.bsc.maven + maven-processor-plugin + 3.3.3 + + + process + + process + + generate-sources + + target/metamodel + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + add-source + generate-sources + + add-source + + + + target/metamodel + + + + + + + + + 5.4.0.Final + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/queryparams/Employee.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/queryparams/Employee.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/queryparams/Employee.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/queryparams/Employee.java diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..653ab83a18 --- /dev/null +++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,31 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.queryparams.Employee + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa-2/src/main/resources/logback.xml b/persistence-modules/java-jpa-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/java-jpa-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java similarity index 100% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java rename to persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java diff --git a/persistence-modules/java-jpa/src/test/resources/employees2.sql b/persistence-modules/java-jpa-2/src/test/resources/queryparams.sql similarity index 100% rename from persistence-modules/java-jpa/src/test/resources/employees2.sql rename to persistence-modules/java-jpa-2/src/test/resources/queryparams.sql diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index 51cc401332..f23040fbdc 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -19,11 +19,6 @@ hibernate-core ${hibernate.version} - - org.hibernate - hibernate-jpamodelgen - ${hibernate.version} - com.h2database h2 @@ -52,58 +47,6 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - -proc:none - - - - org.bsc.maven - maven-processor-plugin - 3.3.3 - - - process - - process - - generate-sources - - target/metamodel - - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 3.0.0 - - - add-source - generate-sources - - add-source - - - - target/metamodel - - - - - - - 5.4.0.Final 2.7.4-RC1 diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml index 6a236f0840..1f16bee3ba 100644 --- a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml @@ -224,26 +224,4 @@ value="products_jpa.sql" /> - - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.queryparams.Employee - true - - - - - - - - - - - - \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index ba3baf6636..05b2c8e090 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -56,5 +56,6 @@ spring-hibernate4 spring-jpa spring-persistence-simple + java-jpa-2 From 1c1cf0fdc91507f83b9c828df5e3f6a2e279d253 Mon Sep 17 00:00:00 2001 From: Juan Vaccari Date: Thu, 11 Jul 2019 23:54:29 +0100 Subject: [PATCH 02/43] BAEL-2928 - Create new spring-di project with examples for Qualifier annotation article --- pom.xml | 4 + spring-di/pom.xml | 101 ++++++++++++++++++ .../main/java/org/baeldung/sample/App.java | 11 ++ .../java/org/baeldung/sample/AppConfig.java | 10 ++ .../main/java/org/baeldung/sample/Bar.java | 5 + .../org/baeldung/sample/BarFormatter.java | 13 +++ .../main/java/org/baeldung/sample/Foo.java | 5 + .../main/java/org/baeldung/sample/FooDAO.java | 5 + .../org/baeldung/sample/FooFormatter.java | 13 +++ .../java/org/baeldung/sample/FooService.java | 17 +++ .../java/org/baeldung/sample/Formatter.java | 7 ++ .../org/baeldung/sample/FormatterType.java | 17 +++ .../sample/FooServiceIntegrationTest.java | 22 ++++ 13 files changed, 230 insertions(+) create mode 100644 spring-di/pom.xml create mode 100644 spring-di/src/main/java/org/baeldung/sample/App.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/AppConfig.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/Bar.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/BarFormatter.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/Foo.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/FooDAO.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/FooFormatter.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/FooService.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/Formatter.java create mode 100644 spring-di/src/main/java/org/baeldung/sample/FormatterType.java create mode 100644 spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java diff --git a/pom.xml b/pom.xml index f24a307d9e..45c84ffb11 100644 --- a/pom.xml +++ b/pom.xml @@ -669,6 +669,8 @@ spring-data-rest-querydsl spring-dispatcher-servlet spring-drools + spring-di + spring-ehcache spring-ejb @@ -871,6 +873,7 @@ spring-data-rest spring-dispatcher-servlet spring-drools + spring-di spring-ehcache spring-freemarker persistence-modules/spring-hibernate-3 @@ -1336,6 +1339,7 @@ spring-data-rest-querydsl spring-dispatcher-servlet spring-drools + spring-di spring-ehcache spring-ejb diff --git a/spring-di/pom.xml b/spring-di/pom.xml new file mode 100644 index 0000000000..62456ba31c --- /dev/null +++ b/spring-di/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + spring-di + 1.0-SNAPSHOT + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + org.springframework + spring-context + + + + javax.annotation + javax.annotation-api + ${annotation-api.version} + + + + + org.springframework + spring-test + test + + + + + + + + org.springframework + spring-framework-bom + ${org.springframework.version} + pom + import + + + org.springframework + spring-core + ${org.springframework.version} + + + + + + spring-di + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + 3.2.2 + + false + + + + + + + + dev + + true + + + dev + + + + prod + + prod + + + + + + org.baeldung.org.baeldung.sample.App + + 5.0.6.RELEASE + 1.3.2 + + + \ No newline at end of file diff --git a/spring-di/src/main/java/org/baeldung/sample/App.java b/spring-di/src/main/java/org/baeldung/sample/App.java new file mode 100644 index 0000000000..17fc49fc8c --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/App.java @@ -0,0 +1,11 @@ +package org.baeldung.sample; + +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class App { + public static void main(String[] args) { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); + FooService fooService = ctx.getBean(FooService.class); + fooService.doStuff(); + } +} diff --git a/spring-di/src/main/java/org/baeldung/sample/AppConfig.java b/spring-di/src/main/java/org/baeldung/sample/AppConfig.java new file mode 100644 index 0000000000..8a177d2611 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/AppConfig.java @@ -0,0 +1,10 @@ +package org.baeldung.sample; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("org.baeldung.sample") +public class AppConfig { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/Bar.java b/spring-di/src/main/java/org/baeldung/sample/Bar.java new file mode 100644 index 0000000000..54e8d54418 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/Bar.java @@ -0,0 +1,5 @@ +package org.baeldung.sample; + +public class Bar { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java b/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java new file mode 100644 index 0000000000..8396653970 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java @@ -0,0 +1,13 @@ +package org.baeldung.sample; + +import org.springframework.stereotype.Component; + +@FormatterType("Bar") +@Component +public class BarFormatter implements Formatter { + + public String format() { + return "bar"; + } + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/Foo.java b/spring-di/src/main/java/org/baeldung/sample/Foo.java new file mode 100644 index 0000000000..562a00121a --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/Foo.java @@ -0,0 +1,5 @@ +package org.baeldung.sample; + +public class Foo { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooDAO.java b/spring-di/src/main/java/org/baeldung/sample/FooDAO.java new file mode 100644 index 0000000000..151c0c38de --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/FooDAO.java @@ -0,0 +1,5 @@ +package org.baeldung.sample; + +public class FooDAO { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java b/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java new file mode 100644 index 0000000000..68cb7f81f2 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java @@ -0,0 +1,13 @@ +package org.baeldung.sample; + +import org.springframework.stereotype.Component; + +@FormatterType("Foo") +@Component +public class FooFormatter implements Formatter { + + public String format() { + return "foo"; + } + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooService.java b/spring-di/src/main/java/org/baeldung/sample/FooService.java new file mode 100644 index 0000000000..711711f205 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/FooService.java @@ -0,0 +1,17 @@ +package org.baeldung.sample; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class FooService { + + @Autowired + @FormatterType("Foo") + private Formatter formatter; + + public String doStuff() { + return formatter.format(); + } + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/Formatter.java b/spring-di/src/main/java/org/baeldung/sample/Formatter.java new file mode 100644 index 0000000000..ab29c2b848 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/Formatter.java @@ -0,0 +1,7 @@ +package org.baeldung.sample; + +public interface Formatter { + + String format(); + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/FormatterType.java b/spring-di/src/main/java/org/baeldung/sample/FormatterType.java new file mode 100644 index 0000000000..a00a9750bf --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/sample/FormatterType.java @@ -0,0 +1,17 @@ +package org.baeldung.sample; + +import org.springframework.beans.factory.annotation.Qualifier; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Qualifier +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface FormatterType { + + String value(); + +} diff --git a/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java b/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java new file mode 100644 index 0000000000..6b518395a1 --- /dev/null +++ b/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java @@ -0,0 +1,22 @@ +package org.baeldung.sample; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) +public class FooServiceIntegrationTest { + + @Autowired + FooService fooService; + + @Test + public void whenFooFormatterType_thenReturnFoo() { + Assert.assertEquals("foo", fooService.doStuff()); + } +} From acd87d8e58f421b94698138e7f473cf5129e4d98 Mon Sep 17 00:00:00 2001 From: glopez Date: Sun, 14 Jul 2019 11:03:53 -0300 Subject: [PATCH 03/43] BAEL-2804 JPA Query Parameters Usage - formatting fixes --- persistence-modules/java-jpa-2/pom.xml | 174 ++++++++++++------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml index 0bfd040222..5e04a99f89 100644 --- a/persistence-modules/java-jpa-2/pom.xml +++ b/persistence-modules/java-jpa-2/pom.xml @@ -1,94 +1,94 @@ - 4.0.0 - java-jpa-2 - java-jpa-2 - - com.baeldung - persistence-modules - 1.0.0-SNAPSHOT - - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.hibernate - hibernate-jpamodelgen - ${hibernate.version} - - - com.h2database - h2 - ${h2.version} - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + java-jpa-2 + java-jpa-2 + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + + + com.h2database + h2 + ${h2.version} + - - - javax.persistence - javax.persistence-api - 2.2 - + + + javax.persistence + javax.persistence-api + 2.2 + - + - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - -proc:none - - - - org.bsc.maven - maven-processor-plugin - 3.3.3 - - - process - - process - - generate-sources - - target/metamodel - - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + -proc:none + + + + org.bsc.maven + maven-processor-plugin + 3.3.3 + + + process + + process + + generate-sources + + target/metamodel + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + + + + - - org.codehaus.mojo - build-helper-maven-plugin - 3.0.0 - - - add-source - generate-sources - - add-source - - - - target/metamodel - - - - - - - - - 5.4.0.Final - + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + add-source + generate-sources + + add-source + + + + target/metamodel + + + + + + + + + 5.4.0.Final + \ No newline at end of file From 7f747e44ec6a4ade68f7360bf0d549ca92e184a0 Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Sun, 14 Jul 2019 18:49:34 +0200 Subject: [PATCH 04/43] Create an interface driven controller (BAEL-3095) --- spring-5-mvc/pom.xml | 7 ++- .../java/com/baeldung/idc/Application.java | 24 ++++++++ .../src/main/java/com/baeldung/idc/Book.java | 55 +++++++++++++++++ .../java/com/baeldung/idc/BookController.java | 34 +++++++++++ .../java/com/baeldung/idc/BookOperations.java | 23 +++++++ .../java/com/baeldung/idc/BookRepository.java | 61 +++++++++++++++++++ .../src/main/resources/custom.properties | 2 + 7 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 spring-5-mvc/src/main/java/com/baeldung/idc/Application.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/idc/Book.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/idc/BookController.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/idc/BookOperations.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/idc/BookRepository.java create mode 100644 spring-5-mvc/src/main/resources/custom.properties diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 302080a8b4..7b641ffa79 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -3,9 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung spring-5-mvc - 0.0.1-SNAPSHOT spring-5-mvc spring 5 MVC sample project about new features jar @@ -87,6 +85,11 @@ ${jayway-rest-assured.version} test + + com.github.javafaker + javafaker + 0.18 + diff --git a/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java b/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java new file mode 100644 index 0000000000..ff86301f7d --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java @@ -0,0 +1,24 @@ +package com.baeldung.idc; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.idc") +@PropertySource(value = { "classpath:/custom.properties" }, ignoreResourceNotFound = true) +public class Application { + + public static void main(String[] args) { + final SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class); + final Map map = new HashMap<>(); + map.put("spring.config.name", "custom.properties"); + builder.properties(map).run(args); + + } + +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/idc/Book.java b/spring-5-mvc/src/main/java/com/baeldung/idc/Book.java new file mode 100644 index 0000000000..387f7049e1 --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/idc/Book.java @@ -0,0 +1,55 @@ +package com.baeldung.idc; + +import org.springframework.stereotype.Component; + +@Component +public class Book { + + private final int id; + + private final String title; + + private final String author; + + private final String genre; + + public Book() { + this(-1, "", "", ""); + } + + public Book(int id, String title, String author, String genre) { + this.id = id; + this.title = title; + this.author = author; + this.genre = genre; + } + + /** + * @return the id + */ + public int getId() { + return id; + } + + /** + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * @return the author + */ + public String getAuthor() { + return author; + } + + /** + * @return the genre + */ + public String getGenre() { + return genre; + } + +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/idc/BookController.java b/spring-5-mvc/src/main/java/com/baeldung/idc/BookController.java new file mode 100644 index 0000000000..5b2349715d --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/idc/BookController.java @@ -0,0 +1,34 @@ +package com.baeldung.idc; + +import java.util.List; +import java.util.Optional; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/book") +public class BookController implements BookOperations { + + private BookRepository repo; + + public BookController(BookRepository repo) { + this.repo = repo; + } + + @Override + public List getAll() { + return repo.getItems(); + } + + @Override + public Optional getById(int id) { + return repo.getById(id); + } + + @Override + public void save(Book book, int id) { + repo.save(id, book); + } + +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/idc/BookOperations.java b/spring-5-mvc/src/main/java/com/baeldung/idc/BookOperations.java new file mode 100644 index 0000000000..70b44561af --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/idc/BookOperations.java @@ -0,0 +1,23 @@ +package com.baeldung.idc; + +import java.util.List; +import java.util.Optional; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +@RequestMapping("/default") +public interface BookOperations { + + @GetMapping("/") + List getAll(); + + @GetMapping("/{id}") + Optional getById(@PathVariable int id); + + @PostMapping("/save/{id}") + public void save(@RequestBody Book book, @PathVariable int id); +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/idc/BookRepository.java b/spring-5-mvc/src/main/java/com/baeldung/idc/BookRepository.java new file mode 100644 index 0000000000..0550b3b79a --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/idc/BookRepository.java @@ -0,0 +1,61 @@ +package com.baeldung.idc; + +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import javax.annotation.PostConstruct; + +import org.springframework.stereotype.Component; + +import com.github.javafaker.Faker; + +/** + * Repository for storing the books. + * + * It serves just for illustrative purposes and is completely in-memory. It uses Java Faker library in order to generate data. + * + * @author A.Shcherbakov + * + */ +@Component +public class BookRepository { + + private List items; + + @PostConstruct + public void init() { + Faker faker = new Faker(Locale.ENGLISH); + final com.github.javafaker.Book book = faker.book(); + this.items = IntStream.range(1, faker.random() + .nextInt(10, 20)) + .mapToObj(i -> new Book(i, book.title(), book.author(), book.genre())) + .collect(Collectors.toList()); + + } + + public int getCount() { + return items.size(); + } + + public List getItems() { + return items; + } + + public Optional getById(int id) { + return this.items.stream() + .filter(item -> id == item.getId()) + .findFirst(); + } + + public void save(int id, Book book) { + IntStream.range(0, items.size()) + .filter(i -> items.get(i) + .getId() == id) + .findFirst() + .ifPresent(i -> this.items.set(i, book)); + } + +} diff --git a/spring-5-mvc/src/main/resources/custom.properties b/spring-5-mvc/src/main/resources/custom.properties new file mode 100644 index 0000000000..78c6675b26 --- /dev/null +++ b/spring-5-mvc/src/main/resources/custom.properties @@ -0,0 +1,2 @@ +server.port=8080 +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration \ No newline at end of file From 306c37cfc4223d2f2ac4919e9758f48093b105b1 Mon Sep 17 00:00:00 2001 From: isaolmez Date: Mon, 15 Jul 2019 12:44:59 +0300 Subject: [PATCH 05/43] BAEL-3014: Added sample code for lists --- spring-thymeleaf-2/pom.xml | 20 ++++-- .../thymeleaf/lists/ListsController.java | 64 +++++++++++++++++++ .../resources/templates/lists/contains.html | 12 ++++ .../resources/templates/lists/isEmpty.html | 14 ++++ .../main/resources/templates/lists/size.html | 12 ++++ .../main/resources/templates/lists/sort.html | 12 ++++ .../resources/templates/lists/toList.html | 14 ++++ .../lists/ListsControllerIntegrationTest.java | 60 +++++++++++++++++ 8 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/lists/ListsController.java create mode 100644 spring-thymeleaf-2/src/main/resources/templates/lists/contains.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/lists/isEmpty.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/lists/size.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/lists/sort.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/lists/toList.html create mode 100644 spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/lists/ListsControllerIntegrationTest.java diff --git a/spring-thymeleaf-2/pom.xml b/spring-thymeleaf-2/pom.xml index 1b95cac43c..ddf71e2ea1 100644 --- a/spring-thymeleaf-2/pom.xml +++ b/spring-thymeleaf-2/pom.xml @@ -5,11 +5,17 @@ spring-thymeleaf-2 war + + + + + + - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + @@ -21,6 +27,12 @@ org.springframework.boot spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/lists/ListsController.java b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/lists/ListsController.java new file mode 100644 index 0000000000..55a7f7c38e --- /dev/null +++ b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/lists/ListsController.java @@ -0,0 +1,64 @@ +package com.baeldung.thymeleaf.lists; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/lists") +public class ListsController { + + @GetMapping("/toList") + public String usingToList(Model model) { + List colors = getColors(); + String[] colorsArray = colors.toArray(new String[0]); + model.addAttribute("myArray", colorsArray); + return "lists/toList"; + } + + @GetMapping("/contains") + public String usingContains(Model model) { + model.addAttribute("myList", getColors()); + model.addAttribute("others", getOtherColors()); + return "lists/contains"; + } + + @GetMapping("/size") + public String usingSize(Model model) { + model.addAttribute("myList", getColors()); + return "lists/size"; + } + + @GetMapping("/isEmpty") + public String usingIsEmpty(Model model) { + model.addAttribute("myList", getColors()); + return "lists/isEmpty"; + } + + @GetMapping("/sort") + public String usingSort(Model model) { + model.addAttribute("myList", getColors()); + model.addAttribute("reverse", Comparator.reverseOrder()); + return "lists/sort"; + } + + private List getColors() { + List colors = new ArrayList<>(); + colors.add("green"); + colors.add("yellow"); + colors.add("red"); + colors.add("blue"); + return colors; + } + + private List getOtherColors() { + List colors = new ArrayList<>(); + colors.add("green"); + colors.add("blue"); + return colors; + } +} diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html b/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html new file mode 100644 index 0000000000..bfa7874010 --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html @@ -0,0 +1,12 @@ + + + + + Lists Utility Class in Thymeleaf + + +myList contains red: + +myList contains red and green: + + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/isEmpty.html b/spring-thymeleaf-2/src/main/resources/templates/lists/isEmpty.html new file mode 100644 index 0000000000..06c66153c7 --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/isEmpty.html @@ -0,0 +1,14 @@ + + + + + Lists Utility Class in Thymeleaf + + + +isEmpty Check : + +List is not empty + + + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/size.html b/spring-thymeleaf-2/src/main/resources/templates/lists/size.html new file mode 100644 index 0000000000..594ff08467 --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/size.html @@ -0,0 +1,12 @@ + + + + + Lists Utility Class in Thymeleaf + + + +size: + + + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/sort.html b/spring-thymeleaf-2/src/main/resources/templates/lists/sort.html new file mode 100644 index 0000000000..e23c7bccbb --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/sort.html @@ -0,0 +1,12 @@ + + + + + Lists Utility Class in Thymeleaf + + +sort: + +sort with Comparator: + + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/toList.html b/spring-thymeleaf-2/src/main/resources/templates/lists/toList.html new file mode 100644 index 0000000000..680c13160e --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/toList.html @@ -0,0 +1,14 @@ + + + + + Lists Utility Class in Thymeleaf + + + + + converted list size: + + + + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/lists/ListsControllerIntegrationTest.java b/spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/lists/ListsControllerIntegrationTest.java new file mode 100644 index 0000000000..252ec3bef3 --- /dev/null +++ b/spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/lists/ListsControllerIntegrationTest.java @@ -0,0 +1,60 @@ +package com.baeldung.thymeleaf.lists; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc(printOnlyOnFailure = false) +public class ListsControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenCalledToList_ThenConvertsToList() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/lists/toList")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("converted list size: 4"))); + } + + @Test + public void whenCalledContains_ThenChecksMembership() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/lists/contains")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("myList contains red: true"))) + .andExpect(content().string(containsString("myList contains red and green: true"))); + } + + @Test + public void whenCalledSize_ThenReturnsSize() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/lists/size")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("size: 4"))); + } + + @Test + public void whenCalledSort_ThenSortsItems() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/lists/sort")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("sort: [blue, green, red, yellow]"))) + .andExpect(content().string(containsString("sort with Comparator: [yellow, red, green, blue]"))); + } + + @Test + public void whenCalledIsEmpty_ThenChecksAnyMembers() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/lists/isEmpty")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("isEmpty Check : false"))); + } +} \ No newline at end of file From fd0ef02dd192bad0bf074779f4b04cd60c9c8aaf Mon Sep 17 00:00:00 2001 From: isaolmez Date: Mon, 15 Jul 2019 12:46:32 +0300 Subject: [PATCH 06/43] BAEL-3014: Added sample code for lists --- spring-thymeleaf-2/pom.xml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/spring-thymeleaf-2/pom.xml b/spring-thymeleaf-2/pom.xml index ddf71e2ea1..d31e5fa7f6 100644 --- a/spring-thymeleaf-2/pom.xml +++ b/spring-thymeleaf-2/pom.xml @@ -5,17 +5,11 @@ spring-thymeleaf-2 war - - - - - - - org.springframework.boot - spring-boot-starter-parent - 2.1.6.RELEASE - + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 From 195c6bf529b08eb94c52079dddb2b2c9c7cea4b5 Mon Sep 17 00:00:00 2001 From: isaolmez Date: Mon, 15 Jul 2019 17:30:23 +0300 Subject: [PATCH 07/43] BAEL-3014: Added sample code for lists --- .../src/main/resources/templates/lists/contains.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html b/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html index bfa7874010..a1db0f0262 100644 --- a/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html @@ -9,4 +9,4 @@ myList contains red: myList contains red and green: - \ No newline at end of file + From bc3ed2671687b829fbdac4d1331aee1bf3811ba0 Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Tue, 16 Jul 2019 17:20:12 +0530 Subject: [PATCH 08/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- libraries-2/pom.xml | 11 +- .../com/baeldung/freebuilder/Employee.java | 65 +++++++ .../freebuilder/builder/classic/Address.java | 25 +++ .../freebuilder/builder/classic/Employee.java | 181 ++++++++++++++++++ .../freebuilder/EmployeeBuilderUnitTest.java | 150 +++++++++++++++ .../classic/EmployeeBuilderUnitTest.java | 32 ++++ pom.xml | 2 +- 7 files changed, 463 insertions(+), 3 deletions(-) create mode 100644 libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java create mode 100644 libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java create mode 100644 libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java create mode 100644 libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java create mode 100644 libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index ff73888b69..c6be8df38d 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -142,9 +142,15 @@ org.apache.mesos mesos ${mesos.library.version} + + + org.inferred + freebuilder + ${freebuilder.version} + true - + 3.0.7 3.6.2 @@ -165,5 +171,6 @@ 2.8.5 3.14.2 4.1.2 - + 2.4.1 + diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java b/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java new file mode 100644 index 0000000000..08470cc5cd --- /dev/null +++ b/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java @@ -0,0 +1,65 @@ +package com.baeldung.freebuilder; + +import com.baeldung.freebuilder.builder.classic.Address; +import org.inferred.freebuilder.FreeBuilder; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.UnaryOperator; + +@FreeBuilder +public interface Employee { + + String getName(); + + int getAge(); + + String getDepartment(); + + String getRole(); + + String getSupervisorName(); + + String getDesignation(); + + String getEmail(); + + long getPhoneNumber(); + + Optional getPermanent(); + + Optional getDateOfJoining(); + + @Nullable + String getCurrentProject(); + + Address getAddress(); + + List getAccessTokens(); + + Map getAssetsSerialIdMapping(); + + + class Builder extends Employee_Builder { + + public Builder() { + // setting default value for department + setDepartment("Builder Pattern"); + } + + @Override + public Builder setEmail(String email) { + if (checkValidEmail(email)) + return super.setEmail(email); + else + throw new IllegalArgumentException("Invalid email"); + + } + + private boolean checkValidEmail(String email) { + return email.contains("@"); + } + } +} diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java b/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java new file mode 100644 index 0000000000..8e53a9f155 --- /dev/null +++ b/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java @@ -0,0 +1,25 @@ +package com.baeldung.freebuilder.builder.classic; + +import org.inferred.freebuilder.FreeBuilder; + +import java.util.Optional; + +@FreeBuilder +public interface Address { + + Optional getAddressLine1(); + + Optional getAddressLine2(); + + Optional getAddressLine3(); + + String getCity(); + + Optional getState(); + + Optional getPinCode(); + + class Builder extends Address_Builder { + + } +} \ No newline at end of file diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java b/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java new file mode 100644 index 0000000000..bd9c8b0a17 --- /dev/null +++ b/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java @@ -0,0 +1,181 @@ +package com.baeldung.freebuilder.builder.classic; + +public class Employee { + + private String name; + private int age; + private String department; + private String role; + private String supervisorName; + private String designation; + private String email; + private long phoneNumber; + private boolean isPermanent; + private Address address; + + private Employee() { + + } + + private void setName(String name) { + this.name = name; + } + + private void setAge(int age) { + this.age = age; + } + + private void setDepartment(String department) { + this.department = department; + } + + private void setRole(String role) { + this.role = role; + } + + private void setSupervisorName(String supervisorName) { + this.supervisorName = supervisorName; + } + + private void setDesignation(String designation) { + this.designation = designation; + } + + private void setEmail(String email) { + this.email = email; + } + + private void setPhoneNumber(long phoneNumber) { + this.phoneNumber = phoneNumber; + } + + private void setPermanent(boolean permanent) { + isPermanent = permanent; + } + + private void setAddress(Address address) { + this.address = address; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + public String getDepartment() { + return department; + } + + public String getRole() { + return role; + } + + public String getSupervisorName() { + return supervisorName; + } + + public String getDesignation() { + return designation; + } + + public String getEmail() { + return email; + } + + public long getPhoneNumber() { + return phoneNumber; + } + + public boolean isPermanent() { + return isPermanent; + } + + public Address getAddress() { + return address; + } + + public static class Builder { + + private String name; + private int age; + private String department; + private String role; + private String supervisorName; + private String designation; + private String email; + private long phoneNumber; + private boolean isPermanent; + private Address address; + + public Builder setName(String name) { + this.name = name; + return this; + } + + public Builder setAge(int age) { + this.age = age; + return this; + } + + public Builder setDepartment(String department) { + this.department = department; + return this; + } + + public Builder setRole(String role) { + this.role = role; + return this; + } + + public Builder setSupervisorName(String supervisorName) { + this.supervisorName = supervisorName; + return this; + } + + public Builder setDesignation(String designation) { + this.designation = designation; + return this; + } + + public Builder setEmail(String email) { + this.email = email; + return this; + } + + public Builder setPhoneNumber(long phoneNumber) { + this.phoneNumber = phoneNumber; + return this; + } + + public Builder setPermanent(boolean permanent) { + isPermanent = permanent; + return this; + } + + public Builder setAddress(Address address) { + this.address = address; + return this; + } + + public Employee build() { + Employee employee = new Employee(); + employee.setName(this.name); + employee.setAge(this.age); + employee.setDepartment(this.department); + employee.setAddress(this.address); + employee.setDesignation(this.designation); + employee.setEmail(this.email); + employee.setPermanent(this.isPermanent); + employee.setName(this.name); + employee.setSupervisorName(this.supervisorName); + employee.setPhoneNumber(this.phoneNumber); + + return employee; + + } + } + +} diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java new file mode 100644 index 0000000000..e3a9e49633 --- /dev/null +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java @@ -0,0 +1,150 @@ +package com.baeldung.freebuilder; + +import com.baeldung.freebuilder.builder.classic.Address; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class EmployeeBuilderUnitTest { + + private static final int PIN_CODE = 223344; + public static final String CITY_NAME = "New York"; + + @Test + public void whenBuildEmployeeWithAddress_thenReturnEmployeeWithValidAddress() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setPermanent(true).setRole("developer").setAddress(address).build(); + + // then + assertTrue(employee.getAddress().getCity().equalsIgnoreCase(CITY_NAME)); + + } + + @Test + public void whenMapPincodeInAddress_thenReturnEmployeeWithValidAddressPincode() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).setPinCode(PIN_CODE).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setPermanent(true).setRole("developer").setAddress(address).build(); + + // then + assertTrue(employee.getAddress().getPinCode().get() == PIN_CODE); + + } + + @Test + public void whenOptionalFields_thenReturnEmployeeWithEmptyValues() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") + .setAddress(address).build(); + + // then + assertFalse(employee.getDateOfJoining().isPresent()); + + } + + @Test + public void whenNullableFields_thenReturnEmployeeWithNullValueForField() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") + .setAddress(address).build(); + + // then + assertNull(employee.getCurrentProject()); + + } + + @Test + public void whenCollectionFields_thenReturnEmployeeWithValues() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") + .addAccessTokens(1221819L).addAccessTokens(1223441L, 134567L).setAddress(address).build(); + + // then + assertTrue(employee.getAccessTokens().size() == 3); + + } + + @Test + public void whenMapFields_thenReturnEmployeeWithValues() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") + .addAccessTokens(1221819L).addAccessTokens(1223441L, 134567L).putAssetsSerialIdMapping("Laptop", 12345L).setAddress(address).build(); + + // then + assertTrue(employee.getAssetsSerialIdMapping().size() == 1); + + } + + @Test + public void whenNestedBuilderTypes_thenReturnEmployeeWithValues() { + + // when + Address.Builder addressBuilder = new Address.Builder(); + Address address = addressBuilder.setCity(CITY_NAME).build(); + + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") + .addAccessTokens(1221819L).addAccessTokens(1223441L, 134567L).putAssetsSerialIdMapping("Laptop", 12345L).setAddress(address).mutateAddress(a -> a.setPinCode(112200)).build(); + + // then + assertTrue(employee.getAssetsSerialIdMapping().size() == 1); + + } + + @Test() + public void whenPartialEmployeeWithValidEmail_thenReturnEmployeeWithEmail() { + + // when + Employee.Builder builder = new Employee.Builder(); + + Employee employee = builder.setName("baeldung") + .setAge(10) + .setEmail("abc@xyz.com") + .buildPartial(); + + assertNotNull(employee.getEmail()); + } + +} diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java new file mode 100644 index 0000000000..930820009c --- /dev/null +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.freebuilder.builder.classic; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + + +class EmployeeBuilderUnitTest { + + private static final String CITY = "New York"; + + @Test + public void whenBuildEmployeeWithAddress_thenReturnEmployeeWithValidAddress() { + + // when + Employee.Builder emplBuilder = new Employee.Builder(); + + Employee employee = emplBuilder + .setName("baeldung") + .setAge(12) + .setDepartment("Builder Pattern") + .setDesignation("Author") + .setEmail("abc@xyz.com") + .setPermanent(true) + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .build(); + + //then + Assertions.assertTrue(employee.getAddress().getCity().equalsIgnoreCase(CITY)); + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 05c719ec7c..90cea73a9d 100644 --- a/pom.xml +++ b/pom.xml @@ -1571,7 +1571,7 @@ 0.3.1 2.5.1 0.0.1 - 3.8 + 3.7 2.3 3.8 From e40946249a032155615d0e63800edb5081aa74fe Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Wed, 17 Jul 2019 08:54:01 +0530 Subject: [PATCH 09/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- .../builder/classic/EmployeeBuilderUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java index 930820009c..5040bfc9e0 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java @@ -6,16 +6,16 @@ import org.junit.jupiter.api.Test; class EmployeeBuilderUnitTest { - private static final String CITY = "New York"; + public static final String NAME = "baeldung"; @Test - public void whenBuildEmployeeWithAddress_thenReturnEmployeeWithValidAddress() { + public void whenBuildEmployee_thenReturnValidEmployee() { // when Employee.Builder emplBuilder = new Employee.Builder(); Employee employee = emplBuilder - .setName("baeldung") + .setName(NAME) .setAge(12) .setDepartment("Builder Pattern") .setDesignation("Author") @@ -26,7 +26,7 @@ class EmployeeBuilderUnitTest { .build(); //then - Assertions.assertTrue(employee.getAddress().getCity().equalsIgnoreCase(CITY)); + Assertions.assertTrue(employee.getName().equalsIgnoreCase(NAME)); } } \ No newline at end of file From ce7c3067f2d88311981891efc55498a95bb0244b Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Wed, 17 Jul 2019 10:19:50 +0530 Subject: [PATCH 10/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- .../freebuilder/EmployeeBuilderUnitTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java index e3a9e49633..abdd213de5 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java @@ -1,16 +1,16 @@ package com.baeldung.freebuilder; -import com.baeldung.freebuilder.builder.classic.Address; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.Optional; - import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.Optional; + +import org.junit.jupiter.api.Test; + +import com.baeldung.freebuilder.builder.classic.Address; + public class EmployeeBuilderUnitTest { private static final int PIN_CODE = 223344; From 3671997f72973e616dfa357658c75966a9263b21 Mon Sep 17 00:00:00 2001 From: Kamlesh Kumar Date: Sun, 14 Jul 2019 14:13:41 +0530 Subject: [PATCH 11/43] BAEL-3042 DynamicUpdate annotation example --- .../dynamicupdate/AccountRepository.java | 11 +++ .../dynamicupdate/DynamicUpdateConfig.java | 80 +++++++++++++++ .../dynamicupdate/model/Account.java | 97 +++++++++++++++++++ .../src/main/resources/logback.xml | 36 +++---- .../DynamicUpdateIntegrationTest.java | 44 +++++++++ 5 files changed, 250 insertions(+), 18 deletions(-) create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/AccountRepository.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateConfig.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/model/Account.java create mode 100644 persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateIntegrationTest.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/AccountRepository.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/AccountRepository.java new file mode 100644 index 0000000000..2fb26c2db6 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/AccountRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.hibernate.dynamicupdate; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.hibernate.dynamicupdate.model.Account; + +@Repository +public interface AccountRepository extends JpaRepository { + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateConfig.java new file mode 100644 index 0000000000..4871a3d1e2 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateConfig.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.dynamicupdate; + +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.google.common.base.Preconditions; + +@EnableTransactionManagement +@Configuration +@PropertySource({ "classpath:persistence-h2.properties" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.hibernate.dynamicupdate" }) +@ComponentScan({ "com.baeldung.hibernate.dynamicupdate" }) +public class DynamicUpdateConfig { + + @Autowired + private Environment env; + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "com.baeldung.hibernate.dynamicupdate.model" }); + + JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + + return em; + } + + @Bean + public DataSource dataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + dataSource.setUsername(env.getProperty("jdbc.user")); + dataSource.setPassword(env.getProperty("jdbc.pass")); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + Properties additionalProperties() { + Properties properties = new Properties(); + properties.setProperty("hibernate.hbm2ddl.auto", Preconditions.checkNotNull(env.getProperty("hibernate.hbm2ddl.auto"))); + properties.setProperty("hibernate.dialect", Preconditions.checkNotNull(env.getProperty("hibernate.dialect"))); + properties.setProperty("hibernate.show_sql", "true"); + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/model/Account.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/model/Account.java new file mode 100644 index 0000000000..b3753112fe --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/dynamicupdate/model/Account.java @@ -0,0 +1,97 @@ +package com.baeldung.hibernate.dynamicupdate.model; + +import java.text.MessageFormat; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +import org.hibernate.annotations.DynamicUpdate; + +@Entity +@DynamicUpdate +public class Account { + + @Id + private int id; + + @Column + private String name; + + @Column + private String type; + + @Column + private boolean active; + + public Account() { + } + + public Account(int id, String name, String type, boolean active) { + super(); + this.id = id; + this.name = name; + this.type = type; + this.active = active; + } + + 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 getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Account other = (Account) obj; + if (id != other.id) + return false; + return true; + } + + @Override + public String toString() { + return MessageFormat.format("id:{0}, name:{1}, active:{2}, type:{3}", id, name, active, type); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/logback.xml b/persistence-modules/spring-hibernate-5/src/main/resources/logback.xml index ec0dc2469a..035520aa15 100644 --- a/persistence-modules/spring-hibernate-5/src/main/resources/logback.xml +++ b/persistence-modules/spring-hibernate-5/src/main/resources/logback.xml @@ -1,19 +1,19 @@ - - - - - web - %date [%thread] %-5level %logger{36} - %message%n - - - - - - - - - - - - - + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateIntegrationTest.java new file mode 100644 index 0000000000..fc183d1f19 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/dynamicupdate/DynamicUpdateIntegrationTest.java @@ -0,0 +1,44 @@ +package com.baeldung.hibernate.dynamicupdate; + +import javax.transaction.Transactional; + +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.test.annotation.Commit; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.hibernate.dynamicupdate.model.Account; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = DynamicUpdateConfig.class, loader = AnnotationConfigContextLoader.class) +@Transactional +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class DynamicUpdateIntegrationTest { + + private static final Integer ACCOUNT_ID = 1; + + @Autowired + private AccountRepository accountRepository; + + @Test + @Commit + public void testA_whenTestAccountIsSaved_thenSuccess() { + Account account = new Account(ACCOUNT_ID, "account1", "regional", true); + accountRepository.save(account); + } + + @Test + @Commit + // Enable Hibernate's debug logging in logback.xml to see the generated SQL statement. + public void testB_whenAccountNameUpdated_thenSuccess() { + Account account = accountRepository.findOne(ACCOUNT_ID); + account.setName("Test Account"); + accountRepository.save(account); + } + +} From 97e38d338ff145cff3f069d4de86dbc1e0fdd21d Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Wed, 24 Jul 2019 21:32:42 +0530 Subject: [PATCH 12/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- .../com/baeldung/freebuilder/Employee.java | 2 + .../freebuilder/builder/classic/Employee.java | 138 +----------------- .../freebuilder/EmployeeBuilderUnitTest.java | 18 ++- .../classic/EmployeeBuilderUnitTest.java | 5 - 4 files changed, 23 insertions(+), 140 deletions(-) diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java b/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java index 08470cc5cd..d486c18a06 100644 --- a/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java +++ b/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java @@ -41,6 +41,8 @@ public interface Employee { Map getAssetsSerialIdMapping(); + Optional getSalaryInUSD(); + class Builder extends Employee_Builder { diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java b/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java index bd9c8b0a17..6509676cb4 100644 --- a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java +++ b/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java @@ -2,61 +2,16 @@ package com.baeldung.freebuilder.builder.classic; public class Employee { - private String name; - private int age; - private String department; - private String role; - private String supervisorName; - private String designation; - private String email; - private long phoneNumber; - private boolean isPermanent; - private Address address; + private final String name; + private final int age; + private final String department; - private Employee() { - - } - - private void setName(String name) { + private Employee(String name, int age, String department) { this.name = name; - } - - private void setAge(int age) { this.age = age; - } - - private void setDepartment(String department) { this.department = department; } - private void setRole(String role) { - this.role = role; - } - - private void setSupervisorName(String supervisorName) { - this.supervisorName = supervisorName; - } - - private void setDesignation(String designation) { - this.designation = designation; - } - - private void setEmail(String email) { - this.email = email; - } - - private void setPhoneNumber(long phoneNumber) { - this.phoneNumber = phoneNumber; - } - - private void setPermanent(boolean permanent) { - isPermanent = permanent; - } - - private void setAddress(Address address) { - this.address = address; - } - public String getName() { return name; } @@ -69,46 +24,11 @@ public class Employee { return department; } - public String getRole() { - return role; - } - - public String getSupervisorName() { - return supervisorName; - } - - public String getDesignation() { - return designation; - } - - public String getEmail() { - return email; - } - - public long getPhoneNumber() { - return phoneNumber; - } - - public boolean isPermanent() { - return isPermanent; - } - - public Address getAddress() { - return address; - } - public static class Builder { private String name; private int age; private String department; - private String role; - private String supervisorName; - private String designation; - private String email; - private long phoneNumber; - private boolean isPermanent; - private Address address; public Builder setName(String name) { this.name = name; @@ -125,56 +45,8 @@ public class Employee { return this; } - public Builder setRole(String role) { - this.role = role; - return this; - } - - public Builder setSupervisorName(String supervisorName) { - this.supervisorName = supervisorName; - return this; - } - - public Builder setDesignation(String designation) { - this.designation = designation; - return this; - } - - public Builder setEmail(String email) { - this.email = email; - return this; - } - - public Builder setPhoneNumber(long phoneNumber) { - this.phoneNumber = phoneNumber; - return this; - } - - public Builder setPermanent(boolean permanent) { - isPermanent = permanent; - return this; - } - - public Builder setAddress(Address address) { - this.address = address; - return this; - } - public Employee build() { - Employee employee = new Employee(); - employee.setName(this.name); - employee.setAge(this.age); - employee.setDepartment(this.department); - employee.setAddress(this.address); - employee.setDesignation(this.designation); - employee.setEmail(this.email); - employee.setPermanent(this.isPermanent); - employee.setName(this.name); - employee.setSupervisorName(this.supervisorName); - employee.setPhoneNumber(this.phoneNumber); - - return employee; - + return new Employee(name, age, department); } } diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java index abdd213de5..c73e2be8a6 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java @@ -15,6 +15,8 @@ public class EmployeeBuilderUnitTest { private static final int PIN_CODE = 223344; public static final String CITY_NAME = "New York"; + public static final int INPUT_SALARY_EUROS = 10000; + public static final double EUROS_TO_USD_RATIO = 0.6; @Test public void whenBuildEmployeeWithAddress_thenReturnEmployeeWithValidAddress() { @@ -33,15 +35,27 @@ public class EmployeeBuilderUnitTest { } @Test - public void whenMapPincodeInAddress_thenReturnEmployeeWithValidAddressPincode() { + public void whenMapSalary_thenReturnEmployeeWithSalaryInUSD() { // when Address.Builder addressBuilder = new Address.Builder(); Address address = addressBuilder.setCity(CITY_NAME).setPinCode(PIN_CODE).build(); + long salaryInEuros = INPUT_SALARY_EUROS; Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setPermanent(true).setRole("developer").setAddress(address).build(); + Employee employee = builder + .setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setPermanent(true) + .setRole("developer") + .setAddress(address) + .mapSalaryInUSD(sal -> salaryInEuros * EUROS_TO_USD_RATIO) + .build(); // then assertTrue(employee.getAddress().getPinCode().get() == PIN_CODE); diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java index 5040bfc9e0..e54a1dbd78 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java @@ -18,11 +18,6 @@ class EmployeeBuilderUnitTest { .setName(NAME) .setAge(12) .setDepartment("Builder Pattern") - .setDesignation("Author") - .setEmail("abc@xyz.com") - .setPermanent(true) - .setSupervisorName("Admin") - .setPhoneNumber(4445566) .build(); //then From 6a29eab8209128fd479544dd29cb7d7afb768805 Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Sun, 28 Jul 2019 16:05:17 +0530 Subject: [PATCH 13/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- .../freebuilder/EmployeeBuilderUnitTest.java | 85 ++++++++++++++++--- 1 file changed, 74 insertions(+), 11 deletions(-) diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java index c73e2be8a6..fef60d9e7c 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java @@ -27,7 +27,16 @@ public class EmployeeBuilderUnitTest { Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setPermanent(true).setRole("developer").setAddress(address).build(); + Employee employee = builder.setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setPermanent(true) + .setRole("developer") + .setAddress(address) + .build(); // then assertTrue(employee.getAddress().getCity().equalsIgnoreCase(CITY_NAME)); @@ -71,8 +80,17 @@ public class EmployeeBuilderUnitTest { Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") - .setAddress(address).build(); + Employee employee = builder.setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setNullablePermanent(null) + .setDateOfJoining(Optional.empty()) + .setRole("developer") + .setAddress(address) + .build(); // then assertFalse(employee.getDateOfJoining().isPresent()); @@ -88,8 +106,17 @@ public class EmployeeBuilderUnitTest { Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") - .setAddress(address).build(); + Employee employee = builder.setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setNullablePermanent(null) + .setDateOfJoining(Optional.empty()) + .setRole("developer") + .setAddress(address) + .build(); // then assertNull(employee.getCurrentProject()); @@ -105,8 +132,19 @@ public class EmployeeBuilderUnitTest { Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") - .addAccessTokens(1221819L).addAccessTokens(1223441L, 134567L).setAddress(address).build(); + Employee employee = builder.setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setNullablePermanent(null) + .setDateOfJoining(Optional.empty()) + .setRole("developer") + .addAccessTokens(1221819L) + .addAccessTokens(1223441L, 134567L) + .setAddress(address) + .build(); // then assertTrue(employee.getAccessTokens().size() == 3); @@ -122,8 +160,20 @@ public class EmployeeBuilderUnitTest { Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") - .addAccessTokens(1221819L).addAccessTokens(1223441L, 134567L).putAssetsSerialIdMapping("Laptop", 12345L).setAddress(address).build(); + Employee employee = builder.setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setNullablePermanent(null) + .setDateOfJoining(Optional.empty()) + .setRole("developer") + .addAccessTokens(1221819L) + .addAccessTokens(1223441L, 134567L) + .putAssetsSerialIdMapping("Laptop", 12345L) + .setAddress(address) + .build(); // then assertTrue(employee.getAssetsSerialIdMapping().size() == 1); @@ -139,8 +189,21 @@ public class EmployeeBuilderUnitTest { Employee.Builder builder = new Employee.Builder(); - Employee employee = builder.setName("baeldung").setAge(10).setDesignation("author").setEmail("abc@xyz.com").setSupervisorName("Admin").setPhoneNumber(4445566).setNullablePermanent(null).setDateOfJoining(Optional.empty()).setRole("developer") - .addAccessTokens(1221819L).addAccessTokens(1223441L, 134567L).putAssetsSerialIdMapping("Laptop", 12345L).setAddress(address).mutateAddress(a -> a.setPinCode(112200)).build(); + Employee employee = builder.setName("baeldung") + .setAge(10) + .setDesignation("author") + .setEmail("abc@xyz.com") + .setSupervisorName("Admin") + .setPhoneNumber(4445566) + .setNullablePermanent(null) + .setDateOfJoining(Optional.empty()) + .setRole("developer") + .addAccessTokens(1221819L) + .addAccessTokens(1223441L, 134567L) + .putAssetsSerialIdMapping("Laptop", 12345L) + .setAddress(address) + .mutateAddress(a -> a.setPinCode(112200)) + .build(); // then assertTrue(employee.getAssetsSerialIdMapping().size() == 1); From f71224ed2cda1ab093764347ca636c412b111ff8 Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Mon, 29 Jul 2019 21:15:24 +0530 Subject: [PATCH 14/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- .../com/baeldung/freebuilder/EmployeeBuilderUnitTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java index fef60d9e7c..4427d3cb69 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java @@ -86,13 +86,14 @@ public class EmployeeBuilderUnitTest { .setEmail("abc@xyz.com") .setSupervisorName("Admin") .setPhoneNumber(4445566) - .setNullablePermanent(null) - .setDateOfJoining(Optional.empty()) + .setPermanent(true) .setRole("developer") .setAddress(address) .build(); // then + assertTrue(employee.getPermanent().isPresent()); + assertTrue(employee.getPermanent().get()); assertFalse(employee.getDateOfJoining().isPresent()); } From b04073514dd57a1a2ed14e86598fae9dc02af252 Mon Sep 17 00:00:00 2001 From: isaolmez Date: Wed, 31 Jul 2019 12:09:36 +0300 Subject: [PATCH 15/43] BAEL-3014: Updated the example --- .../src/main/resources/templates/lists/contains.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html b/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html index a1db0f0262..2d874791d7 100644 --- a/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html +++ b/spring-thymeleaf-2/src/main/resources/templates/lists/contains.html @@ -7,6 +7,6 @@ myList contains red: -myList contains red and green: +myList contains red and green: From b91a78aa0d4674342b147370dcaffa7d14b4cf52 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 2 Aug 2019 06:32:25 +0200 Subject: [PATCH 16/43] [BAEL-2996] Moved code from libraries2 to java-math --- java-math/pom.xml | 36 +++++++++++++++++++ .../MatrixMultiplicationBenchmarking.java | 0 .../matrices/apache/RealMatrixUnitTest.java | 0 .../matrices/colt/DoubleMatrix2DUnitTest.java | 0 .../matrices/ejml/SimpleMatrixUnitTest.java | 0 .../homemade/HomemadeMatrixUnitTest.java | 0 .../matrices/la4j/Basic2DMatrixUnitTest.java | 0 .../matrices/nd4j/INDArrayUnitTest.java | 0 libraries-2/pom.xml | 36 ------------------- 9 files changed, 36 insertions(+), 36 deletions(-) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java (100%) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java (100%) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java (100%) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java (100%) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java (100%) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java (100%) rename {libraries-2 => java-math}/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java (100%) diff --git a/java-math/pom.xml b/java-math/pom.xml index f71577b707..b5c31c4487 100644 --- a/java-math/pom.xml +++ b/java-math/pom.xml @@ -17,6 +17,26 @@ commons-math3 ${commons-math3.version} + + org.ejml + ejml-all + ${ejml.version} + + + org.nd4j + nd4j-native + ${nd4j.version} + + + org.la4j + la4j + ${la4j.version} + + + colt + colt + ${colt.version} + com.google.guava guava @@ -44,6 +64,17 @@ combinatoricslib3 ${combinatoricslib3.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -64,6 +95,11 @@ 1.11 27.0.1-jre 3.3.0 + 0.38 + 1.0.0-beta4 + 1.2.0 + 0.6.0 + 1.19 \ No newline at end of file diff --git a/libraries-2/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java b/java-math/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java rename to java-math/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java diff --git a/libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java rename to java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java diff --git a/libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java rename to java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java diff --git a/libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java rename to java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java diff --git a/libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java rename to java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java diff --git a/libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java rename to java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java diff --git a/libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java rename to java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index ff73888b69..83adf1e199 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -59,26 +59,6 @@ picocli ${picocli.version} - - org.ejml - ejml-all - ${ejml.version} - - - org.nd4j - nd4j-native - ${nd4j.version} - - - org.la4j - la4j - ${la4j.version} - - - colt - colt - ${colt.version} - org.springframework.boot spring-boot-starter @@ -127,17 +107,6 @@ handlebars ${handlebars.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - org.apache.mesos mesos @@ -154,11 +123,6 @@ 3.17.2 4.4.0 2.1.4.RELEASE - 0.38 - 1.0.0-beta4 - 1.2.0 - 0.6.0 - 1.19 0.28.3 1.1.0 3.14.2 From 67d88b93b7c21f76c7a5b74de60952037c22fac5 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 2 Aug 2019 16:22:49 +0100 Subject: [PATCH 17/43] [BAEL-16003] Moving article out of libraries (& flink from libraries-data) into libraries-data-2 --- libraries-data-2/README.md | 11 ++ libraries-data-2/log4j.properties | 1 + libraries-data-2/pom.xml | 128 ++++++++++++++ .../main/com/baeldung/docx/Docx4jExample.java | 105 ++++++++++++ .../com/baeldung/flink/FlinkDataPipeline.java | 82 +++++++++ .../main/com/baeldung/flink/LineSplitter.java | 18 ++ .../main/com/baeldung/flink/WordCount.java | 18 ++ .../baeldung/flink/connector/Consumers.java | 32 ++++ .../baeldung/flink/connector/Producers.java | 17 ++ .../main/com/baeldung/flink/model/Backup.java | 27 +++ .../baeldung/flink/model/InputMessage.java | 71 ++++++++ .../flink/operator/BackupAggregator.java | 34 ++++ .../InputMessageTimestampAssigner.java | 23 +++ .../flink/operator/WordsCapitalizer.java | 11 ++ .../schema/BackupSerializationSchema.java | 33 ++++ .../InputMessageDeserializationSchema.java | 32 ++++ .../google/sheets/GoogleAuthorizeUtil.java | 34 ++++ .../google/sheets/SheetsServiceUtil.java | 20 +++ .../infinispan/CacheConfiguration.java | 70 ++++++++ .../infinispan/listener/CacheListener.java | 53 ++++++ .../repository/HelloWorldRepository.java | 15 ++ .../infinispan/service/HelloWorldService.java | 77 +++++++++ .../service/TransactionalService.java | 55 ++++++ .../com/baeldung/measurement/WaterTank.java | 26 +++ .../com/baeldung/opencsv/Application.java | 108 ++++++++++++ .../main/com/baeldung/opencsv/Constants.java | 17 ++ .../com/baeldung/opencsv/beans/CsvBean.java | 3 + .../opencsv/beans/NamedColumnBean.java | 31 ++++ .../opencsv/beans/SimplePositionBean.java | 29 ++++ .../opencsv/beans/WriteExampleBean.java | 40 +++++ .../opencsv/examples/sync/BeanExamples.java | 63 +++++++ .../examples/sync/CsvReaderExamples.java | 63 +++++++ .../examples/sync/CsvWriterExamples.java | 35 ++++ .../com/baeldung/opencsv/helpers/Helpers.java | 108 ++++++++++++ .../baeldung/opencsv/pojos/CsvTransfer.java | 38 +++++ .../smooks/converter/OrderConverter.java | 44 +++++ .../smooks/converter/OrderValidator.java | 27 +++ .../main/com/baeldung/smooks/model/Item.java | 70 ++++++++ .../main/com/baeldung/smooks/model/Order.java | 52 ++++++ .../com/baeldung/smooks/model/Status.java | 5 + .../com/baeldung/smooks/model/Supplier.java | 52 ++++++ .../test/com/baeldung/crdt/CRDTUnitTest.java | 149 ++++++++++++++++ .../flink/BackupCreatorIntegrationTest.java | 104 +++++++++++ .../flink/WordCapitalizerIntegrationTest.java | 34 ++++ .../flink/WordCountIntegrationTest.java | 161 ++++++++++++++++++ .../google/sheets/GoogleSheetsLiveTest.java | 96 +++++++++++ .../hll/HLLLongRunningManualTest.java | 59 +++++++ .../infinispan/AbstractIntegrationTest.java | 57 +++++++ .../HelloWorldServiceTemporaryLiveTest.java | 51 ++++++ .../TransactionalServiceIntegrationTest.java | 21 +++ .../measurement/WaterTankUnitTest.java | 86 ++++++++++ .../opencsv/OpenCsvIntegrationTest.java | 66 +++++++ .../converter/SmooksIntegrationTest.java | 60 +++++++ 53 files changed, 2722 insertions(+) create mode 100644 libraries-data-2/README.md create mode 100644 libraries-data-2/log4j.properties create mode 100644 libraries-data-2/pom.xml create mode 100644 libraries-data-2/src/main/com/baeldung/docx/Docx4jExample.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/FlinkDataPipeline.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/LineSplitter.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/WordCount.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/connector/Consumers.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/connector/Producers.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/model/Backup.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/model/InputMessage.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/operator/BackupAggregator.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/operator/InputMessageTimestampAssigner.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/operator/WordsCapitalizer.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/schema/BackupSerializationSchema.java create mode 100644 libraries-data-2/src/main/com/baeldung/flink/schema/InputMessageDeserializationSchema.java create mode 100644 libraries-data-2/src/main/com/baeldung/google/sheets/GoogleAuthorizeUtil.java create mode 100644 libraries-data-2/src/main/com/baeldung/google/sheets/SheetsServiceUtil.java create mode 100644 libraries-data-2/src/main/com/baeldung/infinispan/CacheConfiguration.java create mode 100644 libraries-data-2/src/main/com/baeldung/infinispan/listener/CacheListener.java create mode 100644 libraries-data-2/src/main/com/baeldung/infinispan/repository/HelloWorldRepository.java create mode 100644 libraries-data-2/src/main/com/baeldung/infinispan/service/HelloWorldService.java create mode 100644 libraries-data-2/src/main/com/baeldung/infinispan/service/TransactionalService.java create mode 100644 libraries-data-2/src/main/com/baeldung/measurement/WaterTank.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/Application.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/Constants.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/beans/CsvBean.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/beans/NamedColumnBean.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/beans/SimplePositionBean.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/beans/WriteExampleBean.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/BeanExamples.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/helpers/Helpers.java create mode 100644 libraries-data-2/src/main/com/baeldung/opencsv/pojos/CsvTransfer.java create mode 100644 libraries-data-2/src/main/com/baeldung/smooks/converter/OrderConverter.java create mode 100644 libraries-data-2/src/main/com/baeldung/smooks/converter/OrderValidator.java create mode 100644 libraries-data-2/src/main/com/baeldung/smooks/model/Item.java create mode 100644 libraries-data-2/src/main/com/baeldung/smooks/model/Order.java create mode 100644 libraries-data-2/src/main/com/baeldung/smooks/model/Status.java create mode 100644 libraries-data-2/src/main/com/baeldung/smooks/model/Supplier.java create mode 100644 libraries-data-2/src/test/com/baeldung/crdt/CRDTUnitTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/flink/BackupCreatorIntegrationTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/flink/WordCapitalizerIntegrationTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/flink/WordCountIntegrationTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/google/sheets/GoogleSheetsLiveTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/hll/HLLLongRunningManualTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/infinispan/AbstractIntegrationTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/measurement/WaterTankUnitTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/opencsv/OpenCsvIntegrationTest.java create mode 100644 libraries-data-2/src/test/com/baeldung/smooks/converter/SmooksIntegrationTest.java diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md new file mode 100644 index 0000000000..8101138c0e --- /dev/null +++ b/libraries-data-2/README.md @@ -0,0 +1,11 @@ +### Relevant articles +- [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink) +- [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) +- [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types) +- [Introduction to javax.measure](http://www.baeldung.com/javax-measure) +- [Introduction To Docx4J](http://www.baeldung.com/docx4j) +- [Interact with Google Sheets from Java](http://www.baeldung.com/google-sheets-java-client) +- [Introduction To OpenCSV](http://www.baeldung.com/opencsv) +- [Introduction to Smooks](http://www.baeldung.com/smooks) +- [A Guide to Infinispan in Java](http://www.baeldung.com/infinispan) + diff --git a/libraries-data-2/log4j.properties b/libraries-data-2/log4j.properties new file mode 100644 index 0000000000..2173c5d96f --- /dev/null +++ b/libraries-data-2/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml new file mode 100644 index 0000000000..97820859ba --- /dev/null +++ b/libraries-data-2/pom.xml @@ -0,0 +1,128 @@ + + + + 4.0.0 + libraries-http + libraries-http + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.apache.flink + flink-connector-kafka-0.11_2.11 + ${flink.version} + + + org.apache.flink + flink-streaming-java_2.11 + ${flink.version} + + + org.apache.flink + flink-core + ${flink.version} + + + commons-logging + commons-logging + + + + + org.apache.flink + flink-java + ${flink.version} + + + commons-logging + commons-logging + + + + + org.apache.flink + flink-test-utils_2.11 + ${flink.version} + test + + + net.agkn + hll + ${hll.version} + + + com.netopyr.wurmloch + wurmloch-crdt + ${crdt.version} + + + tec.units + unit-ri + ${unit-ri.version} + + + javax.xml.bind + jaxb-api + ${jaxb-api.version} + + + org.docx4j + docx4j + ${docx4j.version} + + + + com.google.api-client + google-api-client + ${google-api.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${google-api.version} + + + com.google.apis + google-api-services-sheets + ${google-sheets.version} + + + + com.opencsv + opencsv + ${opencsv.version} + + + org.milyn + milyn-smooks-all + ${smooks.version} + + + org.infinispan + infinispan-core + ${infinispan.version} + + + + + + 1.5.0 + 1.6.0 + 0.1.0 + 1.0.3 + 3.3.5 + 2.1 + 1.23.0 + 4.1 + 1.7.0 + 9.1.5.Final + v4-rev493-1.21.0 + + \ No newline at end of file diff --git a/libraries-data-2/src/main/com/baeldung/docx/Docx4jExample.java b/libraries-data-2/src/main/com/baeldung/docx/Docx4jExample.java new file mode 100644 index 0000000000..6fe29d26e3 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/docx/Docx4jExample.java @@ -0,0 +1,105 @@ +package com.baeldung.docx; + +import org.docx4j.dml.wordprocessingDrawing.Inline; +import org.docx4j.jaxb.Context; +import org.docx4j.model.table.TblFactory; +import org.docx4j.openpackaging.exceptions.Docx4JException; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; +import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; +import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; +import org.docx4j.wml.BooleanDefaultTrue; +import org.docx4j.wml.Color; +import org.docx4j.wml.Drawing; +import org.docx4j.wml.ObjectFactory; +import org.docx4j.wml.P; +import org.docx4j.wml.R; +import org.docx4j.wml.RPr; +import org.docx4j.wml.Tbl; +import org.docx4j.wml.Tc; +import org.docx4j.wml.Text; +import org.docx4j.wml.Tr; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import java.io.File; +import java.nio.file.Files; +import java.util.List; + +class Docx4jExample { + + void createDocumentPackage(String outputPath, String imagePath) throws Exception { + WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); + MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart(); + mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!"); + mainDocumentPart.addParagraphOfText("Welcome To Baeldung!"); + + ObjectFactory factory = Context.getWmlObjectFactory(); + P p = factory.createP(); + R r = factory.createR(); + Text t = factory.createText(); + t.setValue("Welcome To Baeldung"); + r.getContent().add(t); + p.getContent().add(r); + RPr rpr = factory.createRPr(); + BooleanDefaultTrue b = new BooleanDefaultTrue(); + rpr.setB(b); + rpr.setI(b); + rpr.setCaps(b); + Color red = factory.createColor(); + red.setVal("green"); + rpr.setColor(red); + r.setRPr(rpr); + mainDocumentPart.getContent().add(p); + + File image = new File(imagePath); + byte[] fileContent = Files.readAllBytes(image.toPath()); + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage, fileContent); + Inline inline = imagePart.createImageInline("Baeldung Image", "Alt Text", 1, 2, false); + P Imageparagraph = addImageToParagraph(inline); + mainDocumentPart.getContent().add(Imageparagraph); + + int writableWidthTwips = wordPackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips(); + int columnNumber = 3; + Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips / columnNumber); + List rows = tbl.getContent(); + for (Object row : rows) { + Tr tr = (Tr) row; + List cells = tr.getContent(); + for (Object cell : cells) { + Tc td = (Tc) cell; + td.getContent().add(p); + } + } + + mainDocumentPart.getContent().add(tbl); + File exportFile = new File(outputPath); + wordPackage.save(exportFile); + } + + boolean isTextExist(String testText) throws Docx4JException, JAXBException { + File doc = new File("helloWorld.docx"); + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(doc); + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + String textNodesXPath = "//w:t"; + List paragraphs = mainDocumentPart.getJAXBNodesViaXPath(textNodesXPath, true); + for (Object obj : paragraphs) { + Text text = (Text) ((JAXBElement) obj).getValue(); + String textValue = text.getValue(); + if (textValue != null && textValue.contains(testText)) { + return true; + } + } + return false; + } + + private static P addImageToParagraph(Inline inline) { + ObjectFactory factory = new ObjectFactory(); + P p = factory.createP(); + R r = factory.createR(); + p.getContent().add(r); + Drawing drawing = factory.createDrawing(); + r.getContent().add(drawing); + drawing.getAnchorOrInline().add(inline); + return p; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/FlinkDataPipeline.java b/libraries-data-2/src/main/com/baeldung/flink/FlinkDataPipeline.java new file mode 100644 index 0000000000..d02b1bcb83 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/FlinkDataPipeline.java @@ -0,0 +1,82 @@ +package com.baeldung.flink; + + +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.model.InputMessage; +import com.baeldung.flink.operator.BackupAggregator; +import com.baeldung.flink.operator.InputMessageTimestampAssigner; +import com.baeldung.flink.operator.WordsCapitalizer; +import org.apache.flink.streaming.api.TimeCharacteristic; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.windowing.time.Time; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; + +import static com.baeldung.flink.connector.Consumers.*; +import static com.baeldung.flink.connector.Producers.*; + +public class FlinkDataPipeline { + + public static void capitalize() throws Exception { + String inputTopic = "flink_input"; + String outputTopic = "flink_output"; + String consumerGroup = "baeldung"; + String address = "localhost:9092"; + + StreamExecutionEnvironment environment = + StreamExecutionEnvironment.getExecutionEnvironment(); + + FlinkKafkaConsumer011 flinkKafkaConsumer = + createStringConsumerForTopic(inputTopic, address, consumerGroup); + flinkKafkaConsumer.setStartFromEarliest(); + + DataStream stringInputStream = + environment.addSource(flinkKafkaConsumer); + + FlinkKafkaProducer011 flinkKafkaProducer = + createStringProducer(outputTopic, address); + + stringInputStream + .map(new WordsCapitalizer()) + .addSink(flinkKafkaProducer); + + environment.execute(); + } + +public static void createBackup () throws Exception { + String inputTopic = "flink_input"; + String outputTopic = "flink_output"; + String consumerGroup = "baeldung"; + String kafkaAddress = "localhost:9092"; + + StreamExecutionEnvironment environment = + StreamExecutionEnvironment.getExecutionEnvironment(); + + environment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); + + FlinkKafkaConsumer011 flinkKafkaConsumer = + createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup); + flinkKafkaConsumer.setStartFromEarliest(); + + flinkKafkaConsumer + .assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()); + FlinkKafkaProducer011 flinkKafkaProducer = + createBackupProducer(outputTopic, kafkaAddress); + + DataStream inputMessagesStream = + environment.addSource(flinkKafkaConsumer); + + inputMessagesStream + .timeWindowAll(Time.hours(24)) + .aggregate(new BackupAggregator()) + .addSink(flinkKafkaProducer); + + environment.execute(); +} + + public static void main(String[] args) throws Exception { + createBackup(); + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/LineSplitter.java b/libraries-data-2/src/main/com/baeldung/flink/LineSplitter.java new file mode 100644 index 0000000000..f4e322f1e8 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/LineSplitter.java @@ -0,0 +1,18 @@ +package com.baeldung.flink; + +import org.apache.flink.api.common.functions.FlatMapFunction; +import org.apache.flink.api.java.tuple.Tuple2; +import org.apache.flink.util.Collector; + +import java.util.stream.Stream; + +@SuppressWarnings("serial") +public class LineSplitter implements FlatMapFunction> { + + @Override + public void flatMap(String value, Collector> out) { + + String[] tokens = value.toLowerCase().split("\\W+"); + Stream.of(tokens).filter(t -> t.length() > 0).forEach(token -> out.collect(new Tuple2<>(token, 1))); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/com/baeldung/flink/WordCount.java b/libraries-data-2/src/main/com/baeldung/flink/WordCount.java new file mode 100644 index 0000000000..fc5064bafa --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/WordCount.java @@ -0,0 +1,18 @@ +package com.baeldung.flink; + +import org.apache.flink.api.java.DataSet; +import org.apache.flink.api.java.ExecutionEnvironment; +import org.apache.flink.api.java.aggregation.Aggregations; +import org.apache.flink.api.java.tuple.Tuple2; + +import java.util.List; + +public class WordCount { + + public static DataSet> startWordCount(ExecutionEnvironment env, List lines) throws Exception { + DataSet text = env.fromCollection(lines); + + return text.flatMap(new LineSplitter()).groupBy(0).aggregate(Aggregations.SUM, 1); + + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/com/baeldung/flink/connector/Consumers.java b/libraries-data-2/src/main/com/baeldung/flink/connector/Consumers.java new file mode 100644 index 0000000000..514085f9c4 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/connector/Consumers.java @@ -0,0 +1,32 @@ +package com.baeldung.flink.connector; + +import com.baeldung.flink.model.InputMessage; +import com.baeldung.flink.schema.InputMessageDeserializationSchema; +import org.apache.flink.api.common.serialization.SimpleStringSchema; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; + +import java.util.Properties; + +public class Consumers { + +public static FlinkKafkaConsumer011 createStringConsumerForTopic( + String topic, String kafkaAddress, String kafkaGroup ) { + Properties props = new Properties(); + props.setProperty("bootstrap.servers", kafkaAddress); + props.setProperty("group.id",kafkaGroup); + FlinkKafkaConsumer011 consumer = + new FlinkKafkaConsumer011<>(topic, new SimpleStringSchema(),props); + + return consumer; +} + + public static FlinkKafkaConsumer011 createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup ) { + Properties properties = new Properties(); + properties.setProperty("bootstrap.servers", kafkaAddress); + properties.setProperty("group.id",kafkaGroup); + FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011( + topic, new InputMessageDeserializationSchema(),properties); + + return consumer; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/connector/Producers.java b/libraries-data-2/src/main/com/baeldung/flink/connector/Producers.java new file mode 100644 index 0000000000..8e6f3f8f37 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/connector/Producers.java @@ -0,0 +1,17 @@ +package com.baeldung.flink.connector; + +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.schema.BackupSerializationSchema; +import org.apache.flink.api.common.serialization.SimpleStringSchema; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; + +public class Producers { + + public static FlinkKafkaProducer011 createStringProducer(String topic, String kafkaAddress) { + return new FlinkKafkaProducer011<>(kafkaAddress, topic, new SimpleStringSchema()); + } + + public static FlinkKafkaProducer011 createBackupProducer(String topic, String kafkaAddress) { + return new FlinkKafkaProducer011(kafkaAddress, topic, new BackupSerializationSchema()); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/model/Backup.java b/libraries-data-2/src/main/com/baeldung/flink/model/Backup.java new file mode 100644 index 0000000000..268ceec7f3 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/model/Backup.java @@ -0,0 +1,27 @@ +package com.baeldung.flink.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +public class Backup { + + @JsonProperty("inputMessages") + List inputMessages; + @JsonProperty("backupTimestamp") + LocalDateTime backupTimestamp; + @JsonProperty("uuid") + UUID uuid; + + public Backup(List inputMessages, LocalDateTime backupTimestamp) { + this.inputMessages = inputMessages; + this.backupTimestamp = backupTimestamp; + this.uuid = UUID.randomUUID(); + } + + public List getInputMessages() { + return inputMessages; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/model/InputMessage.java b/libraries-data-2/src/main/com/baeldung/flink/model/InputMessage.java new file mode 100644 index 0000000000..b3f75256ae --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/model/InputMessage.java @@ -0,0 +1,71 @@ +package com.baeldung.flink.model; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.google.common.base.Objects; + +import java.time.LocalDateTime; + +@JsonSerialize +public class InputMessage { + String sender; + String recipient; + LocalDateTime sentAt; + String message; + + public InputMessage() { + } + + public String getSender() { + return sender; + } + public void setSender(String sender) { + this.sender = sender; + } + + public String getRecipient() { + return recipient; + } + + public void setRecipient(String recipient) { + this.recipient = recipient; + } + + public LocalDateTime getSentAt() { + return sentAt; + } + + public void setSentAt(LocalDateTime sentAt) { + this.sentAt = sentAt; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public InputMessage(String sender, String recipient, LocalDateTime sentAt, String message) { + this.sender = sender; + this.recipient = recipient; + this.sentAt = sentAt; + this.message = message; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + InputMessage message1 = (InputMessage) o; + return Objects.equal(sender, message1.sender) && + Objects.equal(recipient, message1.recipient) && + Objects.equal(sentAt, message1.sentAt) && + Objects.equal(message, message1.message); + } + + @Override + public int hashCode() { + return Objects.hashCode(sender, recipient, sentAt, message); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/operator/BackupAggregator.java b/libraries-data-2/src/main/com/baeldung/flink/operator/BackupAggregator.java new file mode 100644 index 0000000000..c39b8413d1 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/operator/BackupAggregator.java @@ -0,0 +1,34 @@ +package com.baeldung.flink.operator; + +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.model.InputMessage; +import org.apache.flink.api.common.functions.AggregateFunction; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + + public class BackupAggregator implements AggregateFunction, Backup> { + @Override + public List createAccumulator() { + return new ArrayList<>(); + } + + @Override + public List add(InputMessage inputMessage, List inputMessages) { + inputMessages.add(inputMessage); + return inputMessages; + } + + @Override + public Backup getResult(List inputMessages) { + Backup backup = new Backup(inputMessages, LocalDateTime.now()); + return backup; + } + + @Override + public List merge(List inputMessages, List acc1) { + inputMessages.addAll(acc1); + return inputMessages; + } + } diff --git a/libraries-data-2/src/main/com/baeldung/flink/operator/InputMessageTimestampAssigner.java b/libraries-data-2/src/main/com/baeldung/flink/operator/InputMessageTimestampAssigner.java new file mode 100644 index 0000000000..05828d9588 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/operator/InputMessageTimestampAssigner.java @@ -0,0 +1,23 @@ +package com.baeldung.flink.operator; + +import com.baeldung.flink.model.InputMessage; +import org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks; +import org.apache.flink.streaming.api.watermark.Watermark; + +import javax.annotation.Nullable; +import java.time.ZoneId; + +public class InputMessageTimestampAssigner implements AssignerWithPunctuatedWatermarks { + + @Override + public long extractTimestamp(InputMessage element, long previousElementTimestamp) { + ZoneId zoneId = ZoneId.systemDefault(); + return element.getSentAt().atZone(zoneId).toEpochSecond() * 1000; + } + + @Nullable + @Override + public Watermark checkAndGetNextWatermark(InputMessage lastElement, long extractedTimestamp) { + return new Watermark(extractedTimestamp - 15); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/operator/WordsCapitalizer.java b/libraries-data-2/src/main/com/baeldung/flink/operator/WordsCapitalizer.java new file mode 100644 index 0000000000..f9103d225c --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/operator/WordsCapitalizer.java @@ -0,0 +1,11 @@ +package com.baeldung.flink.operator; + +import org.apache.flink.api.common.functions.MapFunction; + +public class WordsCapitalizer implements MapFunction { + + @Override + public String map(String s) { + return s.toUpperCase(); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/schema/BackupSerializationSchema.java b/libraries-data-2/src/main/com/baeldung/flink/schema/BackupSerializationSchema.java new file mode 100644 index 0000000000..967b266bb6 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/schema/BackupSerializationSchema.java @@ -0,0 +1,33 @@ +package com.baeldung.flink.schema; + +import com.baeldung.flink.model.Backup; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.flink.api.common.serialization.SerializationSchema; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BackupSerializationSchema + implements SerializationSchema { + + static ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + + Logger logger = LoggerFactory.getLogger(BackupSerializationSchema.class); + + @Override + public byte[] serialize(Backup backupMessage) { + if(objectMapper == null) { + objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + } + try { + String json = objectMapper.writeValueAsString(backupMessage); + return json.getBytes(); + } catch (com.fasterxml.jackson.core.JsonProcessingException e) { + logger.error("Failed to parse JSON", e); + } + return new byte[0]; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/flink/schema/InputMessageDeserializationSchema.java b/libraries-data-2/src/main/com/baeldung/flink/schema/InputMessageDeserializationSchema.java new file mode 100644 index 0000000000..9aaf8b9877 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/flink/schema/InputMessageDeserializationSchema.java @@ -0,0 +1,32 @@ +package com.baeldung.flink.schema; + +import com.baeldung.flink.model.InputMessage; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.flink.api.common.serialization.DeserializationSchema; +import org.apache.flink.api.common.typeinfo.TypeInformation; + +import java.io.IOException; + +public class InputMessageDeserializationSchema implements + DeserializationSchema { + + static ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + + + @Override + public InputMessage deserialize(byte[] bytes) throws IOException { + + return objectMapper.readValue(bytes, InputMessage.class); + } + + @Override + public boolean isEndOfStream(InputMessage inputMessage) { + return false; + } + + @Override + public TypeInformation getProducedType() { + return TypeInformation.of(InputMessage.class); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/google/sheets/GoogleAuthorizeUtil.java b/libraries-data-2/src/main/com/baeldung/google/sheets/GoogleAuthorizeUtil.java new file mode 100644 index 0000000000..641fae42dd --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/google/sheets/GoogleAuthorizeUtil.java @@ -0,0 +1,34 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.List; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.MemoryDataStoreFactory; +import com.google.api.services.sheets.v4.SheetsScopes; + +public class GoogleAuthorizeUtil { + public static Credential authorize() throws IOException, GeneralSecurityException { + InputStream in = GoogleAuthorizeUtil.class.getResourceAsStream("/google-sheets-client-secret.json"); + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in)); + + List scopes = Arrays.asList(SheetsScopes.SPREADSHEETS); + + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), clientSecrets, scopes).setDataStoreFactory(new MemoryDataStoreFactory()) + .setAccessType("offline").build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + + return credential; + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/google/sheets/SheetsServiceUtil.java b/libraries-data-2/src/main/com/baeldung/google/sheets/SheetsServiceUtil.java new file mode 100644 index 0000000000..8a78d50551 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/google/sheets/SheetsServiceUtil.java @@ -0,0 +1,20 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.sheets.v4.Sheets; + +public class SheetsServiceUtil { + + private static final String APPLICATION_NAME = "Google Sheets Example"; + + public static Sheets getSheetsService() throws IOException, GeneralSecurityException { + Credential credential = GoogleAuthorizeUtil.authorize(); + return new Sheets.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), credential).setApplicationName(APPLICATION_NAME).build(); + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/CacheConfiguration.java b/libraries-data-2/src/main/com/baeldung/infinispan/CacheConfiguration.java new file mode 100644 index 0000000000..eda511d7a7 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/infinispan/CacheConfiguration.java @@ -0,0 +1,70 @@ +package com.baeldung.infinispan; + +import com.baeldung.infinispan.listener.CacheListener; +import org.infinispan.Cache; +import org.infinispan.configuration.cache.Configuration; +import org.infinispan.configuration.cache.ConfigurationBuilder; +import org.infinispan.eviction.EvictionType; +import org.infinispan.manager.DefaultCacheManager; +import org.infinispan.transaction.LockingMode; +import org.infinispan.transaction.TransactionMode; + +import java.util.concurrent.TimeUnit; + +public class CacheConfiguration { + + public static final String SIMPLE_HELLO_WORLD_CACHE = "simple-hello-world-cache"; + public static final String EXPIRING_HELLO_WORLD_CACHE = "expiring-hello-world-cache"; + public static final String EVICTING_HELLO_WORLD_CACHE = "evicting-hello-world-cache"; + public static final String PASSIVATING_HELLO_WORLD_CACHE = "passivating-hello-world-cache"; + public static final String TRANSACTIONAL_CACHE = "transactional-cache"; + + public DefaultCacheManager cacheManager() { + return new DefaultCacheManager(); + } + + public Cache transactionalCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(TRANSACTIONAL_CACHE, cacheManager, listener, transactionalConfiguration()); + } + + public Cache simpleHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(SIMPLE_HELLO_WORLD_CACHE, cacheManager, listener, new ConfigurationBuilder().build()); + } + + public Cache expiringHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(EXPIRING_HELLO_WORLD_CACHE, cacheManager, listener, expiringConfiguration()); + } + + public Cache evictingHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(EVICTING_HELLO_WORLD_CACHE, cacheManager, listener, evictingConfiguration()); + } + + public Cache passivatingHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(PASSIVATING_HELLO_WORLD_CACHE, cacheManager, listener, passivatingConfiguration()); + } + + private Cache buildCache(String cacheName, DefaultCacheManager cacheManager, CacheListener listener, Configuration configuration) { + + cacheManager.defineConfiguration(cacheName, configuration); + Cache cache = cacheManager.getCache(cacheName); + cache.addListener(listener); + return cache; + } + + private Configuration expiringConfiguration() { + return new ConfigurationBuilder().expiration().lifespan(1, TimeUnit.SECONDS).build(); + } + + private Configuration evictingConfiguration() { + return new ConfigurationBuilder().memory().evictionType(EvictionType.COUNT).size(1).build(); + } + + private Configuration passivatingConfiguration() { + return new ConfigurationBuilder().memory().evictionType(EvictionType.COUNT).size(1).persistence().passivation(true).addSingleFileStore().purgeOnStartup(true).location(System.getProperty("java.io.tmpdir")).build(); + } + + private Configuration transactionalConfiguration() { + return new ConfigurationBuilder().transaction().transactionMode(TransactionMode.TRANSACTIONAL).lockingMode(LockingMode.PESSIMISTIC).build(); + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/listener/CacheListener.java b/libraries-data-2/src/main/com/baeldung/infinispan/listener/CacheListener.java new file mode 100644 index 0000000000..942a2fb62d --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/infinispan/listener/CacheListener.java @@ -0,0 +1,53 @@ +package com.baeldung.infinispan.listener; + +import org.infinispan.notifications.Listener; +import org.infinispan.notifications.cachelistener.annotation.*; +import org.infinispan.notifications.cachelistener.event.*; + +@Listener +public class CacheListener { + + @CacheEntryCreated + public void entryCreated(CacheEntryCreatedEvent event) { + this.printLog("Adding key '" + event.getKey() + "' to cache", event); + } + + @CacheEntryExpired + public void entryExpired(CacheEntryExpiredEvent event) { + this.printLog("Expiring key '" + event.getKey() + "' from cache", event); + } + + @CacheEntryVisited + public void entryVisited(CacheEntryVisitedEvent event) { + this.printLog("Key '" + event.getKey() + "' was visited", event); + } + + @CacheEntryActivated + public void entryActivated(CacheEntryActivatedEvent event) { + this.printLog("Activating key '" + event.getKey() + "' on cache", event); + } + + @CacheEntryPassivated + public void entryPassivated(CacheEntryPassivatedEvent event) { + this.printLog("Passivating key '" + event.getKey() + "' from cache", event); + } + + @CacheEntryLoaded + public void entryLoaded(CacheEntryLoadedEvent event) { + this.printLog("Loading key '" + event.getKey() + "' to cache", event); + } + + @CacheEntriesEvicted + public void entriesEvicted(CacheEntriesEvictedEvent event) { + final StringBuilder builder = new StringBuilder(); + event.getEntries().forEach((key, value) -> builder.append(key).append(", ")); + System.out.println("Evicting following entries from cache: " + builder.toString()); + } + + private void printLog(String log, CacheEntryEvent event) { + if (!event.isPre()) { + System.out.println(log); + } + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/repository/HelloWorldRepository.java b/libraries-data-2/src/main/com/baeldung/infinispan/repository/HelloWorldRepository.java new file mode 100644 index 0000000000..85c0d539a3 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/infinispan/repository/HelloWorldRepository.java @@ -0,0 +1,15 @@ +package com.baeldung.infinispan.repository; + +public class HelloWorldRepository { + + public String getHelloWorld() { + try { + System.out.println("Executing some heavy query"); + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "Hello World!"; + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/service/HelloWorldService.java b/libraries-data-2/src/main/com/baeldung/infinispan/service/HelloWorldService.java new file mode 100644 index 0000000000..de30cd5c8e --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/infinispan/service/HelloWorldService.java @@ -0,0 +1,77 @@ +package com.baeldung.infinispan.service; + +import com.baeldung.infinispan.listener.CacheListener; +import com.baeldung.infinispan.repository.HelloWorldRepository; +import org.infinispan.Cache; + +import java.util.concurrent.TimeUnit; + +public class HelloWorldService { + + private final HelloWorldRepository repository; + + private final Cache simpleHelloWorldCache; + private final Cache expiringHelloWorldCache; + private final Cache evictingHelloWorldCache; + private final Cache passivatingHelloWorldCache; + + public HelloWorldService(HelloWorldRepository repository, CacheListener listener, Cache simpleHelloWorldCache, Cache expiringHelloWorldCache, Cache evictingHelloWorldCache, + Cache passivatingHelloWorldCache) { + + this.repository = repository; + + this.simpleHelloWorldCache = simpleHelloWorldCache; + this.expiringHelloWorldCache = expiringHelloWorldCache; + this.evictingHelloWorldCache = evictingHelloWorldCache; + this.passivatingHelloWorldCache = passivatingHelloWorldCache; + } + + public String findSimpleHelloWorld() { + String cacheKey = "simple-hello"; + return simpleHelloWorldCache.computeIfAbsent(cacheKey, k -> repository.getHelloWorld()); + } + + public String findExpiringHelloWorld() { + String cacheKey = "expiring-hello"; + String helloWorld = simpleHelloWorldCache.get(cacheKey); + if (helloWorld == null) { + helloWorld = repository.getHelloWorld(); + simpleHelloWorldCache.put(cacheKey, helloWorld, 1, TimeUnit.SECONDS); + } + return helloWorld; + } + + public String findIdleHelloWorld() { + String cacheKey = "idle-hello"; + String helloWorld = simpleHelloWorldCache.get(cacheKey); + if (helloWorld == null) { + helloWorld = repository.getHelloWorld(); + simpleHelloWorldCache.put(cacheKey, helloWorld, -1, TimeUnit.SECONDS, 10, TimeUnit.SECONDS); + } + return helloWorld; + } + + public String findSimpleHelloWorldInExpiringCache() { + String cacheKey = "simple-hello"; + String helloWorld = expiringHelloWorldCache.get(cacheKey); + if (helloWorld == null) { + helloWorld = repository.getHelloWorld(); + expiringHelloWorldCache.put(cacheKey, helloWorld); + } + return helloWorld; + } + + public String findEvictingHelloWorld(String key) { + String value = evictingHelloWorldCache.get(key); + if (value == null) { + value = repository.getHelloWorld(); + evictingHelloWorldCache.put(key, value); + } + return value; + } + + public String findPassivatingHelloWorld(String key) { + return passivatingHelloWorldCache.computeIfAbsent(key, k -> repository.getHelloWorld()); + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/service/TransactionalService.java b/libraries-data-2/src/main/com/baeldung/infinispan/service/TransactionalService.java new file mode 100644 index 0000000000..26862b8d65 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/infinispan/service/TransactionalService.java @@ -0,0 +1,55 @@ +package com.baeldung.infinispan.service; + +import org.infinispan.Cache; +import org.springframework.util.StopWatch; + +import javax.transaction.TransactionManager; + +public class TransactionalService { + + private final Cache transactionalCache; + + private static final String KEY = "key"; + + public TransactionalService(Cache transactionalCache) { + this.transactionalCache = transactionalCache; + + transactionalCache.put(KEY, 0); + } + + public Integer getQuickHowManyVisits() { + try { + TransactionManager tm = transactionalCache.getAdvancedCache().getTransactionManager(); + tm.begin(); + Integer howManyVisits = transactionalCache.get(KEY); + howManyVisits++; + System.out.println("Ill try to set HowManyVisits to " + howManyVisits); + StopWatch watch = new StopWatch(); + watch.start(); + transactionalCache.put(KEY, howManyVisits); + watch.stop(); + System.out.println("I was able to set HowManyVisits to " + howManyVisits + " after waiting " + watch.getTotalTimeSeconds() + " seconds"); + + tm.commit(); + return howManyVisits; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public void startBackgroundBatch() { + try { + TransactionManager tm = transactionalCache.getAdvancedCache().getTransactionManager(); + tm.begin(); + transactionalCache.put(KEY, 1000); + System.out.println("HowManyVisits should now be 1000, " + "but we are holding the transaction"); + Thread.sleep(1000L); + tm.rollback(); + System.out.println("The slow batch suffered a rollback"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/measurement/WaterTank.java b/libraries-data-2/src/main/com/baeldung/measurement/WaterTank.java new file mode 100644 index 0000000000..f3675ae689 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/measurement/WaterTank.java @@ -0,0 +1,26 @@ +package com.baeldung.measurement; + +import javax.measure.Quantity; +import javax.measure.quantity.Volume; + +public class WaterTank { + + private Quantity capacityMeasure; + private double capacityDouble; + + public void setCapacityMeasure(Quantity capacityMeasure) { + this.capacityMeasure = capacityMeasure; + } + + public void setCapacityDouble(double capacityDouble) { + this.capacityDouble = capacityDouble; + } + + public Quantity getCapacityMeasure() { + return capacityMeasure; + } + + public double getCapacityDouble() { + return capacityDouble; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/Application.java b/libraries-data-2/src/main/com/baeldung/opencsv/Application.java new file mode 100644 index 0000000000..fd7e4d82d4 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/Application.java @@ -0,0 +1,108 @@ +package com.baeldung.opencsv; + +import com.baeldung.opencsv.beans.NamedColumnBean; +import com.baeldung.opencsv.beans.SimplePositionBean; +import com.baeldung.opencsv.examples.sync.BeanExamples; +import com.baeldung.opencsv.examples.sync.CsvReaderExamples; +import com.baeldung.opencsv.examples.sync.CsvWriterExamples; +import com.baeldung.opencsv.helpers.Helpers; + +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Path; + +public class Application { + + /* + * Bean Examples. + */ + + public static String simpleSyncPositionBeanExample() { + Path path = null; + try { + path = Helpers.twoColumnCsvPath(); + } catch (Exception ex) { + Helpers.err(ex); + } + return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString(); + } + + public static String namedSyncColumnBeanExample() { + Path path = null; + try { + path = Helpers.namedColumnCsvPath(); + } catch (Exception ex) { + Helpers.err(ex); + } + return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString(); + } + + public static String writeSyncCsvFromBeanExample() { + Path path = null; + try { + path = Helpers.fileOutBeanPath(); + } catch (Exception ex) { + Helpers.err(ex); + } + return BeanExamples.writeCsvFromBean(path); + } + + /* + * CSV Reader Examples. + */ + + public static String oneByOneSyncExample() { + Reader reader = null; + try { + reader = Files.newBufferedReader(Helpers.twoColumnCsvPath()); + } catch (Exception ex) { + Helpers.err(ex); + } + return CsvReaderExamples.oneByOne(reader).toString(); + } + + public static String readAllSyncExample() { + Reader reader = null; + try { + reader = Files.newBufferedReader(Helpers.twoColumnCsvPath()); + } catch (Exception ex) { + Helpers.err(ex); + } + return CsvReaderExamples.readAll(reader).toString(); + } + + /* + * CSV Writer Examples. + */ + + + public static String csvWriterSyncOneByOne() { + Path path = null; + try { + path = Helpers.fileOutOnePath(); + } catch (Exception ex) { + Helpers.err(ex); + } + return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path); + } + + public static String csvWriterSyncAll() { + Path path = null; + try { + path = Helpers.fileOutAllPath(); + } catch (Exception ex) { + Helpers.err(ex); + } + return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path); + } + + public static void main(String[] args) { + simpleSyncPositionBeanExample(); + namedSyncColumnBeanExample(); + writeSyncCsvFromBeanExample(); + oneByOneSyncExample(); + readAllSyncExample(); + csvWriterSyncOneByOne(); + csvWriterSyncAll(); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/Constants.java b/libraries-data-2/src/main/com/baeldung/opencsv/Constants.java new file mode 100644 index 0000000000..f7978acf24 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/Constants.java @@ -0,0 +1,17 @@ +package com.baeldung.opencsv; + +public class Constants { + + public static final String GENERIC_EXCEPTION = "EXCEPTION ENCOUNTERED: "; + public static final String GENERIC_SUCCESS = "SUCCESS"; + + public static final String TWO_COLUMN_CSV = "csv/twoColumn.csv"; + public static final String FOUR_COLUMN_CSV = "csv/fourColumn.csv"; + public static final String NAMED_COLUMN_CSV = "csv/namedColumn.csv"; + + public static final String CSV_All = "csv/writtenAll.csv"; + public static final String CSV_BEAN = "csv/writtenBean.csv"; + public static final String CSV_ONE = "csv/writtenOneByOne.csv"; + + +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/CsvBean.java b/libraries-data-2/src/main/com/baeldung/opencsv/beans/CsvBean.java new file mode 100644 index 0000000000..af9caaae12 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/beans/CsvBean.java @@ -0,0 +1,3 @@ +package com.baeldung.opencsv.beans; + +public class CsvBean { } diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/NamedColumnBean.java b/libraries-data-2/src/main/com/baeldung/opencsv/beans/NamedColumnBean.java new file mode 100644 index 0000000000..d9e5f96333 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/beans/NamedColumnBean.java @@ -0,0 +1,31 @@ +package com.baeldung.opencsv.beans; + +import com.opencsv.bean.CsvBindByName; + +public class NamedColumnBean extends CsvBean { + + @CsvBindByName(column = "name") + private String name; + + //Automatically infer column name as Age + @CsvBindByName + private int age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/SimplePositionBean.java b/libraries-data-2/src/main/com/baeldung/opencsv/beans/SimplePositionBean.java new file mode 100644 index 0000000000..799006e2f9 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/beans/SimplePositionBean.java @@ -0,0 +1,29 @@ +package com.baeldung.opencsv.beans; + +import com.opencsv.bean.CsvBindByPosition; + +public class SimplePositionBean extends CsvBean { + + @CsvBindByPosition(position = 0) + private String exampleColOne; + + @CsvBindByPosition(position = 1) + private String exampleColTwo; + + public String getExampleColOne() { + return exampleColOne; + } + + private void setExampleColOne(String exampleColOne) { + this.exampleColOne = exampleColOne; + } + + public String getExampleColTwo() { + return exampleColTwo; + } + + private void setExampleCsvTwo (String exampleColTwo) { + this.exampleColTwo = exampleColTwo; + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/WriteExampleBean.java b/libraries-data-2/src/main/com/baeldung/opencsv/beans/WriteExampleBean.java new file mode 100644 index 0000000000..f145f67f11 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/beans/WriteExampleBean.java @@ -0,0 +1,40 @@ +package com.baeldung.opencsv.beans; + +public class WriteExampleBean extends CsvBean { + + private String colA; + + private String colB; + + private String colC; + + public WriteExampleBean(String colA, String colB, String colC) { + this.colA = colA; + this.colB = colB; + this.colC = colC; + } + + public String getColA() { + return colA; + } + + public void setColA(String colA) { + this.colA = colA; + } + + public String getColB() { + return colB; + } + + public void setColB(String colB) { + this.colB = colB; + } + + public String getColC() { + return colC; + } + + public void setColC(String colC) { + this.colC = colC; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/BeanExamples.java b/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/BeanExamples.java new file mode 100644 index 0000000000..086f32677e --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/BeanExamples.java @@ -0,0 +1,63 @@ +package com.baeldung.opencsv.examples.sync; + +import com.baeldung.opencsv.beans.CsvBean; +import com.baeldung.opencsv.beans.WriteExampleBean; +import com.baeldung.opencsv.helpers.Helpers; +import com.baeldung.opencsv.pojos.CsvTransfer; +import com.opencsv.CSVWriter; +import com.opencsv.bean.*; + +import java.io.FileWriter; +import java.io.Reader; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class BeanExamples { + + public static List beanBuilderExample(Path path, Class clazz) { + ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy(); + return beanBuilderExample(path, clazz, ms); + } + + public static List beanBuilderExample(Path path, Class clazz, MappingStrategy ms) { + CsvTransfer csvTransfer = new CsvTransfer(); + try { + ms.setType(clazz); + + Reader reader = Files.newBufferedReader(path); + CsvToBean cb = new CsvToBeanBuilder(reader).withType(clazz) + .withMappingStrategy(ms) + .build(); + + csvTransfer.setCsvList(cb.parse()); + reader.close(); + + } catch (Exception ex) { + Helpers.err(ex); + } + return csvTransfer.getCsvList(); + } + + public static String writeCsvFromBean(Path path) { + try { + Writer writer = new FileWriter(path.toString()); + + StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer).withSeparator(CSVWriter.DEFAULT_SEPARATOR) + .build(); + + List list = new ArrayList<>(); + list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd")); + list.add(new WriteExampleBean("Test2", "ipso", "facto")); + + sbc.write(list); + writer.close(); + + } catch (Exception ex) { + Helpers.err(ex); + } + return Helpers.readFile(path); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java b/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java new file mode 100644 index 0000000000..bacfdcff3d --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java @@ -0,0 +1,63 @@ +package com.baeldung.opencsv.examples.sync; + +import com.baeldung.opencsv.helpers.Helpers; +import com.opencsv.CSVParser; +import com.opencsv.CSVParserBuilder; +import com.opencsv.CSVReader; +import com.opencsv.CSVReaderBuilder; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +public class CsvReaderExamples { + + public static List readAll(Reader reader) { + + CSVParser parser = new CSVParserBuilder() + .withSeparator(',') + .withIgnoreQuotations(true) + .build(); + + CSVReader csvReader = new CSVReaderBuilder(reader) + .withSkipLines(0) + .withCSVParser(parser) + .build(); + + List list = new ArrayList<>(); + try { + list = csvReader.readAll(); + reader.close(); + csvReader.close(); + } catch (Exception ex) { + Helpers.err(ex); + } + return list; + } + + public static List oneByOne(Reader reader) { + List list = new ArrayList<>(); + try { + CSVParser parser = new CSVParserBuilder() + .withSeparator(',') + .withIgnoreQuotations(true) + .build(); + + CSVReader csvReader = new CSVReaderBuilder(reader) + .withSkipLines(0) + .withCSVParser(parser) + .build(); + + String[] line; + while ((line = csvReader.readNext()) != null) { + list.add(line); + } + reader.close(); + csvReader.close(); + } catch (Exception ex) { + Helpers.err(ex); + } + return list; + } + +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java b/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java new file mode 100644 index 0000000000..6f52160ba8 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java @@ -0,0 +1,35 @@ +package com.baeldung.opencsv.examples.sync; + +import com.baeldung.opencsv.helpers.Helpers; +import com.opencsv.CSVWriter; + +import java.io.FileWriter; +import java.nio.file.Path; +import java.util.List; + +public class CsvWriterExamples { + + public static String csvWriterOneByOne(List stringArray, Path path) { + try { + CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); + for (String[] array : stringArray) { + writer.writeNext(array); + } + writer.close(); + } catch (Exception ex) { + Helpers.err(ex); + } + return Helpers.readFile(path); + } + + public static String csvWriterAll(List stringArray, Path path) { + try { + CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); + writer.writeAll(stringArray); + writer.close(); + } catch (Exception ex) { + Helpers.err(ex); + } + return Helpers.readFile(path); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/helpers/Helpers.java b/libraries-data-2/src/main/com/baeldung/opencsv/helpers/Helpers.java new file mode 100644 index 0000000000..9a46fbc495 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/helpers/Helpers.java @@ -0,0 +1,108 @@ +package com.baeldung.opencsv.helpers; + +import com.baeldung.opencsv.Constants; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class Helpers { + + /** + * Write Files + */ + + public static Path fileOutAllPath() throws URISyntaxException { + URI uri = ClassLoader.getSystemResource(Constants.CSV_All).toURI(); + return Paths.get(uri); + } + + public static Path fileOutBeanPath() throws URISyntaxException { + URI uri = ClassLoader.getSystemResource(Constants.CSV_BEAN).toURI(); + return Paths.get(uri); + } + + public static Path fileOutOnePath() throws URISyntaxException { + URI uri = ClassLoader.getSystemResource(Constants.CSV_ONE).toURI(); + return Paths.get(uri); + } + + /** + * Read Files + */ + + public static Path twoColumnCsvPath() throws URISyntaxException { + URI uri = ClassLoader.getSystemResource(Constants.TWO_COLUMN_CSV).toURI(); + return Paths.get(uri); + } + + public static Path fourColumnCsvPath() throws URISyntaxException { + URI uri = ClassLoader.getSystemResource(Constants.FOUR_COLUMN_CSV).toURI(); + return Paths.get(uri); + } + + public static Path namedColumnCsvPath() throws URISyntaxException { + URI uri = ClassLoader.getSystemResource(Constants.NAMED_COLUMN_CSV).toURI(); + return Paths.get(uri); + } + + /** + * Simple File Reader + */ + + public static String readFile(Path path) { + String response = ""; + try { + FileReader fr = new FileReader(path.toString()); + BufferedReader br = new BufferedReader(fr); + String strLine; + StringBuffer sb = new StringBuffer(); + while ((strLine = br.readLine()) != null) { + sb.append(strLine); + } + response = sb.toString(); + System.out.println(response); + fr.close(); + br.close(); + } catch (Exception ex) { + Helpers.err(ex); + } + return response; + } + + /** + * Dummy Data for Writing. + */ + + public static List twoColumnCsvString() { + List list = new ArrayList<>(); + list.add(new String[]{"ColA", "ColB"}); + list.add(new String[]{"A", "B"}); + return list; + } + + public static List fourColumnCsvString() { + List list = new ArrayList<>(); + list.add(new String[]{"ColA", "ColB", "ColC", "ColD"}); + list.add(new String[]{"A", "B", "A", "B"}); + list.add(new String[]{"BB", "AB", "AA", "B"}); + return list; + } + + /** + * Message Helpers + */ + + public static void print(String msg) { + System.out.println(msg); + } + + public static void err(Exception ex) { + System.out.println(Constants.GENERIC_EXCEPTION + " " + ex); + } +} diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/pojos/CsvTransfer.java b/libraries-data-2/src/main/com/baeldung/opencsv/pojos/CsvTransfer.java new file mode 100644 index 0000000000..79366e3d20 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/opencsv/pojos/CsvTransfer.java @@ -0,0 +1,38 @@ +package com.baeldung.opencsv.pojos; + +import com.baeldung.opencsv.beans.CsvBean; + +import java.util.ArrayList; +import java.util.List; + +public class CsvTransfer { + + private List csvStringList; + + private List csvList; + + public CsvTransfer() {} + + public List getCsvStringList() { + if (csvStringList != null) return csvStringList; + return new ArrayList(); + } + + public void addLine(String[] line) { + if (this.csvList == null) this.csvStringList = new ArrayList<>(); + this.csvStringList.add(line); + } + + public void setCsvStringList(List csvStringList) { + this.csvStringList = csvStringList; + } + + public void setCsvList(List csvList) { + this.csvList = csvList; + } + + public List getCsvList() { + if (csvList != null) return csvList; + return new ArrayList(); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderConverter.java b/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderConverter.java new file mode 100644 index 0000000000..fa317f93b7 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderConverter.java @@ -0,0 +1,44 @@ +package com.baeldung.smooks.converter; + +import com.baeldung.smooks.model.Order; +import org.milyn.Smooks; +import org.milyn.payload.JavaResult; +import org.milyn.payload.StringResult; +import org.xml.sax.SAXException; + +import javax.xml.transform.stream.StreamSource; +import java.io.IOException; + +public class OrderConverter { + + public Order convertOrderXMLToOrderObject(String path) throws IOException, SAXException { + Smooks smooks = new Smooks(OrderConverter.class.getResourceAsStream("/smooks/smooks-mapping.xml")); + try { + JavaResult javaResult = new JavaResult(); + smooks.filterSource(new StreamSource(OrderConverter.class.getResourceAsStream(path)), javaResult); + return (Order) javaResult.getBean("order"); + } finally { + smooks.close(); + } + } + + public String convertOrderXMLtoEDIFACT(String path) throws IOException, SAXException { + return convertDocumentWithTempalte(path, "/smooks/smooks-transform-edi.xml"); + } + + public String convertOrderXMLtoEmailMessage(String path) throws IOException, SAXException { + return convertDocumentWithTempalte(path, "/smooks/smooks-transform-email.xml"); + } + + private String convertDocumentWithTempalte(String path, String config) throws IOException, SAXException { + Smooks smooks = new Smooks(config); + + try { + StringResult stringResult = new StringResult(); + smooks.filterSource(new StreamSource(OrderConverter.class.getResourceAsStream(path)), stringResult); + return stringResult.toString(); + } finally { + smooks.close(); + } + } +} diff --git a/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderValidator.java b/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderValidator.java new file mode 100644 index 0000000000..3975921da0 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderValidator.java @@ -0,0 +1,27 @@ +package com.baeldung.smooks.converter; + +import org.milyn.Smooks; +import org.milyn.payload.JavaResult; +import org.milyn.payload.StringResult; +import org.milyn.validation.ValidationResult; +import org.xml.sax.SAXException; + +import javax.xml.transform.stream.StreamSource; +import java.io.IOException; + +public class OrderValidator { + + public ValidationResult validate(String path) throws IOException, SAXException { + Smooks smooks = new Smooks(OrderValidator.class.getResourceAsStream("/smooks/smooks-validation.xml")); + + try { + StringResult xmlResult = new StringResult(); + JavaResult javaResult = new JavaResult(); + ValidationResult validationResult = new ValidationResult(); + smooks.filterSource(new StreamSource(OrderValidator.class.getResourceAsStream(path)), xmlResult, javaResult, validationResult); + return validationResult; + } finally { + smooks.close(); + } + } +} diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Item.java b/libraries-data-2/src/main/com/baeldung/smooks/model/Item.java new file mode 100644 index 0000000000..3e1f4a7ef4 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/smooks/model/Item.java @@ -0,0 +1,70 @@ +package com.baeldung.smooks.model; + +public class Item { + + public Item() { + } + + public Item(String code, Double price, Integer quantity) { + this.code = code; + this.price = price; + this.quantity = quantity; + } + + private String code; + private Double price; + private Integer quantity; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + Item item = (Item) o; + + if (code != null ? !code.equals(item.code) : item.code != null) + return false; + if (price != null ? !price.equals(item.price) : item.price != null) + return false; + return quantity != null ? quantity.equals(item.quantity) : item.quantity == null; + } + + @Override + public int hashCode() { + int result = code != null ? code.hashCode() : 0; + result = 31 * result + (price != null ? price.hashCode() : 0); + result = 31 * result + (quantity != null ? quantity.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "Item{" + "code='" + code + '\'' + ", price=" + price + ", quantity=" + quantity + '}'; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Order.java b/libraries-data-2/src/main/com/baeldung/smooks/model/Order.java new file mode 100644 index 0000000000..047e1fe8a3 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/smooks/model/Order.java @@ -0,0 +1,52 @@ +package com.baeldung.smooks.model; + +import java.util.Date; +import java.util.List; + +public class Order { + private Date creationDate; + private Long number; + private Status status; + private Supplier supplier; + private List items; + + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public Long getNumber() { + return number; + } + + public void setNumber(Long number) { + this.number = number; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public Supplier getSupplier() { + return supplier; + } + + public void setSupplier(Supplier supplier) { + this.supplier = supplier; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Status.java b/libraries-data-2/src/main/com/baeldung/smooks/model/Status.java new file mode 100644 index 0000000000..53c50bdf46 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/smooks/model/Status.java @@ -0,0 +1,5 @@ +package com.baeldung.smooks.model; + +public enum Status { + NEW, IN_PROGRESS, FINISHED +} diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Supplier.java b/libraries-data-2/src/main/com/baeldung/smooks/model/Supplier.java new file mode 100644 index 0000000000..827a0fc907 --- /dev/null +++ b/libraries-data-2/src/main/com/baeldung/smooks/model/Supplier.java @@ -0,0 +1,52 @@ +package com.baeldung.smooks.model; + +public class Supplier { + + private String name; + private String phoneNumber; + + public Supplier() { + } + + public Supplier(String name, String phoneNumber) { + this.name = name; + this.phoneNumber = phoneNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + Supplier supplier = (Supplier) o; + + if (name != null ? !name.equals(supplier.name) : supplier.name != null) + return false; + return phoneNumber != null ? phoneNumber.equals(supplier.phoneNumber) : supplier.phoneNumber == null; + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (phoneNumber != null ? phoneNumber.hashCode() : 0); + return result; + } +} diff --git a/libraries-data-2/src/test/com/baeldung/crdt/CRDTUnitTest.java b/libraries-data-2/src/test/com/baeldung/crdt/CRDTUnitTest.java new file mode 100644 index 0000000000..840263e430 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/crdt/CRDTUnitTest.java @@ -0,0 +1,149 @@ +package com.baeldung.crdt; + +import com.netopyr.wurmloch.crdt.GCounter; +import com.netopyr.wurmloch.crdt.GSet; +import com.netopyr.wurmloch.crdt.LWWRegister; +import com.netopyr.wurmloch.crdt.PNCounter; +import com.netopyr.wurmloch.store.LocalCrdtStore; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CRDTUnitTest { + + @Test + public void givenGrowOnlySet_whenTwoReplicasDiverge_thenShouldMergeItWithoutAConflict() { + // given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); + crdtStore1.connect(crdtStore2); + + final GSet replica1 = crdtStore1.createGSet("ID_1"); + final GSet replica2 = crdtStore2. findGSet("ID_1").get(); + + // when + replica1.add("apple"); + replica2.add("banana"); + + // then + assertThat(replica1).contains("apple", "banana"); + assertThat(replica2).contains("apple", "banana"); + + // when + crdtStore1.disconnect(crdtStore2); + + replica1.add("strawberry"); + replica2.add("pear"); + + assertThat(replica1).contains("apple", "banana", "strawberry"); + assertThat(replica2).contains("apple", "banana", "pear"); + + crdtStore1.connect(crdtStore2); + + // then + assertThat(replica1).contains("apple", "banana", "strawberry", "pear"); + assertThat(replica2).contains("apple", "banana", "strawberry", "pear"); + } + + @Test + public void givenIncrementOnlyCounter_whenTwoReplicasDiverge_thenShouldMergeIt() { + // given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); + crdtStore1.connect(crdtStore2); + + final GCounter replica1 = crdtStore1.createGCounter("ID_1"); + final GCounter replica2 = crdtStore2.findGCounter("ID_1").get(); + + // when + replica1.increment(); + replica2.increment(2L); + + // then + assertThat(replica1.get()).isEqualTo(3L); + assertThat(replica2.get()).isEqualTo(3L); + + // when + crdtStore1.disconnect(crdtStore2); + + replica1.increment(3L); + replica2.increment(5L); + + assertThat(replica1.get()).isEqualTo(6L); + assertThat(replica2.get()).isEqualTo(8L); + + crdtStore1.connect(crdtStore2); + + // then + assertThat(replica1.get()).isEqualTo(11L); + assertThat(replica2.get()).isEqualTo(11L); + } + + @Test + public void givenPNCounter_whenReplicasDiverge_thenShouldMergeWithoutAConflict() { + // given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); + crdtStore1.connect(crdtStore2); + + final PNCounter replica1 = crdtStore1.createPNCounter("ID_1"); + final PNCounter replica2 = crdtStore2.findPNCounter("ID_1").get(); + + // when + replica1.increment(); + replica2.decrement(2L); + + // then + assertThat(replica1.get()).isEqualTo(-1L); + assertThat(replica2.get()).isEqualTo(-1L); + + // when + crdtStore1.disconnect(crdtStore2); + + replica1.decrement(3L); + replica2.increment(5L); + + assertThat(replica1.get()).isEqualTo(-4L); + assertThat(replica2.get()).isEqualTo(4L); + + crdtStore1.connect(crdtStore2); + + // then + assertThat(replica1.get()).isEqualTo(1L); + assertThat(replica2.get()).isEqualTo(1L); + } + + @Test + public void givenLastWriteWinsStrategy_whenReplicasDiverge_thenAfterMergeShouldKeepOnlyLastValue() { + // given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore("N_1"); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore("N_2"); + crdtStore1.connect(crdtStore2); + + final LWWRegister replica1 = crdtStore1.createLWWRegister("ID_1"); + final LWWRegister replica2 = crdtStore2. findLWWRegister("ID_1").get(); + + // when + replica1.set("apple"); + replica2.set("banana"); + + // then + assertThat(replica1.get()).isEqualTo("banana"); + assertThat(replica2.get()).isEqualTo("banana"); + + // when + crdtStore1.disconnect(crdtStore2); + + replica1.set("strawberry"); + replica2.set("pear"); + + assertThat(replica1.get()).isEqualTo("strawberry"); + assertThat(replica2.get()).isEqualTo("pear"); + + crdtStore1.connect(crdtStore2); + + // then + assertThat(replica1.get()).isEqualTo("pear"); + assertThat(replica2.get()).isEqualTo("pear"); + } +} diff --git a/libraries-data-2/src/test/com/baeldung/flink/BackupCreatorIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/flink/BackupCreatorIntegrationTest.java new file mode 100644 index 0000000000..f46fffbb59 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/flink/BackupCreatorIntegrationTest.java @@ -0,0 +1,104 @@ +package com.baeldung.flink; + +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.model.InputMessage; +import com.baeldung.flink.operator.BackupAggregator; +import com.baeldung.flink.operator.InputMessageTimestampAssigner; +import com.baeldung.flink.schema.BackupSerializationSchema; +import com.baeldung.flink.schema.InputMessageDeserializationSchema; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.commons.collections.ListUtils; +import org.apache.flink.api.common.serialization.DeserializationSchema; +import org.apache.flink.api.common.serialization.SerializationSchema; +import org.apache.flink.streaming.api.TimeCharacteristic; +import org.apache.flink.streaming.api.datastream.DataStreamSource; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.functions.sink.SinkFunction; +import org.apache.flink.streaming.api.windowing.time.Time; +import org.awaitility.Awaitility; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +public class BackupCreatorIntegrationTest { + public static ObjectMapper mapper; + + @Before + public void setup() { + mapper = new ObjectMapper().registerModule(new JavaTimeModule()); + } + + @Test + public void givenProperJson_whenDeserializeIsInvoked_thenProperObjectIsReturned() throws IOException { + InputMessage message = new InputMessage("Me", "User", LocalDateTime.now(), "Test Message"); + byte[] messageSerialized = mapper.writeValueAsBytes(message); + DeserializationSchema deserializationSchema = new InputMessageDeserializationSchema(); + InputMessage messageDeserialized = deserializationSchema.deserialize(messageSerialized); + + assertEquals(message, messageDeserialized); + } + + @Test + public void givenMultipleInputMessagesFromDifferentDays_whenBackupCreatorIsUser_thenMessagesAreGroupedProperly() throws Exception { + LocalDateTime currentTime = LocalDateTime.now(); + InputMessage message = new InputMessage("Me", "User", currentTime, "First TestMessage"); + InputMessage secondMessage = new InputMessage("Me", "User", currentTime.plusHours(1), "First TestMessage"); + InputMessage thirdMessage = new InputMessage("Me", "User", currentTime.plusHours(2), "First TestMessage"); + InputMessage fourthMessage = new InputMessage("Me", "User", currentTime.plusHours(3), "First TestMessage"); + InputMessage fifthMessage = new InputMessage("Me", "User", currentTime.plusHours(25), "First TestMessage"); + InputMessage sixthMessage = new InputMessage("Me", "User", currentTime.plusHours(26), "First TestMessage"); + + List firstBackupMessages = Arrays.asList(message, secondMessage, thirdMessage, fourthMessage); + List secondBackupMessages = Arrays.asList(fifthMessage, sixthMessage); + List inputMessages = ListUtils.union(firstBackupMessages, secondBackupMessages); + + StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); + env.setParallelism(1); + DataStreamSource testDataSet = env.fromCollection(inputMessages); + CollectingSink sink = new CollectingSink(); + testDataSet.assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()) + .timeWindowAll(Time.hours(24)) + .aggregate(new BackupAggregator()) + .addSink(sink); + + env.execute(); + + Awaitility.await().until(() -> sink.backups.size() == 2); + assertEquals(2, sink.backups.size()); + assertEquals(firstBackupMessages, sink.backups.get(0).getInputMessages()); + assertEquals(secondBackupMessages, sink.backups.get(1).getInputMessages()); + + } + + @Test + public void givenProperBackupObject_whenSerializeIsInvoked_thenObjectIsProperlySerialized() throws IOException { + InputMessage message = new InputMessage("Me", "User", LocalDateTime.now(), "Test Message"); + List messages = Arrays.asList(message); + Backup backup = new Backup(messages, LocalDateTime.now()); + byte[] backupSerialized = mapper.writeValueAsBytes(backup); + SerializationSchema serializationSchema = new BackupSerializationSchema(); + byte[] backupProcessed = serializationSchema.serialize(backup); + + assertArrayEquals(backupSerialized, backupProcessed); + } + + private static class CollectingSink implements SinkFunction { + + public static List backups = new ArrayList<>(); + + @Override + public synchronized void invoke(Backup value, Context context) throws Exception { + backups.add(value); + } + } +} diff --git a/libraries-data-2/src/test/com/baeldung/flink/WordCapitalizerIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/flink/WordCapitalizerIntegrationTest.java new file mode 100644 index 0000000000..8a98dae4b5 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/flink/WordCapitalizerIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.flink; + +import com.baeldung.flink.operator.WordsCapitalizer; +import org.apache.flink.api.java.DataSet; +import org.apache.flink.api.java.ExecutionEnvironment; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class WordCapitalizerIntegrationTest { + + @Test + public void givenDataSet_whenExecuteWordCapitalizer_thenReturnCapitalizedWords() throws Exception { + ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); + List data = Arrays.asList("dog", "cat", "wolf", "pig"); + + DataSet testDataSet = env.fromCollection(data); + + + List dataProcessed = testDataSet + .map(new WordsCapitalizer()) + .collect(); + + List testDataCapitalized = data.stream() + .map(String::toUpperCase) + .collect(Collectors.toList()); + + Assert.assertEquals(testDataCapitalized, dataProcessed); + } + +} diff --git a/libraries-data-2/src/test/com/baeldung/flink/WordCountIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/flink/WordCountIntegrationTest.java new file mode 100644 index 0000000000..5c788e86d6 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/flink/WordCountIntegrationTest.java @@ -0,0 +1,161 @@ +package com.baeldung.flink; + +import org.apache.flink.api.common.operators.Order; +import org.apache.flink.api.java.DataSet; +import org.apache.flink.api.java.ExecutionEnvironment; +import org.apache.flink.api.java.functions.KeySelector; +import org.apache.flink.api.java.tuple.Tuple2; +import org.apache.flink.api.java.tuple.Tuple3; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor; +import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows; +import org.apache.flink.streaming.api.windowing.time.Time; +import org.junit.Test; + +import java.time.ZonedDateTime; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class WordCountIntegrationTest { + private final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); + + @Test + public void givenDataSet_whenExecuteWordCount_thenReturnWordCount() throws Exception { + // given + List lines = Arrays.asList("This is a first sentence", "This is a second sentence with a one word"); + + // when + DataSet> result = WordCount.startWordCount(env, lines); + + // then + List> collect = result.collect(); + assertThat(collect).containsExactlyInAnyOrder(new Tuple2<>("a", 3), new Tuple2<>("sentence", 2), new Tuple2<>("word", 1), new Tuple2<>("is", 2), new Tuple2<>("this", 2), new Tuple2<>("second", 1), new Tuple2<>("first", 1), new Tuple2<>("with", 1), + new Tuple2<>("one", 1)); + } + + @Test + public void givenListOfAmounts_whenUseMapReduce_thenSumAmountsThatAreOnlyAboveThreshold() throws Exception { + // given + DataSet amounts = env.fromElements(1, 29, 40, 50); + int threshold = 30; + + // when + List collect = amounts.filter(a -> a > threshold).reduce((integer, t1) -> integer + t1).collect(); + + // then + assertThat(collect.get(0)).isEqualTo(90); + } + + @Test + public void givenDataSetOfComplexObjects_whenMapToGetOneField_thenReturnedListHaveProperElements() throws Exception { + // given + DataSet personDataSource = env.fromCollection(Arrays.asList(new Person(23, "Tom"), new Person(75, "Michael"))); + + // when + List ages = personDataSource.map(p -> p.age).collect(); + + // then + assertThat(ages).hasSize(2); + assertThat(ages).contains(23, 75); + + } + + @Test + public void givenDataSet_whenSortItByOneField_thenShouldReturnSortedDataSet() throws Exception { + // given + Tuple2 secondPerson = new Tuple2<>(4, "Tom"); + Tuple2 thirdPerson = new Tuple2<>(5, "Scott"); + Tuple2 fourthPerson = new Tuple2<>(200, "Michael"); + Tuple2 firstPerson = new Tuple2<>(1, "Jack"); + DataSet> transactions = env.fromElements(fourthPerson, secondPerson, thirdPerson, firstPerson); + + // when + List> sorted = transactions.sortPartition(new IdKeySelectorTransaction(), Order.ASCENDING).collect(); + + // then + assertThat(sorted).containsExactly(firstPerson, secondPerson, thirdPerson, fourthPerson); + } + + @Test + public void giveTwoDataSets_whenJoinUsingId_thenProduceJoinedData() throws Exception { + // given + Tuple3 address = new Tuple3<>(1, "5th Avenue", "London"); + DataSet> addresses = env.fromElements(address); + + Tuple2 firstTransaction = new Tuple2<>(1, "Transaction_1"); + DataSet> transactions = env.fromElements(firstTransaction, new Tuple2<>(12, "Transaction_2")); + + // when + List, Tuple3>> joined = transactions.join(addresses).where(new IdKeySelectorTransaction()).equalTo(new IdKeySelectorAddress()).collect(); + + // then + assertThat(joined).hasSize(1); + assertThat(joined).contains(new Tuple2<>(firstTransaction, address)); + + } + + @Test + public void givenStreamOfEvents_whenProcessEvents_thenShouldPrintResultsOnSinkOperation() throws Exception { + // given + final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + + DataStream text = env.fromElements("This is a first sentence", "This is a second sentence with a one word"); + + SingleOutputStreamOperator upperCase = text.map(String::toUpperCase); + + upperCase.print(); + + // when + env.execute(); + } + + @Test + public void givenStreamOfEvents_whenProcessEvents_thenShouldApplyWindowingOnTransformation() throws Exception { + // given + final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + + SingleOutputStreamOperator> windowed = env.fromElements(new Tuple2<>(16, ZonedDateTime.now().plusMinutes(25).toInstant().getEpochSecond()), new Tuple2<>(15, ZonedDateTime.now().plusMinutes(2).toInstant().getEpochSecond())) + .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor>(Time.seconds(20)) { + @Override + public long extractTimestamp(Tuple2 element) { + return element.f1 * 1000; + } + }); + + SingleOutputStreamOperator> reduced = windowed.windowAll(TumblingEventTimeWindows.of(Time.seconds(5))).maxBy(0, true); + + reduced.print(); + + // when + env.execute(); + } + + private static class IdKeySelectorTransaction implements KeySelector, Integer> { + @Override + public Integer getKey(Tuple2 value) { + return value.f0; + } + } + + private static class IdKeySelectorAddress implements KeySelector, Integer> { + @Override + public Integer getKey(Tuple3 value) { + return value.f0; + } + } + + private static class Person { + private final int age; + private final String name; + + private Person(int age, String name) { + this.age = age; + this.name = name; + } + } + +} \ No newline at end of file diff --git a/libraries-data-2/src/test/com/baeldung/google/sheets/GoogleSheetsLiveTest.java b/libraries-data-2/src/test/com/baeldung/google/sheets/GoogleSheetsLiveTest.java new file mode 100644 index 0000000000..358b3390f9 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/google/sheets/GoogleSheetsLiveTest.java @@ -0,0 +1,96 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import com.google.api.services.sheets.v4.model.CopyPasteRequest; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; + +import static org.assertj.core.api.Assertions.*; + +public class GoogleSheetsLiveTest { + + private static Sheets sheetsService; + + // this id can be replaced with your spreadsheet id + // otherwise be advised that multiple people may run this test and update the public spreadsheet + private static final String SPREADSHEET_ID = "1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI"; + + @BeforeClass + public static void setup() throws GeneralSecurityException, IOException { + sheetsService = SheetsServiceUtil.getSheetsService(); + } + + @Test + public void whenWriteSheet_thenReadSheetOk() throws IOException { + ValueRange body = new ValueRange().setValues(Arrays.asList(Arrays.asList("Expenses January"), Arrays.asList("books", "30"), Arrays.asList("pens", "10"), Arrays.asList("Expenses February"), Arrays.asList("clothes", "20"), Arrays.asList("shoes", "5"))); + UpdateValuesResponse result = sheetsService.spreadsheets().values().update(SPREADSHEET_ID, "A1", body).setValueInputOption("RAW").execute(); + + List data = new ArrayList<>(); + data.add(new ValueRange().setRange("D1").setValues(Arrays.asList(Arrays.asList("January Total", "=B2+B3")))); + data.add(new ValueRange().setRange("D4").setValues(Arrays.asList(Arrays.asList("February Total", "=B5+B6")))); + + BatchUpdateValuesRequest batchBody = new BatchUpdateValuesRequest().setValueInputOption("USER_ENTERED").setData(data); + BatchUpdateValuesResponse batchResult = sheetsService.spreadsheets().values().batchUpdate(SPREADSHEET_ID, batchBody).execute(); + + List ranges = Arrays.asList("E1", "E4"); + BatchGetValuesResponse readResult = sheetsService.spreadsheets().values().batchGet(SPREADSHEET_ID).setRanges(ranges).execute(); + + ValueRange januaryTotal = readResult.getValueRanges().get(0); + assertThat(januaryTotal.getValues().get(0).get(0)).isEqualTo("40"); + + ValueRange febTotal = readResult.getValueRanges().get(1); + assertThat(febTotal.getValues().get(0).get(0)).isEqualTo("25"); + + ValueRange appendBody = new ValueRange().setValues(Arrays.asList(Arrays.asList("Total", "=E1+E4"))); + AppendValuesResponse appendResult = sheetsService.spreadsheets().values().append(SPREADSHEET_ID, "A1", appendBody).setValueInputOption("USER_ENTERED").setInsertDataOption("INSERT_ROWS").setIncludeValuesInResponse(true).execute(); + + ValueRange total = appendResult.getUpdates().getUpdatedData(); + assertThat(total.getValues().get(0).get(1)).isEqualTo("65"); + } + + @Test + public void whenUpdateSpreadSheetTitle_thenOk() throws IOException { + + UpdateSpreadsheetPropertiesRequest updateRequest = new UpdateSpreadsheetPropertiesRequest().setFields("*").setProperties(new SpreadsheetProperties().setTitle("Expenses")); + + CopyPasteRequest copyRequest = new CopyPasteRequest().setSource(new GridRange().setSheetId(0).setStartColumnIndex(0).setEndColumnIndex(2).setStartRowIndex(0).setEndRowIndex(1)) + .setDestination(new GridRange().setSheetId(1).setStartColumnIndex(0).setEndColumnIndex(2).setStartRowIndex(0).setEndRowIndex(1)).setPasteType("PASTE_VALUES"); + + List requests = new ArrayList<>(); + + requests.add(new Request().setCopyPaste(copyRequest)); + requests.add(new Request().setUpdateSpreadsheetProperties(updateRequest)); + + BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest().setRequests(requests); + + sheetsService.spreadsheets().batchUpdate(SPREADSHEET_ID, body).execute(); + } + + @Test + public void whenCreateSpreadSheet_thenIdOk() throws IOException { + Spreadsheet spreadSheet = new Spreadsheet().setProperties(new SpreadsheetProperties().setTitle("My Spreadsheet")); + Spreadsheet result = sheetsService.spreadsheets().create(spreadSheet).execute(); + + assertThat(result.getSpreadsheetId()).isNotNull(); + } + +} diff --git a/libraries-data-2/src/test/com/baeldung/hll/HLLLongRunningManualTest.java b/libraries-data-2/src/test/com/baeldung/hll/HLLLongRunningManualTest.java new file mode 100644 index 0000000000..2c8113771e --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/hll/HLLLongRunningManualTest.java @@ -0,0 +1,59 @@ +package com.baeldung.hll; + +import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; +import net.agkn.hll.HLL; +import org.assertj.core.data.Offset; +import org.junit.Test; + +import java.util.stream.LongStream; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +public class HLLLongRunningManualTest { + + @Test + public void givenHLL_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinality() { + // given + long numberOfElements = 100_000_000; + long toleratedDifference = 1_000_000; + HashFunction hashFunction = Hashing.murmur3_128(); + HLL hll = new HLL(14, 5); + + // when + LongStream.range(0, numberOfElements).forEach(element -> { + long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); + hll.addRaw(hashedValue); + }); + + // then + long cardinality = hll.cardinality(); + assertThat(cardinality).isCloseTo(numberOfElements, Offset.offset(toleratedDifference)); + } + + @Test + public void givenTwoHLLs_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinalityForUnionOfHLLs() { + // given + long numberOfElements = 100_000_000; + long toleratedDifference = 1_000_000; + HashFunction hashFunction = Hashing.murmur3_128(); + HLL firstHll = new HLL(15, 5); + HLL secondHLL = new HLL(15, 5); + + // when + LongStream.range(0, numberOfElements).forEach(element -> { + long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); + firstHll.addRaw(hashedValue); + }); + + LongStream.range(numberOfElements, numberOfElements * 2).forEach(element -> { + long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); + secondHLL.addRaw(hashedValue); + }); + + // then + firstHll.union(secondHLL); + long cardinality = firstHll.cardinality(); + assertThat(cardinality).isCloseTo(numberOfElements * 2, Offset.offset(toleratedDifference * 2)); + } +} diff --git a/libraries-data-2/src/test/com/baeldung/infinispan/AbstractIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/infinispan/AbstractIntegrationTest.java new file mode 100644 index 0000000000..2a9d430430 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/infinispan/AbstractIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung.infinispan; + +import com.baeldung.infinispan.listener.CacheListener; +import com.baeldung.infinispan.repository.HelloWorldRepository; +import com.baeldung.infinispan.service.HelloWorldService; +import com.baeldung.infinispan.service.TransactionalService; +import org.infinispan.Cache; +import org.infinispan.manager.DefaultCacheManager; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; + +import java.util.function.Supplier; + +@Ignore +public abstract class AbstractIntegrationTest { + + private DefaultCacheManager cacheManager; + + private HelloWorldRepository repository = new HelloWorldRepository(); + + protected HelloWorldService helloWorldService; + protected TransactionalService transactionalService; + + @Before + public void setup() { + CacheConfiguration configuration = new CacheConfiguration(); + CacheListener listener = new CacheListener(); + + cacheManager = configuration.cacheManager(); + + Cache transactionalCache = configuration.transactionalCache(cacheManager, listener); + + Cache simpleHelloWorldCache = configuration.simpleHelloWorldCache(cacheManager, listener); + + Cache expiringHelloWorldCache = configuration.expiringHelloWorldCache(cacheManager, listener); + + Cache evictingHelloWorldCache = configuration.evictingHelloWorldCache(cacheManager, listener); + + Cache passivatingHelloWorldCache = configuration.passivatingHelloWorldCache(cacheManager, listener); + + this.helloWorldService = new HelloWorldService(repository, listener, simpleHelloWorldCache, expiringHelloWorldCache, evictingHelloWorldCache, passivatingHelloWorldCache); + + this.transactionalService = new TransactionalService(transactionalCache); + } + + @After + public void tearDown() { + cacheManager.stop(); + } + + protected long timeThis(Supplier supplier) { + long millis = System.currentTimeMillis(); + supplier.get(); + return System.currentTimeMillis() - millis; + } +} diff --git a/libraries-data-2/src/test/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java b/libraries-data-2/src/test/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java new file mode 100644 index 0000000000..46cc77cbba --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java @@ -0,0 +1,51 @@ +package com.baeldung.infinispan.service; + +import com.baeldung.infinispan.AbstractIntegrationTest; +import org.junit.Test; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class HelloWorldServiceTemporaryLiveTest extends AbstractIntegrationTest { + + @Test + public void whenGetIsCalledTwoTimes_thenTheSecondShouldHitTheCache() { + assertThat(timeThis(() -> helloWorldService.findSimpleHelloWorld())).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findSimpleHelloWorld())).isLessThan(100); + } + + @Test + public void whenGetIsCalledTwoTimesQuickly_thenTheSecondShouldHitTheCache() { + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isLessThan(100); + } + + @Test + public void whenGetIsCalledTwoTimesSparsely_thenNeitherShouldHitTheCache() throws InterruptedException { + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); + + Thread.sleep(1100); + + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); + } + + @Test + public void givenOneEntryIsConfigured_whenTwoAreAdded_thenFirstShouldntBeAvailable() { + assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 2"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); + } + + @Test + public void givenOneEntryIsConfigured_whenTwoAreAdded_thenTheFirstShouldBeAvailable() { + assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 2"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 1"))).isLessThan(100); + } + +} diff --git a/libraries-data-2/src/test/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java new file mode 100644 index 0000000000..800c6c2775 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java @@ -0,0 +1,21 @@ +package com.baeldung.infinispan.service; + +import com.baeldung.infinispan.AbstractIntegrationTest; +import org.junit.Test; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class TransactionalServiceIntegrationTest extends AbstractIntegrationTest { + + @Test + public void whenLockingAnEntry_thenItShouldBeInaccessible() throws InterruptedException { + Runnable backGroundJob = () -> transactionalService.startBackgroundBatch(); + Thread backgroundThread = new Thread(backGroundJob); + transactionalService.getQuickHowManyVisits(); + backgroundThread.start(); + Thread.sleep(100); // lets wait our thread warm up + + assertThat(timeThis(() -> transactionalService.getQuickHowManyVisits())).isGreaterThan(500).isLessThan(1000); + } + +} diff --git a/libraries-data-2/src/test/com/baeldung/measurement/WaterTankUnitTest.java b/libraries-data-2/src/test/com/baeldung/measurement/WaterTankUnitTest.java new file mode 100644 index 0000000000..e23eea1714 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/measurement/WaterTankUnitTest.java @@ -0,0 +1,86 @@ +package com.baeldung.measurement; + +import javax.measure.Quantity; +import javax.measure.quantity.Area; +import javax.measure.quantity.Length; +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Volume; + +import javax.measure.Unit; +import javax.measure.UnitConverter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +import com.baeldung.measurement.WaterTank; + +import tec.units.ri.format.SimpleUnitFormat; +import tec.units.ri.quantity.Quantities; +import tec.units.ri.unit.MetricPrefix; +import static tec.units.ri.unit.Units.*; + +public class WaterTankUnitTest { + + @Test + public void givenQuantity_whenGetUnitAndConvertValue_thenSuccess() { + WaterTank waterTank = new WaterTank(); + waterTank.setCapacityMeasure(Quantities.getQuantity(9.2, LITRE)); + assertEquals(LITRE, waterTank.getCapacityMeasure().getUnit()); + + Quantity waterCapacity = waterTank.getCapacityMeasure(); + double volumeInLitre = waterCapacity.getValue().doubleValue(); + assertEquals(9.2, volumeInLitre, 0.0f); + + double volumeInMilliLitre = waterCapacity.to(MetricPrefix.MILLI(LITRE)).getValue().doubleValue(); + assertEquals(9200.0, volumeInMilliLitre, 0.0f); + + // compilation error + // volumeInMilliLitre = waterCapacity.to(MetricPrefix.MILLI(KILOGRAM)); + + Unit Kilometer = MetricPrefix.KILO(METRE); + + // compilation error + // Unit Centimeter = MetricPrefix.CENTI(LITRE); + } + + @Test + public void givenUnit_whenAlternateUnit_ThenGetAlternateUnit() { + + Unit PASCAL = NEWTON.divide(METRE.pow(2)).alternate("Pa").asType(Pressure.class); + assertTrue(SimpleUnitFormat.getInstance().parse("Pa").equals(PASCAL)); + } + + @Test + public void givenUnit_whenProduct_ThenGetProductUnit() { + Unit squareMetre = METRE.multiply(METRE).asType(Area.class); + Quantity line = Quantities.getQuantity(2, METRE); + assertEquals(line.multiply(line).getUnit(), squareMetre); + } + + @Test + public void givenMeters_whenConvertToKilometer_ThenConverted() { + double distanceInMeters = 50.0; + UnitConverter metreToKilometre = METRE.getConverterTo(MetricPrefix.KILO(METRE)); + double distanceInKilometers = metreToKilometre.convert(distanceInMeters); + assertEquals(0.05, distanceInKilometers, 0.00f); + } + + @Test + public void givenSymbol_WhenCompareToSystemUnit_ThenSuccess() { + assertTrue(SimpleUnitFormat.getInstance().parse("kW").equals(MetricPrefix.KILO(WATT))); + assertTrue(SimpleUnitFormat.getInstance().parse("ms").equals(SECOND.divide(1000))); + } + + @Test + public void givenUnits_WhenAdd_ThenSuccess() { + Quantity total = Quantities.getQuantity(2, METRE).add(Quantities.getQuantity(3, METRE)); + assertEquals(total.getValue().intValue(), 5); + + // compilation error + // Quantity total = Quantities.getQuantity(2, METRE).add(Quantities.getQuantity(3, LITRE)); + + Quantity totalKm = Quantities.getQuantity(2, METRE).add(Quantities.getQuantity(3, MetricPrefix.KILO(METRE))); + assertEquals(totalKm.getValue().intValue(), 3002); + } +} diff --git a/libraries-data-2/src/test/com/baeldung/opencsv/OpenCsvIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/opencsv/OpenCsvIntegrationTest.java new file mode 100644 index 0000000000..fca96684ad --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/opencsv/OpenCsvIntegrationTest.java @@ -0,0 +1,66 @@ +package com.baeldung.opencsv; + +import com.baeldung.opencsv.helpers.Helpers; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class OpenCsvIntegrationTest { + + private Object testReadCsv(Object result) { + assert (result != null); + assert (result instanceof String); + assert (!((String) result).isEmpty()); + System.out.println(result); + return result; + } + + private Object testWriteCsv(Object result) { + assert (result instanceof String); + assert (!((String) result).isEmpty()); + return result; + } + + @Before + public void setup() { + } + + @Test + public void positionExampleTest() { + testReadCsv(Application.simpleSyncPositionBeanExample()); + } + + @Test + public void namedColumnExampleTest() { + testReadCsv(Application.namedSyncColumnBeanExample()); + } + + @Test + public void writeCsvUsingBeanBuilderTest() { + testWriteCsv(Application.writeSyncCsvFromBeanExample()); + } + + @Test + public void oneByOneExampleTest() { + testReadCsv(Application.oneByOneSyncExample()); + } + + @Test + public void readAllExampleTest() { + testReadCsv(Application.readAllSyncExample()); + } + + @Test + public void csvWriterOneByOneTest() { + testWriteCsv(Application.csvWriterSyncOneByOne()); + } + + @Test + public void csvWriterAllTest() { + testWriteCsv(Application.csvWriterSyncAll()); + } + + @After + public void close() { + } +} \ No newline at end of file diff --git a/libraries-data-2/src/test/com/baeldung/smooks/converter/SmooksIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/smooks/converter/SmooksIntegrationTest.java new file mode 100644 index 0000000000..df7fea58f8 --- /dev/null +++ b/libraries-data-2/src/test/com/baeldung/smooks/converter/SmooksIntegrationTest.java @@ -0,0 +1,60 @@ +package com.baeldung.smooks.converter; + +import com.baeldung.smooks.model.Item; +import com.baeldung.smooks.model.Order; +import com.baeldung.smooks.model.Status; +import com.baeldung.smooks.model.Supplier; +import org.junit.Test; +import org.milyn.validation.ValidationResult; +import java.text.SimpleDateFormat; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +public class SmooksIntegrationTest { + + private static final String EDIFACT_MESSAGE = "UNA:+.? '" + System.lineSeparator() + "UNH+771+IN_PROGRESS+2018-01-14'" + System.lineSeparator() + "CTA+CompanyX+1234567'" + System.lineSeparator() + "LIN+1+PX1234+9.99'" + System.lineSeparator() + + "LIN+2+RX990+120.32'" + System.lineSeparator(); + private static final String EMAIL_MESSAGE = "Hi," + System.lineSeparator() + "Order number #771 created on 2018-01-14 is currently in IN_PROGRESS status." + System.lineSeparator() + "Consider contact supplier \"CompanyX\" with phone number: \"1234567\"." + + System.lineSeparator() + "Order items:" + System.lineSeparator() + "1 X PX1234 (total price 9.99)" + System.lineSeparator() + "2 X RX990 (total price 240.64)" + System.lineSeparator(); + + @Test + public void givenOrderXML_whenConvert_thenPOJOsConstructedCorrectly() throws Exception { + + OrderConverter xmlToJavaOrderConverter = new OrderConverter(); + Order order = xmlToJavaOrderConverter.convertOrderXMLToOrderObject("/smooks/order.xml"); + + assertThat(order.getNumber(), is(771L)); + assertThat(order.getStatus(), is(Status.IN_PROGRESS)); + assertThat(order.getCreationDate(), is(new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-14"))); + assertThat(order.getSupplier(), is(new Supplier("CompanyX", "1234567"))); + assertThat(order.getItems(), containsInAnyOrder(new Item("PX1234", 9.99, 1), new Item("RX990", 120.32, 2))); + + } + + @Test + public void givenIncorrectOrderXML_whenValidate_thenExpectValidationErrors() throws Exception { + OrderValidator orderValidator = new OrderValidator(); + ValidationResult validationResult = orderValidator.validate("/smooks/order.xml"); + + assertThat(validationResult.getErrors(), hasSize(1)); + // 1234567 didn't match ^[0-9\\-\\+]{9,15}$ + assertThat(validationResult.getErrors() + .get(0) + .getFailRuleResult() + .getRuleName(), is("supplierPhone")); + } + + @Test + public void givenOrderXML_whenApplyEDITemplate_thenConvertedToEDIFACT() throws Exception { + OrderConverter orderConverter = new OrderConverter(); + String edifact = orderConverter.convertOrderXMLtoEDIFACT("/smooks/order.xml"); + assertThat(edifact, is(EDIFACT_MESSAGE)); + } + + @Test + public void givenOrderXML_whenApplyEmailTemplate_thenConvertedToEmailMessage() throws Exception { + OrderConverter orderConverter = new OrderConverter(); + String emailMessage = orderConverter.convertOrderXMLtoEmailMessage("/smooks/order.xml"); + assertThat(emailMessage, is(EMAIL_MESSAGE)); + } +} \ No newline at end of file From 2096feb825cb7205549807a8f2a1ffd24e287311 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 2 Aug 2019 16:29:20 +0100 Subject: [PATCH 18/43] remove live test change from this branch --- .../{ApplicationLiveTest.java => ApplicationIntegrationTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename twitter4j/src/test/java/com/baeldung/{ApplicationLiveTest.java => ApplicationIntegrationTest.java} (100%) diff --git a/twitter4j/src/test/java/com/baeldung/ApplicationLiveTest.java b/twitter4j/src/test/java/com/baeldung/ApplicationIntegrationTest.java similarity index 100% rename from twitter4j/src/test/java/com/baeldung/ApplicationLiveTest.java rename to twitter4j/src/test/java/com/baeldung/ApplicationIntegrationTest.java From 0f06cd46cae11eaf27f84c1e11cbd1c237c75d3b Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 2 Aug 2019 16:30:39 +0100 Subject: [PATCH 19/43] remove live test change from this branch --- .../src/test/java/com/baeldung/ApplicationIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/twitter4j/src/test/java/com/baeldung/ApplicationIntegrationTest.java b/twitter4j/src/test/java/com/baeldung/ApplicationIntegrationTest.java index 0d4114e72d..4696283faa 100644 --- a/twitter4j/src/test/java/com/baeldung/ApplicationIntegrationTest.java +++ b/twitter4j/src/test/java/com/baeldung/ApplicationIntegrationTest.java @@ -9,7 +9,7 @@ import org.junit.Test; import twitter4j.TwitterException; -public class ApplicationLiveTest { +public class ApplicationIntegrationTest { /** * In order run this jUnit test you need to configure your API details in the twitter4j.properties From e6a38aada17da71d2de8763f934af4aa83a5dfbd Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 3 Aug 2019 15:24:39 +0300 Subject: [PATCH 20/43] add scheduled async example --- .../scheduling/ScheduledFixedRateExample.java | 18 ++++++++++++++++++ .../SpringSchedulingFixedRateConfig.java | 12 ++++++++++++ ...heduledFixedRateExampleIntegrationTest.java | 17 +++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 spring-all/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java create mode 100644 spring-all/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java create mode 100644 spring-all/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java diff --git a/spring-all/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java b/spring-all/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java new file mode 100644 index 0000000000..8ccd2c773b --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java @@ -0,0 +1,18 @@ +package com.baeldung.scheduling; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@EnableAsync +public class ScheduledFixedRateExample { + @Async + @Scheduled(fixedRate = 1000) + public void scheduleFixedRateTaskAsync() throws InterruptedException { + System.out.println("Fixed rate task async - " + System.currentTimeMillis() / 1000); + Thread.sleep(2000); + } + +} diff --git a/spring-all/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java b/spring-all/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java new file mode 100644 index 0000000000..6000f75ec2 --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java @@ -0,0 +1,12 @@ +package com.baeldung.scheduling; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Configuration +@EnableScheduling +@ComponentScan("com.baeldung.scheduling") +public class SpringSchedulingFixedRateConfig { + +} \ No newline at end of file diff --git a/spring-all/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java b/spring-all/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java new file mode 100644 index 0000000000..ef7c7c68fd --- /dev/null +++ b/spring-all/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java @@ -0,0 +1,17 @@ +package com.baeldung.scheduling; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { SpringSchedulingFixedRateConfig.class }, loader = AnnotationConfigContextLoader.class) +public class ScheduledFixedRateExampleIntegrationTest { + + @Test + public void testScheduledFixedRateAnnotation() throws InterruptedException { + Thread.sleep(5000); + } +} From d45e50fa995ac298da4e0b5c294a6520cb0eea70 Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Sun, 4 Aug 2019 13:21:06 +0530 Subject: [PATCH 21/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- patterns/design-patterns-2/pom.xml | 13 +++++++++++++ .../java/com/baeldung/freebuilder}/Address.java | 2 +- .../java/com/baeldung/freebuilder/Employee.java | 2 -- .../com/baeldung/freebuilder/builder}/Employee.java | 2 +- .../freebuilder/EmployeeBuilderUnitTest.java | 10 ++++------ .../builder}/EmployeeBuilderUnitTest.java | 2 +- 6 files changed, 20 insertions(+), 11 deletions(-) rename {libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic => patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder}/Address.java (88%) rename {libraries-2 => patterns/design-patterns-2}/src/main/java/com/baeldung/freebuilder/Employee.java (92%) rename {libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic => patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder}/Employee.java (95%) rename {libraries-2 => patterns/design-patterns-2}/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java (99%) rename {libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic => patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder}/EmployeeBuilderUnitTest.java (91%) diff --git a/patterns/design-patterns-2/pom.xml b/patterns/design-patterns-2/pom.xml index 392035ab84..17afff87ae 100644 --- a/patterns/design-patterns-2/pom.xml +++ b/patterns/design-patterns-2/pom.xml @@ -30,6 +30,17 @@ org.apache.commons commons-lang3 ${commons-lang3.version} + + + org.inferred + freebuilder + ${freebuilder.version} + true + + + com.google.code.findbugs + jsr305 + ${javax.annotations.version} @@ -38,5 +49,7 @@ 1.8 1.8 16.0.2 + 2.4.1 + 3.0.2 diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java b/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java similarity index 88% rename from libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java rename to patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java index 8e53a9f155..6d727f6d9f 100644 --- a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Address.java +++ b/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java @@ -1,4 +1,4 @@ -package com.baeldung.freebuilder.builder.classic; +package com.baeldung.freebuilder; import org.inferred.freebuilder.FreeBuilder; diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java b/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java similarity index 92% rename from libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java rename to patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java index d486c18a06..06558dde0b 100644 --- a/libraries-2/src/main/java/com/baeldung/freebuilder/Employee.java +++ b/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java @@ -1,13 +1,11 @@ package com.baeldung.freebuilder; -import com.baeldung.freebuilder.builder.classic.Address; import org.inferred.freebuilder.FreeBuilder; import javax.annotation.Nullable; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.UnaryOperator; @FreeBuilder public interface Employee { diff --git a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java b/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java similarity index 95% rename from libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java rename to patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java index 6509676cb4..141d734c43 100644 --- a/libraries-2/src/main/java/com/baeldung/freebuilder/builder/classic/Employee.java +++ b/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.freebuilder.builder.classic; +package com.baeldung.freebuilder.builder; public class Employee { diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java similarity index 99% rename from libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java rename to patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java index 4427d3cb69..d28edfcf3d 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java +++ b/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java @@ -1,16 +1,14 @@ package com.baeldung.freebuilder; +import org.junit.jupiter.api.Test; + +import java.util.Optional; + import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Optional; - -import org.junit.jupiter.api.Test; - -import com.baeldung.freebuilder.builder.classic.Address; - public class EmployeeBuilderUnitTest { private static final int PIN_CODE = 223344; diff --git a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java b/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java similarity index 91% rename from libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java rename to patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java index e54a1dbd78..1394f851b6 100644 --- a/libraries-2/src/test/java/com/baeldung/freebuilder/builder/classic/EmployeeBuilderUnitTest.java +++ b/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.freebuilder.builder.classic; +package com.baeldung.freebuilder.builder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; From f1e0397dc072899ae360438431bba62fc7073346 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 4 Aug 2019 14:19:42 +0300 Subject: [PATCH 22/43] update links in readmes --- jenkins/README.md | 3 +- jenkins/hello-world/README.md | 3 + jhipster-5/README.md | 3 +- jhipster-5/bookstore-monolith/README.md | 180 +----------------- spring-cloud-data-flow/README.MD | 6 +- .../apache-spark-job/README.MD | 3 + spring-cloud-data-flow/batch-job/README.MD | 3 + spring-cloud-data-flow/pom.xml | 8 +- .../README.MD | 0 .../customer-mongodb-sink/pom.xml | 0 .../customermongodbsink/Customer.java | 0 .../customermongodbsink/CustomerListener.java | 0 .../CustomerMongodbSinkApplication.java | 0 .../CustomerRepository.java | 0 .../src/main/resources/application.properties | 0 .../customer-transform/pom.xml | 0 .../customer/customertransform/Customer.java | 0 .../CustomerProcessorConfiguration.java | 0 .../CustomerTransformApplication.java | 0 .../src/main/resources/application.properties | 0 .../pom.xml | 2 +- .../README.MD | 4 + .../data-flow-server/pom.xml | 0 .../cloud/DataFlowServerApplication.java | 0 .../src/main/resources/logback.xml | 0 .../SpringContextIntegrationTest.java | 0 .../java/org/baeldung/SpringContextTest.java | 0 ...aFlowServerApplicationIntegrationTest.java | 0 .../data-flow-shell/pom.xml | 0 .../data-flow-shell/spring-shell.log | 0 .../cloud/DataFlowShellApplication.java | 0 .../src/main/resources/logback.xml | 0 .../SpringContextIntegrationTest.java | 0 .../java/org/baeldung/SpringContextTest.java | 0 .../log-sink/pom.xml | 0 .../spring/cloud/LogSinkApplication.java | 0 .../log-sink/src/main/resources/logback.xml | 0 .../SpringContextIntegrationTest.java | 0 .../java/org/baeldung/SpringContextTest.java | 0 .../pom.xml | 23 +++ .../time-processor/pom.xml | 0 .../cloud/TimeProcessorApplication.java | 0 .../src/main/resources/logback.xml | 0 .../SpringContextIntegrationTest.java | 0 .../java/org/baeldung/SpringContextTest.java | 0 .../time-source/pom.xml | 0 .../spring/cloud/TimeSourceApplication.java | 0 .../src/main/resources/logback.xml | 0 .../SpringContextIntegrationTest.java | 0 .../java/org/baeldung/SpringContextTest.java | 0 testing-modules/README.md | 12 +- testing-modules/junit-5/README.md | 1 + testing-modules/mockito/README.md | 4 + testing-modules/rest-assured/README.md | 4 + testing-modules/testing/README.md | 1 + 55 files changed, 56 insertions(+), 204 deletions(-) create mode 100644 jenkins/hello-world/README.md create mode 100644 spring-cloud-data-flow/apache-spark-job/README.MD create mode 100644 spring-cloud-data-flow/batch-job/README.MD rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/README.MD (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-mongodb-sink/pom.xml (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/Customer.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerListener.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerMongodbSinkApplication.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerRepository.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-mongodb-sink/src/main/resources/application.properties (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-transform/pom.xml (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-transform/src/main/java/com/customer/customertransform/Customer.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-transform/src/main/java/com/customer/customertransform/CustomerProcessorConfiguration.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-transform/src/main/java/com/customer/customertransform/CustomerTransformApplication.java (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/customer-transform/src/main/resources/application.properties (100%) rename spring-cloud-data-flow/{etl => spring-cloud-data-flow-etl}/pom.xml (91%) create mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/README.MD rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-server/pom.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-server/src/main/resources/logback.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-shell/pom.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-shell/spring-shell.log (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-shell/src/main/resources/logback.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/data-flow-shell/src/test/java/org/baeldung/SpringContextTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/log-sink/pom.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/log-sink/src/main/resources/logback.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/log-sink/src/test/java/org/baeldung/SpringContextIntegrationTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/log-sink/src/test/java/org/baeldung/SpringContextTest.java (100%) create mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-processor/pom.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-processor/src/main/resources/logback.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-processor/src/test/java/org/baeldung/SpringContextIntegrationTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-processor/src/test/java/org/baeldung/SpringContextTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-source/pom.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-source/src/main/resources/logback.xml (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-source/src/test/java/org/baeldung/SpringContextIntegrationTest.java (100%) rename spring-cloud-data-flow/{ => spring-cloud-data-flow-stream-processing}/time-source/src/test/java/org/baeldung/SpringContextTest.java (100%) diff --git a/jenkins/README.md b/jenkins/README.md index da60e556df..6b28b61277 100644 --- a/jenkins/README.md +++ b/jenkins/README.md @@ -1,3 +1,2 @@ -## Relevant articles: -- [Writing a Jenkins Plugin](http://www.baeldung.com/jenkins-custom-plugin) +This is an aggregator modules for Jenkins-related modules. diff --git a/jenkins/hello-world/README.md b/jenkins/hello-world/README.md new file mode 100644 index 0000000000..da60e556df --- /dev/null +++ b/jenkins/hello-world/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Writing a Jenkins Plugin](http://www.baeldung.com/jenkins-custom-plugin) diff --git a/jhipster-5/README.md b/jhipster-5/README.md index 0537f5b1a5..2731281b3e 100644 --- a/jhipster-5/README.md +++ b/jhipster-5/README.md @@ -1,3 +1,2 @@ -## Relevant articles: -- [Creating New APIs and Views in JHipster](https://www.baeldung.com/jhipster-new-apis-and-views) +This is an aggregator module for JHipster 5 modules. diff --git a/jhipster-5/bookstore-monolith/README.md b/jhipster-5/bookstore-monolith/README.md index 1387b82163..0537f5b1a5 100644 --- a/jhipster-5/bookstore-monolith/README.md +++ b/jhipster-5/bookstore-monolith/README.md @@ -1,179 +1,3 @@ -# Bookstore +## Relevant articles: -This application was generated using JHipster 5.8.2, you can find documentation and help at [https://www.jhipster.tech/documentation-archive/v5.8.2](https://www.jhipster.tech/documentation-archive/v5.8.2). - -## Development - -Before you can build this project, you must install and configure the following dependencies on your machine: - -1. [Node.js][]: We use Node to run a development web server and build the project. - Depending on your system, you can install Node either from source or as a pre-packaged bundle. - -After installing Node, you should be able to run the following command to install development tools. -You will only need to run this command when dependencies change in [package.json](package.json). - - npm install - -We use npm scripts and [Webpack][] as our build system. - -Run the following commands in two separate terminals to create a blissful development experience where your browser -auto-refreshes when files change on your hard drive. - - ./mvnw - npm start - -Npm is also used to manage CSS and JavaScript dependencies used in this application. You can upgrade dependencies by -specifying a newer version in [package.json](package.json). You can also run `npm update` and `npm install` to manage dependencies. -Add the `help` flag on any command to see how you can use it. For example, `npm help update`. - -The `npm run` command will list all of the scripts available to run for this project. - -### Service workers - -Service workers are commented by default, to enable them please uncomment the following code. - -- The service worker registering script in index.html - -```html - -``` - -Note: workbox creates the respective service worker and dynamically generate the `service-worker.js` - -### Managing dependencies - -For example, to add [Leaflet][] library as a runtime dependency of your application, you would run following command: - - npm install --save --save-exact leaflet - -To benefit from TypeScript type definitions from [DefinitelyTyped][] repository in development, you would run following command: - - npm install --save-dev --save-exact @types/leaflet - -Then you would import the JS and CSS files specified in library's installation instructions so that [Webpack][] knows about them: -Edit [src/main/webapp/app/vendor.ts](src/main/webapp/app/vendor.ts) file: - -``` -import 'leaflet/dist/leaflet.js'; -``` - -Edit [src/main/webapp/content/css/vendor.css](src/main/webapp/content/css/vendor.css) file: - -``` -@import '~leaflet/dist/leaflet.css'; -``` - -Note: there are still few other things remaining to do for Leaflet that we won't detail here. - -For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][]. - -### Using angular-cli - -You can also use [Angular CLI][] to generate some custom client code. - -For example, the following command: - - ng generate component my-component - -will generate few files: - - create src/main/webapp/app/my-component/my-component.component.html - create src/main/webapp/app/my-component/my-component.component.ts - update src/main/webapp/app/app.module.ts - -## Building for production - -To optimize the Bookstore application for production, run: - - ./mvnw -Pprod clean package - -This will concatenate and minify the client CSS and JavaScript files. It will also modify `index.html` so it references these new files. -To ensure everything worked, run: - - java -jar target/*.war - -Then navigate to [http://localhost:8080](http://localhost:8080) in your browser. - -Refer to [Using JHipster in production][] for more details. - -## Testing - -To launch your application's tests, run: - - ./mvnw clean test - -### Client tests - -Unit tests are run by [Jest][] and written with [Jasmine][]. They're located in [src/test/javascript/](src/test/javascript/) and can be run with: - - npm test - -For more information, refer to the [Running tests page][]. - -### Code quality - -Sonar is used to analyse code quality. You can start a local Sonar server (accessible on http://localhost:9001) with: - -``` -docker-compose -f src/main/docker/sonar.yml up -d -``` - -Then, run a Sonar analysis: - -``` -./mvnw -Pprod clean test sonar:sonar -``` - -For more information, refer to the [Code quality page][]. - -## Using Docker to simplify development (optional) - -You can use Docker to improve your JHipster development experience. A number of docker-compose configuration are available in the [src/main/docker](src/main/docker) folder to launch required third party services. - -For example, to start a mysql database in a docker container, run: - - docker-compose -f src/main/docker/mysql.yml up -d - -To stop it and remove the container, run: - - docker-compose -f src/main/docker/mysql.yml down - -You can also fully dockerize your application and all the services that it depends on. -To achieve this, first build a docker image of your app by running: - - ./mvnw package -Pprod verify jib:dockerBuild - -Then run: - - docker-compose -f src/main/docker/app.yml up -d - -For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`jhipster docker-compose`), which is able to generate docker configurations for one or several JHipster applications. - -## Continuous Integration (optional) - -To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`), this will let you generate configuration files for a number of Continuous Integration systems. Consult the [Setting up Continuous Integration][] page for more information. - -[jhipster homepage and latest documentation]: https://www.jhipster.tech -[jhipster 5.8.2 archive]: https://www.jhipster.tech/documentation-archive/v5.8.2 -[using jhipster in development]: https://www.jhipster.tech/documentation-archive/v5.8.2/development/ -[using docker and docker-compose]: https://www.jhipster.tech/documentation-archive/v5.8.2/docker-compose -[using jhipster in production]: https://www.jhipster.tech/documentation-archive/v5.8.2/production/ -[running tests page]: https://www.jhipster.tech/documentation-archive/v5.8.2/running-tests/ -[code quality page]: https://www.jhipster.tech/documentation-archive/v5.8.2/code-quality/ -[setting up continuous integration]: https://www.jhipster.tech/documentation-archive/v5.8.2/setting-up-ci/ -[node.js]: https://nodejs.org/ -[yarn]: https://yarnpkg.org/ -[webpack]: https://webpack.github.io/ -[angular cli]: https://cli.angular.io/ -[browsersync]: http://www.browsersync.io/ -[jest]: https://facebook.github.io/jest/ -[jasmine]: http://jasmine.github.io/2.0/introduction.html -[protractor]: https://angular.github.io/protractor/ -[leaflet]: http://leafletjs.com/ -[definitelytyped]: http://definitelytyped.org/ +- [Creating New APIs and Views in JHipster](https://www.baeldung.com/jhipster-new-apis-and-views) diff --git a/spring-cloud-data-flow/README.MD b/spring-cloud-data-flow/README.MD index 9e5cef19af..f2ab96de2c 100644 --- a/spring-cloud-data-flow/README.MD +++ b/spring-cloud-data-flow/README.MD @@ -1,4 +1,2 @@ -### Relevant Articles: -- [Batch Processing with Spring Cloud Data Flow](http://www.baeldung.com/spring-cloud-data-flow-batch-processing) -- [Getting Started with Stream Processing with Spring Cloud Data Flow](http://www.baeldung.com/spring-cloud-data-flow-stream-processing) -- [Spring Cloud Data Flow With Apache Spark](https://www.baeldung.com/spring-cloud-data-flow-spark) + +This is an aggregator module for Spring Cloud Data Flow modules. diff --git a/spring-cloud-data-flow/apache-spark-job/README.MD b/spring-cloud-data-flow/apache-spark-job/README.MD new file mode 100644 index 0000000000..ac554f10bc --- /dev/null +++ b/spring-cloud-data-flow/apache-spark-job/README.MD @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring Cloud Data Flow With Apache Spark](https://www.baeldung.com/spring-cloud-data-flow-spark) diff --git a/spring-cloud-data-flow/batch-job/README.MD b/spring-cloud-data-flow/batch-job/README.MD new file mode 100644 index 0000000000..898f85dbb2 --- /dev/null +++ b/spring-cloud-data-flow/batch-job/README.MD @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Batch Processing with Spring Cloud Data Flow](http://www.baeldung.com/spring-cloud-data-flow-batch-processing) + diff --git a/spring-cloud-data-flow/pom.xml b/spring-cloud-data-flow/pom.xml index 36a780c28d..f3382067f9 100644 --- a/spring-cloud-data-flow/pom.xml +++ b/spring-cloud-data-flow/pom.xml @@ -13,13 +13,9 @@ - data-flow-server - - time-source - time-processor - log-sink + spring-cloud-data-flow-stream + spring-cloud-data-flow-etl batch-job - etl apache-spark-job diff --git a/spring-cloud-data-flow/etl/README.MD b/spring-cloud-data-flow/spring-cloud-data-flow-etl/README.MD similarity index 100% rename from spring-cloud-data-flow/etl/README.MD rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/README.MD diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/pom.xml similarity index 100% rename from spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/pom.xml diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/Customer.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/Customer.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/Customer.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/Customer.java diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerListener.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerListener.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerListener.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerListener.java diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerMongodbSinkApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerMongodbSinkApplication.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerMongodbSinkApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerMongodbSinkApplication.java diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerRepository.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerRepository.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerRepository.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/java/com/customer/customermongodbsink/CustomerRepository.java diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/resources/application.properties similarity index 100% rename from spring-cloud-data-flow/etl/customer-mongodb-sink/src/main/resources/application.properties rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-mongodb-sink/src/main/resources/application.properties diff --git a/spring-cloud-data-flow/etl/customer-transform/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/pom.xml similarity index 100% rename from spring-cloud-data-flow/etl/customer-transform/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/pom.xml diff --git a/spring-cloud-data-flow/etl/customer-transform/src/main/java/com/customer/customertransform/Customer.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/java/com/customer/customertransform/Customer.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-transform/src/main/java/com/customer/customertransform/Customer.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/java/com/customer/customertransform/Customer.java diff --git a/spring-cloud-data-flow/etl/customer-transform/src/main/java/com/customer/customertransform/CustomerProcessorConfiguration.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/java/com/customer/customertransform/CustomerProcessorConfiguration.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-transform/src/main/java/com/customer/customertransform/CustomerProcessorConfiguration.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/java/com/customer/customertransform/CustomerProcessorConfiguration.java diff --git a/spring-cloud-data-flow/etl/customer-transform/src/main/java/com/customer/customertransform/CustomerTransformApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/java/com/customer/customertransform/CustomerTransformApplication.java similarity index 100% rename from spring-cloud-data-flow/etl/customer-transform/src/main/java/com/customer/customertransform/CustomerTransformApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/java/com/customer/customertransform/CustomerTransformApplication.java diff --git a/spring-cloud-data-flow/etl/customer-transform/src/main/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/resources/application.properties similarity index 100% rename from spring-cloud-data-flow/etl/customer-transform/src/main/resources/application.properties rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/customer-transform/src/main/resources/application.properties diff --git a/spring-cloud-data-flow/etl/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml similarity index 91% rename from spring-cloud-data-flow/etl/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml index 55b2f34289..ab34271273 100644 --- a/spring-cloud-data-flow/etl/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml @@ -1,7 +1,7 @@ 4.0.0 - etl + spring-cloud-data-flow-etl 0.0.1-SNAPSHOT etl pom diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/README.MD b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/README.MD new file mode 100644 index 0000000000..522c43252f --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/README.MD @@ -0,0 +1,4 @@ +### Relevant Articles: + +- [Getting Started with Stream Processing with Spring Cloud Data Flow](http://www.baeldung.com/spring-cloud-data-flow-stream-processing) + diff --git a/spring-cloud-data-flow/data-flow-server/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml similarity index 100% rename from spring-cloud-data-flow/data-flow-server/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml diff --git a/spring-cloud-data-flow/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java similarity index 100% rename from spring-cloud-data-flow/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java diff --git a/spring-cloud-data-flow/data-flow-server/src/main/resources/logback.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-data-flow/data-flow-server/src/main/resources/logback.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/logback.xml diff --git a/spring-cloud-data-flow/data-flow-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-cloud-data-flow/data-flow-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud-data-flow/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-data-flow/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud-data-flow/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java similarity index 100% rename from spring-cloud-data-flow/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java diff --git a/spring-cloud-data-flow/data-flow-shell/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml similarity index 100% rename from spring-cloud-data-flow/data-flow-shell/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml diff --git a/spring-cloud-data-flow/data-flow-shell/spring-shell.log b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/spring-shell.log similarity index 100% rename from spring-cloud-data-flow/data-flow-shell/spring-shell.log rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/spring-shell.log diff --git a/spring-cloud-data-flow/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java similarity index 100% rename from spring-cloud-data-flow/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java diff --git a/spring-cloud-data-flow/data-flow-shell/src/main/resources/logback.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-data-flow/data-flow-shell/src/main/resources/logback.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/resources/logback.xml diff --git a/spring-cloud-data-flow/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-cloud-data-flow/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud-data-flow/data-flow-shell/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-data-flow/data-flow-shell/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud-data-flow/log-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml similarity index 100% rename from spring-cloud-data-flow/log-sink/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml diff --git a/spring-cloud-data-flow/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java similarity index 100% rename from spring-cloud-data-flow/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java diff --git a/spring-cloud-data-flow/log-sink/src/main/resources/logback.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-data-flow/log-sink/src/main/resources/logback.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/resources/logback.xml diff --git a/spring-cloud-data-flow/log-sink/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-cloud-data-flow/log-sink/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud-data-flow/log-sink/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-data-flow/log-sink/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml new file mode 100644 index 0000000000..e5c6830393 --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + spring-cloud-data-flow-stream + 0.0.1-SNAPSHOT + spring-cloud-data-flow-stream + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + data-flow-server + data-flow-shell + time-source + time-processor + log-sink + + + diff --git a/spring-cloud-data-flow/time-processor/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml similarity index 100% rename from spring-cloud-data-flow/time-processor/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml diff --git a/spring-cloud-data-flow/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java similarity index 100% rename from spring-cloud-data-flow/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java diff --git a/spring-cloud-data-flow/time-processor/src/main/resources/logback.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-data-flow/time-processor/src/main/resources/logback.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/resources/logback.xml diff --git a/spring-cloud-data-flow/time-processor/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-cloud-data-flow/time-processor/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud-data-flow/time-processor/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-data-flow/time-processor/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud-data-flow/time-source/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml similarity index 100% rename from spring-cloud-data-flow/time-source/pom.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml diff --git a/spring-cloud-data-flow/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java similarity index 100% rename from spring-cloud-data-flow/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java diff --git a/spring-cloud-data-flow/time-source/src/main/resources/logback.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-data-flow/time-source/src/main/resources/logback.xml rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/resources/logback.xml diff --git a/spring-cloud-data-flow/time-source/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-cloud-data-flow/time-source/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud-data-flow/time-source/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-data-flow/time-source/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextTest.java diff --git a/testing-modules/README.md b/testing-modules/README.md index b269f547ec..d534e5cea6 100644 --- a/testing-modules/README.md +++ b/testing-modules/README.md @@ -1,15 +1,5 @@ ## Testing Modules -### Relevant Articles: +This is a aggregator module containing several modules focused on testing libraries. -- [Quick Guide to BDDMockito](http://www.baeldung.com/bdd-mockito) -- [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) -- [Using Hamcrest Number Matchers](http://www.baeldung.com/hamcrest-number-matchers) -- [Assertions in JUnit 4 and JUnit 5](http://www.baeldung.com/junit-assertions) -- [REST-assured with Groovy](http://www.baeldung.com/rest-assured-groovy) -- [Hamcrest Bean Matchers](http://www.baeldung.com/hamcrest-bean-matchers) -- [Hamcrest Object Matchers](http://www.baeldung.com/hamcrest-object-matchers) -- [Headers, Cookies and Parameters with REST-assured](http://www.baeldung.com/rest-assured-header-cookie-parameter) -- [JSON Schema Validation with REST-assured](http://www.baeldung.com/rest-assured-json-schema) -- [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md index d543b9b09b..14e018a5f9 100644 --- a/testing-modules/junit-5/README.md +++ b/testing-modules/junit-5/README.md @@ -11,3 +11,4 @@ - [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng) - [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) - [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution) +- [Assertions in JUnit 4 and JUnit 5](http://www.baeldung.com/junit-assertions) diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 59954784f9..8fe57016e3 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -18,3 +18,7 @@ - [Hamcrest Common Core Matchers](http://www.baeldung.com/hamcrest-core-matchers) - [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) - [Using Hamcrest Number Matchers](https://www.baeldung.com/hamcrest-number-matchers) +- [Quick Guide to BDDMockito](http://www.baeldung.com/bdd-mockito) +- [Hamcrest Bean Matchers](http://www.baeldung.com/hamcrest-bean-matchers) +- [Hamcrest Object Matchers](http://www.baeldung.com/hamcrest-object-matchers) +- [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) diff --git a/testing-modules/rest-assured/README.md b/testing-modules/rest-assured/README.md index ec108353a0..0012a63012 100644 --- a/testing-modules/rest-assured/README.md +++ b/testing-modules/rest-assured/README.md @@ -3,3 +3,7 @@ - [REST-assured Support for Spring MockMvc](https://www.baeldung.com/spring-mock-mvc-rest-assured) - [Getting and Verifying Response Data with REST-assured](https://www.baeldung.com/rest-assured-response) - [REST Assured Authentication](https://www.baeldung.com/rest-assured-authentication) +- [REST-assured with Groovy](http://www.baeldung.com/rest-assured-groovy) +- [Headers, Cookies and Parameters with REST-assured](http://www.baeldung.com/rest-assured-header-cookie-parameter) +- [JSON Schema Validation with REST-assured](http://www.baeldung.com/rest-assured-json-schema) + diff --git a/testing-modules/testing/README.md b/testing-modules/testing/README.md index 4a7829e867..135ef1054a 100644 --- a/testing-modules/testing/README.md +++ b/testing-modules/testing/README.md @@ -21,3 +21,4 @@ - [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions) - [A Guide to JavaFaker](https://www.baeldung.com/java-faker) - [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) +- [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) From 2a4adf293579f3d8a9b13e18a6a95cda69c75fb7 Mon Sep 17 00:00:00 2001 From: glopez Date: Sun, 4 Aug 2019 21:39:46 -0300 Subject: [PATCH 23/43] BAEL-2804 JPA Query Parameters Usage - formatting issues fixed I fixed some formatting issues as requested since the eclipse formatter does not support 4 spaces for blocks a 2 for continuations hence it has to be resolved manually. Additionally I've applied formatting to the logback.xml file. --- .../java-jpa-2/src/main/resources/logback.xml | 19 ++++++++++--------- .../queryparams/JPAQueryParamsUnitTest.java | 14 +++++++------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/persistence-modules/java-jpa-2/src/main/resources/logback.xml b/persistence-modules/java-jpa-2/src/main/resources/logback.xml index 7d900d8ea8..e0098e7c7e 100644 --- a/persistence-modules/java-jpa-2/src/main/resources/logback.xml +++ b/persistence-modules/java-jpa-2/src/main/resources/logback.xml @@ -1,13 +1,14 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + - - - + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java index 4f320935cf..55ee0e6e59 100644 --- a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java +++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/queryparams/JPAQueryParamsUnitTest.java @@ -36,7 +36,7 @@ public class JPAQueryParamsUnitTest { TypedQuery query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.empNumber = ?1", Employee.class); String empNumber = "A123"; Employee employee = query.setParameter(1, empNumber) - .getSingleResult(); + .getSingleResult(); Assert.assertNotNull("Employee not found", employee); } @@ -45,7 +45,7 @@ public class JPAQueryParamsUnitTest { TypedQuery query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.empNumber IN (?1)", Employee.class); List empNumbers = Arrays.asList("A123", "A124"); List employees = query.setParameter(1, empNumbers) - .getResultList(); + .getResultList(); Assert.assertNotNull("Employees not found", employees); Assert.assertFalse("Employees not found", employees.isEmpty()); } @@ -55,7 +55,7 @@ public class JPAQueryParamsUnitTest { TypedQuery query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.empNumber = :number", Employee.class); String empNumber = "A123"; Employee employee = query.setParameter("number", empNumber) - .getSingleResult(); + .getSingleResult(); Assert.assertNotNull("Employee not found", employee); } @@ -64,7 +64,7 @@ public class JPAQueryParamsUnitTest { TypedQuery query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.empNumber IN (:numbers)", Employee.class); List empNumbers = Arrays.asList("A123", "A124"); List employees = query.setParameter("numbers", empNumbers) - .getResultList(); + .getResultList(); Assert.assertNotNull("Employees not found", employees); Assert.assertFalse("Employees not found", employees.isEmpty()); } @@ -75,8 +75,8 @@ public class JPAQueryParamsUnitTest { String empName = "John Doe"; int empAge = 55; List employees = query.setParameter("name", empName) - .setParameter("empAge", empAge) - .getResultList(); + .setParameter("empAge", empAge) + .getResultList(); Assert.assertNotNull("Employees not found!", employees); Assert.assertTrue("Employees not found!", !employees.isEmpty()); } @@ -89,7 +89,7 @@ public class JPAQueryParamsUnitTest { Root c = cQuery.from(Employee.class); ParameterExpression paramEmpNumber = cb.parameter(String.class); cQuery.select(c) - .where(cb.equal(c.get(Employee_.empNumber), paramEmpNumber)); + .where(cb.equal(c.get(Employee_.empNumber), paramEmpNumber)); TypedQuery query = entityManager.createQuery(cQuery); String empNumber = "A123"; From c366657efab882eeb24e7a6823a3ad40172d3b77 Mon Sep 17 00:00:00 2001 From: fejera Date: Mon, 5 Aug 2019 11:34:56 +0200 Subject: [PATCH 24/43] BAEL-16622 - updating intellij formatting rules --- intelliJ/intelliJ-formatter.xml | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/intelliJ/intelliJ-formatter.xml b/intelliJ/intelliJ-formatter.xml index 6dd1ae67f3..9b1d12a3be 100644 --- a/intelliJ/intelliJ-formatter.xml +++ b/intelliJ/intelliJ-formatter.xml @@ -1,19 +1,15 @@ - + \ No newline at end of file From 4dbeacad35ae759259271888d80c4a8e6a445703 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Mon, 5 Aug 2019 16:50:34 +0100 Subject: [PATCH 25/43] [BAEL-16003] renamed artifactId. Removed specified articles from libraries module. Added smooks + google sheets resources into libraries-data-2. Tidied up libraries pom, removing unused dependencies. --- libraries-data-2/pom.xml | 4 +- .../com/baeldung/docx/Docx4jExample.java | 0 .../com/baeldung/flink/FlinkDataPipeline.java | 0 .../com/baeldung/flink/LineSplitter.java | 0 .../com/baeldung/flink/WordCount.java | 0 .../baeldung/flink/connector/Consumers.java | 0 .../baeldung/flink/connector/Producers.java | 0 .../com/baeldung/flink/model/Backup.java | 0 .../baeldung/flink/model/InputMessage.java | 0 .../flink/operator/BackupAggregator.java | 0 .../InputMessageTimestampAssigner.java | 0 .../flink/operator/WordsCapitalizer.java | 0 .../schema/BackupSerializationSchema.java | 0 .../InputMessageDeserializationSchema.java | 0 .../google/sheets/GoogleAuthorizeUtil.java | 0 .../google/sheets/SheetsServiceUtil.java | 0 .../infinispan/CacheConfiguration.java | 0 .../infinispan/listener/CacheListener.java | 0 .../repository/HelloWorldRepository.java | 0 .../infinispan/service/HelloWorldService.java | 0 .../service/TransactionalService.java | 0 .../com/baeldung/measurement/WaterTank.java | 0 .../com/baeldung/opencsv/Application.java | 0 .../com/baeldung/opencsv/Constants.java | 0 .../com/baeldung/opencsv/beans/CsvBean.java | 0 .../opencsv/beans/NamedColumnBean.java | 0 .../opencsv/beans/SimplePositionBean.java | 0 .../opencsv/beans/WriteExampleBean.java | 0 .../opencsv/examples/sync/BeanExamples.java | 0 .../examples/sync/CsvReaderExamples.java | 0 .../examples/sync/CsvWriterExamples.java | 0 .../com/baeldung/opencsv/helpers/Helpers.java | 0 .../baeldung/opencsv/pojos/CsvTransfer.java | 0 .../smooks/converter/OrderConverter.java | 0 .../smooks/converter/OrderValidator.java | 0 .../com/baeldung/smooks/model/Item.java | 0 .../com/baeldung/smooks/model/Order.java | 0 .../com/baeldung/smooks/model/Status.java | 0 .../com/baeldung/smooks/model/Supplier.java | 0 .../google-sheets-client-secret.json | 0 .../src/main/resources/smooks/email.ftl | 0 .../src/main/resources/smooks/item-rules.csv | 0 .../src/main/resources/smooks/order.ftl | 0 .../src/main/resources/smooks/order.json | 0 .../src/main/resources/smooks/order.xml | 0 .../main/resources/smooks/smooks-mapping.xml | 0 .../resources/smooks/smooks-transform-edi.xml | 0 .../smooks/smooks-transform-email.xml | 0 .../resources/smooks/smooks-validation.xml | 0 .../main/resources/smooks/supplier.properties | 0 .../com/baeldung/flink/FlinkDataPipeline.java | 82 --------- .../java/com/baeldung/flink/LineSplitter.java | 18 -- .../java/com/baeldung/flink/WordCount.java | 18 -- .../baeldung/flink/connector/Consumers.java | 32 ---- .../baeldung/flink/connector/Producers.java | 17 -- .../java/com/baeldung/flink/model/Backup.java | 27 --- .../baeldung/flink/model/InputMessage.java | 71 -------- .../flink/operator/BackupAggregator.java | 34 ---- .../InputMessageTimestampAssigner.java | 23 --- .../flink/operator/WordsCapitalizer.java | 11 -- .../schema/BackupSerializationSchema.java | 33 ---- .../InputMessageDeserializationSchema.java | 32 ---- .../flink/BackupCreatorIntegrationTest.java | 104 ----------- .../flink/WordCapitalizerIntegrationTest.java | 34 ---- .../flink/WordCountIntegrationTest.java | 161 ------------------ libraries/pom.xml | 55 ------ .../google/sheets/GoogleAuthorizeUtil.java | 34 ---- .../google/sheets/SheetsServiceUtil.java | 20 --- .../infinispan/CacheConfiguration.java | 70 -------- .../infinispan/listener/CacheListener.java | 53 ------ .../repository/HelloWorldRepository.java | 15 -- .../infinispan/service/HelloWorldService.java | 77 --------- .../service/TransactionalService.java | 55 ------ .../com/baeldung/measurement/WaterTank.java | 26 --- .../com/baeldung/opencsv/Application.java | 108 ------------ .../java/com/baeldung/opencsv/Constants.java | 17 -- .../com/baeldung/opencsv/beans/CsvBean.java | 3 - .../opencsv/beans/NamedColumnBean.java | 31 ---- .../opencsv/beans/SimplePositionBean.java | 29 ---- .../opencsv/beans/WriteExampleBean.java | 40 ----- .../opencsv/examples/sync/BeanExamples.java | 63 ------- .../examples/sync/CsvReaderExamples.java | 63 ------- .../examples/sync/CsvWriterExamples.java | 35 ---- .../com/baeldung/opencsv/helpers/Helpers.java | 108 ------------ .../baeldung/opencsv/pojos/CsvTransfer.java | 38 ----- .../smooks/converter/OrderConverter.java | 44 ----- .../smooks/converter/OrderValidator.java | 27 --- .../java/com/baeldung/smooks/model/Item.java | 70 -------- .../java/com/baeldung/smooks/model/Order.java | 52 ------ .../com/baeldung/smooks/model/Status.java | 5 - .../com/baeldung/smooks/model/Supplier.java | 52 ------ .../java/com/baeldung/crdt/CRDTUnitTest.java | 149 ---------------- .../google/sheets/GoogleSheetsLiveTest.java | 96 ----------- .../hll/HLLLongRunningManualTest.java | 59 ------- .../infinispan/AbstractIntegrationTest.java | 57 ------- .../HelloWorldServiceTemporaryLiveTest.java | 51 ------ .../TransactionalServiceIntegrationTest.java | 21 --- .../measurement/WaterTankUnitTest.java | 86 ---------- .../opencsv/OpenCsvIntegrationTest.java | 66 ------- .../converter/SmooksIntegrationTest.java | 60 ------- 100 files changed, 2 insertions(+), 2534 deletions(-) rename libraries-data-2/src/main/{ => java}/com/baeldung/docx/Docx4jExample.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/FlinkDataPipeline.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/LineSplitter.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/WordCount.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/connector/Consumers.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/connector/Producers.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/model/Backup.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/model/InputMessage.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/operator/BackupAggregator.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/operator/InputMessageTimestampAssigner.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/operator/WordsCapitalizer.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/schema/BackupSerializationSchema.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/flink/schema/InputMessageDeserializationSchema.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/google/sheets/GoogleAuthorizeUtil.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/google/sheets/SheetsServiceUtil.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/infinispan/CacheConfiguration.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/infinispan/listener/CacheListener.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/infinispan/repository/HelloWorldRepository.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/infinispan/service/HelloWorldService.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/infinispan/service/TransactionalService.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/measurement/WaterTank.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/Application.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/Constants.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/beans/CsvBean.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/beans/NamedColumnBean.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/beans/SimplePositionBean.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/beans/WriteExampleBean.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/examples/sync/BeanExamples.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/helpers/Helpers.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/opencsv/pojos/CsvTransfer.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/smooks/converter/OrderConverter.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/smooks/converter/OrderValidator.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/smooks/model/Item.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/smooks/model/Order.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/smooks/model/Status.java (100%) rename libraries-data-2/src/main/{ => java}/com/baeldung/smooks/model/Supplier.java (100%) rename {libraries => libraries-data-2}/src/main/resources/google-sheets-client-secret.json (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/email.ftl (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/item-rules.csv (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/order.ftl (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/order.json (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/order.xml (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/smooks-mapping.xml (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/smooks-transform-edi.xml (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/smooks-transform-email.xml (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/smooks-validation.xml (100%) rename {libraries => libraries-data-2}/src/main/resources/smooks/supplier.properties (100%) delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/FlinkDataPipeline.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/LineSplitter.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/WordCount.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/connector/Consumers.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/connector/Producers.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/model/Backup.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/model/InputMessage.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/operator/BackupAggregator.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java delete mode 100644 libraries-data/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java delete mode 100644 libraries-data/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java delete mode 100644 libraries-data/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java delete mode 100644 libraries-data/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java delete mode 100644 libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java delete mode 100644 libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java delete mode 100644 libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java delete mode 100644 libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java delete mode 100644 libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java delete mode 100644 libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java delete mode 100644 libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java delete mode 100644 libraries/src/main/java/com/baeldung/measurement/WaterTank.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/Application.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/Constants.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/beans/CsvBean.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/beans/NamedColumnBean.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/beans/SimplePositionBean.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/beans/WriteExampleBean.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/examples/sync/BeanExamples.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/helpers/Helpers.java delete mode 100644 libraries/src/main/java/com/baeldung/opencsv/pojos/CsvTransfer.java delete mode 100644 libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java delete mode 100644 libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java delete mode 100644 libraries/src/main/java/com/baeldung/smooks/model/Item.java delete mode 100644 libraries/src/main/java/com/baeldung/smooks/model/Order.java delete mode 100644 libraries/src/main/java/com/baeldung/smooks/model/Status.java delete mode 100644 libraries/src/main/java/com/baeldung/smooks/model/Supplier.java delete mode 100644 libraries/src/test/java/com/baeldung/crdt/CRDTUnitTest.java delete mode 100644 libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java delete mode 100644 libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java delete mode 100644 libraries/src/test/java/com/baeldung/infinispan/AbstractIntegrationTest.java delete mode 100644 libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java delete mode 100644 libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java delete mode 100644 libraries/src/test/java/com/baeldung/measurement/WaterTankUnitTest.java delete mode 100644 libraries/src/test/java/com/baeldung/opencsv/OpenCsvIntegrationTest.java delete mode 100644 libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index 97820859ba..5570761d91 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - libraries-http - libraries-http + libraries-data-2 + libraries-data-2 com.baeldung diff --git a/libraries-data-2/src/main/com/baeldung/docx/Docx4jExample.java b/libraries-data-2/src/main/java/com/baeldung/docx/Docx4jExample.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/docx/Docx4jExample.java rename to libraries-data-2/src/main/java/com/baeldung/docx/Docx4jExample.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/FlinkDataPipeline.java b/libraries-data-2/src/main/java/com/baeldung/flink/FlinkDataPipeline.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/FlinkDataPipeline.java rename to libraries-data-2/src/main/java/com/baeldung/flink/FlinkDataPipeline.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/LineSplitter.java b/libraries-data-2/src/main/java/com/baeldung/flink/LineSplitter.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/LineSplitter.java rename to libraries-data-2/src/main/java/com/baeldung/flink/LineSplitter.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/WordCount.java b/libraries-data-2/src/main/java/com/baeldung/flink/WordCount.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/WordCount.java rename to libraries-data-2/src/main/java/com/baeldung/flink/WordCount.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/connector/Consumers.java b/libraries-data-2/src/main/java/com/baeldung/flink/connector/Consumers.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/connector/Consumers.java rename to libraries-data-2/src/main/java/com/baeldung/flink/connector/Consumers.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/connector/Producers.java b/libraries-data-2/src/main/java/com/baeldung/flink/connector/Producers.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/connector/Producers.java rename to libraries-data-2/src/main/java/com/baeldung/flink/connector/Producers.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/model/Backup.java b/libraries-data-2/src/main/java/com/baeldung/flink/model/Backup.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/model/Backup.java rename to libraries-data-2/src/main/java/com/baeldung/flink/model/Backup.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/model/InputMessage.java b/libraries-data-2/src/main/java/com/baeldung/flink/model/InputMessage.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/model/InputMessage.java rename to libraries-data-2/src/main/java/com/baeldung/flink/model/InputMessage.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/operator/BackupAggregator.java b/libraries-data-2/src/main/java/com/baeldung/flink/operator/BackupAggregator.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/operator/BackupAggregator.java rename to libraries-data-2/src/main/java/com/baeldung/flink/operator/BackupAggregator.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/operator/InputMessageTimestampAssigner.java b/libraries-data-2/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/operator/InputMessageTimestampAssigner.java rename to libraries-data-2/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/operator/WordsCapitalizer.java b/libraries-data-2/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/operator/WordsCapitalizer.java rename to libraries-data-2/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/schema/BackupSerializationSchema.java b/libraries-data-2/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/schema/BackupSerializationSchema.java rename to libraries-data-2/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java diff --git a/libraries-data-2/src/main/com/baeldung/flink/schema/InputMessageDeserializationSchema.java b/libraries-data-2/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/flink/schema/InputMessageDeserializationSchema.java rename to libraries-data-2/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java diff --git a/libraries-data-2/src/main/com/baeldung/google/sheets/GoogleAuthorizeUtil.java b/libraries-data-2/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/google/sheets/GoogleAuthorizeUtil.java rename to libraries-data-2/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java diff --git a/libraries-data-2/src/main/com/baeldung/google/sheets/SheetsServiceUtil.java b/libraries-data-2/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/google/sheets/SheetsServiceUtil.java rename to libraries-data-2/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/CacheConfiguration.java b/libraries-data-2/src/main/java/com/baeldung/infinispan/CacheConfiguration.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/infinispan/CacheConfiguration.java rename to libraries-data-2/src/main/java/com/baeldung/infinispan/CacheConfiguration.java diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/listener/CacheListener.java b/libraries-data-2/src/main/java/com/baeldung/infinispan/listener/CacheListener.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/infinispan/listener/CacheListener.java rename to libraries-data-2/src/main/java/com/baeldung/infinispan/listener/CacheListener.java diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/repository/HelloWorldRepository.java b/libraries-data-2/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/infinispan/repository/HelloWorldRepository.java rename to libraries-data-2/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/service/HelloWorldService.java b/libraries-data-2/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/infinispan/service/HelloWorldService.java rename to libraries-data-2/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java diff --git a/libraries-data-2/src/main/com/baeldung/infinispan/service/TransactionalService.java b/libraries-data-2/src/main/java/com/baeldung/infinispan/service/TransactionalService.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/infinispan/service/TransactionalService.java rename to libraries-data-2/src/main/java/com/baeldung/infinispan/service/TransactionalService.java diff --git a/libraries-data-2/src/main/com/baeldung/measurement/WaterTank.java b/libraries-data-2/src/main/java/com/baeldung/measurement/WaterTank.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/measurement/WaterTank.java rename to libraries-data-2/src/main/java/com/baeldung/measurement/WaterTank.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/Application.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/Application.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/Application.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/Application.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/Constants.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/Constants.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/Constants.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/Constants.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/CsvBean.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/beans/CsvBean.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/beans/CsvBean.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/beans/CsvBean.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/NamedColumnBean.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/beans/NamedColumnBean.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/beans/NamedColumnBean.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/beans/NamedColumnBean.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/SimplePositionBean.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/beans/SimplePositionBean.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/beans/SimplePositionBean.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/beans/SimplePositionBean.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/beans/WriteExampleBean.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/beans/WriteExampleBean.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/beans/WriteExampleBean.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/beans/WriteExampleBean.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/BeanExamples.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/examples/sync/BeanExamples.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/BeanExamples.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/examples/sync/BeanExamples.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/helpers/Helpers.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/helpers/Helpers.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/helpers/Helpers.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/helpers/Helpers.java diff --git a/libraries-data-2/src/main/com/baeldung/opencsv/pojos/CsvTransfer.java b/libraries-data-2/src/main/java/com/baeldung/opencsv/pojos/CsvTransfer.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/opencsv/pojos/CsvTransfer.java rename to libraries-data-2/src/main/java/com/baeldung/opencsv/pojos/CsvTransfer.java diff --git a/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderConverter.java b/libraries-data-2/src/main/java/com/baeldung/smooks/converter/OrderConverter.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/smooks/converter/OrderConverter.java rename to libraries-data-2/src/main/java/com/baeldung/smooks/converter/OrderConverter.java diff --git a/libraries-data-2/src/main/com/baeldung/smooks/converter/OrderValidator.java b/libraries-data-2/src/main/java/com/baeldung/smooks/converter/OrderValidator.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/smooks/converter/OrderValidator.java rename to libraries-data-2/src/main/java/com/baeldung/smooks/converter/OrderValidator.java diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Item.java b/libraries-data-2/src/main/java/com/baeldung/smooks/model/Item.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/smooks/model/Item.java rename to libraries-data-2/src/main/java/com/baeldung/smooks/model/Item.java diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Order.java b/libraries-data-2/src/main/java/com/baeldung/smooks/model/Order.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/smooks/model/Order.java rename to libraries-data-2/src/main/java/com/baeldung/smooks/model/Order.java diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Status.java b/libraries-data-2/src/main/java/com/baeldung/smooks/model/Status.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/smooks/model/Status.java rename to libraries-data-2/src/main/java/com/baeldung/smooks/model/Status.java diff --git a/libraries-data-2/src/main/com/baeldung/smooks/model/Supplier.java b/libraries-data-2/src/main/java/com/baeldung/smooks/model/Supplier.java similarity index 100% rename from libraries-data-2/src/main/com/baeldung/smooks/model/Supplier.java rename to libraries-data-2/src/main/java/com/baeldung/smooks/model/Supplier.java diff --git a/libraries/src/main/resources/google-sheets-client-secret.json b/libraries-data-2/src/main/resources/google-sheets-client-secret.json similarity index 100% rename from libraries/src/main/resources/google-sheets-client-secret.json rename to libraries-data-2/src/main/resources/google-sheets-client-secret.json diff --git a/libraries/src/main/resources/smooks/email.ftl b/libraries-data-2/src/main/resources/smooks/email.ftl similarity index 100% rename from libraries/src/main/resources/smooks/email.ftl rename to libraries-data-2/src/main/resources/smooks/email.ftl diff --git a/libraries/src/main/resources/smooks/item-rules.csv b/libraries-data-2/src/main/resources/smooks/item-rules.csv similarity index 100% rename from libraries/src/main/resources/smooks/item-rules.csv rename to libraries-data-2/src/main/resources/smooks/item-rules.csv diff --git a/libraries/src/main/resources/smooks/order.ftl b/libraries-data-2/src/main/resources/smooks/order.ftl similarity index 100% rename from libraries/src/main/resources/smooks/order.ftl rename to libraries-data-2/src/main/resources/smooks/order.ftl diff --git a/libraries/src/main/resources/smooks/order.json b/libraries-data-2/src/main/resources/smooks/order.json similarity index 100% rename from libraries/src/main/resources/smooks/order.json rename to libraries-data-2/src/main/resources/smooks/order.json diff --git a/libraries/src/main/resources/smooks/order.xml b/libraries-data-2/src/main/resources/smooks/order.xml similarity index 100% rename from libraries/src/main/resources/smooks/order.xml rename to libraries-data-2/src/main/resources/smooks/order.xml diff --git a/libraries/src/main/resources/smooks/smooks-mapping.xml b/libraries-data-2/src/main/resources/smooks/smooks-mapping.xml similarity index 100% rename from libraries/src/main/resources/smooks/smooks-mapping.xml rename to libraries-data-2/src/main/resources/smooks/smooks-mapping.xml diff --git a/libraries/src/main/resources/smooks/smooks-transform-edi.xml b/libraries-data-2/src/main/resources/smooks/smooks-transform-edi.xml similarity index 100% rename from libraries/src/main/resources/smooks/smooks-transform-edi.xml rename to libraries-data-2/src/main/resources/smooks/smooks-transform-edi.xml diff --git a/libraries/src/main/resources/smooks/smooks-transform-email.xml b/libraries-data-2/src/main/resources/smooks/smooks-transform-email.xml similarity index 100% rename from libraries/src/main/resources/smooks/smooks-transform-email.xml rename to libraries-data-2/src/main/resources/smooks/smooks-transform-email.xml diff --git a/libraries/src/main/resources/smooks/smooks-validation.xml b/libraries-data-2/src/main/resources/smooks/smooks-validation.xml similarity index 100% rename from libraries/src/main/resources/smooks/smooks-validation.xml rename to libraries-data-2/src/main/resources/smooks/smooks-validation.xml diff --git a/libraries/src/main/resources/smooks/supplier.properties b/libraries-data-2/src/main/resources/smooks/supplier.properties similarity index 100% rename from libraries/src/main/resources/smooks/supplier.properties rename to libraries-data-2/src/main/resources/smooks/supplier.properties diff --git a/libraries-data/src/main/java/com/baeldung/flink/FlinkDataPipeline.java b/libraries-data/src/main/java/com/baeldung/flink/FlinkDataPipeline.java deleted file mode 100644 index d02b1bcb83..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/FlinkDataPipeline.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.baeldung.flink; - - -import com.baeldung.flink.model.Backup; -import com.baeldung.flink.model.InputMessage; -import com.baeldung.flink.operator.BackupAggregator; -import com.baeldung.flink.operator.InputMessageTimestampAssigner; -import com.baeldung.flink.operator.WordsCapitalizer; -import org.apache.flink.streaming.api.TimeCharacteristic; -import org.apache.flink.streaming.api.datastream.DataStream; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.streaming.api.windowing.time.Time; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; - -import static com.baeldung.flink.connector.Consumers.*; -import static com.baeldung.flink.connector.Producers.*; - -public class FlinkDataPipeline { - - public static void capitalize() throws Exception { - String inputTopic = "flink_input"; - String outputTopic = "flink_output"; - String consumerGroup = "baeldung"; - String address = "localhost:9092"; - - StreamExecutionEnvironment environment = - StreamExecutionEnvironment.getExecutionEnvironment(); - - FlinkKafkaConsumer011 flinkKafkaConsumer = - createStringConsumerForTopic(inputTopic, address, consumerGroup); - flinkKafkaConsumer.setStartFromEarliest(); - - DataStream stringInputStream = - environment.addSource(flinkKafkaConsumer); - - FlinkKafkaProducer011 flinkKafkaProducer = - createStringProducer(outputTopic, address); - - stringInputStream - .map(new WordsCapitalizer()) - .addSink(flinkKafkaProducer); - - environment.execute(); - } - -public static void createBackup () throws Exception { - String inputTopic = "flink_input"; - String outputTopic = "flink_output"; - String consumerGroup = "baeldung"; - String kafkaAddress = "localhost:9092"; - - StreamExecutionEnvironment environment = - StreamExecutionEnvironment.getExecutionEnvironment(); - - environment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); - - FlinkKafkaConsumer011 flinkKafkaConsumer = - createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup); - flinkKafkaConsumer.setStartFromEarliest(); - - flinkKafkaConsumer - .assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()); - FlinkKafkaProducer011 flinkKafkaProducer = - createBackupProducer(outputTopic, kafkaAddress); - - DataStream inputMessagesStream = - environment.addSource(flinkKafkaConsumer); - - inputMessagesStream - .timeWindowAll(Time.hours(24)) - .aggregate(new BackupAggregator()) - .addSink(flinkKafkaProducer); - - environment.execute(); -} - - public static void main(String[] args) throws Exception { - createBackup(); - } - -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/LineSplitter.java b/libraries-data/src/main/java/com/baeldung/flink/LineSplitter.java deleted file mode 100644 index f4e322f1e8..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/LineSplitter.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.flink; - -import org.apache.flink.api.common.functions.FlatMapFunction; -import org.apache.flink.api.java.tuple.Tuple2; -import org.apache.flink.util.Collector; - -import java.util.stream.Stream; - -@SuppressWarnings("serial") -public class LineSplitter implements FlatMapFunction> { - - @Override - public void flatMap(String value, Collector> out) { - - String[] tokens = value.toLowerCase().split("\\W+"); - Stream.of(tokens).filter(t -> t.length() > 0).forEach(token -> out.collect(new Tuple2<>(token, 1))); - } -} \ No newline at end of file diff --git a/libraries-data/src/main/java/com/baeldung/flink/WordCount.java b/libraries-data/src/main/java/com/baeldung/flink/WordCount.java deleted file mode 100644 index fc5064bafa..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/WordCount.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.flink; - -import org.apache.flink.api.java.DataSet; -import org.apache.flink.api.java.ExecutionEnvironment; -import org.apache.flink.api.java.aggregation.Aggregations; -import org.apache.flink.api.java.tuple.Tuple2; - -import java.util.List; - -public class WordCount { - - public static DataSet> startWordCount(ExecutionEnvironment env, List lines) throws Exception { - DataSet text = env.fromCollection(lines); - - return text.flatMap(new LineSplitter()).groupBy(0).aggregate(Aggregations.SUM, 1); - - } -} \ No newline at end of file diff --git a/libraries-data/src/main/java/com/baeldung/flink/connector/Consumers.java b/libraries-data/src/main/java/com/baeldung/flink/connector/Consumers.java deleted file mode 100644 index 514085f9c4..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/connector/Consumers.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.flink.connector; - -import com.baeldung.flink.model.InputMessage; -import com.baeldung.flink.schema.InputMessageDeserializationSchema; -import org.apache.flink.api.common.serialization.SimpleStringSchema; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; - -import java.util.Properties; - -public class Consumers { - -public static FlinkKafkaConsumer011 createStringConsumerForTopic( - String topic, String kafkaAddress, String kafkaGroup ) { - Properties props = new Properties(); - props.setProperty("bootstrap.servers", kafkaAddress); - props.setProperty("group.id",kafkaGroup); - FlinkKafkaConsumer011 consumer = - new FlinkKafkaConsumer011<>(topic, new SimpleStringSchema(),props); - - return consumer; -} - - public static FlinkKafkaConsumer011 createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup ) { - Properties properties = new Properties(); - properties.setProperty("bootstrap.servers", kafkaAddress); - properties.setProperty("group.id",kafkaGroup); - FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011( - topic, new InputMessageDeserializationSchema(),properties); - - return consumer; - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/connector/Producers.java b/libraries-data/src/main/java/com/baeldung/flink/connector/Producers.java deleted file mode 100644 index 8e6f3f8f37..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/connector/Producers.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.flink.connector; - -import com.baeldung.flink.model.Backup; -import com.baeldung.flink.schema.BackupSerializationSchema; -import org.apache.flink.api.common.serialization.SimpleStringSchema; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; - -public class Producers { - - public static FlinkKafkaProducer011 createStringProducer(String topic, String kafkaAddress) { - return new FlinkKafkaProducer011<>(kafkaAddress, topic, new SimpleStringSchema()); - } - - public static FlinkKafkaProducer011 createBackupProducer(String topic, String kafkaAddress) { - return new FlinkKafkaProducer011(kafkaAddress, topic, new BackupSerializationSchema()); - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/model/Backup.java b/libraries-data/src/main/java/com/baeldung/flink/model/Backup.java deleted file mode 100644 index 268ceec7f3..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/model/Backup.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.flink.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; - -public class Backup { - - @JsonProperty("inputMessages") - List inputMessages; - @JsonProperty("backupTimestamp") - LocalDateTime backupTimestamp; - @JsonProperty("uuid") - UUID uuid; - - public Backup(List inputMessages, LocalDateTime backupTimestamp) { - this.inputMessages = inputMessages; - this.backupTimestamp = backupTimestamp; - this.uuid = UUID.randomUUID(); - } - - public List getInputMessages() { - return inputMessages; - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/model/InputMessage.java b/libraries-data/src/main/java/com/baeldung/flink/model/InputMessage.java deleted file mode 100644 index b3f75256ae..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/model/InputMessage.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.baeldung.flink.model; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.google.common.base.Objects; - -import java.time.LocalDateTime; - -@JsonSerialize -public class InputMessage { - String sender; - String recipient; - LocalDateTime sentAt; - String message; - - public InputMessage() { - } - - public String getSender() { - return sender; - } - public void setSender(String sender) { - this.sender = sender; - } - - public String getRecipient() { - return recipient; - } - - public void setRecipient(String recipient) { - this.recipient = recipient; - } - - public LocalDateTime getSentAt() { - return sentAt; - } - - public void setSentAt(LocalDateTime sentAt) { - this.sentAt = sentAt; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public InputMessage(String sender, String recipient, LocalDateTime sentAt, String message) { - this.sender = sender; - this.recipient = recipient; - this.sentAt = sentAt; - this.message = message; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - InputMessage message1 = (InputMessage) o; - return Objects.equal(sender, message1.sender) && - Objects.equal(recipient, message1.recipient) && - Objects.equal(sentAt, message1.sentAt) && - Objects.equal(message, message1.message); - } - - @Override - public int hashCode() { - return Objects.hashCode(sender, recipient, sentAt, message); - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/operator/BackupAggregator.java b/libraries-data/src/main/java/com/baeldung/flink/operator/BackupAggregator.java deleted file mode 100644 index c39b8413d1..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/operator/BackupAggregator.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.flink.operator; - -import com.baeldung.flink.model.Backup; -import com.baeldung.flink.model.InputMessage; -import org.apache.flink.api.common.functions.AggregateFunction; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - - public class BackupAggregator implements AggregateFunction, Backup> { - @Override - public List createAccumulator() { - return new ArrayList<>(); - } - - @Override - public List add(InputMessage inputMessage, List inputMessages) { - inputMessages.add(inputMessage); - return inputMessages; - } - - @Override - public Backup getResult(List inputMessages) { - Backup backup = new Backup(inputMessages, LocalDateTime.now()); - return backup; - } - - @Override - public List merge(List inputMessages, List acc1) { - inputMessages.addAll(acc1); - return inputMessages; - } - } diff --git a/libraries-data/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java b/libraries-data/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java deleted file mode 100644 index 05828d9588..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.flink.operator; - -import com.baeldung.flink.model.InputMessage; -import org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks; -import org.apache.flink.streaming.api.watermark.Watermark; - -import javax.annotation.Nullable; -import java.time.ZoneId; - -public class InputMessageTimestampAssigner implements AssignerWithPunctuatedWatermarks { - - @Override - public long extractTimestamp(InputMessage element, long previousElementTimestamp) { - ZoneId zoneId = ZoneId.systemDefault(); - return element.getSentAt().atZone(zoneId).toEpochSecond() * 1000; - } - - @Nullable - @Override - public Watermark checkAndGetNextWatermark(InputMessage lastElement, long extractedTimestamp) { - return new Watermark(extractedTimestamp - 15); - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java b/libraries-data/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java deleted file mode 100644 index f9103d225c..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.flink.operator; - -import org.apache.flink.api.common.functions.MapFunction; - -public class WordsCapitalizer implements MapFunction { - - @Override - public String map(String s) { - return s.toUpperCase(); - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java b/libraries-data/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java deleted file mode 100644 index 967b266bb6..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.flink.schema; - -import com.baeldung.flink.model.Backup; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import org.apache.flink.api.common.serialization.SerializationSchema; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BackupSerializationSchema - implements SerializationSchema { - - static ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - - Logger logger = LoggerFactory.getLogger(BackupSerializationSchema.class); - - @Override - public byte[] serialize(Backup backupMessage) { - if(objectMapper == null) { - objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); - objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - } - try { - String json = objectMapper.writeValueAsString(backupMessage); - return json.getBytes(); - } catch (com.fasterxml.jackson.core.JsonProcessingException e) { - logger.error("Failed to parse JSON", e); - } - return new byte[0]; - } -} diff --git a/libraries-data/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java b/libraries-data/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java deleted file mode 100644 index 9aaf8b9877..0000000000 --- a/libraries-data/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.flink.schema; - -import com.baeldung.flink.model.InputMessage; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import org.apache.flink.api.common.serialization.DeserializationSchema; -import org.apache.flink.api.common.typeinfo.TypeInformation; - -import java.io.IOException; - -public class InputMessageDeserializationSchema implements - DeserializationSchema { - - static ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - - - @Override - public InputMessage deserialize(byte[] bytes) throws IOException { - - return objectMapper.readValue(bytes, InputMessage.class); - } - - @Override - public boolean isEndOfStream(InputMessage inputMessage) { - return false; - } - - @Override - public TypeInformation getProducedType() { - return TypeInformation.of(InputMessage.class); - } -} diff --git a/libraries-data/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java deleted file mode 100644 index f46fffbb59..0000000000 --- a/libraries-data/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.baeldung.flink; - -import com.baeldung.flink.model.Backup; -import com.baeldung.flink.model.InputMessage; -import com.baeldung.flink.operator.BackupAggregator; -import com.baeldung.flink.operator.InputMessageTimestampAssigner; -import com.baeldung.flink.schema.BackupSerializationSchema; -import com.baeldung.flink.schema.InputMessageDeserializationSchema; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import org.apache.commons.collections.ListUtils; -import org.apache.flink.api.common.serialization.DeserializationSchema; -import org.apache.flink.api.common.serialization.SerializationSchema; -import org.apache.flink.streaming.api.TimeCharacteristic; -import org.apache.flink.streaming.api.datastream.DataStreamSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.streaming.api.functions.sink.SinkFunction; -import org.apache.flink.streaming.api.windowing.time.Time; -import org.awaitility.Awaitility; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; - -public class BackupCreatorIntegrationTest { - public static ObjectMapper mapper; - - @Before - public void setup() { - mapper = new ObjectMapper().registerModule(new JavaTimeModule()); - } - - @Test - public void givenProperJson_whenDeserializeIsInvoked_thenProperObjectIsReturned() throws IOException { - InputMessage message = new InputMessage("Me", "User", LocalDateTime.now(), "Test Message"); - byte[] messageSerialized = mapper.writeValueAsBytes(message); - DeserializationSchema deserializationSchema = new InputMessageDeserializationSchema(); - InputMessage messageDeserialized = deserializationSchema.deserialize(messageSerialized); - - assertEquals(message, messageDeserialized); - } - - @Test - public void givenMultipleInputMessagesFromDifferentDays_whenBackupCreatorIsUser_thenMessagesAreGroupedProperly() throws Exception { - LocalDateTime currentTime = LocalDateTime.now(); - InputMessage message = new InputMessage("Me", "User", currentTime, "First TestMessage"); - InputMessage secondMessage = new InputMessage("Me", "User", currentTime.plusHours(1), "First TestMessage"); - InputMessage thirdMessage = new InputMessage("Me", "User", currentTime.plusHours(2), "First TestMessage"); - InputMessage fourthMessage = new InputMessage("Me", "User", currentTime.plusHours(3), "First TestMessage"); - InputMessage fifthMessage = new InputMessage("Me", "User", currentTime.plusHours(25), "First TestMessage"); - InputMessage sixthMessage = new InputMessage("Me", "User", currentTime.plusHours(26), "First TestMessage"); - - List firstBackupMessages = Arrays.asList(message, secondMessage, thirdMessage, fourthMessage); - List secondBackupMessages = Arrays.asList(fifthMessage, sixthMessage); - List inputMessages = ListUtils.union(firstBackupMessages, secondBackupMessages); - - StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); - env.setParallelism(1); - DataStreamSource testDataSet = env.fromCollection(inputMessages); - CollectingSink sink = new CollectingSink(); - testDataSet.assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()) - .timeWindowAll(Time.hours(24)) - .aggregate(new BackupAggregator()) - .addSink(sink); - - env.execute(); - - Awaitility.await().until(() -> sink.backups.size() == 2); - assertEquals(2, sink.backups.size()); - assertEquals(firstBackupMessages, sink.backups.get(0).getInputMessages()); - assertEquals(secondBackupMessages, sink.backups.get(1).getInputMessages()); - - } - - @Test - public void givenProperBackupObject_whenSerializeIsInvoked_thenObjectIsProperlySerialized() throws IOException { - InputMessage message = new InputMessage("Me", "User", LocalDateTime.now(), "Test Message"); - List messages = Arrays.asList(message); - Backup backup = new Backup(messages, LocalDateTime.now()); - byte[] backupSerialized = mapper.writeValueAsBytes(backup); - SerializationSchema serializationSchema = new BackupSerializationSchema(); - byte[] backupProcessed = serializationSchema.serialize(backup); - - assertArrayEquals(backupSerialized, backupProcessed); - } - - private static class CollectingSink implements SinkFunction { - - public static List backups = new ArrayList<>(); - - @Override - public synchronized void invoke(Backup value, Context context) throws Exception { - backups.add(value); - } - } -} diff --git a/libraries-data/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java deleted file mode 100644 index 8a98dae4b5..0000000000 --- a/libraries-data/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.flink; - -import com.baeldung.flink.operator.WordsCapitalizer; -import org.apache.flink.api.java.DataSet; -import org.apache.flink.api.java.ExecutionEnvironment; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class WordCapitalizerIntegrationTest { - - @Test - public void givenDataSet_whenExecuteWordCapitalizer_thenReturnCapitalizedWords() throws Exception { - ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); - List data = Arrays.asList("dog", "cat", "wolf", "pig"); - - DataSet testDataSet = env.fromCollection(data); - - - List dataProcessed = testDataSet - .map(new WordsCapitalizer()) - .collect(); - - List testDataCapitalized = data.stream() - .map(String::toUpperCase) - .collect(Collectors.toList()); - - Assert.assertEquals(testDataCapitalized, dataProcessed); - } - -} diff --git a/libraries-data/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java deleted file mode 100644 index 5c788e86d6..0000000000 --- a/libraries-data/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.baeldung.flink; - -import org.apache.flink.api.common.operators.Order; -import org.apache.flink.api.java.DataSet; -import org.apache.flink.api.java.ExecutionEnvironment; -import org.apache.flink.api.java.functions.KeySelector; -import org.apache.flink.api.java.tuple.Tuple2; -import org.apache.flink.api.java.tuple.Tuple3; -import org.apache.flink.streaming.api.datastream.DataStream; -import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor; -import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows; -import org.apache.flink.streaming.api.windowing.time.Time; -import org.junit.Test; - -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class WordCountIntegrationTest { - private final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); - - @Test - public void givenDataSet_whenExecuteWordCount_thenReturnWordCount() throws Exception { - // given - List lines = Arrays.asList("This is a first sentence", "This is a second sentence with a one word"); - - // when - DataSet> result = WordCount.startWordCount(env, lines); - - // then - List> collect = result.collect(); - assertThat(collect).containsExactlyInAnyOrder(new Tuple2<>("a", 3), new Tuple2<>("sentence", 2), new Tuple2<>("word", 1), new Tuple2<>("is", 2), new Tuple2<>("this", 2), new Tuple2<>("second", 1), new Tuple2<>("first", 1), new Tuple2<>("with", 1), - new Tuple2<>("one", 1)); - } - - @Test - public void givenListOfAmounts_whenUseMapReduce_thenSumAmountsThatAreOnlyAboveThreshold() throws Exception { - // given - DataSet amounts = env.fromElements(1, 29, 40, 50); - int threshold = 30; - - // when - List collect = amounts.filter(a -> a > threshold).reduce((integer, t1) -> integer + t1).collect(); - - // then - assertThat(collect.get(0)).isEqualTo(90); - } - - @Test - public void givenDataSetOfComplexObjects_whenMapToGetOneField_thenReturnedListHaveProperElements() throws Exception { - // given - DataSet personDataSource = env.fromCollection(Arrays.asList(new Person(23, "Tom"), new Person(75, "Michael"))); - - // when - List ages = personDataSource.map(p -> p.age).collect(); - - // then - assertThat(ages).hasSize(2); - assertThat(ages).contains(23, 75); - - } - - @Test - public void givenDataSet_whenSortItByOneField_thenShouldReturnSortedDataSet() throws Exception { - // given - Tuple2 secondPerson = new Tuple2<>(4, "Tom"); - Tuple2 thirdPerson = new Tuple2<>(5, "Scott"); - Tuple2 fourthPerson = new Tuple2<>(200, "Michael"); - Tuple2 firstPerson = new Tuple2<>(1, "Jack"); - DataSet> transactions = env.fromElements(fourthPerson, secondPerson, thirdPerson, firstPerson); - - // when - List> sorted = transactions.sortPartition(new IdKeySelectorTransaction(), Order.ASCENDING).collect(); - - // then - assertThat(sorted).containsExactly(firstPerson, secondPerson, thirdPerson, fourthPerson); - } - - @Test - public void giveTwoDataSets_whenJoinUsingId_thenProduceJoinedData() throws Exception { - // given - Tuple3 address = new Tuple3<>(1, "5th Avenue", "London"); - DataSet> addresses = env.fromElements(address); - - Tuple2 firstTransaction = new Tuple2<>(1, "Transaction_1"); - DataSet> transactions = env.fromElements(firstTransaction, new Tuple2<>(12, "Transaction_2")); - - // when - List, Tuple3>> joined = transactions.join(addresses).where(new IdKeySelectorTransaction()).equalTo(new IdKeySelectorAddress()).collect(); - - // then - assertThat(joined).hasSize(1); - assertThat(joined).contains(new Tuple2<>(firstTransaction, address)); - - } - - @Test - public void givenStreamOfEvents_whenProcessEvents_thenShouldPrintResultsOnSinkOperation() throws Exception { - // given - final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - - DataStream text = env.fromElements("This is a first sentence", "This is a second sentence with a one word"); - - SingleOutputStreamOperator upperCase = text.map(String::toUpperCase); - - upperCase.print(); - - // when - env.execute(); - } - - @Test - public void givenStreamOfEvents_whenProcessEvents_thenShouldApplyWindowingOnTransformation() throws Exception { - // given - final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - - SingleOutputStreamOperator> windowed = env.fromElements(new Tuple2<>(16, ZonedDateTime.now().plusMinutes(25).toInstant().getEpochSecond()), new Tuple2<>(15, ZonedDateTime.now().plusMinutes(2).toInstant().getEpochSecond())) - .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor>(Time.seconds(20)) { - @Override - public long extractTimestamp(Tuple2 element) { - return element.f1 * 1000; - } - }); - - SingleOutputStreamOperator> reduced = windowed.windowAll(TumblingEventTimeWindows.of(Time.seconds(5))).maxBy(0, true); - - reduced.print(); - - // when - env.execute(); - } - - private static class IdKeySelectorTransaction implements KeySelector, Integer> { - @Override - public Integer getKey(Tuple2 value) { - return value.f0; - } - } - - private static class IdKeySelectorAddress implements KeySelector, Integer> { - @Override - public Integer getKey(Tuple3 value) { - return value.f0; - } - } - - private static class Person { - private final int age; - private final String name; - - private Person(int age, String name) { - this.age = age; - this.name = name; - } - } - -} \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index e8ffde5f99..438fe6a519 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -36,12 +36,6 @@ cglib ${cglib.version} - - - com.opencsv - opencsv - ${opencsv.version} - org.apache.commons commons-lang3 @@ -52,11 +46,6 @@ commons-net ${commons-net.version} - - tec.units - unit-ri - ${unit-ri.version} - org.jasypt jasypt @@ -347,11 +336,6 @@ ${org.hamcrest.java-hamcrest.version} test - - net.agkn - hll - ${hll.version} - net.bytebuddy byte-buddy @@ -464,21 +448,6 @@ jgrapht-core ${jgrapht.version} - - com.netopyr.wurmloch - wurmloch-crdt - ${crdt.version} - - - org.docx4j - docx4j - ${docx4j.version} - - - javax.xml.bind - jaxb-api - ${jaxb-api.version} - com.github.ben-manes.caffeine caffeine @@ -509,11 +478,6 @@ google-http-client-gson ${googleclient.version} - - org.infinispan - infinispan-core - ${infinispan.version} - @@ -553,11 +517,6 @@ google-oauth-client-jetty ${google-api.version} - - com.google.apis - google-api-services-sheets - ${google-sheets.version} - org.apache.kafka kafka-streams @@ -581,12 +540,6 @@ test test - - - org.milyn - milyn-smooks-all - ${smooks.version} - com.mashape.unirest unirest-java @@ -815,7 +768,6 @@ 4.0.0 1.21 1.23.0 - 0.1.0 0.7.0 3.2.7 1.9.2 @@ -839,7 +791,6 @@ 3.5.0 3.0.0 2.0.0.0 - 1.6.0 1.7.1 2.1.2 1.0 @@ -852,17 +803,13 @@ 2.10 1.5.1 1.15 - 1.0.3 1.0.0 3.10.2 2.5.5 1.23.0 v4-rev493-1.21.0 2.0.0 - 1.7.0 3.0.14 - 9.1.5.Final - 4.1 1.4.9 2.1.2 1.10.L001 @@ -893,8 +840,6 @@ 1.2.6 4.8.1 1.0.1 - 3.3.5 - 2.1 1.58 1.19.4 1.6.0 diff --git a/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java b/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java deleted file mode 100644 index 641fae42dd..0000000000 --- a/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.google.sheets; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.security.GeneralSecurityException; -import java.util.Arrays; -import java.util.List; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; -import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; -import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; -import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.client.util.store.MemoryDataStoreFactory; -import com.google.api.services.sheets.v4.SheetsScopes; - -public class GoogleAuthorizeUtil { - public static Credential authorize() throws IOException, GeneralSecurityException { - InputStream in = GoogleAuthorizeUtil.class.getResourceAsStream("/google-sheets-client-secret.json"); - GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in)); - - List scopes = Arrays.asList(SheetsScopes.SPREADSHEETS); - - GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), clientSecrets, scopes).setDataStoreFactory(new MemoryDataStoreFactory()) - .setAccessType("offline").build(); - Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); - - return credential; - } - -} diff --git a/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java b/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java deleted file mode 100644 index 8a78d50551..0000000000 --- a/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.google.sheets; - -import java.io.IOException; -import java.security.GeneralSecurityException; - -import com.google.api.client.auth.oauth2.Credential; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.services.sheets.v4.Sheets; - -public class SheetsServiceUtil { - - private static final String APPLICATION_NAME = "Google Sheets Example"; - - public static Sheets getSheetsService() throws IOException, GeneralSecurityException { - Credential credential = GoogleAuthorizeUtil.authorize(); - return new Sheets.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), credential).setApplicationName(APPLICATION_NAME).build(); - } - -} diff --git a/libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java b/libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java deleted file mode 100644 index eda511d7a7..0000000000 --- a/libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.baeldung.infinispan; - -import com.baeldung.infinispan.listener.CacheListener; -import org.infinispan.Cache; -import org.infinispan.configuration.cache.Configuration; -import org.infinispan.configuration.cache.ConfigurationBuilder; -import org.infinispan.eviction.EvictionType; -import org.infinispan.manager.DefaultCacheManager; -import org.infinispan.transaction.LockingMode; -import org.infinispan.transaction.TransactionMode; - -import java.util.concurrent.TimeUnit; - -public class CacheConfiguration { - - public static final String SIMPLE_HELLO_WORLD_CACHE = "simple-hello-world-cache"; - public static final String EXPIRING_HELLO_WORLD_CACHE = "expiring-hello-world-cache"; - public static final String EVICTING_HELLO_WORLD_CACHE = "evicting-hello-world-cache"; - public static final String PASSIVATING_HELLO_WORLD_CACHE = "passivating-hello-world-cache"; - public static final String TRANSACTIONAL_CACHE = "transactional-cache"; - - public DefaultCacheManager cacheManager() { - return new DefaultCacheManager(); - } - - public Cache transactionalCache(DefaultCacheManager cacheManager, CacheListener listener) { - return this.buildCache(TRANSACTIONAL_CACHE, cacheManager, listener, transactionalConfiguration()); - } - - public Cache simpleHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { - return this.buildCache(SIMPLE_HELLO_WORLD_CACHE, cacheManager, listener, new ConfigurationBuilder().build()); - } - - public Cache expiringHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { - return this.buildCache(EXPIRING_HELLO_WORLD_CACHE, cacheManager, listener, expiringConfiguration()); - } - - public Cache evictingHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { - return this.buildCache(EVICTING_HELLO_WORLD_CACHE, cacheManager, listener, evictingConfiguration()); - } - - public Cache passivatingHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { - return this.buildCache(PASSIVATING_HELLO_WORLD_CACHE, cacheManager, listener, passivatingConfiguration()); - } - - private Cache buildCache(String cacheName, DefaultCacheManager cacheManager, CacheListener listener, Configuration configuration) { - - cacheManager.defineConfiguration(cacheName, configuration); - Cache cache = cacheManager.getCache(cacheName); - cache.addListener(listener); - return cache; - } - - private Configuration expiringConfiguration() { - return new ConfigurationBuilder().expiration().lifespan(1, TimeUnit.SECONDS).build(); - } - - private Configuration evictingConfiguration() { - return new ConfigurationBuilder().memory().evictionType(EvictionType.COUNT).size(1).build(); - } - - private Configuration passivatingConfiguration() { - return new ConfigurationBuilder().memory().evictionType(EvictionType.COUNT).size(1).persistence().passivation(true).addSingleFileStore().purgeOnStartup(true).location(System.getProperty("java.io.tmpdir")).build(); - } - - private Configuration transactionalConfiguration() { - return new ConfigurationBuilder().transaction().transactionMode(TransactionMode.TRANSACTIONAL).lockingMode(LockingMode.PESSIMISTIC).build(); - } - -} diff --git a/libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java b/libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java deleted file mode 100644 index 942a2fb62d..0000000000 --- a/libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.baeldung.infinispan.listener; - -import org.infinispan.notifications.Listener; -import org.infinispan.notifications.cachelistener.annotation.*; -import org.infinispan.notifications.cachelistener.event.*; - -@Listener -public class CacheListener { - - @CacheEntryCreated - public void entryCreated(CacheEntryCreatedEvent event) { - this.printLog("Adding key '" + event.getKey() + "' to cache", event); - } - - @CacheEntryExpired - public void entryExpired(CacheEntryExpiredEvent event) { - this.printLog("Expiring key '" + event.getKey() + "' from cache", event); - } - - @CacheEntryVisited - public void entryVisited(CacheEntryVisitedEvent event) { - this.printLog("Key '" + event.getKey() + "' was visited", event); - } - - @CacheEntryActivated - public void entryActivated(CacheEntryActivatedEvent event) { - this.printLog("Activating key '" + event.getKey() + "' on cache", event); - } - - @CacheEntryPassivated - public void entryPassivated(CacheEntryPassivatedEvent event) { - this.printLog("Passivating key '" + event.getKey() + "' from cache", event); - } - - @CacheEntryLoaded - public void entryLoaded(CacheEntryLoadedEvent event) { - this.printLog("Loading key '" + event.getKey() + "' to cache", event); - } - - @CacheEntriesEvicted - public void entriesEvicted(CacheEntriesEvictedEvent event) { - final StringBuilder builder = new StringBuilder(); - event.getEntries().forEach((key, value) -> builder.append(key).append(", ")); - System.out.println("Evicting following entries from cache: " + builder.toString()); - } - - private void printLog(String log, CacheEntryEvent event) { - if (!event.isPre()) { - System.out.println(log); - } - } - -} diff --git a/libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java b/libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java deleted file mode 100644 index 85c0d539a3..0000000000 --- a/libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.infinispan.repository; - -public class HelloWorldRepository { - - public String getHelloWorld() { - try { - System.out.println("Executing some heavy query"); - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return "Hello World!"; - } - -} diff --git a/libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java b/libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java deleted file mode 100644 index de30cd5c8e..0000000000 --- a/libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.baeldung.infinispan.service; - -import com.baeldung.infinispan.listener.CacheListener; -import com.baeldung.infinispan.repository.HelloWorldRepository; -import org.infinispan.Cache; - -import java.util.concurrent.TimeUnit; - -public class HelloWorldService { - - private final HelloWorldRepository repository; - - private final Cache simpleHelloWorldCache; - private final Cache expiringHelloWorldCache; - private final Cache evictingHelloWorldCache; - private final Cache passivatingHelloWorldCache; - - public HelloWorldService(HelloWorldRepository repository, CacheListener listener, Cache simpleHelloWorldCache, Cache expiringHelloWorldCache, Cache evictingHelloWorldCache, - Cache passivatingHelloWorldCache) { - - this.repository = repository; - - this.simpleHelloWorldCache = simpleHelloWorldCache; - this.expiringHelloWorldCache = expiringHelloWorldCache; - this.evictingHelloWorldCache = evictingHelloWorldCache; - this.passivatingHelloWorldCache = passivatingHelloWorldCache; - } - - public String findSimpleHelloWorld() { - String cacheKey = "simple-hello"; - return simpleHelloWorldCache.computeIfAbsent(cacheKey, k -> repository.getHelloWorld()); - } - - public String findExpiringHelloWorld() { - String cacheKey = "expiring-hello"; - String helloWorld = simpleHelloWorldCache.get(cacheKey); - if (helloWorld == null) { - helloWorld = repository.getHelloWorld(); - simpleHelloWorldCache.put(cacheKey, helloWorld, 1, TimeUnit.SECONDS); - } - return helloWorld; - } - - public String findIdleHelloWorld() { - String cacheKey = "idle-hello"; - String helloWorld = simpleHelloWorldCache.get(cacheKey); - if (helloWorld == null) { - helloWorld = repository.getHelloWorld(); - simpleHelloWorldCache.put(cacheKey, helloWorld, -1, TimeUnit.SECONDS, 10, TimeUnit.SECONDS); - } - return helloWorld; - } - - public String findSimpleHelloWorldInExpiringCache() { - String cacheKey = "simple-hello"; - String helloWorld = expiringHelloWorldCache.get(cacheKey); - if (helloWorld == null) { - helloWorld = repository.getHelloWorld(); - expiringHelloWorldCache.put(cacheKey, helloWorld); - } - return helloWorld; - } - - public String findEvictingHelloWorld(String key) { - String value = evictingHelloWorldCache.get(key); - if (value == null) { - value = repository.getHelloWorld(); - evictingHelloWorldCache.put(key, value); - } - return value; - } - - public String findPassivatingHelloWorld(String key) { - return passivatingHelloWorldCache.computeIfAbsent(key, k -> repository.getHelloWorld()); - } - -} diff --git a/libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java b/libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java deleted file mode 100644 index 26862b8d65..0000000000 --- a/libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.infinispan.service; - -import org.infinispan.Cache; -import org.springframework.util.StopWatch; - -import javax.transaction.TransactionManager; - -public class TransactionalService { - - private final Cache transactionalCache; - - private static final String KEY = "key"; - - public TransactionalService(Cache transactionalCache) { - this.transactionalCache = transactionalCache; - - transactionalCache.put(KEY, 0); - } - - public Integer getQuickHowManyVisits() { - try { - TransactionManager tm = transactionalCache.getAdvancedCache().getTransactionManager(); - tm.begin(); - Integer howManyVisits = transactionalCache.get(KEY); - howManyVisits++; - System.out.println("Ill try to set HowManyVisits to " + howManyVisits); - StopWatch watch = new StopWatch(); - watch.start(); - transactionalCache.put(KEY, howManyVisits); - watch.stop(); - System.out.println("I was able to set HowManyVisits to " + howManyVisits + " after waiting " + watch.getTotalTimeSeconds() + " seconds"); - - tm.commit(); - return howManyVisits; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - public void startBackgroundBatch() { - try { - TransactionManager tm = transactionalCache.getAdvancedCache().getTransactionManager(); - tm.begin(); - transactionalCache.put(KEY, 1000); - System.out.println("HowManyVisits should now be 1000, " + "but we are holding the transaction"); - Thread.sleep(1000L); - tm.rollback(); - System.out.println("The slow batch suffered a rollback"); - } catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/libraries/src/main/java/com/baeldung/measurement/WaterTank.java b/libraries/src/main/java/com/baeldung/measurement/WaterTank.java deleted file mode 100644 index f3675ae689..0000000000 --- a/libraries/src/main/java/com/baeldung/measurement/WaterTank.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.measurement; - -import javax.measure.Quantity; -import javax.measure.quantity.Volume; - -public class WaterTank { - - private Quantity capacityMeasure; - private double capacityDouble; - - public void setCapacityMeasure(Quantity capacityMeasure) { - this.capacityMeasure = capacityMeasure; - } - - public void setCapacityDouble(double capacityDouble) { - this.capacityDouble = capacityDouble; - } - - public Quantity getCapacityMeasure() { - return capacityMeasure; - } - - public double getCapacityDouble() { - return capacityDouble; - } -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/Application.java b/libraries/src/main/java/com/baeldung/opencsv/Application.java deleted file mode 100644 index fd7e4d82d4..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/Application.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.baeldung.opencsv; - -import com.baeldung.opencsv.beans.NamedColumnBean; -import com.baeldung.opencsv.beans.SimplePositionBean; -import com.baeldung.opencsv.examples.sync.BeanExamples; -import com.baeldung.opencsv.examples.sync.CsvReaderExamples; -import com.baeldung.opencsv.examples.sync.CsvWriterExamples; -import com.baeldung.opencsv.helpers.Helpers; - -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Path; - -public class Application { - - /* - * Bean Examples. - */ - - public static String simpleSyncPositionBeanExample() { - Path path = null; - try { - path = Helpers.twoColumnCsvPath(); - } catch (Exception ex) { - Helpers.err(ex); - } - return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString(); - } - - public static String namedSyncColumnBeanExample() { - Path path = null; - try { - path = Helpers.namedColumnCsvPath(); - } catch (Exception ex) { - Helpers.err(ex); - } - return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString(); - } - - public static String writeSyncCsvFromBeanExample() { - Path path = null; - try { - path = Helpers.fileOutBeanPath(); - } catch (Exception ex) { - Helpers.err(ex); - } - return BeanExamples.writeCsvFromBean(path); - } - - /* - * CSV Reader Examples. - */ - - public static String oneByOneSyncExample() { - Reader reader = null; - try { - reader = Files.newBufferedReader(Helpers.twoColumnCsvPath()); - } catch (Exception ex) { - Helpers.err(ex); - } - return CsvReaderExamples.oneByOne(reader).toString(); - } - - public static String readAllSyncExample() { - Reader reader = null; - try { - reader = Files.newBufferedReader(Helpers.twoColumnCsvPath()); - } catch (Exception ex) { - Helpers.err(ex); - } - return CsvReaderExamples.readAll(reader).toString(); - } - - /* - * CSV Writer Examples. - */ - - - public static String csvWriterSyncOneByOne() { - Path path = null; - try { - path = Helpers.fileOutOnePath(); - } catch (Exception ex) { - Helpers.err(ex); - } - return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path); - } - - public static String csvWriterSyncAll() { - Path path = null; - try { - path = Helpers.fileOutAllPath(); - } catch (Exception ex) { - Helpers.err(ex); - } - return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path); - } - - public static void main(String[] args) { - simpleSyncPositionBeanExample(); - namedSyncColumnBeanExample(); - writeSyncCsvFromBeanExample(); - oneByOneSyncExample(); - readAllSyncExample(); - csvWriterSyncOneByOne(); - csvWriterSyncAll(); - } -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/Constants.java b/libraries/src/main/java/com/baeldung/opencsv/Constants.java deleted file mode 100644 index f7978acf24..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/Constants.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.opencsv; - -public class Constants { - - public static final String GENERIC_EXCEPTION = "EXCEPTION ENCOUNTERED: "; - public static final String GENERIC_SUCCESS = "SUCCESS"; - - public static final String TWO_COLUMN_CSV = "csv/twoColumn.csv"; - public static final String FOUR_COLUMN_CSV = "csv/fourColumn.csv"; - public static final String NAMED_COLUMN_CSV = "csv/namedColumn.csv"; - - public static final String CSV_All = "csv/writtenAll.csv"; - public static final String CSV_BEAN = "csv/writtenBean.csv"; - public static final String CSV_ONE = "csv/writtenOneByOne.csv"; - - -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/beans/CsvBean.java b/libraries/src/main/java/com/baeldung/opencsv/beans/CsvBean.java deleted file mode 100644 index af9caaae12..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/beans/CsvBean.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.baeldung.opencsv.beans; - -public class CsvBean { } diff --git a/libraries/src/main/java/com/baeldung/opencsv/beans/NamedColumnBean.java b/libraries/src/main/java/com/baeldung/opencsv/beans/NamedColumnBean.java deleted file mode 100644 index d9e5f96333..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/beans/NamedColumnBean.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.opencsv.beans; - -import com.opencsv.bean.CsvBindByName; - -public class NamedColumnBean extends CsvBean { - - @CsvBindByName(column = "name") - private String name; - - //Automatically infer column name as Age - @CsvBindByName - private int age; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/beans/SimplePositionBean.java b/libraries/src/main/java/com/baeldung/opencsv/beans/SimplePositionBean.java deleted file mode 100644 index 799006e2f9..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/beans/SimplePositionBean.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.opencsv.beans; - -import com.opencsv.bean.CsvBindByPosition; - -public class SimplePositionBean extends CsvBean { - - @CsvBindByPosition(position = 0) - private String exampleColOne; - - @CsvBindByPosition(position = 1) - private String exampleColTwo; - - public String getExampleColOne() { - return exampleColOne; - } - - private void setExampleColOne(String exampleColOne) { - this.exampleColOne = exampleColOne; - } - - public String getExampleColTwo() { - return exampleColTwo; - } - - private void setExampleCsvTwo (String exampleColTwo) { - this.exampleColTwo = exampleColTwo; - } - -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/beans/WriteExampleBean.java b/libraries/src/main/java/com/baeldung/opencsv/beans/WriteExampleBean.java deleted file mode 100644 index f145f67f11..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/beans/WriteExampleBean.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.opencsv.beans; - -public class WriteExampleBean extends CsvBean { - - private String colA; - - private String colB; - - private String colC; - - public WriteExampleBean(String colA, String colB, String colC) { - this.colA = colA; - this.colB = colB; - this.colC = colC; - } - - public String getColA() { - return colA; - } - - public void setColA(String colA) { - this.colA = colA; - } - - public String getColB() { - return colB; - } - - public void setColB(String colB) { - this.colB = colB; - } - - public String getColC() { - return colC; - } - - public void setColC(String colC) { - this.colC = colC; - } -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/examples/sync/BeanExamples.java b/libraries/src/main/java/com/baeldung/opencsv/examples/sync/BeanExamples.java deleted file mode 100644 index 086f32677e..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/examples/sync/BeanExamples.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.opencsv.examples.sync; - -import com.baeldung.opencsv.beans.CsvBean; -import com.baeldung.opencsv.beans.WriteExampleBean; -import com.baeldung.opencsv.helpers.Helpers; -import com.baeldung.opencsv.pojos.CsvTransfer; -import com.opencsv.CSVWriter; -import com.opencsv.bean.*; - -import java.io.FileWriter; -import java.io.Reader; -import java.io.Writer; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -public class BeanExamples { - - public static List beanBuilderExample(Path path, Class clazz) { - ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy(); - return beanBuilderExample(path, clazz, ms); - } - - public static List beanBuilderExample(Path path, Class clazz, MappingStrategy ms) { - CsvTransfer csvTransfer = new CsvTransfer(); - try { - ms.setType(clazz); - - Reader reader = Files.newBufferedReader(path); - CsvToBean cb = new CsvToBeanBuilder(reader).withType(clazz) - .withMappingStrategy(ms) - .build(); - - csvTransfer.setCsvList(cb.parse()); - reader.close(); - - } catch (Exception ex) { - Helpers.err(ex); - } - return csvTransfer.getCsvList(); - } - - public static String writeCsvFromBean(Path path) { - try { - Writer writer = new FileWriter(path.toString()); - - StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer).withSeparator(CSVWriter.DEFAULT_SEPARATOR) - .build(); - - List list = new ArrayList<>(); - list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd")); - list.add(new WriteExampleBean("Test2", "ipso", "facto")); - - sbc.write(list); - writer.close(); - - } catch (Exception ex) { - Helpers.err(ex); - } - return Helpers.readFile(path); - } -} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java b/libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java deleted file mode 100644 index bacfdcff3d..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvReaderExamples.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.opencsv.examples.sync; - -import com.baeldung.opencsv.helpers.Helpers; -import com.opencsv.CSVParser; -import com.opencsv.CSVParserBuilder; -import com.opencsv.CSVReader; -import com.opencsv.CSVReaderBuilder; - -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; - -public class CsvReaderExamples { - - public static List readAll(Reader reader) { - - CSVParser parser = new CSVParserBuilder() - .withSeparator(',') - .withIgnoreQuotations(true) - .build(); - - CSVReader csvReader = new CSVReaderBuilder(reader) - .withSkipLines(0) - .withCSVParser(parser) - .build(); - - List list = new ArrayList<>(); - try { - list = csvReader.readAll(); - reader.close(); - csvReader.close(); - } catch (Exception ex) { - Helpers.err(ex); - } - return list; - } - - public static List oneByOne(Reader reader) { - List list = new ArrayList<>(); - try { - CSVParser parser = new CSVParserBuilder() - .withSeparator(',') - .withIgnoreQuotations(true) - .build(); - - CSVReader csvReader = new CSVReaderBuilder(reader) - .withSkipLines(0) - .withCSVParser(parser) - .build(); - - String[] line; - while ((line = csvReader.readNext()) != null) { - list.add(line); - } - reader.close(); - csvReader.close(); - } catch (Exception ex) { - Helpers.err(ex); - } - return list; - } - -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java b/libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java deleted file mode 100644 index 6f52160ba8..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/examples/sync/CsvWriterExamples.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.opencsv.examples.sync; - -import com.baeldung.opencsv.helpers.Helpers; -import com.opencsv.CSVWriter; - -import java.io.FileWriter; -import java.nio.file.Path; -import java.util.List; - -public class CsvWriterExamples { - - public static String csvWriterOneByOne(List stringArray, Path path) { - try { - CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); - for (String[] array : stringArray) { - writer.writeNext(array); - } - writer.close(); - } catch (Exception ex) { - Helpers.err(ex); - } - return Helpers.readFile(path); - } - - public static String csvWriterAll(List stringArray, Path path) { - try { - CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); - writer.writeAll(stringArray); - writer.close(); - } catch (Exception ex) { - Helpers.err(ex); - } - return Helpers.readFile(path); - } -} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/opencsv/helpers/Helpers.java b/libraries/src/main/java/com/baeldung/opencsv/helpers/Helpers.java deleted file mode 100644 index 9a46fbc495..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/helpers/Helpers.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.baeldung.opencsv.helpers; - -import com.baeldung.opencsv.Constants; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -public class Helpers { - - /** - * Write Files - */ - - public static Path fileOutAllPath() throws URISyntaxException { - URI uri = ClassLoader.getSystemResource(Constants.CSV_All).toURI(); - return Paths.get(uri); - } - - public static Path fileOutBeanPath() throws URISyntaxException { - URI uri = ClassLoader.getSystemResource(Constants.CSV_BEAN).toURI(); - return Paths.get(uri); - } - - public static Path fileOutOnePath() throws URISyntaxException { - URI uri = ClassLoader.getSystemResource(Constants.CSV_ONE).toURI(); - return Paths.get(uri); - } - - /** - * Read Files - */ - - public static Path twoColumnCsvPath() throws URISyntaxException { - URI uri = ClassLoader.getSystemResource(Constants.TWO_COLUMN_CSV).toURI(); - return Paths.get(uri); - } - - public static Path fourColumnCsvPath() throws URISyntaxException { - URI uri = ClassLoader.getSystemResource(Constants.FOUR_COLUMN_CSV).toURI(); - return Paths.get(uri); - } - - public static Path namedColumnCsvPath() throws URISyntaxException { - URI uri = ClassLoader.getSystemResource(Constants.NAMED_COLUMN_CSV).toURI(); - return Paths.get(uri); - } - - /** - * Simple File Reader - */ - - public static String readFile(Path path) { - String response = ""; - try { - FileReader fr = new FileReader(path.toString()); - BufferedReader br = new BufferedReader(fr); - String strLine; - StringBuffer sb = new StringBuffer(); - while ((strLine = br.readLine()) != null) { - sb.append(strLine); - } - response = sb.toString(); - System.out.println(response); - fr.close(); - br.close(); - } catch (Exception ex) { - Helpers.err(ex); - } - return response; - } - - /** - * Dummy Data for Writing. - */ - - public static List twoColumnCsvString() { - List list = new ArrayList<>(); - list.add(new String[]{"ColA", "ColB"}); - list.add(new String[]{"A", "B"}); - return list; - } - - public static List fourColumnCsvString() { - List list = new ArrayList<>(); - list.add(new String[]{"ColA", "ColB", "ColC", "ColD"}); - list.add(new String[]{"A", "B", "A", "B"}); - list.add(new String[]{"BB", "AB", "AA", "B"}); - return list; - } - - /** - * Message Helpers - */ - - public static void print(String msg) { - System.out.println(msg); - } - - public static void err(Exception ex) { - System.out.println(Constants.GENERIC_EXCEPTION + " " + ex); - } -} diff --git a/libraries/src/main/java/com/baeldung/opencsv/pojos/CsvTransfer.java b/libraries/src/main/java/com/baeldung/opencsv/pojos/CsvTransfer.java deleted file mode 100644 index 79366e3d20..0000000000 --- a/libraries/src/main/java/com/baeldung/opencsv/pojos/CsvTransfer.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.opencsv.pojos; - -import com.baeldung.opencsv.beans.CsvBean; - -import java.util.ArrayList; -import java.util.List; - -public class CsvTransfer { - - private List csvStringList; - - private List csvList; - - public CsvTransfer() {} - - public List getCsvStringList() { - if (csvStringList != null) return csvStringList; - return new ArrayList(); - } - - public void addLine(String[] line) { - if (this.csvList == null) this.csvStringList = new ArrayList<>(); - this.csvStringList.add(line); - } - - public void setCsvStringList(List csvStringList) { - this.csvStringList = csvStringList; - } - - public void setCsvList(List csvList) { - this.csvList = csvList; - } - - public List getCsvList() { - if (csvList != null) return csvList; - return new ArrayList(); - } -} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java b/libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java deleted file mode 100644 index fa317f93b7..0000000000 --- a/libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.smooks.converter; - -import com.baeldung.smooks.model.Order; -import org.milyn.Smooks; -import org.milyn.payload.JavaResult; -import org.milyn.payload.StringResult; -import org.xml.sax.SAXException; - -import javax.xml.transform.stream.StreamSource; -import java.io.IOException; - -public class OrderConverter { - - public Order convertOrderXMLToOrderObject(String path) throws IOException, SAXException { - Smooks smooks = new Smooks(OrderConverter.class.getResourceAsStream("/smooks/smooks-mapping.xml")); - try { - JavaResult javaResult = new JavaResult(); - smooks.filterSource(new StreamSource(OrderConverter.class.getResourceAsStream(path)), javaResult); - return (Order) javaResult.getBean("order"); - } finally { - smooks.close(); - } - } - - public String convertOrderXMLtoEDIFACT(String path) throws IOException, SAXException { - return convertDocumentWithTempalte(path, "/smooks/smooks-transform-edi.xml"); - } - - public String convertOrderXMLtoEmailMessage(String path) throws IOException, SAXException { - return convertDocumentWithTempalte(path, "/smooks/smooks-transform-email.xml"); - } - - private String convertDocumentWithTempalte(String path, String config) throws IOException, SAXException { - Smooks smooks = new Smooks(config); - - try { - StringResult stringResult = new StringResult(); - smooks.filterSource(new StreamSource(OrderConverter.class.getResourceAsStream(path)), stringResult); - return stringResult.toString(); - } finally { - smooks.close(); - } - } -} diff --git a/libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java b/libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java deleted file mode 100644 index 3975921da0..0000000000 --- a/libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.smooks.converter; - -import org.milyn.Smooks; -import org.milyn.payload.JavaResult; -import org.milyn.payload.StringResult; -import org.milyn.validation.ValidationResult; -import org.xml.sax.SAXException; - -import javax.xml.transform.stream.StreamSource; -import java.io.IOException; - -public class OrderValidator { - - public ValidationResult validate(String path) throws IOException, SAXException { - Smooks smooks = new Smooks(OrderValidator.class.getResourceAsStream("/smooks/smooks-validation.xml")); - - try { - StringResult xmlResult = new StringResult(); - JavaResult javaResult = new JavaResult(); - ValidationResult validationResult = new ValidationResult(); - smooks.filterSource(new StreamSource(OrderValidator.class.getResourceAsStream(path)), xmlResult, javaResult, validationResult); - return validationResult; - } finally { - smooks.close(); - } - } -} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Item.java b/libraries/src/main/java/com/baeldung/smooks/model/Item.java deleted file mode 100644 index 3e1f4a7ef4..0000000000 --- a/libraries/src/main/java/com/baeldung/smooks/model/Item.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.baeldung.smooks.model; - -public class Item { - - public Item() { - } - - public Item(String code, Double price, Integer quantity) { - this.code = code; - this.price = price; - this.quantity = quantity; - } - - private String code; - private Double price; - private Integer quantity; - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public Double getPrice() { - return price; - } - - public void setPrice(Double price) { - this.price = price; - } - - public Integer getQuantity() { - return quantity; - } - - public void setQuantity(Integer quantity) { - this.quantity = quantity; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - Item item = (Item) o; - - if (code != null ? !code.equals(item.code) : item.code != null) - return false; - if (price != null ? !price.equals(item.price) : item.price != null) - return false; - return quantity != null ? quantity.equals(item.quantity) : item.quantity == null; - } - - @Override - public int hashCode() { - int result = code != null ? code.hashCode() : 0; - result = 31 * result + (price != null ? price.hashCode() : 0); - result = 31 * result + (quantity != null ? quantity.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "Item{" + "code='" + code + '\'' + ", price=" + price + ", quantity=" + quantity + '}'; - } -} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Order.java b/libraries/src/main/java/com/baeldung/smooks/model/Order.java deleted file mode 100644 index 047e1fe8a3..0000000000 --- a/libraries/src/main/java/com/baeldung/smooks/model/Order.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.smooks.model; - -import java.util.Date; -import java.util.List; - -public class Order { - private Date creationDate; - private Long number; - private Status status; - private Supplier supplier; - private List items; - - public Date getCreationDate() { - return creationDate; - } - - public void setCreationDate(Date creationDate) { - this.creationDate = creationDate; - } - - public Long getNumber() { - return number; - } - - public void setNumber(Long number) { - this.number = number; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - public Supplier getSupplier() { - return supplier; - } - - public void setSupplier(Supplier supplier) { - this.supplier = supplier; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } -} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Status.java b/libraries/src/main/java/com/baeldung/smooks/model/Status.java deleted file mode 100644 index 53c50bdf46..0000000000 --- a/libraries/src/main/java/com/baeldung/smooks/model/Status.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.smooks.model; - -public enum Status { - NEW, IN_PROGRESS, FINISHED -} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Supplier.java b/libraries/src/main/java/com/baeldung/smooks/model/Supplier.java deleted file mode 100644 index 827a0fc907..0000000000 --- a/libraries/src/main/java/com/baeldung/smooks/model/Supplier.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.smooks.model; - -public class Supplier { - - private String name; - private String phoneNumber; - - public Supplier() { - } - - public Supplier(String name, String phoneNumber) { - this.name = name; - this.phoneNumber = phoneNumber; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - Supplier supplier = (Supplier) o; - - if (name != null ? !name.equals(supplier.name) : supplier.name != null) - return false; - return phoneNumber != null ? phoneNumber.equals(supplier.phoneNumber) : supplier.phoneNumber == null; - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + (phoneNumber != null ? phoneNumber.hashCode() : 0); - return result; - } -} diff --git a/libraries/src/test/java/com/baeldung/crdt/CRDTUnitTest.java b/libraries/src/test/java/com/baeldung/crdt/CRDTUnitTest.java deleted file mode 100644 index 840263e430..0000000000 --- a/libraries/src/test/java/com/baeldung/crdt/CRDTUnitTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.baeldung.crdt; - -import com.netopyr.wurmloch.crdt.GCounter; -import com.netopyr.wurmloch.crdt.GSet; -import com.netopyr.wurmloch.crdt.LWWRegister; -import com.netopyr.wurmloch.crdt.PNCounter; -import com.netopyr.wurmloch.store.LocalCrdtStore; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CRDTUnitTest { - - @Test - public void givenGrowOnlySet_whenTwoReplicasDiverge_thenShouldMergeItWithoutAConflict() { - // given - final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); - final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); - crdtStore1.connect(crdtStore2); - - final GSet replica1 = crdtStore1.createGSet("ID_1"); - final GSet replica2 = crdtStore2. findGSet("ID_1").get(); - - // when - replica1.add("apple"); - replica2.add("banana"); - - // then - assertThat(replica1).contains("apple", "banana"); - assertThat(replica2).contains("apple", "banana"); - - // when - crdtStore1.disconnect(crdtStore2); - - replica1.add("strawberry"); - replica2.add("pear"); - - assertThat(replica1).contains("apple", "banana", "strawberry"); - assertThat(replica2).contains("apple", "banana", "pear"); - - crdtStore1.connect(crdtStore2); - - // then - assertThat(replica1).contains("apple", "banana", "strawberry", "pear"); - assertThat(replica2).contains("apple", "banana", "strawberry", "pear"); - } - - @Test - public void givenIncrementOnlyCounter_whenTwoReplicasDiverge_thenShouldMergeIt() { - // given - final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); - final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); - crdtStore1.connect(crdtStore2); - - final GCounter replica1 = crdtStore1.createGCounter("ID_1"); - final GCounter replica2 = crdtStore2.findGCounter("ID_1").get(); - - // when - replica1.increment(); - replica2.increment(2L); - - // then - assertThat(replica1.get()).isEqualTo(3L); - assertThat(replica2.get()).isEqualTo(3L); - - // when - crdtStore1.disconnect(crdtStore2); - - replica1.increment(3L); - replica2.increment(5L); - - assertThat(replica1.get()).isEqualTo(6L); - assertThat(replica2.get()).isEqualTo(8L); - - crdtStore1.connect(crdtStore2); - - // then - assertThat(replica1.get()).isEqualTo(11L); - assertThat(replica2.get()).isEqualTo(11L); - } - - @Test - public void givenPNCounter_whenReplicasDiverge_thenShouldMergeWithoutAConflict() { - // given - final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); - final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); - crdtStore1.connect(crdtStore2); - - final PNCounter replica1 = crdtStore1.createPNCounter("ID_1"); - final PNCounter replica2 = crdtStore2.findPNCounter("ID_1").get(); - - // when - replica1.increment(); - replica2.decrement(2L); - - // then - assertThat(replica1.get()).isEqualTo(-1L); - assertThat(replica2.get()).isEqualTo(-1L); - - // when - crdtStore1.disconnect(crdtStore2); - - replica1.decrement(3L); - replica2.increment(5L); - - assertThat(replica1.get()).isEqualTo(-4L); - assertThat(replica2.get()).isEqualTo(4L); - - crdtStore1.connect(crdtStore2); - - // then - assertThat(replica1.get()).isEqualTo(1L); - assertThat(replica2.get()).isEqualTo(1L); - } - - @Test - public void givenLastWriteWinsStrategy_whenReplicasDiverge_thenAfterMergeShouldKeepOnlyLastValue() { - // given - final LocalCrdtStore crdtStore1 = new LocalCrdtStore("N_1"); - final LocalCrdtStore crdtStore2 = new LocalCrdtStore("N_2"); - crdtStore1.connect(crdtStore2); - - final LWWRegister replica1 = crdtStore1.createLWWRegister("ID_1"); - final LWWRegister replica2 = crdtStore2. findLWWRegister("ID_1").get(); - - // when - replica1.set("apple"); - replica2.set("banana"); - - // then - assertThat(replica1.get()).isEqualTo("banana"); - assertThat(replica2.get()).isEqualTo("banana"); - - // when - crdtStore1.disconnect(crdtStore2); - - replica1.set("strawberry"); - replica2.set("pear"); - - assertThat(replica1.get()).isEqualTo("strawberry"); - assertThat(replica2.get()).isEqualTo("pear"); - - crdtStore1.connect(crdtStore2); - - // then - assertThat(replica1.get()).isEqualTo("pear"); - assertThat(replica2.get()).isEqualTo("pear"); - } -} diff --git a/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java deleted file mode 100644 index 358b3390f9..0000000000 --- a/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.baeldung.google.sheets; - -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.junit.BeforeClass; -import org.junit.Test; - -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.AppendValuesResponse; -import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; -import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; -import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; -import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; -import com.google.api.services.sheets.v4.model.CopyPasteRequest; -import com.google.api.services.sheets.v4.model.GridRange; -import com.google.api.services.sheets.v4.model.Request; -import com.google.api.services.sheets.v4.model.Spreadsheet; -import com.google.api.services.sheets.v4.model.SpreadsheetProperties; -import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; -import com.google.api.services.sheets.v4.model.UpdateValuesResponse; -import com.google.api.services.sheets.v4.model.ValueRange; - -import static org.assertj.core.api.Assertions.*; - -public class GoogleSheetsLiveTest { - - private static Sheets sheetsService; - - // this id can be replaced with your spreadsheet id - // otherwise be advised that multiple people may run this test and update the public spreadsheet - private static final String SPREADSHEET_ID = "1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI"; - - @BeforeClass - public static void setup() throws GeneralSecurityException, IOException { - sheetsService = SheetsServiceUtil.getSheetsService(); - } - - @Test - public void whenWriteSheet_thenReadSheetOk() throws IOException { - ValueRange body = new ValueRange().setValues(Arrays.asList(Arrays.asList("Expenses January"), Arrays.asList("books", "30"), Arrays.asList("pens", "10"), Arrays.asList("Expenses February"), Arrays.asList("clothes", "20"), Arrays.asList("shoes", "5"))); - UpdateValuesResponse result = sheetsService.spreadsheets().values().update(SPREADSHEET_ID, "A1", body).setValueInputOption("RAW").execute(); - - List data = new ArrayList<>(); - data.add(new ValueRange().setRange("D1").setValues(Arrays.asList(Arrays.asList("January Total", "=B2+B3")))); - data.add(new ValueRange().setRange("D4").setValues(Arrays.asList(Arrays.asList("February Total", "=B5+B6")))); - - BatchUpdateValuesRequest batchBody = new BatchUpdateValuesRequest().setValueInputOption("USER_ENTERED").setData(data); - BatchUpdateValuesResponse batchResult = sheetsService.spreadsheets().values().batchUpdate(SPREADSHEET_ID, batchBody).execute(); - - List ranges = Arrays.asList("E1", "E4"); - BatchGetValuesResponse readResult = sheetsService.spreadsheets().values().batchGet(SPREADSHEET_ID).setRanges(ranges).execute(); - - ValueRange januaryTotal = readResult.getValueRanges().get(0); - assertThat(januaryTotal.getValues().get(0).get(0)).isEqualTo("40"); - - ValueRange febTotal = readResult.getValueRanges().get(1); - assertThat(febTotal.getValues().get(0).get(0)).isEqualTo("25"); - - ValueRange appendBody = new ValueRange().setValues(Arrays.asList(Arrays.asList("Total", "=E1+E4"))); - AppendValuesResponse appendResult = sheetsService.spreadsheets().values().append(SPREADSHEET_ID, "A1", appendBody).setValueInputOption("USER_ENTERED").setInsertDataOption("INSERT_ROWS").setIncludeValuesInResponse(true).execute(); - - ValueRange total = appendResult.getUpdates().getUpdatedData(); - assertThat(total.getValues().get(0).get(1)).isEqualTo("65"); - } - - @Test - public void whenUpdateSpreadSheetTitle_thenOk() throws IOException { - - UpdateSpreadsheetPropertiesRequest updateRequest = new UpdateSpreadsheetPropertiesRequest().setFields("*").setProperties(new SpreadsheetProperties().setTitle("Expenses")); - - CopyPasteRequest copyRequest = new CopyPasteRequest().setSource(new GridRange().setSheetId(0).setStartColumnIndex(0).setEndColumnIndex(2).setStartRowIndex(0).setEndRowIndex(1)) - .setDestination(new GridRange().setSheetId(1).setStartColumnIndex(0).setEndColumnIndex(2).setStartRowIndex(0).setEndRowIndex(1)).setPasteType("PASTE_VALUES"); - - List requests = new ArrayList<>(); - - requests.add(new Request().setCopyPaste(copyRequest)); - requests.add(new Request().setUpdateSpreadsheetProperties(updateRequest)); - - BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest().setRequests(requests); - - sheetsService.spreadsheets().batchUpdate(SPREADSHEET_ID, body).execute(); - } - - @Test - public void whenCreateSpreadSheet_thenIdOk() throws IOException { - Spreadsheet spreadSheet = new Spreadsheet().setProperties(new SpreadsheetProperties().setTitle("My Spreadsheet")); - Spreadsheet result = sheetsService.spreadsheets().create(spreadSheet).execute(); - - assertThat(result.getSpreadsheetId()).isNotNull(); - } - -} diff --git a/libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java b/libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java deleted file mode 100644 index 2c8113771e..0000000000 --- a/libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.hll; - -import com.google.common.hash.HashFunction; -import com.google.common.hash.Hashing; -import net.agkn.hll.HLL; -import org.assertj.core.data.Offset; -import org.junit.Test; - -import java.util.stream.LongStream; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -public class HLLLongRunningManualTest { - - @Test - public void givenHLL_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinality() { - // given - long numberOfElements = 100_000_000; - long toleratedDifference = 1_000_000; - HashFunction hashFunction = Hashing.murmur3_128(); - HLL hll = new HLL(14, 5); - - // when - LongStream.range(0, numberOfElements).forEach(element -> { - long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); - hll.addRaw(hashedValue); - }); - - // then - long cardinality = hll.cardinality(); - assertThat(cardinality).isCloseTo(numberOfElements, Offset.offset(toleratedDifference)); - } - - @Test - public void givenTwoHLLs_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinalityForUnionOfHLLs() { - // given - long numberOfElements = 100_000_000; - long toleratedDifference = 1_000_000; - HashFunction hashFunction = Hashing.murmur3_128(); - HLL firstHll = new HLL(15, 5); - HLL secondHLL = new HLL(15, 5); - - // when - LongStream.range(0, numberOfElements).forEach(element -> { - long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); - firstHll.addRaw(hashedValue); - }); - - LongStream.range(numberOfElements, numberOfElements * 2).forEach(element -> { - long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); - secondHLL.addRaw(hashedValue); - }); - - // then - firstHll.union(secondHLL); - long cardinality = firstHll.cardinality(); - assertThat(cardinality).isCloseTo(numberOfElements * 2, Offset.offset(toleratedDifference * 2)); - } -} diff --git a/libraries/src/test/java/com/baeldung/infinispan/AbstractIntegrationTest.java b/libraries/src/test/java/com/baeldung/infinispan/AbstractIntegrationTest.java deleted file mode 100644 index 2a9d430430..0000000000 --- a/libraries/src/test/java/com/baeldung/infinispan/AbstractIntegrationTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.infinispan; - -import com.baeldung.infinispan.listener.CacheListener; -import com.baeldung.infinispan.repository.HelloWorldRepository; -import com.baeldung.infinispan.service.HelloWorldService; -import com.baeldung.infinispan.service.TransactionalService; -import org.infinispan.Cache; -import org.infinispan.manager.DefaultCacheManager; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; - -import java.util.function.Supplier; - -@Ignore -public abstract class AbstractIntegrationTest { - - private DefaultCacheManager cacheManager; - - private HelloWorldRepository repository = new HelloWorldRepository(); - - protected HelloWorldService helloWorldService; - protected TransactionalService transactionalService; - - @Before - public void setup() { - CacheConfiguration configuration = new CacheConfiguration(); - CacheListener listener = new CacheListener(); - - cacheManager = configuration.cacheManager(); - - Cache transactionalCache = configuration.transactionalCache(cacheManager, listener); - - Cache simpleHelloWorldCache = configuration.simpleHelloWorldCache(cacheManager, listener); - - Cache expiringHelloWorldCache = configuration.expiringHelloWorldCache(cacheManager, listener); - - Cache evictingHelloWorldCache = configuration.evictingHelloWorldCache(cacheManager, listener); - - Cache passivatingHelloWorldCache = configuration.passivatingHelloWorldCache(cacheManager, listener); - - this.helloWorldService = new HelloWorldService(repository, listener, simpleHelloWorldCache, expiringHelloWorldCache, evictingHelloWorldCache, passivatingHelloWorldCache); - - this.transactionalService = new TransactionalService(transactionalCache); - } - - @After - public void tearDown() { - cacheManager.stop(); - } - - protected long timeThis(Supplier supplier) { - long millis = System.currentTimeMillis(); - supplier.get(); - return System.currentTimeMillis() - millis; - } -} diff --git a/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java b/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java deleted file mode 100644 index 46cc77cbba..0000000000 --- a/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceTemporaryLiveTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.infinispan.service; - -import com.baeldung.infinispan.AbstractIntegrationTest; -import org.junit.Test; - -import static org.assertj.core.api.Java6Assertions.assertThat; - -public class HelloWorldServiceTemporaryLiveTest extends AbstractIntegrationTest { - - @Test - public void whenGetIsCalledTwoTimes_thenTheSecondShouldHitTheCache() { - assertThat(timeThis(() -> helloWorldService.findSimpleHelloWorld())).isGreaterThanOrEqualTo(1000); - - assertThat(timeThis(() -> helloWorldService.findSimpleHelloWorld())).isLessThan(100); - } - - @Test - public void whenGetIsCalledTwoTimesQuickly_thenTheSecondShouldHitTheCache() { - assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); - - assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isLessThan(100); - } - - @Test - public void whenGetIsCalledTwoTimesSparsely_thenNeitherShouldHitTheCache() throws InterruptedException { - assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); - - Thread.sleep(1100); - - assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); - } - - @Test - public void givenOneEntryIsConfigured_whenTwoAreAdded_thenFirstShouldntBeAvailable() { - assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); - - assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 2"))).isGreaterThanOrEqualTo(1000); - - assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); - } - - @Test - public void givenOneEntryIsConfigured_whenTwoAreAdded_thenTheFirstShouldBeAvailable() { - assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); - - assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 2"))).isGreaterThanOrEqualTo(1000); - - assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 1"))).isLessThan(100); - } - -} diff --git a/libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java b/libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java deleted file mode 100644 index 800c6c2775..0000000000 --- a/libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.infinispan.service; - -import com.baeldung.infinispan.AbstractIntegrationTest; -import org.junit.Test; - -import static org.assertj.core.api.Java6Assertions.assertThat; - -public class TransactionalServiceIntegrationTest extends AbstractIntegrationTest { - - @Test - public void whenLockingAnEntry_thenItShouldBeInaccessible() throws InterruptedException { - Runnable backGroundJob = () -> transactionalService.startBackgroundBatch(); - Thread backgroundThread = new Thread(backGroundJob); - transactionalService.getQuickHowManyVisits(); - backgroundThread.start(); - Thread.sleep(100); // lets wait our thread warm up - - assertThat(timeThis(() -> transactionalService.getQuickHowManyVisits())).isGreaterThan(500).isLessThan(1000); - } - -} diff --git a/libraries/src/test/java/com/baeldung/measurement/WaterTankUnitTest.java b/libraries/src/test/java/com/baeldung/measurement/WaterTankUnitTest.java deleted file mode 100644 index e23eea1714..0000000000 --- a/libraries/src/test/java/com/baeldung/measurement/WaterTankUnitTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.baeldung.measurement; - -import javax.measure.Quantity; -import javax.measure.quantity.Area; -import javax.measure.quantity.Length; -import javax.measure.quantity.Pressure; -import javax.measure.quantity.Volume; - -import javax.measure.Unit; -import javax.measure.UnitConverter; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.junit.Test; - -import com.baeldung.measurement.WaterTank; - -import tec.units.ri.format.SimpleUnitFormat; -import tec.units.ri.quantity.Quantities; -import tec.units.ri.unit.MetricPrefix; -import static tec.units.ri.unit.Units.*; - -public class WaterTankUnitTest { - - @Test - public void givenQuantity_whenGetUnitAndConvertValue_thenSuccess() { - WaterTank waterTank = new WaterTank(); - waterTank.setCapacityMeasure(Quantities.getQuantity(9.2, LITRE)); - assertEquals(LITRE, waterTank.getCapacityMeasure().getUnit()); - - Quantity waterCapacity = waterTank.getCapacityMeasure(); - double volumeInLitre = waterCapacity.getValue().doubleValue(); - assertEquals(9.2, volumeInLitre, 0.0f); - - double volumeInMilliLitre = waterCapacity.to(MetricPrefix.MILLI(LITRE)).getValue().doubleValue(); - assertEquals(9200.0, volumeInMilliLitre, 0.0f); - - // compilation error - // volumeInMilliLitre = waterCapacity.to(MetricPrefix.MILLI(KILOGRAM)); - - Unit Kilometer = MetricPrefix.KILO(METRE); - - // compilation error - // Unit Centimeter = MetricPrefix.CENTI(LITRE); - } - - @Test - public void givenUnit_whenAlternateUnit_ThenGetAlternateUnit() { - - Unit PASCAL = NEWTON.divide(METRE.pow(2)).alternate("Pa").asType(Pressure.class); - assertTrue(SimpleUnitFormat.getInstance().parse("Pa").equals(PASCAL)); - } - - @Test - public void givenUnit_whenProduct_ThenGetProductUnit() { - Unit squareMetre = METRE.multiply(METRE).asType(Area.class); - Quantity line = Quantities.getQuantity(2, METRE); - assertEquals(line.multiply(line).getUnit(), squareMetre); - } - - @Test - public void givenMeters_whenConvertToKilometer_ThenConverted() { - double distanceInMeters = 50.0; - UnitConverter metreToKilometre = METRE.getConverterTo(MetricPrefix.KILO(METRE)); - double distanceInKilometers = metreToKilometre.convert(distanceInMeters); - assertEquals(0.05, distanceInKilometers, 0.00f); - } - - @Test - public void givenSymbol_WhenCompareToSystemUnit_ThenSuccess() { - assertTrue(SimpleUnitFormat.getInstance().parse("kW").equals(MetricPrefix.KILO(WATT))); - assertTrue(SimpleUnitFormat.getInstance().parse("ms").equals(SECOND.divide(1000))); - } - - @Test - public void givenUnits_WhenAdd_ThenSuccess() { - Quantity total = Quantities.getQuantity(2, METRE).add(Quantities.getQuantity(3, METRE)); - assertEquals(total.getValue().intValue(), 5); - - // compilation error - // Quantity total = Quantities.getQuantity(2, METRE).add(Quantities.getQuantity(3, LITRE)); - - Quantity totalKm = Quantities.getQuantity(2, METRE).add(Quantities.getQuantity(3, MetricPrefix.KILO(METRE))); - assertEquals(totalKm.getValue().intValue(), 3002); - } -} diff --git a/libraries/src/test/java/com/baeldung/opencsv/OpenCsvIntegrationTest.java b/libraries/src/test/java/com/baeldung/opencsv/OpenCsvIntegrationTest.java deleted file mode 100644 index fca96684ad..0000000000 --- a/libraries/src/test/java/com/baeldung/opencsv/OpenCsvIntegrationTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.opencsv; - -import com.baeldung.opencsv.helpers.Helpers; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class OpenCsvIntegrationTest { - - private Object testReadCsv(Object result) { - assert (result != null); - assert (result instanceof String); - assert (!((String) result).isEmpty()); - System.out.println(result); - return result; - } - - private Object testWriteCsv(Object result) { - assert (result instanceof String); - assert (!((String) result).isEmpty()); - return result; - } - - @Before - public void setup() { - } - - @Test - public void positionExampleTest() { - testReadCsv(Application.simpleSyncPositionBeanExample()); - } - - @Test - public void namedColumnExampleTest() { - testReadCsv(Application.namedSyncColumnBeanExample()); - } - - @Test - public void writeCsvUsingBeanBuilderTest() { - testWriteCsv(Application.writeSyncCsvFromBeanExample()); - } - - @Test - public void oneByOneExampleTest() { - testReadCsv(Application.oneByOneSyncExample()); - } - - @Test - public void readAllExampleTest() { - testReadCsv(Application.readAllSyncExample()); - } - - @Test - public void csvWriterOneByOneTest() { - testWriteCsv(Application.csvWriterSyncOneByOne()); - } - - @Test - public void csvWriterAllTest() { - testWriteCsv(Application.csvWriterSyncAll()); - } - - @After - public void close() { - } -} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java b/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java deleted file mode 100644 index df7fea58f8..0000000000 --- a/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.smooks.converter; - -import com.baeldung.smooks.model.Item; -import com.baeldung.smooks.model.Order; -import com.baeldung.smooks.model.Status; -import com.baeldung.smooks.model.Supplier; -import org.junit.Test; -import org.milyn.validation.ValidationResult; -import java.text.SimpleDateFormat; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -public class SmooksIntegrationTest { - - private static final String EDIFACT_MESSAGE = "UNA:+.? '" + System.lineSeparator() + "UNH+771+IN_PROGRESS+2018-01-14'" + System.lineSeparator() + "CTA+CompanyX+1234567'" + System.lineSeparator() + "LIN+1+PX1234+9.99'" + System.lineSeparator() - + "LIN+2+RX990+120.32'" + System.lineSeparator(); - private static final String EMAIL_MESSAGE = "Hi," + System.lineSeparator() + "Order number #771 created on 2018-01-14 is currently in IN_PROGRESS status." + System.lineSeparator() + "Consider contact supplier \"CompanyX\" with phone number: \"1234567\"." - + System.lineSeparator() + "Order items:" + System.lineSeparator() + "1 X PX1234 (total price 9.99)" + System.lineSeparator() + "2 X RX990 (total price 240.64)" + System.lineSeparator(); - - @Test - public void givenOrderXML_whenConvert_thenPOJOsConstructedCorrectly() throws Exception { - - OrderConverter xmlToJavaOrderConverter = new OrderConverter(); - Order order = xmlToJavaOrderConverter.convertOrderXMLToOrderObject("/smooks/order.xml"); - - assertThat(order.getNumber(), is(771L)); - assertThat(order.getStatus(), is(Status.IN_PROGRESS)); - assertThat(order.getCreationDate(), is(new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-14"))); - assertThat(order.getSupplier(), is(new Supplier("CompanyX", "1234567"))); - assertThat(order.getItems(), containsInAnyOrder(new Item("PX1234", 9.99, 1), new Item("RX990", 120.32, 2))); - - } - - @Test - public void givenIncorrectOrderXML_whenValidate_thenExpectValidationErrors() throws Exception { - OrderValidator orderValidator = new OrderValidator(); - ValidationResult validationResult = orderValidator.validate("/smooks/order.xml"); - - assertThat(validationResult.getErrors(), hasSize(1)); - // 1234567 didn't match ^[0-9\\-\\+]{9,15}$ - assertThat(validationResult.getErrors() - .get(0) - .getFailRuleResult() - .getRuleName(), is("supplierPhone")); - } - - @Test - public void givenOrderXML_whenApplyEDITemplate_thenConvertedToEDIFACT() throws Exception { - OrderConverter orderConverter = new OrderConverter(); - String edifact = orderConverter.convertOrderXMLtoEDIFACT("/smooks/order.xml"); - assertThat(edifact, is(EDIFACT_MESSAGE)); - } - - @Test - public void givenOrderXML_whenApplyEmailTemplate_thenConvertedToEmailMessage() throws Exception { - OrderConverter orderConverter = new OrderConverter(); - String emailMessage = orderConverter.convertOrderXMLtoEmailMessage("/smooks/order.xml"); - assertThat(emailMessage, is(EMAIL_MESSAGE)); - } -} \ No newline at end of file From 98f59f58a24ef56cb2309d8f3c6a1d17c89b7ae4 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Mon, 5 Aug 2019 17:12:55 +0100 Subject: [PATCH 26/43] [BAEL-16003] Added missing dependencies - mvn clean install now succeeds --- libraries-data-2/pom.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index 5570761d91..87c620f438 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -109,6 +109,21 @@ infinispan-core ${infinispan.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.springframework + spring-web + ${spring.version} + @@ -124,5 +139,7 @@ 1.7.0 9.1.5.Final v4-rev493-1.21.0 + 2.9.8 + 4.3.8.RELEASE \ No newline at end of file From c1920ddaaba38796b3105ec3fb3f2eb50acc2df9 Mon Sep 17 00:00:00 2001 From: Juan Vaccari Date: Mon, 5 Aug 2019 17:48:18 +0100 Subject: [PATCH 27/43] BAEL-2928 - Solve conflicts in pom.xml --- pom.xml | 1687 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 846 insertions(+), 841 deletions(-) diff --git a/pom.xml b/pom.xml index 45c84ffb11..0f7e0edd3e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,19 +1,15 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung parent-modules 1.0.0-SNAPSHOT - parent-modules + parent-modules pom - - quarkus - - @@ -57,11 +53,11 @@ test - org.junit.jupiter - junit-jupiter-api + org.junit.jupiter + junit-jupiter-api ${junit-jupiter.version} test - + org.hamcrest hamcrest-core @@ -123,22 +119,22 @@ - - org.junit.platform - junit-platform-surefire-provider - ${junit-platform.version} - - - org.junit.jupiter - junit-jupiter-engine - ${junit-jupiter.version} - - - org.junit.vintage - junit-vintage-engine - ${junit-jupiter.version} - - + + org.junit.platform + junit-platform-surefire-provider + ${junit-platform.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + + + org.junit.vintage + junit-vintage-engine + ${junit-jupiter.version} + + org.apache.maven.plugins @@ -312,6 +308,10 @@ 3 true + + SpringContextTest + **/*UnitTest + **/*IntegrationTest.java **/*IntTest.java @@ -328,66 +328,67 @@ parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin - - akka-streams - algorithms-genetic - algorithms-miscellaneous-1 - algorithms-miscellaneous-2 - algorithms-miscellaneous-3 - algorithms-sorting - animal-sniffer-mvn-plugin - annotations - antlr - apache-avro - apache-bval - apache-curator - apache-cxf - apache-fop - apache-geode - apache-meecrowave - apache-opennlp - apache-poi - apache-pulsar - apache-shiro - apache-solrj - apache-spark - apache-thrift - apache-tika - apache-velocity - apache-zookeeper - asciidoctor - asm - atomix - autovalue - aws - aws-lambda - axon - azure + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin + + akka-streams + algorithms-genetic + algorithms-miscellaneous-1 + algorithms-miscellaneous-2 + algorithms-miscellaneous-3 + algorithms-sorting + animal-sniffer-mvn-plugin + annotations + antlr + apache-avro + apache-bval + apache-curator + apache-cxf + apache-fop + apache-geode + apache-meecrowave + apache-opennlp + apache-poi + apache-pulsar + apache-shiro + apache-solrj + apache-spark + apache-thrift + apache-tika + apache-velocity + apache-zookeeper + asciidoctor + asm + atomix + autovalue + aws + aws-lambda + axon + azure - blade + blade - bootique + bootique - cas - cdi - checker-plugin - core-groovy - core-groovy-2 - core-groovy-collections - - - - core-java-modules/core-java-8 - core-java-modules/core-java-8-2 + cas + cdi + checker-plugin + core-groovy + core-groovy-2 + core-groovy-collections + + + + core-java-modules/core-java-8 + core-java-modules/core-java-8-2 core-java-modules/core-java-lambdas core-java-modules/core-java-arrays + core-java-modules/core-java-arrays-2 core-java-modules/core-java-collections core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 @@ -422,7 +423,6 @@ drools dubbo - easy-random ethereum feign @@ -462,12 +462,14 @@ java-lite java-numbers + java-numbers-2 java-rmi java-spi java-streams java-strings java-strings-2 + java-strings-ops java-vavr-stream java-websocket javafx @@ -476,329 +478,326 @@ jaxb - jee-7-security - jersey - JGit - jgroups - jhipster - jhipster-5 - jib - jjwt - jmeter - jmh - jni - jooby - jsf - json - json-path - jsoup - jta + jee-7-security + jersey + jgit + jgroups + jhipster-5 + jib + jjwt + jmeter + jmh + jni + jooby + jsf + json + json-path + jsoup + jta - - kotlin-libraries - kotlin-libraries-2 + + kotlin-libraries + kotlin-libraries-2 - - libraries - libraries-2 - libraries-data - libraries-apache-commons - libraries-primitive - libraries-security - libraries-server - libraries-http - linkrest - logging-modules - lombok - lucene + + libraries + libraries-2 + libraries-data + libraries-apache-commons + libraries-primitive + libraries-security + libraries-server + libraries-http + libraries-io + linkrest + logging-modules + lombok + lucene - mapstruct - maven - maven-archetype - - maven-polyglot/maven-polyglot-json-extension - - mesos-marathon - metrics - - microprofile - msf4j - - mustache - mybatis + mapstruct + maven + maven-archetype + + maven-polyglot/maven-polyglot-json-extension + + mesos-marathon + metrics + + microprofile + msf4j + + mustache + mybatis - optaplanner - orika - osgi + optaplanner + orika + osgi - patterns - pdf - performance-tests - - protobuffer + patterns + pdf + performance-tests + + protobuffer - persistence-modules - quarkus + persistence-modules + quarkus - rabbitmq - - ratpack - reactor-core - rest-with-spark-java - resteasy - restx - - rule-engines + rabbitmq + + ratpack + reactor-core + resteasy + restx + + rule-engines rsocket - rxjava - rxjava-2 - software-security/sql-injection-samples + rxjava + rxjava-2 + software-security/sql-injection-samples tensorflow-java spring-boot-flowable spring-security-kerberos - morphia - + oauth2-framework-impl - - default-second - - + + default-second + + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*JdbcTest.java - **/*LiveTest.java - - - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + SpringContextTest + **/*UnitTest + + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/*JdbcTest.java + **/*LiveTest.java + + + - - + + - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin - saas - spark-java + saas + spark-java - spring-4 + spring-4 - spring-5 - spring-5-webflux - spring-5-data-reactive - spring-5-mvc - spring-5-reactive - spring-5-reactive-client - spring-5-reactive-oauth - spring-5-reactive-security - spring-5-security - spring-5-security-oauth - spring-5-security-cognito + spring-5 + spring-5-webflux + spring-5-data-reactive + spring-5-mvc + spring-5-reactive + spring-5-reactive-2 + spring-5-reactive-client + spring-5-reactive-oauth + spring-5-reactive-security + spring-5-security + spring-5-security-oauth + spring-5-security-cognito - spring-activiti - spring-akka - spring-all - spring-amqp - spring-amqp-simple - spring-aop - spring-apache-camel - spring-batch - spring-bom + spring-activiti + spring-akka + spring-all + spring-amqp + spring-amqp-simple + spring-aop + spring-apache-camel + spring-batch + spring-bom - spring-boot - spring-boot-admin - spring-boot-angular - spring-boot-angular-ecommerce - spring-boot-autoconfiguration - spring-boot-bootstrap - spring-boot-camel - - spring-boot-client + spring-boot + spring-boot-admin + spring-boot-angular + spring-boot-angular-ecommerce + spring-boot-autoconfiguration + spring-boot-bootstrap + spring-boot-camel + + spring-boot-client - spring-boot-crud - spring-boot-ctx-fluent - spring-boot-custom-starter - spring-boot-disable-console-logging - - spring-boot-jasypt - spring-boot-keycloak - spring-boot-logging-log4j2 - spring-boot-mvc - spring-boot-mvc-birt - spring-boot-ops - spring-boot-ops-2 - spring-boot-rest - spring-boot-data - spring-boot-parent - spring-boot-property-exp - spring-boot-security - spring-boot-testing - spring-boot-vue - spring-boot-libraries + spring-boot-crud + spring-boot-ctx-fluent + spring-boot-custom-starter + spring-boot-disable-console-logging + + spring-boot-jasypt + spring-boot-keycloak + spring-boot-kotlin + spring-boot-logging-log4j2 + spring-boot-mvc + spring-boot-mvc-birt + spring-boot-ops + spring-boot-ops-2 + spring-boot-rest + spring-boot-data + spring-boot-parent + spring-boot-property-exp + spring-boot-security + spring-boot-testing + spring-boot-vue + spring-boot-libraries - spring-cloud - spring-cloud-bus - - spring-cloud-data-flow + + + + + - spring-core - spring-core-2 - spring-cucumber + spring-core + spring-core-2 + spring-cucumber - spring-data-rest - spring-data-rest-querydsl - spring-dispatcher-servlet - spring-drools - spring-di + spring-data-rest + + spring-dispatcher-servlet + spring-drools + spring-di + spring-ehcache + + spring-exceptions - spring-ehcache - spring-ejb - spring-exceptions + spring-freemarker - spring-freemarker + spring-groovy - spring-groovy + spring-integration - spring-integration + spring-jenkins-pipeline + spring-jersey + spring-jinq + spring-jms + spring-jooq - spring-jenkins-pipeline - spring-jersey - spring-jinq - spring-jms - spring-jooq + spring-kafka + spring-katharsis - spring-kafka - spring-katharsis + spring-ldap - spring-ldap + spring-mobile + spring-mockito + spring-mvc-forms-jsp + spring-mvc-forms-thymeleaf + spring-mvc-java + spring-mvc-kotlin + spring-mvc-simple + spring-mvc-simple-2 + spring-mvc-velocity + spring-mvc-webflow + spring-mvc-xml - spring-mobile - spring-mockito - spring-mvc-forms-jsp - spring-mvc-forms-thymeleaf - spring-mvc-java - spring-mvc-kotlin - spring-mvc-simple - spring-mvc-simple-2 - spring-mvc-velocity - spring-mvc-webflow - spring-mvc-xml + spring-protobuf + - spring-protobuf - + spring-quartz - spring-quartz + spring-reactive-kotlin + spring-reactor + spring-remoting + spring-rest + spring-rest-angular + spring-rest-full + spring-rest-hal-browser + spring-rest-query-language + spring-rest-shell + spring-rest-simple + spring-resttemplate + spring-roo + spring-security-acl + spring-security-angular/server + spring-security-cache-control - spring-reactive-kotlin - spring-reactor - spring-remoting - spring-rest - spring-rest-angular - spring-rest-full - spring-rest-hal-browser - spring-rest-query-language - spring-rest-shell - spring-rest-simple - spring-resttemplate - spring-roo - spring-security-acl - spring-security-angular/server - spring-security-cache-control - - spring-security-client - - spring-security-core - spring-security-mvc-boot - spring-security-mvc-custom - spring-security-mvc-digest-auth + spring-security-core + spring-security-mvc-boot + spring-security-mvc-custom + spring-security-mvc-digest-auth spring-security-mvc-jsonview - spring-security-mvc-ldap - spring-security-mvc-login - spring-security-mvc-persisted-remember-me - spring-security-mvc-session - spring-security-mvc-socket - spring-security-openid - - spring-security-rest - spring-security-rest-basic-auth - spring-security-rest-custom - spring-security-sso - spring-security-stormpath - spring-security-thymeleaf - spring-security-x509 - spring-session - spring-sleuth - spring-soap - spring-social-login - spring-spel - spring-state-machine - spring-static-resources - spring-swagger-codegen + spring-security-mvc-ldap + spring-security-mvc-login + spring-security-mvc-persisted-remember-me + spring-security-mvc + spring-security-mvc-socket + spring-security-openid + + spring-security-rest + spring-security-rest-basic-auth + spring-security-rest-custom + spring-security-sso + spring-security-stormpath + spring-security-thymeleaf + spring-security-x509 + + spring-sleuth + spring-soap + spring-social-login + spring-spel + spring-state-machine + spring-static-resources + spring-swagger-codegen - spring-thymeleaf + spring-thymeleaf - spring-userservice + + spring-vertx - spring-vault - spring-vertx + - spring-webflux-amqp + spring-zuul - spring-zuul + static-analysis + stripe + structurizr + struts-2 - static-analysis - stripe - structurizr - struts-2 + testing-modules - testing-modules + twilio + twitter4j - twilio - Twitter4J + undertow - undertow + vertx + vertx-and-rxjava + video-tutorials + vraptor - vavr - vertx - vertx-and-rxjava - video-tutorials - vraptor + wicket - wicket - - xml - xmlunit-2 - xstream + xml + xstream tensorflow-java spring-boot-flowable spring-security-kerberos - morphia - + - + spring-context @@ -825,6 +824,7 @@ spring-5 spring-5-data-reactive spring-5-reactive + spring-5-reactive-2 spring-5-reactive-client spring-5-reactive-security spring-5-security @@ -843,6 +843,7 @@ spring-boot-camel spring-boot-client spring-boot-custom-starter + spring-boot-di greeter-spring-boot-autoconfigure greeter-spring-boot-sample-app persistence-modules/spring-boot-h2/spring-boot-h2-database @@ -909,14 +910,13 @@ spring-security-acl spring-security-angular spring-security-cache-control - spring-security-client spring-security-core spring-security-mvc-boot spring-security-mvc-custom spring-security-mvc-digest-auth spring-security-mvc-ldap spring-security-mvc-persisted-remember-me - spring-security-mvc-session + spring-security-mvc spring-security-mvc-socket spring-security-rest spring-security-sso @@ -931,7 +931,6 @@ spring-state-machine spring-swagger-codegen/spring-swagger-codegen-app spring-thymeleaf - spring-userservice spring-vault spring-vertx spring-zuul/spring-zuul-foos-resource @@ -947,572 +946,576 @@ - - default-heavy - - + + default-heavy + + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*JdbcTest.java - **/*LiveTest.java - - - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + SpringContextTest + **/*UnitTest + + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/*JdbcTest.java + **/*LiveTest.java + + + - - + + - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin - core-java-modules/core-java-concurrency-advanced - core-kotlin - core-kotlin-2 - core-kotlin-io + core-java-modules/core-java-concurrency-advanced + core-kotlin + core-kotlin-2 + core-kotlin-io - jenkins/hello-world - jws + jenkins/hello-world + jhipster + jws - libraries + libraries + persistence-modules/hibernate5 + persistence-modules/hibernate-mapping + persistence-modules/java-jpa + persistence-modules/java-jpa-2 + persistence-modules/java-mongodb + persistence-modules/jnosql - persistence-modules/hibernate5 - persistence-modules/hibernate-mapping - persistence-modules/java-jpa - persistence-modules/java-mongodb - persistence-modules/jnosql + vaadin + vavr + + - vaadin - - + + integration-lite-first - - integration-lite-first + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*ManualTest.java + **/*LiveTest.java + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin + + akka-streams + algorithms-genetic + algorithms-miscellaneous-1 + algorithms-miscellaneous-2 + algorithms-miscellaneous-3 + algorithms-sorting + animal-sniffer-mvn-plugin + annotations + antlr + apache-avro + apache-bval + apache-curator + apache-cxf + apache-fop + apache-geode + apache-meecrowave + apache-opennlp + apache-poi + apache-pulsar + apache-shiro + apache-solrj + apache-spark + apache-thrift + apache-tika + apache-velocity + apache-zookeeper + asciidoctor + asm + atomix + autovalue + aws + aws-lambda + axon + azure - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin - - akka-streams - algorithms-genetic - algorithms-miscellaneous-1 - algorithms-miscellaneous-2 - algorithms-miscellaneous-3 - algorithms-sorting - animal-sniffer-mvn-plugin - annotations - antlr - apache-avro - apache-bval - apache-curator - apache-cxf - apache-fop - apache-geode - apache-meecrowave - apache-opennlp - apache-poi - apache-pulsar - apache-shiro - apache-solrj - apache-spark - apache-thrift - apache-tika - apache-velocity - apache-zookeeper - asciidoctor - asm - atomix - autovalue - aws - aws-lambda - axon - azure + bootique - bootique + cas + cdi + checker-plugin + core-groovy + core-groovy-2 + core-groovy-collections + + + core-java-modules/core-java-8 + core-java-modules/core-java-8-2 + + + core-java-modules/core-java-arrays + core-java-modules/core-java-arrays-2 + core-java-modules/core-java-collections + core-java-modules/core-java-collections-list + core-java-modules/core-java-collections-list-2 + core-java-modules/core-java-collections-array-list + core-java-modules/core-java-collections-set + core-java-modules/core-java-concurrency-basic + core-java-modules/core-java-concurrency-collections + core-java-modules/core-java-io + core-java-modules/core-java-nio + core-java-modules/core-java-security + core-java-modules/core-java-lang-syntax + core-java-modules/core-java-lang + core-java-modules/core-java-lang-oop + core-java-modules/core-java-lang-oop-2 + core-java-modules + core-java-modules/core-java-networking + core-java-modules/core-java-perf + core-java-modules/core-java-sun + core-scala + couchbase + custom-pmd - cas - cdi - checker-plugin - core-groovy - core-groovy-2 - core-groovy-collections - - - core-java-modules/core-java-8 - core-java-modules/core-java-8-2 - - - core-java-modules/core-java-arrays - core-java-modules/core-java-collections - core-java-modules/core-java-collections-list - core-java-modules/core-java-collections-list-2 - core-java-modules/core-java-collections-array-list - core-java-modules/core-java-collections-set - core-java-modules/core-java-concurrency-basic - core-java-modules/core-java-concurrency-collections - core-java-modules/core-java-io - core-java-modules/core-java-nio - core-java-modules/core-java-security - core-java-modules/core-java-lang-syntax - core-java-modules/core-java-lang - core-java-modules/core-java-lang-oop - core-java-modules/core-java-lang-oop-2 - core-java-modules - core-java-modules/core-java-networking - core-java-modules/core-java-perf - core-java-modules/core-java-sun - core-scala - couchbase - custom-pmd + dagger + data-structures + ddd + deeplearning4j + disruptor + dozer + drools + dubbo - dagger - data-structures - ddd - deeplearning4j - disruptor - dozer - drools - dubbo + ethereum - ethereum + feign + flyway-cdi-extension - feign - flyway-cdi-extension + geotools + google-cloud + google-web-toolkit + + + graphql/graphql-java + grpc + gson + guava + guava-collections + guava-modules + + guice - geotools - google-cloud - google-web-toolkit - - - graphql/graphql-java - grpc - gson - guava - guava-collections - guava-modules - - guice + hazelcast + helidon + httpclient + httpclient-simple + hystrix - hazelcast - helidon - httpclient - httpclient-simple - hystrix + image-processing + immutables - image-processing - immutables - - jackson - jackson-2 - jackson-simple - java-collections-conversions - java-collections-maps - java-collections-maps-2 - - java-ee-8-security-api - java-lite - java-numbers - java-rmi - java-spi - java-streams - - java-strings - java-strings-2 - java-vavr-stream - java-websocket - javafx - javax-servlets - javaxval - jaxb - + java-ee-8-security-api + java-lite + java-numbers + java-numbers-2 + java-rmi + java-spi + java-streams + + java-strings + java-strings-2 + java-strings-ops + java-vavr-stream + java-websocket + javafx + javax-servlets + javaxval + jaxb + - jee-7-security - jersey - JGit - jgroups - jhipster - jhipster-5 - jib - jjwt - jmeter - jmh - jni - jooby - jsf - json - json-path - jsoup - jta + jee-7-security + jersey + jgit + jgroups + jhipster-5 + jib + jjwt + jmeter + jmh + jni + jooby + jsf + json + json-path + jsoup + jta - - kotlin-libraries + + kotlin-libraries - - libraries - libraries-data - libraries-apache-commons - libraries-security - libraries-server - libraries-http - linkrest - logging-modules - lombok - lucene + + libraries + libraries-data + libraries-apache-commons + libraries-security + libraries-server + libraries-http + linkrest + logging-modules + lombok + lucene - mapstruct - maven - - maven-archetype - - maven-polyglot/maven-polyglot-json-extension - - mesos-marathon - metrics - - microprofile - msf4j - - mustache - mybatis + mapstruct + maven + + maven-archetype + + maven-polyglot/maven-polyglot-json-extension + + mesos-marathon + metrics + + microprofile + msf4j + + mustache + mybatis - optaplanner - orika - osgi + optaplanner + orika + osgi - patterns - pdf - performance-tests - - protobuffer + patterns + pdf + performance-tests + + protobuffer - persistence-modules + persistence-modules - rabbitmq - - ratpack - reactor-core - rest-with-spark-java - resteasy - restx - - rule-engines - rsocket - rxjava - rxjava-2 + rabbitmq + + ratpack + reactor-core + resteasy + restx + + rule-engines + rsocket + rxjava + rxjava-2 + oauth2-framework-impl - + - + - - integration-lite-second + + integration-lite-second - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*ManualTest.java + **/*LiveTest.java + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin - saas - spark-java + saas + spark-java - spring-4 + spring-4 - spring-5 - spring-5-data-reactive - spring-5-mvc - spring-5-reactive - spring-5-reactive-client - spring-5-reactive-oauth - spring-5-reactive-security - spring-5-security - spring-5-security-oauth - spring-5-security-cognito - spring-activiti - spring-akka - spring-all - spring-amqp - spring-amqp-simple - spring-aop - spring-apache-camel - spring-batch - spring-bom + spring-5 + spring-5-data-reactive + spring-5-mvc + spring-5-reactive + spring-5-reactive-2 + spring-5-reactive-client + spring-5-reactive-oauth + spring-5-reactive-security + spring-5-security + spring-5-security-oauth + spring-5-security-cognito + spring-activiti + spring-akka + spring-all + spring-amqp + spring-amqp-simple + spring-aop + spring-apache-camel + spring-batch + spring-bom - spring-boot - spring-boot-admin - spring-boot-angular - spring-boot-angular-ecommerce - spring-boot-autoconfiguration - spring-boot-bootstrap - spring-boot-camel - - spring-boot-client - spring-boot-crud - spring-boot-ctx-fluent - spring-boot-custom-starter - spring-boot-disable-console-logging - - spring-boot-jasypt - spring-boot-keycloak - spring-boot-logging-log4j2 - spring-boot-mvc - spring-boot-mvc-birt - spring-boot-ops - spring-boot-ops-2 - spring-boot-rest - spring-boot-data - spring-boot-parent - spring-boot-property-exp - spring-boot-security - spring-boot-vue + spring-boot + spring-boot-admin + spring-boot-angular + spring-boot-angular-ecommerce + spring-boot-autoconfiguration + spring-boot-bootstrap + spring-boot-camel + + spring-boot-client + spring-boot-crud + spring-boot-ctx-fluent + spring-boot-custom-starter + spring-boot-disable-console-logging + + spring-boot-jasypt + spring-boot-keycloak + spring-boot-logging-log4j2 + spring-boot-mvc + spring-boot-mvc-birt + spring-boot-ops + spring-boot-ops-2 + spring-boot-rest + spring-boot-data + spring-boot-parent + spring-boot-property-exp + spring-boot-security + spring-boot-vue - spring-cloud - spring-cloud-bus - - spring-cloud-data-flow + spring-cloud + spring-cloud-bus + + spring-cloud-data-flow - spring-core - spring-core-2 - spring-cucumber + spring-core + spring-core-2 + spring-cucumber - spring-data-rest - spring-data-rest-querydsl - spring-dispatcher-servlet - spring-drools - spring-di + spring-data-rest + spring-data-rest-querydsl + spring-dispatcher-servlet + spring-drools + spring-di spring-ehcache - spring-ejb - spring-exceptions + spring-ejb + spring-exceptions - spring-freemarker + spring-freemarker - spring-groovy + spring-groovy - spring-integration + spring-integration - spring-jenkins-pipeline - spring-jersey - spring-jinq - spring-jms - spring-jooq + spring-jenkins-pipeline + spring-jersey + spring-jinq + spring-jms + spring-jooq - spring-kafka - spring-katharsis + spring-kafka + spring-katharsis - spring-ldap + spring-ldap - spring-mobile - spring-mockito - spring-mvc-forms-jsp - spring-mvc-forms-thymeleaf - spring-mvc-java - spring-mvc-kotlin - spring-mvc-simple - spring-mvc-simple-2 - spring-mvc-velocity - spring-mvc-webflow - spring-mvc-xml + spring-mobile + spring-mockito + spring-mvc-forms-jsp + spring-mvc-forms-thymeleaf + spring-mvc-java + spring-mvc-kotlin + spring-mvc-simple + spring-mvc-simple-2 + spring-mvc-velocity + spring-mvc-webflow + spring-mvc-xml - spring-protobuf - + spring-protobuf + - spring-quartz + spring-quartz - spring-reactive-kotlin - spring-reactor - spring-remoting - spring-rest - spring-rest-angular - spring-rest-full - spring-rest-hal-browser - spring-rest-query-language - spring-rest-shell - spring-rest-simple - spring-resttemplate - spring-roo + spring-reactive-kotlin + spring-reactor + spring-remoting + spring-rest + spring-rest-angular + spring-rest-full + spring-rest-hal-browser + spring-rest-query-language + spring-rest-shell + spring-rest-simple + spring-resttemplate + spring-roo - spring-security-acl - spring-security-angular/server - spring-security-cache-control + spring-security-acl + spring-security-angular/server + spring-security-cache-control + spring-security-core + spring-security-mvc-boot + spring-security-mvc-custom + spring-security-mvc-digest-auth + spring-security-mvc-ldap + spring-security-mvc-login + spring-security-mvc-persisted-remember-me + spring-security-mvc + spring-security-mvc-socket + spring-security-openid + + spring-security-rest + spring-security-rest-basic-auth + spring-security-rest-custom + spring-security-sso + spring-security-stormpath + spring-security-thymeleaf + spring-security-x509 + spring-session + spring-sleuth + spring-soap + spring-social-login + spring-spel + spring-state-machine + spring-static-resources + spring-swagger-codegen - spring-security-client + spring-thymeleaf - spring-security-core - spring-security-mvc-boot - spring-security-mvc-custom - spring-security-mvc-digest-auth - spring-security-mvc-ldap - spring-security-mvc-login - spring-security-mvc-persisted-remember-me - spring-security-mvc-session - spring-security-mvc-socket - spring-security-openid - - spring-security-rest - spring-security-rest-basic-auth - spring-security-rest-custom - spring-security-sso - spring-security-stormpath - spring-security-thymeleaf - spring-security-x509 - spring-session - spring-sleuth - spring-soap - spring-social-login - spring-spel - spring-state-machine - spring-static-resources - spring-swagger-codegen + spring-vault + spring-vertx - spring-thymeleaf + spring-webflux-amqp - spring-userservice + spring-zuul - spring-vault - spring-vertx + static-analysis + stripe + structurizr + struts-2 - spring-webflux-amqp + testing-modules - spring-zuul + twilio + twitter4j - static-analysis - stripe - structurizr - struts-2 + undertow - testing-modules + vertx + vertx-and-rxjava + video-tutorials + vraptor - twilio - Twitter4J + wicket - undertow + xml + xstream + - vavr - vertx - vertx-and-rxjava - video-tutorials - vraptor + - wicket + + integration-heavy - xml - xmlunit-2 - xstream + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*ManualTest.java + **/*LiveTest.java + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + - + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin - + core-java-modules/core-java + core-java-modules/core-java-concurrency-advanced + core-kotlin + core-kotlin-2 - - integration-heavy + jenkins/hello-world + jhipster + jws - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - + libraries - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin + persistence-modules/hibernate5 + persistence-modules/java-jpa + persistence-modules/java-jpa-2 + persistence-modules/java-mongodb + persistence-modules/jnosql - core-java-modules/core-java - core-java-modules/core-java-concurrency-advanced - core-kotlin - core-kotlin-2 + vaadin + vavr + - jenkins/hello-world - jws - - libraries - - persistence-modules/hibernate5 - persistence-modules/java-jpa - persistence-modules/java-mongodb - persistence-modules/jnosql - - vaadin - - - + @@ -1546,7 +1549,7 @@ 1.1.7 - + 2.21.0 3.7.0 1.6.0 @@ -1561,6 +1564,7 @@ 2.21.0 2.5 2.6 + 3.5 1.4 3.0.0 3.1.0 @@ -1582,4 +1586,5 @@ 1.16.12 1.4.197 - + + \ No newline at end of file From 4b7d77eb1dfe70694031c54d0be3892e4dfc89c1 Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Mon, 5 Aug 2019 19:57:12 +0200 Subject: [PATCH 28/43] Get rid of custom.properties --- .../main/java/com/baeldung/idc/Application.java | 15 ++------------- spring-5-mvc/src/main/resources/custom.properties | 2 -- 2 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 spring-5-mvc/src/main/resources/custom.properties diff --git a/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java b/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java index ff86301f7d..7288aded73 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java +++ b/spring-5-mvc/src/main/java/com/baeldung/idc/Application.java @@ -1,24 +1,13 @@ package com.baeldung.idc; -import java.util.HashMap; -import java.util.Map; - +import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; @SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.idc") -@PropertySource(value = { "classpath:/custom.properties" }, ignoreResourceNotFound = true) public class Application { public static void main(String[] args) { - final SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class); - final Map map = new HashMap<>(); - map.put("spring.config.name", "custom.properties"); - builder.properties(map).run(args); - + SpringApplication.run(Application.class, args); } } diff --git a/spring-5-mvc/src/main/resources/custom.properties b/spring-5-mvc/src/main/resources/custom.properties deleted file mode 100644 index 78c6675b26..0000000000 --- a/spring-5-mvc/src/main/resources/custom.properties +++ /dev/null @@ -1,2 +0,0 @@ -server.port=8080 -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration \ No newline at end of file From ab0477a4b29115a18229c33b5532edb99b7abf5c Mon Sep 17 00:00:00 2001 From: Sumeet Gajbhar Date: Tue, 6 Aug 2019 01:55:25 +0530 Subject: [PATCH 29/43] BAEL-3127 Binary Numbers in Java (#7469) * BAEL-3027 binary number arithmetic operations * BAEL-3127 updated the unit test case names * added unit test cases for built-in java functions * updated function name * BAEL-3127 updated unit test case names * BAEL-3127 removed comments from code * BAEL-3127 updated variable names * BAEL-3027 binary number arithmetic operations * merging upsteam * fixing build issue * updated formatting * update variable names --- .../baeldung/binarynumbers/BinaryNumbers.java | 288 +++++++++--------- 1 file changed, 140 insertions(+), 148 deletions(-) diff --git a/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java b/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java index effdee07ad..62cead726f 100644 --- a/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java +++ b/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java @@ -1,148 +1,140 @@ -package com.baeldung.binarynumbers; - -public class BinaryNumbers { - - /** - * This method takes a decimal number and convert it into a binary number. - * example:- input:10, output:1010 - * - * @param decimalNumber - * @return binary number - */ - public Integer convertDecimalToBinary(Integer decimalNumber) { - - if (decimalNumber == 0) { - return decimalNumber; - } - - StringBuilder binaryNumber = new StringBuilder(); - - while (decimalNumber > 0) { - - int remainder = decimalNumber % 2; - int result = decimalNumber / 2; - - binaryNumber.append(remainder); - decimalNumber = result; - } - - binaryNumber = binaryNumber.reverse(); - - return Integer.valueOf(binaryNumber.toString()); - } - - /** - * This method takes a binary number and convert it into a decimal number. - * example:- input:101, output:5 - * - * @param binary number - * @return decimal Number - */ - public Integer convertBinaryToDecimal(Integer binaryNumber) { - - Integer result = 0; - Integer base = 1; - - while (binaryNumber > 0) { - - int lastDigit = binaryNumber % 10; - binaryNumber = binaryNumber / 10; - - result += lastDigit * base; - - base = base * 2; - } - return result; - } - - /** - * This method accepts two binary numbers and returns sum of input numbers. - * Example:- firstNum: 101, secondNum: 100, output: 1001 - * - * @param firstNum - * @param secondNum - * @return addition of input numbers - */ - public Integer addBinaryNumber(Integer firstNum, Integer secondNum) { - - StringBuilder output = new StringBuilder(); - - int carry = 0; - int temp; - - while (firstNum != 0 || secondNum != 0) { - - temp = (firstNum % 10 + secondNum % 10 + carry) % 2; - output.append(temp); - - carry = (firstNum % 10 + secondNum % 10 + carry) / 2; - - firstNum = firstNum / 10; - secondNum = secondNum / 10; - } - - if (carry != 0) { - output.append(carry); - } - - return Integer.valueOf(output.reverse() - .toString()); - } - - /** - * This method takes two binary number as input and subtract second number from the first number. - * example:- firstNum: 1000, secondNum: 11, output: 101 - * @param firstNum - * @param secondNum - * @return Result of subtraction of secondNum from first - */ - public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) { - - int onesComplement = Integer.valueOf(getOnesComplement(secondNum)); - - StringBuilder output = new StringBuilder(); - - int carry = 0; - int temp; - - while (firstNum != 0 || onesComplement != 0) { - - temp = (firstNum % 10 + onesComplement % 10 + carry) % 2; - output.append(temp); - - carry = (firstNum % 10 + onesComplement % 10 + carry) / 2; - - firstNum = firstNum / 10; - onesComplement = onesComplement / 10; - } - - String additionOfFirstNumAndOnesComplement = output.reverse() - .toString(); - - if (carry == 1) { - return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry); - } else { - return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement)); - } - - } - - public Integer getOnesComplement(Integer num) { - - StringBuilder onesComplement = new StringBuilder(); - - while (num > 0) { - int lastDigit = num % 10; - if (lastDigit == 0) { - onesComplement.append(1); - } else { - onesComplement.append(0); - } - num = num / 10; - } - - return Integer.valueOf(onesComplement.reverse() - .toString()); - } - -} +package com.baeldung.binarynumbers; + +public class BinaryNumbers { + + /** + * This method takes a decimal number and convert it into a binary number. + * example:- input:10, output:1010 + * + * @param decimalNumber + * @return binary number + */ + public Integer convertDecimalToBinary(Integer decimalNumber) { + + if (decimalNumber == 0) { + return decimalNumber; + } + + StringBuilder binaryNumber = new StringBuilder(); + Integer quotient = decimalNumber; + + while (quotient > 0) { + + int remainder = quotient % 2; + binaryNumber.append(remainder); + quotient /= 2; + } + + binaryNumber = binaryNumber.reverse(); + return Integer.valueOf(binaryNumber.toString()); + } + + /** + * This method takes a binary number and convert it into a decimal number. + * example:- input:101, output:5 + * + * @param binary number + * @return decimal Number + */ + public Integer convertBinaryToDecimal(Integer binaryNumber) { + + Integer decimalNumber = 0; + Integer base = 1; + + while (binaryNumber > 0) { + + int lastDigit = binaryNumber % 10; + binaryNumber = binaryNumber / 10; + + decimalNumber += lastDigit * base; + base = base * 2; + } + return decimalNumber; + } + + /** + * This method accepts two binary numbers and returns sum of input numbers. + * Example:- firstNum: 101, secondNum: 100, output: 1001 + * + * @param firstNum + * @param secondNum + * @return addition of input numbers + */ + public Integer addBinaryNumber(Integer firstNum, Integer secondNum) { + + StringBuilder output = new StringBuilder(); + + int carry = 0; + int temp; + + while (firstNum != 0 || secondNum != 0) { + + temp = (firstNum % 10 + secondNum % 10 + carry) % 2; + output.append(temp); + + carry = (firstNum % 10 + secondNum % 10 + carry) / 2; + + firstNum = firstNum / 10; + secondNum = secondNum / 10; + } + + if (carry != 0) { + output.append(carry); + } + + return Integer.valueOf(output.reverse() + .toString()); + } + + /** + * This method takes two binary number as input and subtract second number from the first number. + * example:- firstNum: 1000, secondNum: 11, output: 101 + * @param firstNum + * @param secondNum + * @return Result of subtraction of secondNum from first + */ + public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) { + + int onesComplement = Integer.valueOf(getOnesComplement(secondNum)); + StringBuilder output = new StringBuilder(); + int carry = 0; + int temp; + + while (firstNum != 0 || onesComplement != 0) { + + temp = (firstNum % 10 + onesComplement % 10 + carry) % 2; + output.append(temp); + + carry = (firstNum % 10 + onesComplement % 10 + carry) / 2; + + firstNum = firstNum / 10; + onesComplement = onesComplement / 10; + } + + String additionOfFirstNumAndOnesComplement = output.reverse() + .toString(); + + if (carry == 1) { + return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry); + } else { + return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement)); + } + } + + public Integer getOnesComplement(Integer num) { + + StringBuilder onesComplement = new StringBuilder(); + while (num > 0) { + int lastDigit = num % 10; + if (lastDigit == 0) { + onesComplement.append(1); + } else { + onesComplement.append(0); + } + num = num / 10; + } + return Integer.valueOf(onesComplement.reverse() + .toString()); + } + +} \ No newline at end of file From a02fcfbb064daa85f5367ba0dbf5a14246c294af Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Mon, 5 Aug 2019 19:35:34 -0300 Subject: [PATCH 30/43] UPDATE Added additional tests, security config, and fix format issues (#7421) --- .../xml/attribute/Dom4jTransformer.java | 6 ++- .../xml/attribute/JaxpTransformer.java | 17 +++---- .../xml/attribute/jmh/AttributeBenchMark.java | 47 ++++++++++--------- .../xml/attribute/Dom4jProcessorUnitTest.java | 41 ++++++++++------ .../xml/attribute/JaxpProcessorUnitTest.java | 14 ++++++ .../xml/attribute/JooxProcessorUnitTest.java | 38 ++++++++++----- xml/src/test/resources/xml/xee_attribute.xml | 9 ++++ 7 files changed, 116 insertions(+), 56 deletions(-) create mode 100644 xml/src/test/resources/xml/xee_attribute.xml diff --git a/xml/src/main/java/com/baeldung/xml/attribute/Dom4jTransformer.java b/xml/src/main/java/com/baeldung/xml/attribute/Dom4jTransformer.java index a1922ad224..d4fdeb0d58 100644 --- a/xml/src/main/java/com/baeldung/xml/attribute/Dom4jTransformer.java +++ b/xml/src/main/java/com/baeldung/xml/attribute/Dom4jTransformer.java @@ -3,6 +3,7 @@ package com.baeldung.xml.attribute; import org.dom4j.*; import org.dom4j.io.DocumentSource; import org.dom4j.io.SAXReader; +import org.xml.sax.SAXException; import javax.xml.XMLConstants; import javax.xml.transform.OutputKeys; @@ -17,9 +18,12 @@ import java.util.List; public class Dom4jTransformer { private final Document input; - public Dom4jTransformer(String resourcePath) throws DocumentException { + public Dom4jTransformer(String resourcePath) throws DocumentException, SAXException { // 1- Build the doc from the XML file SAXReader xmlReader = new SAXReader(); + xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + xmlReader.setFeature("http://xml.org/sax/features/external-general-entities", false); + xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); this.input = xmlReader.read(resourcePath); } diff --git a/xml/src/main/java/com/baeldung/xml/attribute/JaxpTransformer.java b/xml/src/main/java/com/baeldung/xml/attribute/JaxpTransformer.java index a2266a2b44..a55b00950c 100644 --- a/xml/src/main/java/com/baeldung/xml/attribute/JaxpTransformer.java +++ b/xml/src/main/java/com/baeldung/xml/attribute/JaxpTransformer.java @@ -32,7 +32,8 @@ public class JaxpTransformer { // 1- Build the doc from the XML file DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - input = factory.newDocumentBuilder() + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + this.input = factory.newDocumentBuilder() .parse(resourcePath); } @@ -40,24 +41,24 @@ public class JaxpTransformer { // 2- Locate the node(s) with xpath XPath xpath = XPathFactory.newInstance() .newXPath(); - NodeList nodes = (NodeList) xpath.evaluate(String.format("//*[contains(@%s, '%s')]", attribute, oldValue), input, XPathConstants.NODESET); + NodeList nodes = (NodeList) xpath.evaluate(String.format("//*[contains(@%s, '%s')]", attribute, oldValue), this.input, XPathConstants.NODESET); // 3- Make the change on the selected nodes for (int i = 0; i < nodes.getLength(); i++) { Element value = (Element) nodes.item(i); value.setAttribute(attribute, newValue); } - //Stream api syntax - // IntStream - // .range(0, nodes.getLength()) - // .mapToObj(i -> (Element) nodes.item(i)) - // .forEach(value -> value.setAttribute(attribute, newValue)); + // Stream api syntax + // IntStream + // .range(0, nodes.getLength()) + // .mapToObj(i -> (Element) nodes.item(i)) + // .forEach(value -> value.setAttribute(attribute, newValue)); // 4- Save the result to a new XML doc TransformerFactory factory = TransformerFactory.newInstance(); factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer xformer = factory.newTransformer(); xformer.setOutputProperty(OutputKeys.INDENT, "yes"); Writer output = new StringWriter(); - xformer.transform(new DOMSource(input), new StreamResult(output)); + xformer.transform(new DOMSource(this.input), new StreamResult(output)); return output.toString(); } } diff --git a/xml/src/main/java/com/baeldung/xml/attribute/jmh/AttributeBenchMark.java b/xml/src/main/java/com/baeldung/xml/attribute/jmh/AttributeBenchMark.java index 064e181713..f5f3a2ce6c 100644 --- a/xml/src/main/java/com/baeldung/xml/attribute/jmh/AttributeBenchMark.java +++ b/xml/src/main/java/com/baeldung/xml/attribute/jmh/AttributeBenchMark.java @@ -1,7 +1,19 @@ package com.baeldung.xml.attribute.jmh; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.xpath.XPathExpressionException; + import org.dom4j.DocumentException; -import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; @@ -12,30 +24,23 @@ import com.baeldung.xml.attribute.Dom4jTransformer; import com.baeldung.xml.attribute.JaxpTransformer; import com.baeldung.xml.attribute.JooxTransformer; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.xpath.XPathExpressionException; -import java.io.IOException; -import java.util.concurrent.TimeUnit; - @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) public class AttributeBenchMark { public static void main(String[] args) throws RunnerException { - Options opt = new OptionsBuilder() - .include(AttributeBenchMark.class.getSimpleName()) - .forks(1) - .build(); + Options opt = new OptionsBuilder().include(AttributeBenchMark.class.getSimpleName()) + .forks(1) + .build(); new Runner(opt).run(); } @Benchmark - public String dom4jBenchmark() throws DocumentException, TransformerException { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + public String dom4jBenchmark() throws DocumentException, TransformerException, SAXException { + String path = this.getClass() + .getResource("/xml/attribute.xml") + .toString(); Dom4jTransformer transformer = new Dom4jTransformer(path); String attribute = "customer"; String oldValue = "true"; @@ -46,9 +51,9 @@ public class AttributeBenchMark { @Benchmark public String jooxBenchmark() throws IOException, SAXException { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + String path = this.getClass() + .getResource("/xml/attribute.xml") + .toString(); JooxTransformer transformer = new JooxTransformer(path); String attribute = "customer"; String oldValue = "true"; @@ -59,9 +64,9 @@ public class AttributeBenchMark { @Benchmark public String jaxpBenchmark() throws TransformerException, ParserConfigurationException, SAXException, IOException, XPathExpressionException { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + String path = this.getClass() + .getResource("/xml/attribute.xml") + .toString(); JaxpTransformer transformer = new JaxpTransformer(path); String attribute = "customer"; String oldValue = "true"; diff --git a/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java index 485744f9a5..351b8bc437 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java @@ -2,14 +2,19 @@ package com.baeldung.xml.attribute; import org.dom4j.DocumentException; import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.xpath.XPathExpressionException; + import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.xmlunit.assertj.XmlAssert.assertThat; /** @@ -18,10 +23,9 @@ import static org.xmlunit.assertj.XmlAssert.assertThat; public class Dom4jProcessorUnitTest { @Test - public void givenXmlWithAttributes_whenModifyAttribute_thenGetXmlUpdated() throws TransformerFactoryConfigurationError, TransformerException, DocumentException { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + public void givenXmlWithAttributes_whenModifyAttribute_thenGetXmlUpdated() throws TransformerFactoryConfigurationError, TransformerException, DocumentException, SAXException { + String path = getClass().getResource("/xml/attribute.xml") + .toString(); Dom4jTransformer transformer = new Dom4jTransformer(path); String attribute = "customer"; String oldValue = "true"; @@ -33,23 +37,32 @@ public class Dom4jProcessorUnitTest { } @Test - public void givenTwoXml_whenModifyAttribute_thenGetSimilarXml() throws IOException, TransformerFactoryConfigurationError, TransformerException, URISyntaxException, DocumentException { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + public void givenTwoXml_whenModifyAttribute_thenGetSimilarXml() throws IOException, TransformerFactoryConfigurationError, TransformerException, URISyntaxException, DocumentException, SAXException { + String path = getClass().getResource("/xml/attribute.xml") + .toString(); Dom4jTransformer transformer = new Dom4jTransformer(path); String attribute = "customer"; String oldValue = "true"; String newValue = "false"; - String expectedXml = new String(Files.readAllBytes((Paths.get(getClass() - .getResource("/xml/attribute_expected.xml") - .toURI())))); + String expectedXml = new String(Files.readAllBytes((Paths.get(getClass().getResource("/xml/attribute_expected.xml") + .toURI())))); String result = transformer.modifyAttribute(attribute, oldValue, newValue); - assertThat(result) - .and(expectedXml) - .areSimilar(); + assertThat(result).and(expectedXml) + .areSimilar(); + } + + @Test + public void givenXmlXee_whenInit_thenThrowException() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException, TransformerFactoryConfigurationError, TransformerException { + String path = getClass().getResource("/xml/xee_attribute.xml") + .toString(); + + assertThatThrownBy(() -> { + + new Dom4jTransformer(path); + + }).isInstanceOf(DocumentException.class); } } diff --git a/xml/src/test/java/com/baeldung/xml/attribute/JaxpProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/JaxpProcessorUnitTest.java index 8394016dbd..8d814783e0 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/JaxpProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/JaxpProcessorUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.xml.attribute; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.xmlunit.assertj.XmlAssert.assertThat; import java.io.IOException; @@ -11,6 +12,7 @@ import javax.xml.xpath.XPathExpressionException; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; /** * Unit test for {@link JaxpTransformer}. @@ -31,4 +33,16 @@ public class JaxpProcessorUnitTest { assertThat(result).hasXPath("//*[contains(@customer, 'false')]"); } + @Test + public void givenXmlXee_whenInit_thenThrowException() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException, TransformerFactoryConfigurationError, TransformerException { + String path = getClass().getResource("/xml/xee_attribute.xml") + .toString(); + + assertThatThrownBy(() -> { + + new JaxpTransformer(path); + + }).isInstanceOf(SAXParseException.class); + } + } diff --git a/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java index 38c7c59789..40d0c671e7 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java @@ -2,13 +2,19 @@ package com.baeldung.xml.attribute; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.xpath.XPathExpressionException; + import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.xmlunit.assertj.XmlAssert.assertThat; /** @@ -18,9 +24,8 @@ public class JooxProcessorUnitTest { @Test public void givenXmlWithAttributes_whenModifyAttribute_thenGetXmlUpdated() throws IOException, SAXException, TransformerFactoryConfigurationError { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + String path = getClass().getResource("/xml/attribute.xml") + .toString(); JooxTransformer transformer = new JooxTransformer(path); String attribute = "customer"; String oldValue = "true"; @@ -33,22 +38,31 @@ public class JooxProcessorUnitTest { @Test public void givenTwoXml_whenModifyAttribute_thenGetSimilarXml() throws IOException, TransformerFactoryConfigurationError, URISyntaxException, SAXException { - String path = getClass() - .getResource("/xml/attribute.xml") - .toString(); + String path = getClass().getResource("/xml/attribute.xml") + .toString(); JooxTransformer transformer = new JooxTransformer(path); String attribute = "customer"; String oldValue = "true"; String newValue = "false"; - String expectedXml = new String(Files.readAllBytes((Paths.get(getClass() - .getResource("/xml/attribute_expected.xml") - .toURI())))); + String expectedXml = new String(Files.readAllBytes((Paths.get(getClass().getResource("/xml/attribute_expected.xml") + .toURI())))); String result = transformer.modifyAttribute(attribute, oldValue, newValue); - assertThat(result) - .and(expectedXml) - .areSimilar(); + assertThat(result).and(expectedXml) + .areSimilar(); + } + + @Test + public void givenXmlXee_whenInit_thenThrowException() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException, TransformerFactoryConfigurationError, TransformerException { + String path = getClass().getResource("/xml/xee_attribute.xml") + .toString(); + + assertThatThrownBy(() -> { + + new JooxTransformer(path); + + }).isInstanceOf(SAXParseException.class); } } diff --git a/xml/src/test/resources/xml/xee_attribute.xml b/xml/src/test/resources/xml/xee_attribute.xml new file mode 100644 index 0000000000..9633ca15b0 --- /dev/null +++ b/xml/src/test/resources/xml/xee_attribute.xml @@ -0,0 +1,9 @@ + + ]> + + &xxe; + + john@email.com + mary@email.com + \ No newline at end of file From c3020771206d2e14416bbb936116afabe0629041 Mon Sep 17 00:00:00 2001 From: Chirag Dewan Date: Wed, 7 Aug 2019 21:36:14 +0530 Subject: [PATCH 31/43] BAEL-2990 Automatic generation of the Builder pattern with FreeBuilder --- libraries-2/pom.xml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index a9a818615f..bac601df61 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 libraries2 libraries2 @@ -111,15 +111,9 @@ org.apache.mesos mesos ${mesos.library.version} - - - org.inferred - freebuilder - ${freebuilder.version} - true - + 3.0.7 3.6.2 @@ -135,6 +129,5 @@ 2.8.5 3.14.2 4.1.2 - 2.4.1 - - + + \ No newline at end of file From fcc7ca0f1d1630a7f3186a8ff97d97aab6876d91 Mon Sep 17 00:00:00 2001 From: dev-chirag <41482403+dev-chirag@users.noreply.github.com> Date: Wed, 7 Aug 2019 21:40:20 +0530 Subject: [PATCH 32/43] Update pom.xml --- libraries-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index bac601df61..83adf1e199 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 libraries2 libraries2 @@ -130,4 +130,4 @@ 3.14.2 4.1.2 - \ No newline at end of file + From ec8b02a6882161e309d9f673d736efccd2adc96f Mon Sep 17 00:00:00 2001 From: dev-chirag <41482403+dev-chirag@users.noreply.github.com> Date: Wed, 7 Aug 2019 21:40:48 +0530 Subject: [PATCH 33/43] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 14b9d3cf81..aabede4f3a 100644 --- a/pom.xml +++ b/pom.xml @@ -1579,7 +1579,7 @@ 0.3.1 2.5.1 0.0.1 - 3.7 + 3.8 2.3 3.8 From b72e8b3f1dbe8248e85e0c6efd19de57142ae07c Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Wed, 7 Aug 2019 19:48:38 +0100 Subject: [PATCH 34/43] [BAEL-16003] Moved missing docx test. Removed remaining docx folders. modified libraries & libraries-data README.md files.Added libraries-data-2 to project pom. --- libraries-data-2/src/main/resources/image.jpg | Bin 0 -> 70820 bytes .../Docx4jReadAndWriteIntegrationTest.java | 38 +++---- .../java/com/baeldung/docx/Docx4jExample.java | 105 ------------------ 3 files changed, 19 insertions(+), 124 deletions(-) create mode 100644 libraries-data-2/src/main/resources/image.jpg rename {libraries/src/test/java => libraries-data-2/src/test}/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java (97%) delete mode 100644 libraries/src/main/java/com/baeldung/docx/Docx4jExample.java diff --git a/libraries-data-2/src/main/resources/image.jpg b/libraries-data-2/src/main/resources/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2554a0d9c7b0f0e797a73824c15021346fb1467 GIT binary patch literal 70820 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 literal 0 HcmV?d00001 diff --git a/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java b/libraries-data-2/src/test/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java similarity index 97% rename from libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java rename to libraries-data-2/src/test/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java index b6e157beea..9a2691d3f0 100644 --- a/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java +++ b/libraries-data-2/src/test/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java @@ -1,19 +1,19 @@ -package com.baeldung.docx; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class Docx4jReadAndWriteIntegrationTest { - - private static final String imagePath = "src/main/resources/image.jpg"; - private static final String outputPath = "helloWorld.docx"; - - @Test - public void givenWordPackage_whenTextExist_thenReturnTrue() throws Exception { - Docx4jExample docx4j = new Docx4jExample(); - docx4j.createDocumentPackage(outputPath, imagePath); - assertTrue(docx4j.isTextExist("Hello World!")); - assertTrue(!docx4j.isTextExist("InexistantText")); - } -} +package com.baeldung.docx; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class Docx4jReadAndWriteIntegrationTest { + + private static final String imagePath = "src/main/resources/image.jpg"; + private static final String outputPath = "helloWorld.docx"; + + @Test + public void givenWordPackage_whenTextExist_thenReturnTrue() throws Exception { + Docx4jExample docx4j = new Docx4jExample(); + docx4j.createDocumentPackage(outputPath, imagePath); + assertTrue(docx4j.isTextExist("Hello World!")); + assertTrue(!docx4j.isTextExist("InexistantText")); + } +} diff --git a/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java b/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java deleted file mode 100644 index 97fbf4adc7..0000000000 --- a/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.baeldung.docx; - -import org.docx4j.dml.wordprocessingDrawing.Inline; -import org.docx4j.jaxb.Context; -import org.docx4j.model.table.TblFactory; -import org.docx4j.openpackaging.exceptions.Docx4JException; -import org.docx4j.openpackaging.packages.WordprocessingMLPackage; -import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; -import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; -import org.docx4j.wml.BooleanDefaultTrue; -import org.docx4j.wml.Color; -import org.docx4j.wml.Drawing; -import org.docx4j.wml.ObjectFactory; -import org.docx4j.wml.P; -import org.docx4j.wml.R; -import org.docx4j.wml.RPr; -import org.docx4j.wml.Tbl; -import org.docx4j.wml.Tc; -import org.docx4j.wml.Text; -import org.docx4j.wml.Tr; - -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import java.io.File; -import java.nio.file.Files; -import java.util.List; - -class Docx4jExample { - - void createDocumentPackage(String outputPath, String imagePath) throws Exception { - WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); - MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart(); - mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!"); - mainDocumentPart.addParagraphOfText("Welcome To Baeldung!"); - - ObjectFactory factory = Context.getWmlObjectFactory(); - P p = factory.createP(); - R r = factory.createR(); - Text t = factory.createText(); - t.setValue("Welcome To Baeldung"); - r.getContent().add(t); - p.getContent().add(r); - RPr rpr = factory.createRPr(); - BooleanDefaultTrue b = new BooleanDefaultTrue(); - rpr.setB(b); - rpr.setI(b); - rpr.setCaps(b); - Color red = factory.createColor(); - red.setVal("green"); - rpr.setColor(red); - r.setRPr(rpr); - mainDocumentPart.getContent().add(p); - - File image = new File(imagePath); - byte[] fileContent = Files.readAllBytes(image.toPath()); - BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage, fileContent); - Inline inline = imagePart.createImageInline("Baeldung Image", "Alt Text", 1, 2, false); - P Imageparagraph = addImageToParagraph(inline); - mainDocumentPart.getContent().add(Imageparagraph); - - int writableWidthTwips = wordPackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips(); - int columnNumber = 3; - Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips / columnNumber); - List rows = tbl.getContent(); - for (Object row : rows) { - Tr tr = (Tr) row; - List cells = tr.getContent(); - for (Object cell : cells) { - Tc td = (Tc) cell; - td.getContent().add(p); - } - } - - mainDocumentPart.getContent().add(tbl); - File exportFile = new File(outputPath); - wordPackage.save(exportFile); - } - - boolean isTextExist(String testText) throws Docx4JException, JAXBException { - File doc = new File("helloWorld.docx"); - WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(doc); - MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); - String textNodesXPath = "//w:t"; - List paragraphs = mainDocumentPart.getJAXBNodesViaXPath(textNodesXPath, true); - for (Object obj : paragraphs) { - Text text = (Text) ((JAXBElement) obj).getValue(); - String textValue = text.getValue(); - if (textValue != null && textValue.contains(testText)) { - return true; - } - } - return false; - } - - private static P addImageToParagraph(Inline inline) { - ObjectFactory factory = new ObjectFactory(); - P p = factory.createP(); - R r = factory.createR(); - p.getContent().add(r); - Drawing drawing = factory.createDrawing(); - r.getContent().add(drawing); - drawing.getAnchorOrInline().add(inline); - return p; - } -} From 81d12e2121825445c4a0fcd3a8d14920e8515bbf Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Wed, 7 Aug 2019 19:53:18 +0100 Subject: [PATCH 35/43] [BAEL-16003] Added missing README and POM changes --- libraries-data/README.md | 1 - libraries/README.md | 8 -------- pom.xml | 2 ++ 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/libraries-data/README.md b/libraries-data/README.md index 077961f887..1ad7e94a1f 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -11,7 +11,6 @@ - [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) - [Guide to JMapper](https://www.baeldung.com/jmapper) - [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch) -- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline) - [Intro to Apache Storm](https://www.baeldung.com/apache-storm) - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) - [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide) diff --git a/libraries/README.md b/libraries/README.md index c7b40e3c94..1dd47ef176 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -15,7 +15,6 @@ - [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) - [Locality-Sensitive Hashing in Java Using Java-LSH](http://www.baeldung.com/locality-sensitive-hashing) - [Introduction to Awaitlity](http://www.baeldung.com/awaitlity-testing) -- [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) - [Introduction to Neuroph](http://www.baeldung.com/neuroph) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) @@ -23,8 +22,6 @@ - [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections) - [DistinctBy in the Java Stream API](http://www.baeldung.com/java-streams-distinct-by) - [Introduction to NoException](http://www.baeldung.com/no-exception) -- [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types) -- [Introduction to javax.measure](http://www.baeldung.com/javax-measure) - [Spring Yarg Integration](http://www.baeldung.com/spring-yarg) - [Delete a Directory Recursively in Java](http://www.baeldung.com/java-delete-directory) - [Guide to JDeferred](http://www.baeldung.com/jdeferred) @@ -33,15 +30,10 @@ - [Introduction to Retrofit](http://www.baeldung.com/retrofit) - [Using Pairs in Java](http://www.baeldung.com/java-pairs) - [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) -- [Introduction To Docx4J](http://www.baeldung.com/docx4j) - [Introduction to StreamEx](http://www.baeldung.com/streamex) - [Introduction to BouncyCastle with Java](http://www.baeldung.com/java-bouncy-castle) -- [Interact with Google Sheets from Java](http://www.baeldung.com/google-sheets-java-client) - [A Docker Guide for Java](http://www.baeldung.com/docker-java-api) -- [Introduction To OpenCSV](http://www.baeldung.com/opencsv) - [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java) -- [Introduction to Smooks](http://www.baeldung.com/smooks) -- [A Guide to Infinispan in Java](http://www.baeldung.com/infinispan) - [A Guide to Unirest](http://www.baeldung.com/unirest) - [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java) - [A Guide to Byte Buddy](http://www.baeldung.com/byte-buddy) diff --git a/pom.xml b/pom.xml index 9b47ffe3a6..139ce65ee5 100644 --- a/pom.xml +++ b/pom.xml @@ -502,6 +502,7 @@ libraries libraries-2 libraries-data + libraries-data-2 libraries-apache-commons libraries-primitive libraries-security @@ -1194,6 +1195,7 @@ libraries libraries-data + libraries-data-2 libraries-apache-commons libraries-security libraries-server From 7749c4d79f1b6c455fc662c766cb963a5de7818a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 7 Aug 2019 22:59:17 +0300 Subject: [PATCH 36/43] Update README.md --- spring-boot-mvc-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-mvc-2/README.md b/spring-boot-mvc-2/README.md index a405298cbe..f8e26f218b 100644 --- a/spring-boot-mvc-2/README.md +++ b/spring-boot-mvc-2/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Functional Controllers in Spring MVC]() \ No newline at end of file +- [Functional Controllers in Spring MVC](https://www.baeldung.com/spring-mvc-functional-controllers) From b7e02dbb4a1217a02d4d44acd99b19a8fd1dde56 Mon Sep 17 00:00:00 2001 From: Guillermo Lopez Date: Wed, 7 Aug 2019 22:43:41 -0300 Subject: [PATCH 37/43] BAEL-2804 Fixed XML indentation I've set the XML indentation the same way as the rest of the modules using 4 spaces instead of 2. --- persistence-modules/java-jpa-2/pom.xml | 208 +++++++++--------- .../main/resources/META-INF/persistence.xml | 56 ++--- .../java-jpa-2/src/main/resources/logback.xml | 21 +- 3 files changed, 145 insertions(+), 140 deletions(-) diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml index dd200eb3cb..fdd482f833 100644 --- a/persistence-modules/java-jpa-2/pom.xml +++ b/persistence-modules/java-jpa-2/pom.xml @@ -1,111 +1,111 @@ - 4.0.0 - java-jpa-2 - java-jpa-2 - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../pom.xml - - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.hibernate - hibernate-jpamodelgen - ${hibernate.version} - - - com.h2database - h2 - ${h2.version} - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + java-jpa-2 + java-jpa-2 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../pom.xml + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + + + com.h2database + h2 + ${h2.version} + - - - javax.persistence - javax.persistence-api - ${javax.persistence-api.version} - + + + javax.persistence + javax.persistence-api + ${javax.persistence-api.version} + - - - org.eclipse.persistence - eclipselink - ${eclipselink.version} - runtime - - - org.postgresql - postgresql - ${postgres.version} - runtime - - + + + org.eclipse.persistence + eclipselink + ${eclipselink.version} + runtime + + + org.postgresql + postgresql + ${postgres.version} + runtime + + - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - -proc:none - - - - org.bsc.maven - maven-processor-plugin - 3.3.3 - - - process - - process - - generate-sources - - target/metamodel - - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + -proc:none + + + + org.bsc.maven + maven-processor-plugin + 3.3.3 + + + process + + process + + generate-sources + + target/metamodel + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + + + + - - org.codehaus.mojo - build-helper-maven-plugin - 3.0.0 - - - add-source - generate-sources - - add-source - - - - target/metamodel - - - - - - - - - 5.4.0.Final - 2.7.4-RC1 - 42.2.5 - 2.2 - + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + add-source + generate-sources + + add-source + + + + target/metamodel + + + + + + + + + 5.4.0.Final + 2.7.4-RC1 + 42.2.5 + 2.2 + \ No newline at end of file diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml index 653ab83a18..560a75070c 100644 --- a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml @@ -1,31 +1,35 @@ + version="2.2"> - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.queryparams.Employee - true - - - - - - - - - - - - + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.queryparams.Employee + true + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa-2/src/main/resources/logback.xml b/persistence-modules/java-jpa-2/src/main/resources/logback.xml index e0098e7c7e..2527fea245 100644 --- a/persistence-modules/java-jpa-2/src/main/resources/logback.xml +++ b/persistence-modules/java-jpa-2/src/main/resources/logback.xml @@ -1,14 +1,15 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - + %msg%n + + + - - - + + + \ No newline at end of file From 71db72a68a45549b8d8eef3e3bcb601d438250ff Mon Sep 17 00:00:00 2001 From: nikunjgandhi1987 <51273165+nikunjgandhi1987@users.noreply.github.com> Date: Wed, 7 Aug 2019 21:59:06 -0400 Subject: [PATCH 38/43] Selection Sort Implementation (#7454) * Selection sort implementation * Selection sort implementation --- .../selectionsort/SelectionSort.java | 38 +++++++++++++++++++ .../selectionsort/SelectionSortUnitTest.java | 25 ++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java create mode 100644 algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java new file mode 100644 index 0000000000..17e95edf06 --- /dev/null +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.selectionsort; + +public class SelectionSort { + + public static void sortAscending(final int[] arr) { + for (int i = 0; i < arr.length - 1; i++) { + int minElementIndex = i; + for (int j = i + 1; j < arr.length; j++) { + if (arr[minElementIndex] > arr[j]) { + minElementIndex = j; + } + } + + if (minElementIndex != i) { + int temp = arr[i]; + arr[i] = arr[minElementIndex]; + arr[minElementIndex] = temp; + } + } + } + + public static void sortDescending(final int[] arr) { + for (int i = 0; i < arr.length - 1; i++) { + int maxElementIndex = i; + for (int j = i + 1; j < arr.length; j++) { + if (arr[maxElementIndex] < arr[j]) { + maxElementIndex = j; + } + } + + if (maxElementIndex != i) { + int temp = arr[i]; + arr[i] = arr[maxElementIndex]; + arr[maxElementIndex] = temp; + } + } + } +} \ No newline at end of file diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java new file mode 100644 index 0000000000..85efd1d3da --- /dev/null +++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.algorithms.selectionsort; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +public class SelectionSortUnitTest { + + @Test + public void givenUnsortedArray_whenSelectionSort_SortAscending_thenSortedAsc() { + int[] input = { 5, 4, 1, 6, 2 }; + SelectionSort.sortAscending(input); + int[] expected = {1, 2, 4, 5, 6}; + assertArrayEquals("the two arrays are not equal", expected, input); + } + + @Test + public void givenUnsortedArray_whenSelectionSort_SortDescending_thenSortedDesc() { + int[] input = { 5, 4, 1, 6, 2 }; + SelectionSort.sortDescending(input); + int[] expected = {6, 5, 4, 2, 1}; + assertArrayEquals("the two arrays are not equal", expected, input); + } +} From 69fb2149624d4b153501af123b9c656cd21bcd7a Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Thu, 8 Aug 2019 10:57:16 +0530 Subject: [PATCH 39/43] Adding source code for tutorial tracked under BAEL-3171. (#7523) --- .../baeldung/jgss/JgssIntegrationTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java new file mode 100644 index 0000000000..e322e89996 --- /dev/null +++ b/core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java @@ -0,0 +1,75 @@ +package com.baeldung.jgss; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.security.sasl.SaslException; + +import org.ietf.jgss.GSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.MessageProp; +import org.ietf.jgss.Oid; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore +public class JgssIntegrationTest { + + private static final String SERVER_PRINCIPAL = "HTTP/localhost@EXAMPLE.COM"; + private static final String MECHANISM = "1.2.840.113554.1.2.2"; + + GSSContext serverContext; + GSSContext clientContext; + + @Before + public void setUp() throws SaslException, GSSException { + GSSManager manager = GSSManager.getInstance(); + serverContext = manager.createContext((GSSCredential) null); + String serverPrinciple = SERVER_PRINCIPAL; + GSSName serverName = manager.createName(serverPrinciple, null); + Oid krb5Oid = new Oid(MECHANISM); + clientContext = manager.createContext( + serverName, krb5Oid, (GSSCredential) null, GSSContext.DEFAULT_LIFETIME); + clientContext.requestMutualAuth(true); + clientContext.requestConf(true); + clientContext.requestInteg(true); + } + + @Test + public void givenCredential_whenStarted_thenAutenticationWorks() throws SaslException, GSSException { + byte[] serverToken = new byte[0]; + byte[] clientToken = new byte[0]; + clientToken = clientContext.initSecContext(clientToken, 0, clientToken.length); + serverToken = clientToken; + serverToken = serverContext.acceptSecContext(serverToken, 0, serverToken.length); + clientToken = serverToken; + clientToken = clientContext.initSecContext(clientToken, 0, clientToken.length); + assertTrue(serverContext.isEstablished()); + assertTrue(clientContext.isEstablished()); + } + + @Test + public void givenContext_whenStarted_thenSecurityWorks() throws SaslException, GSSException { + byte[] messageBytes = "Baeldung".getBytes(); + MessageProp clientProp = new MessageProp(0, true); + byte[] clientToken = clientContext.wrap(messageBytes, 0, messageBytes.length, clientProp); + byte[] serverToken = clientToken; + MessageProp serverProp = new MessageProp(0, false); + byte[] bytes = serverContext.unwrap(serverToken, 0, serverToken.length, serverProp); + clientContext.verifyMIC(serverToken, 0, serverToken.length, bytes, 0, bytes.length, serverProp); + String string = new String(bytes); + assertEquals("Baeldung", string); + } + + @After + public void tearDown() throws SaslException, GSSException { + serverContext.dispose(); + clientContext.dispose(); + } + +} From 7f7fd337a7c8fb187c6c66f9ffb40fba080255a8 Mon Sep 17 00:00:00 2001 From: Nivedan Bamal <50937743+Nivedan-Bamal@users.noreply.github.com> Date: Thu, 8 Aug 2019 01:38:03 -0400 Subject: [PATCH 40/43] Adds after / before mapping example (#7518) --- .../main/java/com/baeldung/dto/CarDTO.java | 1 + .../main/java/com/baeldung/dto/FuelType.java | 5 +++ .../com/baeldung/entity/BioDieselCar.java | 4 ++ .../java/com/baeldung/entity/ElectricCar.java | 4 ++ .../java/com/baeldung/mapper/CarsMapper.java | 32 ++++++++++++++ .../baeldung/mapper/CarsMapperUnitTest.java | 42 +++++++++++++++++++ 6 files changed, 88 insertions(+) create mode 100644 mapstruct/src/main/java/com/baeldung/dto/FuelType.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/BioDieselCar.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/ElectricCar.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/CarsMapper.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/CarsMapperUnitTest.java diff --git a/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java b/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java index 51aa8ccac2..98aefcb971 100644 --- a/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java +++ b/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java @@ -8,4 +8,5 @@ import lombok.Setter; public class CarDTO { private int id; private String name; + private FuelType fuelType; } diff --git a/mapstruct/src/main/java/com/baeldung/dto/FuelType.java b/mapstruct/src/main/java/com/baeldung/dto/FuelType.java new file mode 100644 index 0000000000..88692884ad --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/dto/FuelType.java @@ -0,0 +1,5 @@ +package com.baeldung.dto; + +public enum FuelType { + ELECTRIC, BIO_DIESEL +} diff --git a/mapstruct/src/main/java/com/baeldung/entity/BioDieselCar.java b/mapstruct/src/main/java/com/baeldung/entity/BioDieselCar.java new file mode 100644 index 0000000000..3f868c10a7 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/BioDieselCar.java @@ -0,0 +1,4 @@ +package com.baeldung.entity; + +public class BioDieselCar extends Car { +} diff --git a/mapstruct/src/main/java/com/baeldung/entity/ElectricCar.java b/mapstruct/src/main/java/com/baeldung/entity/ElectricCar.java new file mode 100644 index 0000000000..9b780a244e --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/ElectricCar.java @@ -0,0 +1,4 @@ +package com.baeldung.entity; + +public class ElectricCar extends Car { +} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/CarsMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/CarsMapper.java new file mode 100644 index 0000000000..430aef1440 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/CarsMapper.java @@ -0,0 +1,32 @@ +package com.baeldung.mapper; + +import org.mapstruct.AfterMapping; +import org.mapstruct.BeforeMapping; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; + +import com.baeldung.dto.CarDTO; +import com.baeldung.dto.FuelType; +import com.baeldung.entity.BioDieselCar; +import com.baeldung.entity.Car; +import com.baeldung.entity.ElectricCar; + +@Mapper +public abstract class CarsMapper { + + @BeforeMapping + protected void enrichDTOWithFuelType(Car car, @MappingTarget CarDTO carDto) { + if (car instanceof ElectricCar) + carDto.setFuelType(FuelType.ELECTRIC); + if (car instanceof BioDieselCar) + carDto.setFuelType(FuelType.BIO_DIESEL); + } + + @AfterMapping + protected void convertNameToUpperCase(@MappingTarget CarDTO carDto) { + carDto.setName(carDto.getName().toUpperCase()); + } + + public abstract CarDTO toCarDto(Car car); + +} diff --git a/mapstruct/src/test/java/com/baeldung/mapper/CarsMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/CarsMapperUnitTest.java new file mode 100644 index 0000000000..e729e1a2d0 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/CarsMapperUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.mapper; + +import static org.junit.Assert.assertEquals; + +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import com.baeldung.dto.CarDTO; +import com.baeldung.dto.FuelType; +import com.baeldung.entity.BioDieselCar; +import com.baeldung.entity.Car; +import com.baeldung.entity.ElectricCar; + +class CarsMapperUnitTest { + + private CarsMapper sut = Mappers.getMapper(CarsMapper.class); + + @Test + void testGivenSubTypeElectric_mapsModifiedFieldsToSuperTypeDto_whenBeforeAndAfterMappingMethodscarCalled() { + Car car = new ElectricCar(); + car.setId(12); + car.setName("Tesla_Model_C"); + + CarDTO carDto = sut.toCarDto(car); + + assertEquals("TESLA_MODEL_C", carDto.getName()); + assertEquals(FuelType.ELECTRIC, carDto.getFuelType()); + } + + @Test + void testGivenSubTypeBioDiesel_mapsModifiedFieldsToSuperTypeDto_whenBeforeAndAfterMappingMethodscarCalled() { + Car car = new BioDieselCar(); + car.setId(11); + car.setName("Tesla_Model_X"); + + CarDTO carDto = sut.toCarDto(car); + + assertEquals("TESLA_MODEL_X", carDto.getName()); + assertEquals(FuelType.BIO_DIESEL, carDto.getFuelType()); + } + +} From 8ff8628008b26e7955e871c4163abbc80a4c64ee Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Thu, 8 Aug 2019 14:40:43 +0200 Subject: [PATCH 41/43] feat(BAEL-3044) Implement MyBatis with Spring/SpringBoot module (#7507) --- persistence-modules/spring-mybatis/pom.xml | 113 ++++++++++++++++++ .../com/baeldung/mybatis/spring/Article.java | 19 +++ .../mybatis/spring/ArticleMapper.java | 11 ++ .../mybatis/spring/PersistenceAutoConfig.java | 14 +++ .../mybatis/spring/PersistenceConfig.java | 37 ++++++ .../src/main/resources/beans.xml | 21 ++++ .../src/main/resources/data.sql | 3 + .../src/main/resources/schema.sql | 6 + .../ArticleMapperBootIntegrationTest.java | 13 ++ .../spring/ArticleMapperCommonTest.java | 22 ++++ .../spring/ArticleMapperIntegrationTest.java | 11 ++ .../ArticleMapperXMLIntegrationTest.java | 11 ++ pom.xml | 1 + 13 files changed, 282 insertions(+) create mode 100644 persistence-modules/spring-mybatis/pom.xml create mode 100644 persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java create mode 100644 persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java create mode 100644 persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java create mode 100644 persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java create mode 100644 persistence-modules/spring-mybatis/src/main/resources/beans.xml create mode 100644 persistence-modules/spring-mybatis/src/main/resources/data.sql create mode 100644 persistence-modules/spring-mybatis/src/main/resources/schema.sql create mode 100644 persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java create mode 100644 persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java create mode 100644 persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java create mode 100644 persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml new file mode 100644 index 0000000000..ecdcd1d923 --- /dev/null +++ b/persistence-modules/spring-mybatis/pom.xml @@ -0,0 +1,113 @@ + + 4.0.0 + com.baeldung + spring-mybatis + 0.1-SNAPSHOT + spring-mybatis + + + com.baeldung + parent-boot-2 + 1.0.0-SNAPSHOT + ../../parent-boot-2 + + + + + + + + org.springframework + spring-context + ${org.springframework.version} + + + + org.springframework + spring-beans + ${org.springframework.version} + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + + + + com.h2database + h2 + ${h2.version} + + + + org.springframework + spring-jdbc + ${org.springframework.version} + + + + org.mybatis + mybatis + ${mybatis.version} + + + + org.mybatis + mybatis-spring + ${spring-mybatis.version} + + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework + spring-test + ${org.springframework.version} + test + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + + spring-mybatis + + + src/main/resources + true + + + + + + + 5.1.8.RELEASE + + + 2.0.2 + 3.5.2 + 2.1.0 + 1.4.197 + + + 3.8.0 + + + + diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java new file mode 100644 index 0000000000..90e4ce6170 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java @@ -0,0 +1,19 @@ +package com.baeldung.mybatis.spring; + +public class Article { + private Long id; + private String title; + private String author; + + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } +} diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java new file mode 100644 index 0000000000..db5b3675f4 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java @@ -0,0 +1,11 @@ +package com.baeldung.mybatis.spring; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface ArticleMapper { + @Select("SELECT * FROM ARTICLES WHERE id = #{id}") + Article getArticle(@Param("id") Long id); +} diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java new file mode 100644 index 0000000000..72f754c01d --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java @@ -0,0 +1,14 @@ +package com.baeldung.mybatis.spring; + +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; + +@SpringBootConfiguration +@EnableAutoConfiguration +@ComponentScan(basePackages = { "com.baeldung.mybatis" }, excludeFilters = { + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = { PersistenceConfig.class }) +}) +public class PersistenceAutoConfig { +} diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java new file mode 100644 index 0000000000..f02e04e5a1 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java @@ -0,0 +1,37 @@ +package com.baeldung.mybatis.spring; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.annotation.MapperScan; +import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +import javax.sql.DataSource; + +@Configuration +@MapperScan("com.baeldung.mybatis") +@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class }) +public class PersistenceConfig { + + @Bean + public DataSource dataSource() { + return new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("schema.sql") + .addScript("data.sql") + .build(); + } + + @Bean + public SqlSessionFactory sqlSessionFactory() throws Exception { + SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); + factoryBean.setDataSource(dataSource()); + return factoryBean.getObject(); + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-mybatis/src/main/resources/beans.xml b/persistence-modules/spring-mybatis/src/main/resources/beans.xml new file mode 100644 index 0000000000..6ed82b7934 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/resources/beans.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-mybatis/src/main/resources/data.sql b/persistence-modules/spring-mybatis/src/main/resources/data.sql new file mode 100644 index 0000000000..86203bf561 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/resources/data.sql @@ -0,0 +1,3 @@ +TRUNCATE TABLE ARTICLES; +INSERT INTO ARTICLES +VALUES (1, 'Working with MyBatis in Spring', 'Baeldung'); \ No newline at end of file diff --git a/persistence-modules/spring-mybatis/src/main/resources/schema.sql b/persistence-modules/spring-mybatis/src/main/resources/schema.sql new file mode 100644 index 0000000000..807e1ec624 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/main/resources/schema.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS `ARTICLES` +( + `id` INTEGER PRIMARY KEY, + `title` VARCHAR(100) NOT NULL, + `author` VARCHAR(100) NOT NULL +); diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java new file mode 100644 index 0000000000..531356ffa2 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java @@ -0,0 +1,13 @@ +package com.baeldung.mybatis.spring; + +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +@ContextConfiguration(classes = PersistenceAutoConfig.class) +public class ArticleMapperBootIntegrationTest extends ArticleMapperCommonTest { + +} diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java new file mode 100644 index 0000000000..33071dc0c1 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java @@ -0,0 +1,22 @@ +package com.baeldung.mybatis.spring; + +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.assertj.core.api.Assertions.assertThat; + +class ArticleMapperCommonTest { + + @Autowired + ArticleMapper articleMapper; + + @Test + public void whenRecordsInDatabase_shouldReturnArticleWithGivenId() { + Article article = articleMapper.getArticle(1L); + + assertThat(article).isNotNull(); + assertThat(article.getId()).isEqualTo(1L); + assertThat(article.getAuthor()).isEqualTo("Baeldung"); + assertThat(article.getTitle()).isEqualTo("Working with MyBatis in Spring"); + } +} diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java new file mode 100644 index 0000000000..9298714cb2 --- /dev/null +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java @@ -0,0 +1,11 @@ +package com.baeldung.mybatis.spring; + +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = PersistenceConfig.class) +public class ArticleMapperIntegrationTest extends ArticleMapperCommonTest { + +} diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java new file mode 100644 index 0000000000..de8974d4ad --- /dev/null +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java @@ -0,0 +1,11 @@ +package com.baeldung.mybatis.spring; + +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = "classpath:/beans.xml") +public class ArticleMapperXMLIntegrationTest extends ArticleMapperCommonTest { + +} diff --git a/pom.xml b/pom.xml index aabede4f3a..d095e8a7bc 100644 --- a/pom.xml +++ b/pom.xml @@ -879,6 +879,7 @@ spring-freemarker persistence-modules/spring-hibernate-3 persistence-modules/spring-hibernate4 + persistence-modules/spring-mybatis spring-integration spring-jenkins-pipeline spring-jersey From 650dabda9f5aeb6a928b84ba3b6376e9a811eb0e Mon Sep 17 00:00:00 2001 From: amit2103 Date: Fri, 9 Aug 2019 00:27:47 +0530 Subject: [PATCH 42/43] [BAEL-16685] -Upgrade parent-spring-4 to the latest version of Spring 4.3.25 --- parent-spring-4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml index ab66cf19bf..390934ca7b 100644 --- a/parent-spring-4/pom.xml +++ b/parent-spring-4/pom.xml @@ -51,7 +51,7 @@ - 4.3.22.RELEASE + 4.3.25.RELEASE 1.6.1 From c9176915cb9b859f7e35e5158ba9286100044fbe Mon Sep 17 00:00:00 2001 From: "sreekanth.nair" Date: Fri, 9 Aug 2019 08:29:13 +0530 Subject: [PATCH 43/43] [BAEL-3121] Added source for finding number of lines in a file --- .../main/java/com/baeldung/file}/Main.java | 18 ++++---- .../baeldung/file}/NumberOfLineFinder.java | 13 +++++- .../src/main/resources/input.txt | 45 +++++++++++++++++++ .../file/NumberOfLineFinderUnitTest.java | 21 ++++++--- parent-java/pom.xml | 6 +++ 5 files changed, 87 insertions(+), 16 deletions(-) rename core-java-modules/{core-java-io/src/main/java/com/baeldung/files => core-java-nio/src/main/java/com/baeldung/file}/Main.java (55%) rename core-java-modules/{core-java-io/src/main/java/com/baeldung/files => core-java-nio/src/main/java/com/baeldung/file}/NumberOfLineFinder.java (90%) create mode 100644 core-java-modules/core-java-nio/src/main/resources/input.txt rename core-java-modules/{core-java-io => core-java-nio}/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java (64%) diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/files/Main.java b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/Main.java similarity index 55% rename from core-java-modules/core-java-io/src/main/java/com/baeldung/files/Main.java rename to core-java-modules/core-java-nio/src/main/java/com/baeldung/file/Main.java index c3bcd048a4..d8800dd881 100644 --- a/core-java-modules/core-java-io/src/main/java/com/baeldung/files/Main.java +++ b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/Main.java @@ -1,12 +1,13 @@ -package com.baeldung.files; +package com.baeldung.file; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingApacheCommonsIO; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingBufferedReader; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingGoogleGuava; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingLineNumberReader; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFileChannel; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFiles; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingScanner; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingApacheCommonsIO; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingBufferedReader; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingGoogleGuava; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingLineNumberReader; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFileChannel; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFiles; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFilesReadAllLines; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingScanner; public class Main { @@ -17,6 +18,7 @@ public class Main { System.out.printf("Total Number of Lines Using LineNumberReader: %s%n", getTotalNumberOfLinesUsingLineNumberReader(INPUT_FILE_NAME)); System.out.printf("Total Number of Lines Using Scanner: %s%n", getTotalNumberOfLinesUsingScanner(INPUT_FILE_NAME)); System.out.printf("Total Number of Lines Using NIO Files: %s%n", getTotalNumberOfLinesUsingNIOFiles(INPUT_FILE_NAME)); + System.out.printf("Total Number of Lines Using NIO Files#readAllLines: %s%n", getTotalNumberOfLinesUsingNIOFilesReadAllLines(INPUT_FILE_NAME)); System.out.printf("Total Number of Lines Using NIO FileChannel: %s%n", getTotalNumberOfLinesUsingNIOFileChannel(INPUT_FILE_NAME)); System.out.printf("Total Number of Lines Using Apache Commons IO: %s%n", getTotalNumberOfLinesUsingApacheCommonsIO(INPUT_FILE_NAME)); System.out.printf("Total Number of Lines Using NIO Google Guava: %s%n", getTotalNumberOfLinesUsingGoogleGuava(INPUT_FILE_NAME)); diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/files/NumberOfLineFinder.java b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/NumberOfLineFinder.java similarity index 90% rename from core-java-modules/core-java-io/src/main/java/com/baeldung/files/NumberOfLineFinder.java rename to core-java-modules/core-java-nio/src/main/java/com/baeldung/file/NumberOfLineFinder.java index 076825d76c..3abf82f3fa 100644 --- a/core-java-modules/core-java-io/src/main/java/com/baeldung/files/NumberOfLineFinder.java +++ b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/NumberOfLineFinder.java @@ -1,4 +1,4 @@ -package com.baeldung.files; +package com.baeldung.file; import java.io.BufferedReader; import java.io.File; @@ -67,6 +67,17 @@ public class NumberOfLineFinder { return lines; } + public static int getTotalNumberOfLinesUsingNIOFilesReadAllLines(String fileName) { + int lines = 0; + try { + List fileStream = Files.readAllLines(Paths.get(fileName)); + lines = fileStream.size(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + return lines; + } + public static int getTotalNumberOfLinesUsingNIOFileChannel(String fileName) { int lines = 1; try (FileChannel channel = FileChannel.open(Paths.get(fileName), StandardOpenOption.READ)) { diff --git a/core-java-modules/core-java-nio/src/main/resources/input.txt b/core-java-modules/core-java-nio/src/main/resources/input.txt new file mode 100644 index 0000000000..650da894e8 --- /dev/null +++ b/core-java-modules/core-java-nio/src/main/resources/input.txt @@ -0,0 +1,45 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien. + +Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla. + +Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis. + +Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis. + +Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et. + +Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor. + +Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui. + +Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices. + +Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas. + +Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus. + +Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque. + +Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla. + +Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non. + +Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam. + +Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in. + +Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat. + +Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi. + +Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex. + +Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor. + +Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue. \ No newline at end of file diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java b/core-java-modules/core-java-nio/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java similarity index 64% rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java rename to core-java-modules/core-java-nio/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java index 6f0427ebd2..40ed6d6bba 100644 --- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java +++ b/core-java-modules/core-java-nio/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java @@ -1,12 +1,13 @@ package com.baeldung.file; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingApacheCommonsIO; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingBufferedReader; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingGoogleGuava; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingLineNumberReader; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFileChannel; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFiles; -import static com.baeldung.files.NumberOfLineFinder.getTotalNumberOfLinesUsingScanner; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingApacheCommonsIO; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingBufferedReader; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingGoogleGuava; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingLineNumberReader; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFileChannel; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFiles; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFilesReadAllLines; +import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingScanner; import static org.junit.Assert.assertEquals; import org.junit.Test; @@ -39,6 +40,12 @@ public class NumberOfLineFinderUnitTest { assertEquals(ACTUAL_LINE_COUNT, lines); } + @Test + public void whenUsingNIOFilesReadAllLines_thenReturnTotalNumberOfLines() { + int lines = getTotalNumberOfLinesUsingNIOFilesReadAllLines(INPUT_FILE_NAME); + assertEquals(ACTUAL_LINE_COUNT, lines); + } + @Test public void whenUsingNIOFileChannel_thenReturnTotalNumberOfLines() { int lines = getTotalNumberOfLinesUsingNIOFileChannel(INPUT_FILE_NAME); diff --git a/parent-java/pom.xml b/parent-java/pom.xml index cb3e205871..09e2596d0a 100644 --- a/parent-java/pom.xml +++ b/parent-java/pom.xml @@ -21,10 +21,16 @@ guava ${guava.version} + + commons-io + commons-io + ${commons.io.version} + 23.0 + 2.6