From 63027fd269c46259d39e56b9ddd87380e99a5232 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Tue, 14 Apr 2020 00:43:27 -0600 Subject: [PATCH 01/52] BAEL-3961 Using a list of values in a JDBCTemplate IN clause --- .../main/java/com/baeldung/jdbc/Employee.java | 7 +++ .../java/com/baeldung/jdbc/EmployeeDAO.java | 43 ++++++++++++- .../baeldung/jdbc/EmployeeDAOUnitTest.java | 63 +++++++++++++++++-- 3 files changed, 106 insertions(+), 7 deletions(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java index a43eb265c7..d5f87ca3df 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java @@ -9,6 +9,13 @@ public class Employee { private String address; + public Employee(int id, String firstName, String lastName, String address) { + setId(id); + setFirstName(firstName); + setLastName(lastName); + setAddress(address); + } + public int getId() { return id; } diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index b5bf9452ed..dec88ee1f6 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -1,21 +1,62 @@ package com.baeldung.jdbc; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.stereotype.Repository; @Repository public class EmployeeDAO { private JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate namedJdbcTemplate; public void setDataSource(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); + namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } public int getCountOfEmployees() { return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class); } - + public List getEmployeesFromIdListNamed(List ids) { + SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); + List employees = namedJdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (:ids)", + parameters, + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + + return employees; + } + + public List getEmployeesFromIdList(List ids) { + String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); + List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (" + inSql +")", + ids.toArray(), + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + + return employees; + } + + public List getEmployeesFromLargeIdList(List ids) { + jdbcTemplate.execute("CREATE TEMPORARY TABLE employee_tmp (id INT NOT NULL)"); + + List employeeIds = new ArrayList<>(); + for (Integer id : ids) { + employeeIds.add(new Object[] { id }); + } + jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds); + + List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + + return employees; + } + } diff --git a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java index 71e8fb4263..f21704221b 100644 --- a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java +++ b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -2,8 +2,12 @@ package com.baeldung.jdbc; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.ArrayList; +import java.util.List; + import javax.sql.DataSource; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -14,13 +18,24 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.util.ReflectionTestUtils; - @RunWith(MockitoJUnitRunner.class) public class EmployeeDAOUnitTest { @Mock JdbcTemplate jdbcTemplate; + DataSource dataSource; + + @Before + public void setup() { + dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) + .generateUniqueName(true) + .addScript("classpath:jdbc/schema.sql") + .addScript("classpath:jdbc/test-data.sql") + .build(); + + } + @Test public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount() { EmployeeDAO employeeDAO = new EmployeeDAO(); @@ -38,14 +53,50 @@ public class EmployeeDAOUnitTest { @Test public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() { - DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) - .addScript("classpath:jdbc/schema.sql") - .addScript("classpath:jdbc/test-data.sql") - .build(); - EmployeeDAO employeeDAO = new EmployeeDAO(); employeeDAO.setDataSource(dataSource); assertEquals(4, employeeDAO.getCountOfEmployees()); } + + @Test + public void givenSmallIdList_whenGetEmployeesFromIdList_thenReturnCorrectEmployees() { + List ids = new ArrayList<>(); + ids.add(1); + ids.add(3); + ids.add(4); + EmployeeDAO employeeDAO = new EmployeeDAO(); + employeeDAO.setDataSource(dataSource); + + List employees = employeeDAO.getEmployeesFromIdList(ids); + + assertEquals(3, employees.size()); + assertEquals(1, employees.get(0).getId()); + assertEquals(3, employees.get(1).getId()); + assertEquals(4, employees.get(2).getId()); + + employees = employeeDAO.getEmployeesFromIdListNamed(ids); + + assertEquals(3, employees.size()); + assertEquals(1, employees.get(0).getId()); + assertEquals(3, employees.get(1).getId()); + assertEquals(4, employees.get(2).getId()); + } + + @Test + public void givenLargeIdList_whenGetEmployeesFromIdList_thenReturnCorrectEmployees() { + List ids = new ArrayList<>(); + ids.add(1); + ids.add(3); + ids.add(4); + EmployeeDAO employeeDAO = new EmployeeDAO(); + employeeDAO.setDataSource(dataSource); + + List employees = employeeDAO.getEmployeesFromLargeIdList(ids); + + assertEquals(3, employees.size()); + assertEquals(1, employees.get(0).getId()); + assertEquals(3, employees.get(1).getId()); + assertEquals(4, employees.get(2).getId()); + } } From 78e180f35d3a6de9a05bd122df6614075332a6ac Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Tue, 14 Apr 2020 19:23:11 -0600 Subject: [PATCH 02/52] BAEL-3961 Make the program more robust by only create the table when necessary and clean all data in the temp table. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 3 ++- .../src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index dec88ee1f6..25d280ad12 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -45,7 +45,8 @@ public class EmployeeDAO { } public List getEmployeesFromLargeIdList(List ids) { - jdbcTemplate.execute("CREATE TEMPORARY TABLE employee_tmp (id INT NOT NULL)"); + jdbcTemplate.execute("CREATE TEMPORARY TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)"); + jdbcTemplate.update("DELETE FROM employee_tmp"); List employeeIds = new ArrayList<>(); for (Integer id : ids) { diff --git a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java index f21704221b..369725bafd 100644 --- a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java +++ b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -98,5 +98,10 @@ public class EmployeeDAOUnitTest { assertEquals(1, employees.get(0).getId()); assertEquals(3, employees.get(1).getId()); assertEquals(4, employees.get(2).getId()); + + ids.clear(); + ids.add(2); + employees = employeeDAO.getEmployeesFromLargeIdList(ids); + assertEquals(1, employees.size()); } } From dc0a41fd8ef0e6ad9c16c2267466416f0a87f195 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 17 Apr 2020 12:37:42 +0530 Subject: [PATCH 03/52] JAVA-915: Migrate hystrix to parent-boot-2 --- hystrix/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hystrix/pom.xml b/hystrix/pom.xml index 8c505c9104..1cf8713b91 100644 --- a/hystrix/pom.xml +++ b/hystrix/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From 29a2f0ece167b56f060bb7cbedc0cb73bbe07fb6 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 9 Apr 2020 08:24:04 +0200 Subject: [PATCH 04/52] [JAVA-616] core-java-arrays-sorting * Creation * Moved code from https://www.baeldung.com/java-sorting-arrays * Moved code from https://www.baeldung.com/java-check-sorted-array * Moved code from https://www.baeldung.com/java-invert-array * Moved code from https://www.baeldung.com/java-arrays-sort-vs-parallelsort --- .../core-java-arrays-2/README.md | 1 - .../core-java-arrays-sorting/README.md | 9 ++ .../core-java-arrays-sorting/pom.xml | 87 +++++++++++++++++++ .../com/baeldung/array/ArrayInverter.java | 0 .../baeldung/array/SortedArrayChecker.java | 2 - .../arraysort/ArraySortingBenchmark.java | 0 .../main/java/com/baeldung/sort/Employee.java | 48 ++++++++++ .../baeldung/array/ArrayInverterUnitTest.java | 0 .../array/SortedArrayCheckerUnitTest.java | 2 +- .../arraysort/SortComparisonUnitTest.java | 0 .../com/baeldung/sort/ArraySortUnitTest.java | 2 - core-java-modules/core-java-arrays/README.md | 3 - core-java-modules/pom.xml | 1 + 13 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 core-java-modules/core-java-arrays-sorting/README.md create mode 100644 core-java-modules/core-java-arrays-sorting/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/main/java/com/baeldung/array/ArrayInverter.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/main/java/com/baeldung/array/SortedArrayChecker.java (97%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-sorting}/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java (100%) create mode 100644 core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java (98%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-sorting}/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/test/java/com/baeldung/sort/ArraySortUnitTest.java (98%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index c4ae3f03f7..a78b3327b6 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -13,5 +13,4 @@ This module contains articles about Java arrays - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) - [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) -- [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort) - [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-sorting/README.md b/core-java-modules/core-java-arrays-sorting/README.md new file mode 100644 index 0000000000..f83dd43526 --- /dev/null +++ b/core-java-modules/core-java-arrays-sorting/README.md @@ -0,0 +1,9 @@ +## Core Java Arrays - Sorting + +This module contains articles about sorting arrays in Java + +### Relevant Articles: +- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) +- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) +- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) +- [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort) diff --git a/core-java-modules/core-java-arrays-sorting/pom.xml b/core-java-modules/core-java-arrays-sorting/pom.xml new file mode 100644 index 0000000000..127d921b2a --- /dev/null +++ b/core-java-modules/core-java-arrays-sorting/pom.xml @@ -0,0 +1,87 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + ../pom.xml + + 4.0.0 + + core-java-arrays-sorting + core-java-arrays-sorting + jar + + + + + org.apache.maven.plugins + maven-shade-plugin + ${shade.plugin.version} + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + + + + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + com.google.guava + guava + ${guava.version} + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.2.0 + + 3.9 + 28.2-jre + + 1.19 + + 3.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/ArrayInverter.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java rename to core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/ArrayInverter.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/SortedArrayChecker.java similarity index 97% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java rename to core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/SortedArrayChecker.java index 78a9a8f4d1..8fa64972f2 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java +++ b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/SortedArrayChecker.java @@ -1,7 +1,5 @@ package com.baeldung.array; -import com.baeldung.arraycopy.model.Employee; - import java.util.Comparator; public class SortedArrayChecker { diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java rename to core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java diff --git a/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java new file mode 100644 index 0000000000..e9c737b74b --- /dev/null +++ b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java @@ -0,0 +1,48 @@ +package com.baeldung.sort; + +import java.io.Serializable; + +public class Employee implements Serializable { + private static final long serialVersionUID = -2454619097207585825L; + private int id; + private String name; + private int age; + + public Employee() { + } + + public Employee(int id, String name) { + this.id = id; + this.name = name; + } + + public Employee(int id, String name, int age) { + this.id = id; + this.name = name; + this.age = age; + } + + public int getAge() { + return age; + } + + public int getId() { + return id; + } + + public void setAge(int age) { + this.age = age; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java similarity index 98% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java index 7971e0eab7..5411dcba72 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java +++ b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.array; -import com.baeldung.arraycopy.model.Employee; +import com.baeldung.sort.Employee; import org.junit.Before; import org.junit.Test; diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/sort/ArraySortUnitTest.java similarity index 98% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/sort/ArraySortUnitTest.java index 59035738fe..b89a870c51 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java +++ b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/sort/ArraySortUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.sort; -import com.baeldung.arraycopy.model.Employee; import org.junit.Before; import org.junit.Test; @@ -86,5 +85,4 @@ public class ArraySortUnitTest { assertArrayEquals(new Employee[]{david, john, mary}, employees); } - } diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 9d9db9ab81..94351bbad6 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -10,7 +10,4 @@ This module contains articles about Java arrays - [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) -- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) -- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) -- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 00ef24be92..aba97f4826 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -122,6 +122,7 @@ pre-jpms + core-java-arrays-sorting From 0593fce8a3def726abc84d91fec72f5941d66b86 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 20:54:17 +0200 Subject: [PATCH 05/52] [JAVA-616] core-java-arrays-guides * Creation * Moved code from https://www.baeldung.com/java-arrays-guide * Moved code from https://www.baeldung.com/java-util-arrays --- .../core-java-arrays-guides/README.md | 7 ++++ .../core-java-arrays-guides/pom.xml | 32 +++++++++++++++++++ .../baeldung/array/ArrayReferenceGuide.java | 0 .../arrays/ParallelPrefixBenchmark.java | 0 .../com/baeldung/arrays/ArraysUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 2 -- core-java-modules/pom.xml | 1 + 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-arrays-guides/README.md create mode 100644 core-java-modules/core-java-arrays-guides/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-guides}/src/main/java/com/baeldung/array/ArrayReferenceGuide.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-guides}/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-guides}/src/test/java/com/baeldung/arrays/ArraysUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-guides/README.md b/core-java-modules/core-java-arrays-guides/README.md new file mode 100644 index 0000000000..2e66080002 --- /dev/null +++ b/core-java-modules/core-java-arrays-guides/README.md @@ -0,0 +1,7 @@ +## Core Java Arrays - Guides + +This module contains complete guides about arrays in Java + +### Relevant Articles: +- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) +- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays) \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-guides/pom.xml b/core-java-modules/core-java-arrays-guides/pom.xml new file mode 100644 index 0000000000..ef718d5117 --- /dev/null +++ b/core-java-modules/core-java-arrays-guides/pom.xml @@ -0,0 +1,32 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-guides + core-java-arrays-guides + jar + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + 1.19 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/ArrayReferenceGuide.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java rename to core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/ArrayReferenceGuide.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java rename to core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java b/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/ArraysUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java rename to core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/ArraysUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 94351bbad6..05c316cf7e 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -6,8 +6,6 @@ This module contains articles about Java arrays - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) - [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) -- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays) - [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) -- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index aba97f4826..b23b7ba8f4 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -123,6 +123,7 @@ pre-jpms core-java-arrays-sorting + core-java-arrays-guides From 6af4961a79bc5d493f8bf36b86718600b8908d0b Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:01:14 +0200 Subject: [PATCH 06/52] [JAVA-616] core-java-arrays-multidimensional * Creation * Moved code from https://www.baeldung.com/java-jagged-arrays * Moved code from https://www.baeldung.com/java-loop-diagonal-array --- core-java-modules/core-java-arrays-2/README.md | 1 - .../core-java-arrays-multidimensional/README.md | 7 +++++++ .../core-java-arrays-multidimensional/pom.xml | 15 +++++++++++++++ .../com/baeldung/array/MultiDimensionalArray.java | 0 .../baeldung/array/looping/LoopDiagonally.java | 0 .../array/MultiDimensionalArrayUnitTest.java | 0 .../array/looping/LoopDiagonallyUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 1 - core-java-modules/pom.xml | 1 + 9 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-arrays-multidimensional/README.md create mode 100644 core-java-modules/core-java-arrays-multidimensional/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-multidimensional}/src/main/java/com/baeldung/array/MultiDimensionalArray.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-multidimensional}/src/main/java/com/baeldung/array/looping/LoopDiagonally.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-multidimensional}/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-multidimensional}/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index a78b3327b6..07c171dcd5 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -5,7 +5,6 @@ This module contains articles about Java arrays ## Relevant Articles - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) - [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) - [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) - [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) diff --git a/core-java-modules/core-java-arrays-multidimensional/README.md b/core-java-modules/core-java-arrays-multidimensional/README.md new file mode 100644 index 0000000000..d92747a4fb --- /dev/null +++ b/core-java-modules/core-java-arrays-multidimensional/README.md @@ -0,0 +1,7 @@ +## Core Java Arrays - Multidimensional + +This module contains articles about multidimensional arrays in Java + +### Relevant Articles: +- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) +- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-multidimensional/pom.xml b/core-java-modules/core-java-arrays-multidimensional/pom.xml new file mode 100644 index 0000000000..6e49a20521 --- /dev/null +++ b/core-java-modules/core-java-arrays-multidimensional/pom.xml @@ -0,0 +1,15 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-multidimensional + core-java-arrays-multidimensional + jar + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java b/core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/MultiDimensionalArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java rename to core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/MultiDimensionalArray.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java b/core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/looping/LoopDiagonally.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java rename to core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/looping/LoopDiagonally.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java b/core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java rename to core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java b/core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java rename to core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 05c316cf7e..7b5f21a1e6 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -6,6 +6,5 @@ This module contains articles about Java arrays - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) - [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) -- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index b23b7ba8f4..20a2add836 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -124,6 +124,7 @@ pre-jpms core-java-arrays-sorting core-java-arrays-guides + core-java-arrays-multidimensional From dcd863f5d67dea7c0533cbd04a234507ede70725 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:08:02 +0200 Subject: [PATCH 07/52] [JAVA-616] core-java-arrays-convert * Creation * Moved code from https://www.baeldung.com/java-convert-float-to-byte-array * Moved code from https://www.baeldung.com/java-stream-to-array --- .../core-java-arrays-2/README.md | 2 -- .../core-java-arrays-convert/README.md | 7 +++++ .../core-java-arrays-convert/pom.xml | 27 +++++++++++++++++++ .../array/conversions/FloatToByteArray.java | 0 .../conversions/StreamArrayConversion.java | 0 .../conversions/FloatToByteArrayUnitTest.java | 0 .../StreamArrayConversionUnitTest.java | 0 core-java-modules/pom.xml | 1 + 8 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-arrays-convert/README.md create mode 100644 core-java-modules/core-java-arrays-convert/pom.xml rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index 07c171dcd5..eefc6aa787 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -5,8 +5,6 @@ This module contains articles about Java arrays ## Relevant Articles - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) -- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) - [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md new file mode 100644 index 0000000000..4bd060a246 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -0,0 +1,7 @@ +## Core Java Arrays - Conversions + +This module contains articles about arrays conversion in Java + +## Relevant Articles +- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) +- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) diff --git a/core-java-modules/core-java-arrays-convert/pom.xml b/core-java-modules/core-java-arrays-convert/pom.xml new file mode 100644 index 0000000000..bd50289f47 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/pom.xml @@ -0,0 +1,27 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-convert + core-java-arrays-convert + jar + + + + com.google.guava + guava + ${guava.version} + + + + + 28.2-jre + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java rename to core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java rename to core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java rename to core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java rename to core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 20a2add836..9926e7781a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -125,6 +125,7 @@ core-java-arrays-sorting core-java-arrays-guides core-java-arrays-multidimensional + core-java-arrays-convert From e36771a76366ab2fcfcd19c0a5ce8cfb97446fc4 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:16:30 +0200 Subject: [PATCH 08/52] [JAVA-616] core-java-arrays-operations-basic * Creation * Moved code from https://www.baeldung.com/java-initialize-array * Moved code from https://www.baeldung.com/java-common-array-operations * Moved code from https://www.baeldung.com/java-add-element-to-array-vs-list * Moved code from https://www.baeldung.com/java-array-contains-value * Moved code from https://www.baeldung.com/java-array-remove-element * Moved code from https://www.baeldung.com/java-array-remove-first-element * Moved code from https://www.baeldung.com/java-array-add-element-at-the-end --- .../core-java-arrays-2/README.md | 5 -- .../ArraysIntersectionOperations.java | 27 +++++++ .../operations/IntersectionUnitTest.java | 2 +- .../README.md | 19 +++++ .../core-java-arrays-operations-basic/pom.xml | 78 +++++++++++++++++++ .../array/AddElementToEndOfArray.java | 0 .../baeldung/array/ArrayBenchmarkRunner.java | 2 +- .../com/baeldung/array/ArrayInitializer.java | 0 .../array/RemoveElementFromAnArray.java | 0 .../baeldung/array/SearchArrayBenchmark.java} | 2 +- .../array/operations/ArrayOperations.java | 0 .../operations/ArrayListOperations.java | 0 .../array/AddElementToEndOfArrayUnitTest.java | 0 .../array/ArrayInitializerUnitTest.java | 0 .../RemoveElementFromAnArrayUnitTest.java | 0 .../operations/ArrayOperationsUnitTest.java | 0 .../RemoveFirstElementUnitTest.java | 0 .../ArrayListOperationsUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 2 - core-java-modules/pom.xml | 1 + 20 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java create mode 100644 core-java-modules/core-java-arrays-operations-basic/README.md create mode 100644 core-java-modules/core-java-arrays-operations-basic/pom.xml rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/AddElementToEndOfArray.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java (86%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/ArrayInitializer.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java (100%) rename core-java-modules/{core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java => core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java} (98%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/operations/ArrayOperations.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index eefc6aa787..bde6c6cc1e 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -4,10 +4,5 @@ This module contains articles about Java arrays ## Relevant Articles -- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) -- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) -- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) -- [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) - [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java new file mode 100644 index 0000000000..6c4ce837ad --- /dev/null +++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java @@ -0,0 +1,27 @@ +package com.baeldung.array.operations; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.stream.Stream; + +public class ArraysIntersectionOperations { + + public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b) { + return Stream.of(a) + .filter(Arrays.asList(b)::contains) + .toArray(Integer[]::new); + } + + public static Integer[] intersectionSet(final Integer[] a, final Integer[] b) { + return Stream.of(a) + .filter(Arrays.asList(b)::contains) + .distinct() + .toArray(Integer[]::new); + } + + public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b) { + return Stream.of(a) + .filter(new LinkedList<>(Arrays.asList(b))::remove) + .toArray(Integer[]::new); + } +} diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java index 1560cc5701..b0d4a80b06 100644 --- a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java @@ -2,7 +2,7 @@ package com.baeldung.array.operations; import org.junit.jupiter.api.Test; -import static com.baeldung.array.operations.ArrayOperations.*; +import static com.baeldung.array.operations.ArraysIntersectionOperations.*; import static org.assertj.core.api.Assertions.assertThat; class IntersectionUnitTest { diff --git a/core-java-modules/core-java-arrays-operations-basic/README.md b/core-java-modules/core-java-arrays-operations-basic/README.md new file mode 100644 index 0000000000..914d5a71bd --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -0,0 +1,19 @@ +## Core Java Arrays - Basic Operations + +This module contains articles about basic operations on arrays in Java + +Basic operations would cover anything elementary we should expect to be able to achieve on a collection type: + +- Adding/Removing elements +- Getting elements +- Iterating + +### Relevant Articles: +- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) +- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) +- [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) +- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) +- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) +- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) +- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) +- [[More advanced operations -->]](/core-java-modules/core-java-arrays-operations-advanced) diff --git a/core-java-modules/core-java-arrays-operations-basic/pom.xml b/core-java-modules/core-java-arrays-operations-basic/pom.xml new file mode 100644 index 0000000000..4480c14bb2 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/pom.xml @@ -0,0 +1,78 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-operations-basic + core-java-arrays-operations-basic + jar + + + + + org.apache.maven.plugins + maven-shade-plugin + ${shade.plugin.version} + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + + + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.2.0 + + 3.9 + + 1.19 + + 3.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/AddElementToEndOfArray.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/AddElementToEndOfArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java similarity index 86% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java index f35064b783..30c3978a3a 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java +++ b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java @@ -9,7 +9,7 @@ public class ArrayBenchmarkRunner { public static void main(String[] args) throws Exception { Options options = new OptionsBuilder() - .include(SearchArrayUnitTest.class.getSimpleName()).threads(1) + .include(SearchArrayBenchmark.class.getSimpleName()).threads(1) .forks(1).shouldFailOnError(true).shouldDoGC(true) .jvmArgs("-server").build(); diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayInitializer.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayInitializer.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java similarity index 98% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java index bed58356cb..fc4b513250 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java +++ b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java @@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) @Warmup(iterations = 5) @OutputTimeUnit(TimeUnit.MICROSECONDS) -public class SearchArrayUnitTest { +public class SearchArrayBenchmark { @State(Scope.Benchmark) public static class SearchData { diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/operations/ArrayOperations.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/operations/ArrayOperations.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 7b5f21a1e6..7c7e6d0add 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -4,7 +4,5 @@ This module contains articles about Java arrays ### Relevant Articles: - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) -- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) -- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 9926e7781a..cf6e4c69cf 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -126,6 +126,7 @@ core-java-arrays-guides core-java-arrays-multidimensional core-java-arrays-convert + core-java-arrays-operations-basic From 50530b81b499cf4ed9248b0baed519230572c40f Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:45:37 +0200 Subject: [PATCH 09/52] [JAVA-616] core-java-arrays-operations-advanced * Creation * Moved code from https://www.baeldung.com/java-array-copy * Moved code from https://www.baeldung.com/java-arrays-deepequals * Moved code from https://www.baeldung.com/java-array-sum-average * Moved code from https://www.baeldung.com/java-array-intersection --- .../core-java-arrays-2/README.md | 1 - .../core-java-arrays-3/README.md | 1 - .../README.md | 16 +++++++++ .../pom.xml | 36 +++++++++++++++++++ .../baeldung/array/SumAndAverageInArray.java | 0 .../ArraysIntersectionOperations.java | 0 .../com/baeldung/arraycopy/model/Address.java | 0 .../baeldung/arraycopy/model/Employee.java | 0 .../array/SumAndAverageInArrayUnitTest.java | 0 .../operations/IntersectionUnitTest.java | 0 .../arraycopy/ArrayCopyUtilUnitTest.java | 0 .../deepequals/ArraysDeepEqualsUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 2 -- core-java-modules/pom.xml | 1 + 14 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 core-java-modules/core-java-arrays-operations-advanced/README.md create mode 100644 core-java-modules/core-java-arrays-operations-advanced/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/array/SumAndAverageInArray.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/arraycopy/model/Address.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/arraycopy/model/Employee.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java (100%) rename core-java-modules/{core-java-arrays-3 => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index bde6c6cc1e..20a2ddec9f 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -4,5 +4,4 @@ This module contains articles about Java arrays ## Relevant Articles -- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-3/README.md b/core-java-modules/core-java-arrays-3/README.md index 255d3d097d..a96ddccabb 100644 --- a/core-java-modules/core-java-arrays-3/README.md +++ b/core-java-modules/core-java-arrays-3/README.md @@ -1,3 +1,2 @@ ### Relevant Articles: -- [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md new file mode 100644 index 0000000000..71f9ce0ac6 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/README.md @@ -0,0 +1,16 @@ +## Core Java Arrays - Advanced Operations + +This module contains articles about advanced operations on arrays in Java + +Advanced operations would be much logic or interactions with other arrays, such as: + +- Sum, average of elements +- Intersections +- ... + +### Relevant Articles: +- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) +- [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) +- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) +- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) +- [[More basic operations-->]](/core-java-modules/core-java-operations-basic) diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml new file mode 100644 index 0000000000..8989e91189 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -0,0 +1,36 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-operations-advanced + core-java-arrays-operations-advanced + jar + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.9 + + 3.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/SumAndAverageInArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/SumAndAverageInArray.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Address.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Address.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Employee.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Employee.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java diff --git a/core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 7c7e6d0add..efc6ab426d 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -3,6 +3,4 @@ This module contains articles about Java arrays ### Relevant Articles: -- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) -- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index cf6e4c69cf..414313f918 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -127,6 +127,7 @@ core-java-arrays-multidimensional core-java-arrays-convert core-java-arrays-operations-basic + core-java-arrays-operations-advanced From 91922d655394434ff244ad4d2a2d2a7699c53ee3 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 22:02:20 +0200 Subject: [PATCH 10/52] [JAVA-616] Cleaning code * Removed core-java-arrays* modules * Updated core-java-module/pom.xml --- .../core-java-arrays-2/README.md | 7 - core-java-modules/core-java-arrays-2/pom.xml | 86 --------- .../core-java-arrays-3/README.md | 2 - core-java-modules/core-java-arrays-3/pom.xml | 32 ---- core-java-modules/core-java-arrays/README.md | 6 - core-java-modules/core-java-arrays/pom.xml | 180 ------------------ core-java-modules/pom.xml | 16 +- 7 files changed, 7 insertions(+), 322 deletions(-) delete mode 100644 core-java-modules/core-java-arrays-2/README.md delete mode 100644 core-java-modules/core-java-arrays-2/pom.xml delete mode 100644 core-java-modules/core-java-arrays-3/README.md delete mode 100644 core-java-modules/core-java-arrays-3/pom.xml delete mode 100644 core-java-modules/core-java-arrays/README.md delete mode 100644 core-java-modules/core-java-arrays/pom.xml diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md deleted file mode 100644 index 20a2ddec9f..0000000000 --- a/core-java-modules/core-java-arrays-2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Core Java Arrays (Part 2) - -This module contains articles about Java arrays - -## Relevant Articles - -- [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-2/pom.xml b/core-java-modules/core-java-arrays-2/pom.xml deleted file mode 100644 index 1445a322d7..0000000000 --- a/core-java-modules/core-java-arrays-2/pom.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - 4.0.0 - core-java-arrays-2 - 0.1.0-SNAPSHOT - core-java-arrays-2 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - - - core-java-arrays-2 - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-shade-plugin - ${shade.plugin.version} - - - package - - shade - - - benchmarks - - - org.openjdk.jmh.Main - - - - - - - - - - - 1.19 - - 3.9 - - 3.10.0 - 3.2.0 - - - diff --git a/core-java-modules/core-java-arrays-3/README.md b/core-java-modules/core-java-arrays-3/README.md deleted file mode 100644 index a96ddccabb..0000000000 --- a/core-java-modules/core-java-arrays-3/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: - diff --git a/core-java-modules/core-java-arrays-3/pom.xml b/core-java-modules/core-java-arrays-3/pom.xml deleted file mode 100644 index 210375b878..0000000000 --- a/core-java-modules/core-java-arrays-3/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - core-java-arrays-3 - 0.1.0-SNAPSHOT - core-java-arrays-3 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.assertj - assertj-core - ${assertj.version} - test - - - - - 3.14.0 - - - \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md deleted file mode 100644 index efc6ab426d..0000000000 --- a/core-java-modules/core-java-arrays/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Core Java Arrays - -This module contains articles about Java arrays - -### Relevant Articles: -- [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/core-java-arrays/pom.xml b/core-java-modules/core-java-arrays/pom.xml deleted file mode 100644 index ea28eb25eb..0000000000 --- a/core-java-modules/core-java-arrays/pom.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - 4.0.0 - core-java-arrays - 0.1.0-SNAPSHOT - core-java-arrays - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh-generator-annprocess.version} - - - - - core-java-arrays - - - src/main/resources - true - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - ${source.version} - ${target.version} - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - - - 3.9 - - 1.19 - 1.19 - - - 3.10.0 - - - 3.0.0-M1 - 1.6.0 - 1.8 - 1.8 - - - diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 414313f918..b7454cc737 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -31,10 +31,14 @@ core-java-annotations - core-java-arrays - core-java-arrays-2 - core-java-arrays-3 + core-java-arrays-sorting + core-java-arrays-guides + core-java-arrays-multidimensional + core-java-arrays-convert + core-java-arrays-operations-basic + core-java-arrays-operations-advanced + core-java-collections core-java-collections-2 core-java-collections-3 @@ -122,12 +126,6 @@ pre-jpms - core-java-arrays-sorting - core-java-arrays-guides - core-java-arrays-multidimensional - core-java-arrays-convert - core-java-arrays-operations-basic - core-java-arrays-operations-advanced From 40fb82606a7a00044781ed96acf6132a88c6ee10 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 17 Apr 2020 21:05:33 +0200 Subject: [PATCH 11/52] [JAVA-616] Reworded operations modules descriptions --- .../core-java-arrays-operations-advanced/README.md | 9 +-------- .../core-java-arrays-operations-basic/README.md | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md index 71f9ce0ac6..af0c00641a 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/README.md +++ b/core-java-modules/core-java-arrays-operations-advanced/README.md @@ -1,16 +1,9 @@ ## Core Java Arrays - Advanced Operations -This module contains articles about advanced operations on arrays in Java - -Advanced operations would be much logic or interactions with other arrays, such as: - -- Sum, average of elements -- Intersections -- ... +This module contains articles about advanced operations on arrays in Java. They assume some background knowledge with arrays in Java. ### Relevant Articles: - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) -- [[More basic operations-->]](/core-java-modules/core-java-operations-basic) diff --git a/core-java-modules/core-java-arrays-operations-basic/README.md b/core-java-modules/core-java-arrays-operations-basic/README.md index 914d5a71bd..ca81c23c98 100644 --- a/core-java-modules/core-java-arrays-operations-basic/README.md +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -1,12 +1,6 @@ ## Core Java Arrays - Basic Operations -This module contains articles about basic operations on arrays in Java - -Basic operations would cover anything elementary we should expect to be able to achieve on a collection type: - -- Adding/Removing elements -- Getting elements -- Iterating +This module contains articles about Java array fundamentals. They assume no previous background knowledge on working with arrays. ### Relevant Articles: - [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) @@ -16,4 +10,3 @@ Basic operations would cover anything elementary we should expect to be able to - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [[More advanced operations -->]](/core-java-modules/core-java-arrays-operations-advanced) From 32461d70ed11d3f4249f933fe0a2983069c244d5 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 22:26:54 +0530 Subject: [PATCH 12/52] JAVA-918: Migrate jjwt to parent-boot-2 --- jjwt/pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/jjwt/pom.xml b/jjwt/pom.xml index 073f12a922..aa238fafb5 100644 --- a/jjwt/pom.xml +++ b/jjwt/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 @@ -30,6 +30,11 @@ org.springframework.boot spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + io.jsonwebtoken From c68c7648a3361ee26f35356e618ddc9ab189d3f0 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 18 Apr 2020 12:48:37 -0600 Subject: [PATCH 13/52] BAEL-3961 Remove address field of Employee class. --- .../main/java/com/baeldung/jdbc/Employee.java | 17 ++++------------- .../java/com/baeldung/jdbc/EmployeeDAO.java | 11 ++++++----- .../src/main/resources/jdbc/schema.sql | 3 +-- .../src/main/resources/jdbc/test-data.sql | 8 ++++---- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java index d5f87ca3df..bd6fe0fb15 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java @@ -7,13 +7,11 @@ public class Employee { private String lastName; - private String address; - public Employee(int id, String firstName, String lastName, String address) { - setId(id); - setFirstName(firstName); - setLastName(lastName); - setAddress(address); + public Employee(int id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; } public int getId() { @@ -40,12 +38,5 @@ public class Employee { this.lastName = lastName; } - public String getAddress() { - return address; - } - - public void setAddress(final String address) { - this.address = address; - } } diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index 25d280ad12..8637f6f851 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -30,23 +30,22 @@ public class EmployeeDAO { SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); List employees = namedJdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (:ids)", parameters, - (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); return employees; } public List getEmployeesFromIdList(List ids) { String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); - List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (" + inSql +")", + List employees = jdbcTemplate.query(String.format("SELECT * FROM EMPLOYEE WHERE id IN (%s)", inSql), ids.toArray(), - (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); return employees; } public List getEmployeesFromLargeIdList(List ids) { jdbcTemplate.execute("CREATE TEMPORARY TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)"); - jdbcTemplate.update("DELETE FROM employee_tmp"); List employeeIds = new ArrayList<>(); for (Integer id : ids) { @@ -55,7 +54,9 @@ public class EmployeeDAO { jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds); List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", - (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); + + jdbcTemplate.update("DELETE FROM employee_tmp"); return employees; } diff --git a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql index 3401c5d963..be102431ca 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql +++ b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql @@ -2,6 +2,5 @@ CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, FIRST_NAME varchar(255), - LAST_NAME varchar(255), - ADDRESS varchar(255) + LAST_NAME varchar(255) ); \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql index c1669c156d..5421c09849 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql +++ b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql @@ -1,4 +1,4 @@ -INSERT INTO EMPLOYEE VALUES (1, 'James', 'Gosling', 'Canada'); -INSERT INTO EMPLOYEE VALUES (2, 'Donald', 'Knuth', 'USA'); -INSERT INTO EMPLOYEE VALUES (3, 'Linus', 'Torvalds', 'Finland'); -INSERT INTO EMPLOYEE VALUES (4, 'Dennis', 'Ritchie', 'USA'); \ No newline at end of file +INSERT INTO EMPLOYEE VALUES (1, 'James', 'Gosling'); +INSERT INTO EMPLOYEE VALUES (2, 'Donald', 'Knuth'); +INSERT INTO EMPLOYEE VALUES (3, 'Linus', 'Torvalds'); +INSERT INTO EMPLOYEE VALUES (4, 'Dennis', 'Ritchie'); \ No newline at end of file From 647a6dc798f3674e6072e88ad158d41534cba232 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 19 Apr 2020 18:54:43 +0200 Subject: [PATCH 14/52] JAVA-1130: Update the x509 mutual authentication codebase --- .../spring-security-x509/keystore/Makefile | 92 ------------------ .../keystore/keystore.jks | Bin 9310 -> 0 bytes .../src/main/resources/application.properties | 2 +- .../x509/X509AuthenticationServer.java | 8 +- .../src/main/resources/application.properties | 4 +- .../src/main/resources/keystore.jks | Bin 9310 -> 0 bytes .../spring-security-x509/store/clientBob.p12 | Bin 0 -> 4024 bytes .../spring-security-x509/store/keystore.jks | Bin 0 -> 3718 bytes .../spring-security-x509/store/rootCA.crt | 30 ++++++ .../spring-security-x509/store/truststore.jks | Bin 0 -> 1358 bytes 10 files changed, 39 insertions(+), 97 deletions(-) delete mode 100644 spring-security-modules/spring-security-x509/keystore/Makefile delete mode 100644 spring-security-modules/spring-security-x509/keystore/keystore.jks delete mode 100644 spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/keystore.jks create mode 100644 spring-security-modules/spring-security-x509/store/clientBob.p12 create mode 100644 spring-security-modules/spring-security-x509/store/keystore.jks create mode 100644 spring-security-modules/spring-security-x509/store/rootCA.crt create mode 100644 spring-security-modules/spring-security-x509/store/truststore.jks diff --git a/spring-security-modules/spring-security-x509/keystore/Makefile b/spring-security-modules/spring-security-x509/keystore/Makefile deleted file mode 100644 index 2cd7c55c5b..0000000000 --- a/spring-security-modules/spring-security-x509/keystore/Makefile +++ /dev/null @@ -1,92 +0,0 @@ -PASSWORD=changeit -KEYSTORE=keystore.jks -HOSTNAME=localhost -CLIENTNAME=cid -CLIENT_PRIVATE_KEY="${CLIENTNAME}_pk" - -# CN = Common Name -# OU = Organization Unit -# O = Organization Name -# L = Locality Name -# ST = State Name -# C = Country (2-letter Country Code) -# E = Email -DNAME_CA='CN=Baeldung CA,OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' -# For server certificates, the Common Name (CN) must be the hostname -DNAME_HOST='CN=$(HOSTNAME),OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' -DNAME_CLIENT='CN=$(CLIENTNAME),OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' -TRUSTSTORE=truststore.jks - -all: clean create-keystore add-host create-truststore add-client - -create-keystore: - # Generate a certificate authority (CA) - keytool -genkey -alias ca -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ - -validity 3650 -dname $(DNAME_CA) \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - -add-host: - # Generate a host certificate - keytool -genkey -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ - -validity 3650 -dname $(DNAME_HOST) \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Generate a host certificate signing request - keytool -certreq -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ - -validity 3650 -file "$(HOSTNAME).csr" \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Generate signed certificate with the certificate authority - keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ - -validity 3650 -sigalg SHA512withRSA \ - -infile "$(HOSTNAME).csr" -outfile "$(HOSTNAME).crt" -rfc \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Import signed certificate into the keystore - keytool -import -trustcacerts -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ - -file "$(HOSTNAME).crt" \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - -export-authority: - # Export certificate authority - keytool -export -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt -rfc \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - - -create-truststore: export-authority - # Import certificate authority into a new truststore - keytool -import -trustcacerts -noprompt -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - -add-client: - # Generate client certificate - keytool -genkey -alias $(CLIENT_PRIVATE_KEY) -ext san=dns:localhost,ip:127.0.0.1 \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ - -validity 3650 -dname $(DNAME_CLIENT) \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - # Generate a host certificate signing request - keytool -certreq -alias $(CLIENT_PRIVATE_KEY) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ - -validity 3650 -file "$(CLIENTNAME).csr" \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - # Generate signed certificate with the certificate authority - keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ - -validity 3650 -sigalg SHA512withRSA \ - -infile "$(CLIENTNAME).csr" -outfile "$(CLIENTNAME).crt" -rfc \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Import signed certificate into the truststore - keytool -import -trustcacerts -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ - -file "$(CLIENTNAME).crt" \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - # Export private certificate for importing into a browser - keytool -importkeystore -srcalias $(CLIENT_PRIVATE_KEY) -ext san=dns:localhost,ip:127.0.0.1 \ - -srckeystore $(TRUSTSTORE) -srcstorepass $(PASSWORD) \ - -destkeystore "$(CLIENTNAME).p12" -deststorepass $(PASSWORD) \ - -deststoretype PKCS12 - # Delete client private key as truststore should not contain any private keys - keytool -delete -alias $(CLIENT_PRIVATE_KEY) \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - -clean: - # Remove generated artifacts - find . \( -name "$(CLIENTNAME)*" -o -name "$(HOSTNAME)*" -o -name "$(KEYSTORE)" -o -name "$(TRUSTSTORE)" -o -name ca.crt \) -type f -exec rm -f {} \; diff --git a/spring-security-modules/spring-security-x509/keystore/keystore.jks b/spring-security-modules/spring-security-x509/keystore/keystore.jks deleted file mode 100644 index 044a820c39524f1ef3c470105dbaa82b63af0493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9310 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 DeRHq; diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties index 53dfe9976a..208cc90b47 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=keystore/keystore.jks +server.ssl.key-store=store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java index 050423238e..18bbfba835 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java @@ -23,7 +23,11 @@ public class X509AuthenticationServer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().anyRequest().authenticated().and().x509().subjectPrincipalRegex("CN=(.*?)(?:,|$)").userDetailsService(userDetailsService()); + http.authorizeRequests().anyRequest().authenticated() + .and() + .x509() + .subjectPrincipalRegex("CN=(.*?)(?:,|$)") + .userDetailsService(userDetailsService()); } @Bean @@ -31,7 +35,7 @@ public class X509AuthenticationServer extends WebSecurityConfigurerAdapter { return new UserDetailsService() { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - if (username.equals("cid")) { + if (username.equals("Bob")) { return new User(username, "", AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER")); } throw new UsernameNotFoundException("User not found!"); diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties index 743c9c4582..b841a37916 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=../keystore/keystore.jks +server.ssl.key-store=store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit @@ -6,6 +6,6 @@ server.ssl.enabled=true server.port=8443 spring.security.user.name=Admin spring.security.user.password=admin -server.ssl.trust-store=../keystore/truststore.jks +server.ssl.trust-store=store/truststore.jks server.ssl.trust-store-password=changeit server.ssl.client-auth=need \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/keystore.jks b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/keystore.jks deleted file mode 100644 index 044a820c39524f1ef3c470105dbaa82b63af0493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9310 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 DeRHq; diff --git a/spring-security-modules/spring-security-x509/store/clientBob.p12 b/spring-security-modules/spring-security-x509/store/clientBob.p12 new file mode 100644 index 0000000000000000000000000000000000000000..e5d6dbcefbfaffa2502b1ed9613bc1cb2f9ce573 GIT binary patch literal 4024 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 SChlA@P5Y@C!_vP&?!N$UlZxN~ literal 0 HcmV?d00001 diff --git a/spring-security-modules/spring-security-x509/store/keystore.jks b/spring-security-modules/spring-security-x509/store/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..8650651a1e0a884555a4219049340ce2314315cb GIT binary patch literal 3718 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 kxy)FR?K>|cBR4C9fw-ZlfiN3$C<`+Wk5gi5 zPD*KBx?XaAu7R95uaSX)iJ_&TnW34HMU*(NF^Fpp<>J=Z#H5652_q{5a}yIk1JGSu zOifIT49BM$^W7KtHD8{=CFWDwpFN*~jdU}7-`?18;<3|VO_vGD;VNb<+qW>AuXi$d z+oJIE)#-n`7izGno#5qty|q-+Pj^c!t5xPwt8FLS9Hi=PSA_?At#G$8^7(OTna9h| zU(*}v$}+D{xY!uv$o}!{!5pDUs)di5K5kjHEJR_(dAEf^p9QM-s5QNnDbY_8xtY14 ze!I&QbG^RL{d}_;m7|jnojABZ_RRSUl0hOS|L+8GPPIH${aC)WCOYZOTt~J`+Zx`v ztz#^&C$$!4y6MDMqL)gMoDi10a{ZzWX*Q8hF{?3UT-ajz-#M3b0%0(^X%jQz9 z(*yYS1gA(^+|%v*vt@(bb5C#m zqr1t9XZfFGFE&lnR$O%ml^CD z{o;x)T|blmM)~@se4iVSxWE5ot?8ft;N1Ti&QlKZ*s0xjVYUz0WGb8PGuz)oclE_t z3I!RT`y}!exvDpQUOri8a{s@3i;6{Rnm(@Ceb17c?{Bijs=xeyWd9n^_u8{|(slmd z`c=PJWtWE(8cY9e{TReJS2gx-OMJZeOF<@PMh3>k!3Kc_vcPmF%f}+dBJxQvl(Soo z=TPMDBWBa5xaB_Hp0vY29we>IB4HrbfL#GUNP#dT<9`-b17;wFoa}&U8<^}E8Pay; zebn#TwpV0c<<~9w^A_inu9@Bce!`dTz>_cDuzh;BWJe-bVHkJR^}E^gmn&{;WLWoL z=YyY9->QqOczDVCG3(*_sdj%nxGxn4#EB?QJhkkWuNxZ!|D1)ozi%GBU%N~2gvZ;M zYSlOf>+?yq*YDh&_v*{xX~Nw~>-svkta}=n{{GD#;jiq@(O);bXJxQh?wJ(Icy6(T zJR{?r4qs#K)+&R~#fi%%&gkfg+L^P8S8TSjj3&Q)!(BcRu5z}ms?ullcl}Xv&C)N< z@S3}Rf~>WXOOo6b?x(W*5A{kO-**E-gD3D1RFrm1-CeZKbAvKgL{4}&FC*7<$6{b(+^U$i;;V4Pmt zv=YHOzmC{4^Q{*|w<&tR_Lz90PnLUW66Z^n8$VZW(21SmsiDp~hdeXV-epP%lLX{{Pt~YuAkgeTRL%j-Pav1UuxNS z9G07G_!P#)_@z?sMs=5H(tpdsH0#^(y3D_O{F^7Y9jblszw$@S4hKVfYpsuWzDC@Z zySMI8(u4W>yZHG%nwAAWDG8X{u^;1It literal 0 HcmV?d00001 From 7b0c9d508f38ceb812bae691606755c53b897870 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 20 Apr 2020 12:00:03 +0300 Subject: [PATCH 15/52] Update README.md --- libraries-data-2/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index 24618b5e37..f96fab5120 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -11,4 +11,7 @@ This module contains articles about libraries for data processing in Java. - [Guide to JMapper](https://www.baeldung.com/jmapper) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) - [Intro to Derive4J](https://www.baeldung.com/derive4j) -More articles: [[<-- prev]](/../libraries-data) \ No newline at end of file +More articles: [[<-- prev]](/../libraries-data) + +#Building the project +You can build the project from the command line using: mvn clean install, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: target/generated-sources/annotations to the project build path in your IDE. From f55d344629d3a148ed5fce139bf3fc688cf8962c Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 20 Apr 2020 12:01:27 +0300 Subject: [PATCH 16/52] Update README.md --- libraries-data-2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index f96fab5120..f992186bd9 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -13,5 +13,5 @@ This module contains articles about libraries for data processing in Java. - [Intro to Derive4J](https://www.baeldung.com/derive4j) More articles: [[<-- prev]](/../libraries-data) -#Building the project -You can build the project from the command line using: mvn clean install, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: target/generated-sources/annotations to the project build path in your IDE. +##### Building the project +You can build the project from the command line using: *mvn clean install*, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: *target/generated-sources/annotations* to the project build path in your IDE. From 8da24b4abe906ab8dae62e007a0f13b1d097c50b Mon Sep 17 00:00:00 2001 From: Vikas Rajput Date: Mon, 20 Apr 2020 19:01:55 +0300 Subject: [PATCH 17/52] BAEL-3557: Completed a simple web application in spring boot and groovy (#9152) Co-authored-by: Vikas Ramsingh Rajput --- spring-boot-groovy/pom.xml | 83 ++++++++++++++++ .../app/SpringBootGroovyApplication.groovy | 13 +++ .../app/controller/TodoController.groovy | 48 +++++++++ .../com/baeldung/app/entity/Todo.groovy | 23 +++++ .../app/repository/TodoRepository.groovy | 9 ++ .../baeldung/app/service/TodoService.groovy | 16 +++ .../app/service/impl/TodoServiceImpl.groovy | 40 ++++++++ .../src/main/resources/application.properties | 5 + .../com/baeldung/app/TodoAppUnitTest.groovy | 97 +++++++++++++++++++ 9 files changed, 334 insertions(+) create mode 100644 spring-boot-groovy/pom.xml create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy create mode 100644 spring-boot-groovy/src/main/resources/application.properties create mode 100644 spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy diff --git a/spring-boot-groovy/pom.xml b/spring-boot-groovy/pom.xml new file mode 100644 index 0000000000..f61398c5d6 --- /dev/null +++ b/spring-boot-groovy/pom.xml @@ -0,0 +1,83 @@ + + + + 4.0.0 + com.baeldung.app + spring-boot-groovy + spring-boot-groovy + war + Spring Boot Todo Application with Groovy + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.codehaus.groovy + groovy + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + runtime + + + net.bytebuddy + byte-buddy-dep + 1.10.9 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.9.0 + + + + addSources + addTestSources + generateStubs + compile + generateTestStubs + compileTests + removeStubs + removeTestStubs + + + + + + + + + com.baeldung.app.SpringBootGroovyApplication + + + diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy new file mode 100644 index 0000000000..226a2ff53d --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy @@ -0,0 +1,13 @@ +package com.baeldung.app + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + +import com.baeldung.app.SpringBootGroovyApplication + +@SpringBootApplication +class SpringBootGroovyApplication { + static void main(String[] args) { + SpringApplication.run SpringBootGroovyApplication, args + } +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy new file mode 100644 index 0000000000..02f6d0223b --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy @@ -0,0 +1,48 @@ +package com.baeldung.app.controller + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.DeleteMapping +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.PutMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RestController + +import com.baeldung.app.entity.Todo +import com.baeldung.app.service.TodoService + +@RestController +@RequestMapping('todo') +public class TodoController { + + @Autowired + TodoService todoService + + @GetMapping + List getAllTodoList(){ + todoService.findAll() + } + + @PostMapping + Todo saveTodo(@RequestBody Todo todo){ + todoService.saveTodo todo + } + + @PutMapping + Todo updateTodo(@RequestBody Todo todo){ + todoService.updateTodo todo + } + + @DeleteMapping('/{todoId}') + deleteTodo(@PathVariable Integer todoId){ + todoService.deleteTodo todoId + } + + @GetMapping('/{todoId}') + Todo getTodoById(@PathVariable Integer todoId){ + todoService.findById todoId + } +} \ No newline at end of file diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy new file mode 100644 index 0000000000..9f1253c5b3 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy @@ -0,0 +1,23 @@ +package com.baeldung.app.entity + +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.GeneratedValue +import javax.persistence.GenerationType +import javax.persistence.Id +import javax.persistence.Table + +@Entity +@Table(name = 'todo') +class Todo { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Integer id + + @Column + String task + + @Column + Boolean isCompleted + +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy new file mode 100644 index 0000000000..c0b35cc37d --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy @@ -0,0 +1,9 @@ +package com.baeldung.app.repository + +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +import com.baeldung.app.entity.Todo + +@Repository +interface TodoRepository extends JpaRepository {} \ No newline at end of file diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy new file mode 100644 index 0000000000..0a59d93330 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy @@ -0,0 +1,16 @@ +package com.baeldung.app.service + +import com.baeldung.app.entity.Todo + +interface TodoService { + + List findAll() + + Todo findById(Integer todoId) + + Todo saveTodo(Todo todo) + + Todo updateTodo(Todo todo) + + Todo deleteTodo(Integer todoId) +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy new file mode 100644 index 0000000000..6d0ee03a9f --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy @@ -0,0 +1,40 @@ +package com.baeldung.app.service.impl + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +import com.baeldung.app.entity.Todo +import com.baeldung.app.repository.TodoRepository +import com.baeldung.app.service.TodoService + +@Service +class TodoServiceImpl implements TodoService { + + @Autowired + TodoRepository todoRepository + + @Override + List findAll() { + todoRepository.findAll() + } + + @Override + Todo findById(Integer todoId) { + todoRepository.findById todoId get() + } + + @Override + Todo saveTodo(Todo todo){ + todoRepository.save todo + } + + @Override + Todo updateTodo(Todo todo){ + todoRepository.save todo + } + + @Override + Todo deleteTodo(Integer todoId){ + todoRepository.deleteById todoId + } +} diff --git a/spring-boot-groovy/src/main/resources/application.properties b/spring-boot-groovy/src/main/resources/application.properties new file mode 100644 index 0000000000..8d53a190bb --- /dev/null +++ b/spring-boot-groovy/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:mem:todo +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=sa +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy b/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy new file mode 100644 index 0000000000..faf2d64ba7 --- /dev/null +++ b/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy @@ -0,0 +1,97 @@ +package com.baeldung.app + +import static org.junit.jupiter.api.Assertions.assertEquals +import static org.junit.jupiter.api.Assertions.assertTrue + +import org.junit.BeforeClass +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.test.context.event.annotation.BeforeTestClass +import org.springframework.test.context.junit4.SpringRunner + +import com.baeldung.app.entity.Todo + +import io.restassured.RestAssured +import io.restassured.response.Response + +class TodoAppUnitTest { + static API_ROOT = 'http://localhost:8081/todo' + static readingTodoId + static writingTodoId + + @BeforeClass + static void populateDummyData() { + Todo readingTodo = new Todo(task: 'Reading', isCompleted: false) + Todo writingTodo = new Todo(task: 'Writing', isCompleted: false) + + final Response readingResponse = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(readingTodo).post(API_ROOT) + + Todo cookingTodoResponse = readingResponse.as Todo.class + readingTodoId = cookingTodoResponse.getId() + + final Response writingResponse = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(writingTodo).post(API_ROOT) + + Todo writingTodoResponse = writingResponse.as Todo.class + writingTodoId = writingTodoResponse.getId() + } + + @Test + void whenGetAllTodoList_thenOk(){ + final Response response = RestAssured.get(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + assertTrue response.as(List.class).size() > 0 + } + + @Test + void whenGetTodoById_thenOk(){ + final Response response = + RestAssured.get("$API_ROOT/$readingTodoId") + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + Todo todoResponse = response.as Todo.class + assertEquals readingTodoId,todoResponse.getId() + } + + @Test + void whenUpdateTodoById_thenOk(){ + Todo todo = new Todo(id:readingTodoId, isCompleted: true) + final Response response = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(todo).put(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + Todo todoResponse = response.as Todo.class + assertTrue todoResponse.getIsCompleted() + } + + @Test + void whenDeleteTodoById_thenOk(){ + final Response response = + RestAssured.given() + .delete("$API_ROOT/$writingTodoId") + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + } + + @Test + void whenSaveTodo_thenOk(){ + Todo todo = new Todo(task: 'Blogging', isCompleted: false) + final Response response = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(todo).post(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + } +} \ No newline at end of file From 6dcb364fe7ca11aab44ddb190227fb5a9cc0946a Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 20 Apr 2020 22:42:22 +0530 Subject: [PATCH 18/52] JAVA-917: Migrate jhipster-5 to parent-boot-2 --- jhipster-5/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jhipster-5/pom.xml b/jhipster-5/pom.xml index cebbe25d8b..2a5132e50e 100644 --- a/jhipster-5/pom.xml +++ b/jhipster-5/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From fd318eb47615796d28901386aa158b51212db0fb Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 20 Apr 2020 23:15:30 +0530 Subject: [PATCH 19/52] JAVA-919: Migrate jmeter to parent-boot-2 --- jmeter/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jmeter/pom.xml b/jmeter/pom.xml index 64642695ff..945210edd7 100644 --- a/jmeter/pom.xml +++ b/jmeter/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From 4fe86bb104b27cbb2601b0aac5f81a295fba0402 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 20 Apr 2020 23:42:21 +0530 Subject: [PATCH 20/52] JAVA-920: Migrate libraries-security to parent-boot-2 --- libraries-security/pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml index e287de4527..e02f766141 100644 --- a/libraries-security/pom.xml +++ b/libraries-security/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 @@ -23,7 +23,9 @@ org.springframework.security.oauth spring-security-oauth2 + ${spring-boot.version} + org.springframework spring-web From fdce9657e353378c627c5effde51c5cc36380ad2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:15:56 +0800 Subject: [PATCH 21/52] Update README.md --- netty/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/netty/README.md b/netty/README.md index b006c1c686..8b13789179 100644 --- a/netty/README.md +++ b/netty/README.md @@ -1,6 +1 @@ -## Netty - -This module contains articles about Netty. - -### Relevant Articles: From c367c05c53fdcc1c45642ae053143d5e91df961c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:16:07 +0800 Subject: [PATCH 22/52] Delete README.md --- netty/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 netty/README.md diff --git a/netty/README.md b/netty/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/netty/README.md +++ /dev/null @@ -1 +0,0 @@ - From b5603f9fce1721bafb94d3442360ede620e68d62 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:17:56 +0800 Subject: [PATCH 23/52] Update README.md --- java-collections-maps-3/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md index ed68eb00a0..8b13789179 100644 --- a/java-collections-maps-3/README.md +++ b/java-collections-maps-3/README.md @@ -1,8 +1 @@ -## Java Collections Cookbooks and Examples -This module contains articles about Map data structures in Java. - -### Relevant Articles: - -- More articles: [[<-- prev>]](/../java-collections-maps) -- More articles: [[<-- prev>]](/../java-collections-maps-2) From c9c48fda086801eb260c4e92facca1c6b7ad08a0 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:18:04 +0800 Subject: [PATCH 24/52] Delete README.md --- java-collections-maps-3/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 java-collections-maps-3/README.md diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/java-collections-maps-3/README.md +++ /dev/null @@ -1 +0,0 @@ - From 6a41016938929ad22c46c9c1708d4dc1f9524aea Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:30:05 +0800 Subject: [PATCH 25/52] Update README.md --- guava/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guava/README.md b/guava/README.md index 71f76c1360..9c650dbc1d 100644 --- a/guava/README.md +++ b/guava/README.md @@ -13,3 +13,4 @@ This module contains articles a Google Guava - [Bloom Filter in Java using Guava](https://www.baeldung.com/guava-bloom-filter) - [Quick Guide to the Guava RateLimiter](https://www.baeldung.com/guava-rate-limiter) - [Introduction to Guava Throwables](https://www.baeldung.com/guava-throwables) +- [Guava Cache](https://www.baeldung.com/guava-cache) From 458c4d8505fe12160769b5208eb5b5e4c68b0b51 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:33:38 +0800 Subject: [PATCH 26/52] Update README.md --- core-kotlin-modules/core-kotlin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-kotlin-modules/core-kotlin/README.md b/core-kotlin-modules/core-kotlin/README.md index 151da607ac..90caccf5c8 100644 --- a/core-kotlin-modules/core-kotlin/README.md +++ b/core-kotlin-modules/core-kotlin/README.md @@ -3,7 +3,7 @@ This module contains articles about Kotlin core features. ### Relevant articles: -- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin/tutorial) +- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin-intro) - [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability) - [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number) - [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project) From 8c151edb1e887572eb77d05ae55f7f5766f65f87 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:36:40 +0800 Subject: [PATCH 27/52] Update README.md --- spring-boot-modules/spring-boot-testing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md index 9bbaf337d7..192f5cee99 100644 --- a/spring-boot-modules/spring-boot-testing/README.md +++ b/spring-boot-modules/spring-boot-testing/README.md @@ -13,4 +13,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level) - [Embedded Redis Server with Spring Boot Test](https://www.baeldung.com/spring-embedded-redis) - [Testing Spring Boot @ConfigurationProperties](https://www.baeldung.com/spring-boot-testing-configurationproperties) -- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing]() +- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing](https://www.baeldung.com/spring-junit-prevent-runner-beans-testing-execution) From 34d94a78f0639095029abfc7acd3a85b0c6dabc7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 21 Apr 2020 11:33:15 +0530 Subject: [PATCH 28/52] JAVA-920: Copied missing artifact so that live test runs ok --- .../src/main/resources/Baeldung.p12 | Bin 0 -> 2502 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 libraries-security/src/main/resources/Baeldung.p12 diff --git a/libraries-security/src/main/resources/Baeldung.p12 b/libraries-security/src/main/resources/Baeldung.p12 new file mode 100644 index 0000000000000000000000000000000000000000..65ec8bc8fec33120b2c11276883dde5dad7a3ea6 GIT binary patch literal 2502 zcmY+Ec{CJ^8pg-W7-KiSAxm~&AvE}qeFbou@HKRX#MCzW*R!0LL7Y% z7)Sr`m+g30_7yeFjs-&~fCI+{-yx;|%9MeT2(tgQ10!G4XA2 zkG>wSErwX=^nQsIu&jb*uF4fhJf{o`c{-h8IOQJ-3P1FiZj0wRF6K9 z8mc&Zv?tvBj9P!Y^4uoj2G=6#18%wBeI!8jBRU|{P+P>0Aj=k375X=>QV+%oS!bk}+lJ+=1;z2pF||>sP$r3Brd~; zK)4%I2x>Ka+<;kKSK~)>L|uxGz&8_NxTGL2SC%Ui58tY=@-RCRhmrcaiO=Kg3VLao zL4POxN4d@n*d5|D3|P>OiNs!L2y3}V91S9g=+MPm2z2B)8SfIlps2SxADFc?et7bp zX$NVVRh<~4WzxjUvYD%W)wYw9O8Brp^L0RcbZ~X#P4;$ zj@d^cTmNv5A?VBUvx?k4kPIs2@lgJ*dzk-y`e;r~_tMcguyihj(WZx;W7st6eU1^p zA%3;BP+|V=UsgnMaP2xR9K?kLwyMXM~nWS!589aEx|ZivtPE+FCig}|Cv7n z4X_Xg-u#7*)&HXc=rv2DY6l{514xv{C2smp+M* z0HVF+G4qecX9^nOQ_20k2BM02$9dQ593Rq`jJUz%jTp%B$M|BdRc91;W`+2m}mmXL+cwS z-&0lg5an|f6il`kXk#vPZhK2Z{$$;;@;0;b_10a*B5Rf5vKBR^@uJW`WS*}TZ=JLU zrj7F9)-nOh*HW4C!Otz_FqYnEa!4nC@x0Wy?`_DN=c%fjkhTs@U^UB&)l0w$4n{K* zxd;D}W@$I_F{l@h(sB)s*Iz+sw{FOEa8& z#EfydGU+EgJ3m#S4b&`TTCBfC)eJ1M>U(%yKc+7F3lI-0X##xff#=dtmj;cWs@*(1 zZXS(tbGXP@?braN#P>=GxwN^xFqQBRSvZbJniMWr*lo`MXc=JWLQ&?yr)-$(Q$h^t zmmrKH?`t%wDk~pX1aJ^CbU%HXCAh@rR6?f`m^|7yVOF)+`(Y=4B-tto(B<>E=#QYq z&@RDn^M$lUwdx-1I4h;lvzUX6)HqThjqi4SlgM#nYG;nAtd-nO%TPn)KA9c{jep;9 zv79sQ{V`P{aJuEBb+8(|yi8}R z6hXIAFE*35l(toZR?k^d;kDRbp0Bi3D0P+;?`sW)yZdU2IS(8r-PlbgD6J2GLhODl zx^Ea$kiSoZQ1qd#$ zrw<*y{e#y|n++B0#ujM&wp!KoH<8hT7JB{RiW`47kpL%2BP;hRkV5E^;HN+5b za*HI=nMx7`*nucDb(iCuuCi`KplQ=xzr^Ya{l%oz=!5s?{M_rv@Zq3;FGnmok06!C z!iZ>7b}M(R4R=#t|6J8 Date: Tue, 21 Apr 2020 14:11:41 +0800 Subject: [PATCH 29/52] Update README.md --- core-java-modules/core-java-string-operations-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md index bc00c6a915..45b02a3e10 100644 --- a/core-java-modules/core-java-string-operations-2/README.md +++ b/core-java-modules/core-java-string-operations-2/README.md @@ -9,7 +9,6 @@ This module contains articles about string operations. - [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case) - [Java String equalsIgnoreCase()](https://www.baeldung.com/java-string-equalsignorecase) - [Case-Insensitive String Matching in Java](https://www.baeldung.com/java-case-insensitive-string-matching) -- [L-Trim and R-Trim in Java](https://www.baeldung.com/l-trim-and-r-trim-in-java) - [L-Trim and R-Trim Alternatives in Java](https://www.baeldung.com/java-trim-alternatives) - [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) - More articles: [[<-- prev]](../core-java-string-operations) From b58db90f3bc2333a1b34ddbac2024f30bb358b84 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:13:43 +0800 Subject: [PATCH 30/52] Delete README.md --- maven-all/versions-maven-plugin/original/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 maven-all/versions-maven-plugin/original/README.md diff --git a/maven-all/versions-maven-plugin/original/README.md b/maven-all/versions-maven-plugin/original/README.md deleted file mode 100644 index 5652a9b7e4..0000000000 --- a/maven-all/versions-maven-plugin/original/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) From 4a75b130579bd8e5641ed9b71f8d7aa13eb8c338 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:15:57 +0800 Subject: [PATCH 31/52] Update README.md --- persistence-modules/spring-jpa/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index 27a2fe8368..599a667a13 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -10,7 +10,7 @@ - [Self-Contained Testing Using an In-Memory Database](https://www.baeldung.com/spring-jpa-test-in-memory-database) - [A Guide to Spring AbstractRoutingDatasource](https://www.baeldung.com/spring-abstract-routing-data-source) - [Obtaining Auto-generated Keys in Spring JDBC](https://www.baeldung.com/spring-jdbc-autogenerated-keys) -- [Transactions with Spring 4 and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring) +- [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring) - [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries) - [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many) - [Spring Persistence (Hibernate and JPA) with a JNDI datasource](https://www.baeldung.com/spring-persistence-hibernate-and-jpa-with-a-jndi-datasource/) From d17e2b5b93c5b6b1e247c894088d1027a760ebbe Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:18:12 +0800 Subject: [PATCH 32/52] Delete README.md --- spring-core-3/src/main/java/com/baeldung/factorybean/README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 spring-core-3/src/main/java/com/baeldung/factorybean/README.md diff --git a/spring-core-3/src/main/java/com/baeldung/factorybean/README.md b/spring-core-3/src/main/java/com/baeldung/factorybean/README.md deleted file mode 100644 index 13f9f379e0..0000000000 --- a/spring-core-3/src/main/java/com/baeldung/factorybean/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) From 62ccb01325e5c44a0de557ac071e157c491b8235 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:19:47 +0800 Subject: [PATCH 33/52] Delete README.md --- maven-all/maven/custom-rule/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 maven-all/maven/custom-rule/README.md diff --git a/maven-all/maven/custom-rule/README.md b/maven-all/maven/custom-rule/README.md deleted file mode 100644 index 44d43050e7..0000000000 --- a/maven-all/maven/custom-rule/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin) From b2af10c98ba1934ce0c6fda08b03e34cb4e97284 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:26:20 +0800 Subject: [PATCH 34/52] Delete README.md --- ddd-modules/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 ddd-modules/README.md diff --git a/ddd-modules/README.md b/ddd-modules/README.md deleted file mode 100644 index ba6b8d5016..0000000000 --- a/ddd-modules/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [DDD Bounded Contexts and Java Modules](https://www.baeldung.com/java-modules-ddd-bounded-contexts) From 3266970b400419ed5967b64f141e67038c51c061 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:27:38 +0800 Subject: [PATCH 35/52] Create README.md --- ddd-modules/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 ddd-modules/README.md diff --git a/ddd-modules/README.md b/ddd-modules/README.md new file mode 100644 index 0000000000..ba6b8d5016 --- /dev/null +++ b/ddd-modules/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [DDD Bounded Contexts and Java Modules](https://www.baeldung.com/java-modules-ddd-bounded-contexts) From bbb0511669cf61ef04b5dd1d4593f53dfa277137 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:29:19 +0800 Subject: [PATCH 36/52] Update README.md --- maven-all/maven/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/maven-all/maven/README.md b/maven-all/maven/README.md index ced4a52703..c5f46ca184 100644 --- a/maven-all/maven/README.md +++ b/maven-all/maven/README.md @@ -7,7 +7,6 @@ have their own dedicated modules. - [Guide to the Core Maven Plugins](https://www.baeldung.com/core-maven-plugins) - [Maven Resources Plugin](https://www.baeldung.com/maven-resources-plugin) -- [Maven Compiler Plugin](https://www.baeldung.com/maven-compiler-plugin) - [Quick Guide to the Maven Surefire Plugin](https://www.baeldung.com/maven-surefire-plugin) - [The Maven Failsafe Plugin](https://www.baeldung.com/maven-failsafe-plugin) - [The Maven Verifier Plugin](https://www.baeldung.com/maven-verifier-plugin) From e01bab2ac0a217994918439b750858cf83889ce1 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 22 Apr 2020 15:42:16 +0530 Subject: [PATCH 37/52] JAVA-921: Migrate mesos-marathon to parent-boot-2 --- mesos-marathon/README.md | 2 +- mesos-marathon/pom.xml | 4 ++-- .../java/com/baeldung/DemoApplicationIntegrationTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md index 65b2361698..8e5b8e4974 100644 --- a/mesos-marathon/README.md +++ b/mesos-marathon/README.md @@ -6,4 +6,4 @@ This module contains articles about Marathon and Mesos. - [Simple Jenkins Pipeline with Marathon and Mesos](https://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) - To run the pipeline, please modify the dockerise.sh file with your own useranema and password for docker login. + To run the pipeline, please modify the dockerise.sh file with your own username and password for docker login. diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml index 4fb819c434..42798bb209 100644 --- a/mesos-marathon/pom.xml +++ b/mesos-marathon/pom.xml @@ -7,9 +7,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java b/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java index 85331516f9..dfe944a316 100644 --- a/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java +++ b/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java @@ -3,8 +3,8 @@ package com.baeldung; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; From 0cf5e3662336102b3ce4a3ef045c27dadcdace76 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 22 Apr 2020 17:44:28 +0530 Subject: [PATCH 38/52] JAVA-922: Migrate flyway to parent-boot-2 --- persistence-modules/flyway/pom.xml | 6 +++--- .../flyway/src/main/resources/application.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml index 01b3dab6ee..f2e393abbf 100644 --- a/persistence-modules/flyway/pom.xml +++ b/persistence-modules/flyway/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 @@ -63,7 +63,7 @@ - 5.0.2 + 5.2.3 5.0.2 diff --git a/persistence-modules/flyway/src/main/resources/application.properties b/persistence-modules/flyway/src/main/resources/application.properties index 4d339eca5c..cee75fa4d9 100644 --- a/persistence-modules/flyway/src/main/resources/application.properties +++ b/persistence-modules/flyway/src/main/resources/application.properties @@ -1 +1 @@ -#flyway.enabled=false \ No newline at end of file +#spring.flyway.enabled=false \ No newline at end of file From 17d9e00dc3dd1cd6d6fb1a03d376a4c6c6e7e6b1 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Wed, 22 Apr 2020 20:21:36 +0530 Subject: [PATCH 39/52] BAEL-3988: Calling a SOAP web service in Java (#9166) --- jee-7/pom.xml | 23 ++++ .../soap/ws/client/generated/Country.java | 129 ++++++++++++++++++ .../ws/client/generated/CountryService.java | 34 +++++ .../generated/CountryServiceImplService.java | 91 ++++++++++++ .../soap/ws/client/generated/Currency.java | 37 +++++ .../ws/client/generated/ObjectFactory.java | 38 ++++++ .../ws/client/generated/package-info.java | 2 + .../com/baeldung/soap/ws/server/Country.java | 41 ++++++ .../soap/ws/server/CountryRepository.java | 43 ++++++ .../soap/ws/server/CountryService.java | 15 ++ .../soap/ws/server/CountryServiceImpl.java | 15 ++ .../ws/server/CountryServicePublisher.java | 19 +++ .../com/baeldung/soap/ws/server/Currency.java | 15 ++ jee-7/src/main/resources/country.wsdl | 40 ++++++ jee-7/src/main/resources/country.xsd | 21 +++ .../soap/ws/client/CountryClientLiveTest.java | 39 ++++++ 16 files changed, 602 insertions(+) create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java create mode 100644 jee-7/src/main/resources/country.wsdl create mode 100644 jee-7/src/main/resources/country.xsd create mode 100644 jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java diff --git a/jee-7/pom.xml b/jee-7/pom.xml index a2593e46a5..7352c6550a 100644 --- a/jee-7/pom.xml +++ b/jee-7/pom.xml @@ -242,6 +242,29 @@ + + + org.codehaus.mojo + jaxws-maven-plugin + 2.6 + + + wsimport-from-jdk + + wsimport + + + + + src/main/resources + + country.wsdl + + true + com.baeldung.soap.ws.client.generated + src/main/java + + diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java new file mode 100644 index 0000000000..6a810b9afa --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java @@ -0,0 +1,129 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + +/** + *

Java class for country complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="country">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="capital" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         <element name="currency" type="{http://server.ws.soap.baeldung.com/}currency" minOccurs="0"/>
+ *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         <element name="population" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "country", propOrder = { "capital", "currency", "name", "population" }) +public class Country { + + protected String capital; + @XmlSchemaType(name = "string") + protected Currency currency; + protected String name; + protected int population; + + /** + * Gets the value of the capital property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCapital() { + return capital; + } + + /** + * Sets the value of the capital property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCapital(String value) { + this.capital = value; + } + + /** + * Gets the value of the currency property. + * + * @return + * possible object is + * {@link Currency } + * + */ + public Currency getCurrency() { + return currency; + } + + /** + * Sets the value of the currency property. + * + * @param value + * allowed object is + * {@link Currency } + * + */ + public void setCurrency(Currency value) { + this.currency = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the population property. + * + */ + public int getPopulation() { + return population; + } + + /** + * Sets the value of the population property. + * + */ + public void setPopulation(int value) { + this.population = value; + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java new file mode 100644 index 0000000000..bda4a305a5 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java @@ -0,0 +1,34 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.ws.Action; + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.3.2 + * Generated source version: 2.2 + * + */ +@WebService(name = "CountryService", targetNamespace = "http://server.ws.soap.baeldung.com/") +@SOAPBinding(style = SOAPBinding.Style.RPC) +@XmlSeeAlso({ ObjectFactory.class }) +public interface CountryService { + + /** + * + * @param arg0 + * @return + * returns com.baeldung.soap.ws.client.generated.Country + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://server.ws.soap.baeldung.com/CountryService/findByNameRequest", output = "http://server.ws.soap.baeldung.com/CountryService/findByNameResponse") + public Country findByName(@WebParam(name = "arg0", partName = "arg0") String arg0); + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java new file mode 100644 index 0000000000..09f4c29202 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java @@ -0,0 +1,91 @@ + +package com.baeldung.soap.ws.client.generated; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; +import javax.xml.ws.WebEndpoint; +import javax.xml.ws.WebServiceClient; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.WebServiceFeature; + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.3.2 + * Generated source version: 2.2 + * + */ +@WebServiceClient(name = "CountryServiceImplService", targetNamespace = "http://server.ws.soap.baeldung.com/", wsdlLocation = "file:src/main/resources/country.wsdl") +public class CountryServiceImplService extends Service { + + private final static URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; + private final static WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; + private final static QName COUNTRYSERVICEIMPLSERVICE_QNAME = new QName("http://server.ws.soap.baeldung.com/", "CountryServiceImplService"); + + static { + URL url = null; + WebServiceException e = null; + try { + url = new URL("file:src/main/resources/country.wsdl"); + } catch (MalformedURLException ex) { + e = new WebServiceException(ex); + } + COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; + COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; + } + + public CountryServiceImplService() { + super(__getWsdlLocation(), COUNTRYSERVICEIMPLSERVICE_QNAME); + } + + public CountryServiceImplService(WebServiceFeature... features) { + super(__getWsdlLocation(), COUNTRYSERVICEIMPLSERVICE_QNAME, features); + } + + public CountryServiceImplService(URL wsdlLocation) { + super(wsdlLocation, COUNTRYSERVICEIMPLSERVICE_QNAME); + } + + public CountryServiceImplService(URL wsdlLocation, WebServiceFeature... features) { + super(wsdlLocation, COUNTRYSERVICEIMPLSERVICE_QNAME, features); + } + + public CountryServiceImplService(URL wsdlLocation, QName serviceName) { + super(wsdlLocation, serviceName); + } + + public CountryServiceImplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { + super(wsdlLocation, serviceName, features); + } + + /** + * + * @return + * returns CountryService + */ + @WebEndpoint(name = "CountryServiceImplPort") + public CountryService getCountryServiceImplPort() { + return super.getPort(new QName("http://server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService.class); + } + + /** + * + * @param features + * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values. + * @return + * returns CountryService + */ + @WebEndpoint(name = "CountryServiceImplPort") + public CountryService getCountryServiceImplPort(WebServiceFeature... features) { + return super.getPort(new QName("http://server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService.class, features); + } + + private static URL __getWsdlLocation() { + if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION != null) { + throw COUNTRYSERVICEIMPLSERVICE_EXCEPTION; + } + return COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java new file mode 100644 index 0000000000..8b9355edc5 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java @@ -0,0 +1,37 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + +/** + *

Java class for currency. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="currency">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     <enumeration value="EUR"/>
+ *     <enumeration value="INR"/>
+ *     <enumeration value="USD"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "currency") +@XmlEnum +public enum Currency { + + EUR, INR, USD; + + public String value() { + return name(); + } + + public static Currency fromValue(String v) { + return valueOf(v); + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java new file mode 100644 index 0000000000..241debe758 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java @@ -0,0 +1,38 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.xml.bind.annotation.XmlRegistry; + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.baeldung.soap.ws.client.generated package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.soap.ws.client.generated + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Country } + * + */ + public Country createCountry() { + return new Country(); + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java new file mode 100644 index 0000000000..6df70b70f1 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java @@ -0,0 +1,2 @@ +@javax.xml.bind.annotation.XmlSchema(namespace = "http://server.ws.soap.baeldung.com/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +package com.baeldung.soap.ws.client.generated; diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java new file mode 100644 index 0000000000..62ea4a22ed --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java @@ -0,0 +1,41 @@ +package com.baeldung.soap.ws.server; + +public class Country { + protected String name; + protected int population; + protected String capital; + protected Currency currency; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getPopulation() { + return population; + } + + public void setPopulation(int population) { + this.population = population; + } + + public String getCapital() { + return capital; + } + + public void setCapital(String capital) { + this.capital = capital; + } + + public Currency getCurrency() { + return currency; + } + + public void setCurrency(Currency currency) { + this.currency = currency; + } + +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java new file mode 100644 index 0000000000..558f7c1293 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java @@ -0,0 +1,43 @@ +package com.baeldung.soap.ws.server; + +import java.util.HashMap; +import java.util.Map; + +public class CountryRepository { + + private static final Map countries = new HashMap<>(); + + { + initData(); + } + + private final static void initData() { + Country usa = new Country(); + usa.setName("USA"); + usa.setCapital("Washington D.C."); + usa.setCurrency(Currency.USD); + usa.setPopulation(323947000); + + countries.put(usa.getName(), usa); + + Country india = new Country(); + india.setName("India"); + india.setCapital("New Delhi"); + india.setCurrency(Currency.INR); + india.setPopulation(1295210000); + + countries.put(india.getName(), india); + + Country france = new Country(); + france.setName("France"); + france.setCapital("Paris"); + france.setCurrency(Currency.EUR); + france.setPopulation(66710000); + + countries.put(france.getName(), france); + } + + public Country findCountry(String name) { + return countries.get(name); + } +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java new file mode 100644 index 0000000000..e3f68a4e59 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java @@ -0,0 +1,15 @@ +package com.baeldung.soap.ws.server; + +import javax.jws.WebMethod; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.jws.soap.SOAPBinding.Style; + +@WebService +@SOAPBinding(style=Style.RPC) +public interface CountryService { + + @WebMethod + Country findByName(String name); + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java new file mode 100644 index 0000000000..a8c6250354 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java @@ -0,0 +1,15 @@ +package com.baeldung.soap.ws.server; + +import javax.jws.WebService; + +@WebService(endpointInterface = "com.baeldung.soap.ws.server.CountryService") +public class CountryServiceImpl implements CountryService { + + private CountryRepository countryRepository = new CountryRepository(); + + @Override + public Country findByName(String name) { + return countryRepository.findCountry(name); + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java new file mode 100644 index 0000000000..e7c1c480f4 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java @@ -0,0 +1,19 @@ +package com.baeldung.soap.ws.server; + +import javax.xml.ws.Endpoint; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class CountryServicePublisher { + + private static final Logger logger = LoggerFactory.getLogger(CountryServicePublisher.class); + + public static void main(String[] args) { + Endpoint endpoint = Endpoint.create(new CountryServiceImpl()); + endpoint.publish("http://localhost:8888/ws/country"); + + logger.info("Country web service ready to consume requests!"); + } +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java new file mode 100644 index 0000000000..d1b25a26c6 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java @@ -0,0 +1,15 @@ +package com.baeldung.soap.ws.server; + +public enum Currency { + + EUR, INR, USD; + + public String value() { + return name(); + } + + public static Currency fromValue(String v) { + return valueOf(v); + } + +} diff --git a/jee-7/src/main/resources/country.wsdl b/jee-7/src/main/resources/country.wsdl new file mode 100644 index 0000000000..4d41fce322 --- /dev/null +++ b/jee-7/src/main/resources/country.wsdl @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/country.xsd b/jee-7/src/main/resources/country.xsd new file mode 100644 index 0000000000..c94b6047f9 --- /dev/null +++ b/jee-7/src/main/resources/country.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java b/jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java new file mode 100644 index 0000000000..ae423f9bdd --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java @@ -0,0 +1,39 @@ +package com.baeldung.soap.ws.client; + +import static org.junit.Assert.assertEquals; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.soap.ws.client.generated.CountryService; +import com.baeldung.soap.ws.client.generated.CountryServiceImplService; +import com.baeldung.soap.ws.client.generated.Currency; + +//Ensure that com.baeldung.soap.ws.server.CountryServicePublisher is running before executing this test +public class CountryClientLiveTest { + + private static CountryService countryService; + + @BeforeClass + public static void setup() { + CountryServiceImplService service = new CountryServiceImplService(); + countryService = service.getCountryServiceImplPort(); + } + + @Test + public void givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi() { + assertEquals("New Delhi", countryService.findByName("India").getCapital()); + } + + @Test + public void givenCountryService_whenCountryFrance_thenPopulationCorrect() { + assertEquals(66710000, countryService.findByName("France").getPopulation()); + } + + @Test + public void givenCountryService_whenCountryUSA_thenCurrencyUSD() { + assertEquals(Currency.USD, countryService.findByName("USA").getCurrency()); + } + + +} From 28de9f499781531a65d71041ebd5101f1401793c Mon Sep 17 00:00:00 2001 From: Mona Mohamadinia Date: Wed, 22 Apr 2020 20:37:18 +0430 Subject: [PATCH 40/52] Added Log Group Sample (#9112) --- .../baeldung/group/LogGroupApplication.java | 26 +++++++++++++++++++ .../application-log-group.properties | 1 + 2 files changed, 27 insertions(+) create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java b/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java new file mode 100644 index 0000000000..021f27bd98 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java @@ -0,0 +1,26 @@ +package com.baeldung.group; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@SpringBootApplication +@ActiveProfiles("log-group") +public class LogGroupApplication { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogGroupApplication.class); + + @RequestMapping("/log-group") + public void justLog() { + LOGGER.debug("Received a request"); + } + + public static void main(String[] args) { + SpringApplication.run(LogGroupApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties new file mode 100644 index 0000000000..6dfe11724e --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties @@ -0,0 +1 @@ +logging.level.web=debug \ No newline at end of file From b2af9262a218ada40a62a3abeddfe0ae0a763a50 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Wed, 22 Apr 2020 18:15:29 +0200 Subject: [PATCH 41/52] JAVA-1130: Improvements after review --- .../spring-security-x509/README.md | 7 +++ .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 4 +- .../spring-security-x509/store/clientBob.p12 | Bin 4024 -> 4024 bytes .../spring-security-x509/store/keystore.jks | Bin 3718 -> 3793 bytes .../spring-security-x509/store/localhost.ext | 5 ++ .../spring-security-x509/store/rootCA.crt | 56 +++++++++--------- .../spring-security-x509/store/truststore.jks | Bin 1358 -> 1358 bytes 8 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 spring-security-modules/spring-security-x509/store/localhost.ext diff --git a/spring-security-modules/spring-security-x509/README.md b/spring-security-modules/spring-security-x509/README.md index b1eb0debf5..da431d862c 100644 --- a/spring-security-modules/spring-security-x509/README.md +++ b/spring-security-modules/spring-security-x509/README.md @@ -4,3 +4,10 @@ This module contains articles about X.509 authentication with Spring Security ### Relevant Articles: - [X.509 Authentication in Spring Security](https://www.baeldung.com/x-509-authentication-in-spring-security) + +###### Note for the [X.509 Authentication in Spring Security](https://www.baeldung.com/x-509-authentication-in-spring-security): +All the ready to use certificates are located in the [store](store) directory. The application is already configured to use these files. +This means the app works out of the box. + +However, it's highly recommended that you follow the article step by step and generate all the needed files by yourself. +This will let you understand the topic more deeply. \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties index 208cc90b47..0ba5fa1b8c 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=store/keystore.jks +server.ssl.key-store=../store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties index b841a37916..fc2fc89396 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=store/keystore.jks +server.ssl.key-store=../store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit @@ -6,6 +6,6 @@ server.ssl.enabled=true server.port=8443 spring.security.user.name=Admin spring.security.user.password=admin -server.ssl.trust-store=store/truststore.jks +server.ssl.trust-store=../store/truststore.jks server.ssl.trust-store-password=changeit server.ssl.client-auth=need \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/store/clientBob.p12 b/spring-security-modules/spring-security-x509/store/clientBob.p12 index e5d6dbcefbfaffa2502b1ed9613bc1cb2f9ce573..b5de8ab129d23828273dd98f929290facba95900 100644 GIT binary patch delta 3873 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 delta 3873 zcmV++58m*&AGjZoU4Nu_iuk>hm%9Q22mpYB1uzWNIKkuvo;>nD2l?I%E5x*QwL&A|7^|HsuM^6hkk)*@RIPY}_ zUg3AnVA4tsVhy(6=QTgn_l!6^ zFAKrLRzF^|d5*4j%?c0{U;hEVns{tpY=WBec>wscLbemM(<936HAnZMC@m1QB=>8_ zGFOC;9Ss*@4Sz!sv3d;8##<=4pB?Y!IV{UKVI7bJC(%L7_o?6dxFv%E|L(@azD$X| zokh8}71F@h{+pkZUD&V%!ts^9)$!+;kFE2jJSNv5jfvrdt(ty>HrZ(rwPn$Ag}uRD z%l(NXo!GSGM6Sd)g!E0KeHXFgp9fZtZwUh!f8id3qh)Ft;L z?1sQnSOj*rSQ@qk=}O${)?qZp(lBG9tjqq$wftY=4)RpcY5SQRL{sz*({agS(xGrn0081LXZt&U46CxnA5p$mh5SUGg8jq|3~R zabZypEb5PxbLJ0sjzLq2X9C>a3MHu`WCph(aXL+uNQKoxhUJe#O=0*H)Qf9MCb4kE zZ0li2JFau#04>P?k@L{Jlh&qyw*H<99efHhzJHibz=9=QgWG9d9^k5s@fHo|F0A8~ zwatjQMntxR3DeNk{5aoRr!j%+{}LEjv1kCt0vT5C4w<4rknjjFd-c`u#o93qSClr1 z>bQdq+v5-~FLE)gpL)E;_x1*wH|VkD9@sFltz(#iX*;cdLj>Lv=%{S}mao4824Bn{ zE`PG1NIOQ?ztq8+j);D39TI(ObEJXBN5l*tUQ>^~%k62XRo|7uy2mQwpE2`SYDdBG zF;ZWZP!1M}O~itN7*iBw^zJ`>)-Q>8=jGHZokWBK{haXFs5A|tS+aMgr9pPu1RJGer64H0!P}Z4Hfq%{6ZNLWhL#rjAsRujYQZ;&>6{q624_zdg zplzh%k<9XnR+7LGl(RdD8FT&667!4rYZOE%RlUPtNCiOS*851i=?P}?SJTQ zJR^IFCbN(dcsXQJCEiubQw@7$M?0Nb{dU_rOa-N9dr!u=#xLHicY+z$`9=4U4Gv;~ zV>3|+L$NI)G-F|AGkR2+Q5YHPHZ`NU@JJKyh4waG3Ms#C6F=9oMkSv0ceLlgCvg^X z$JSmy`t0uVA29vL*FHQnQxYct(|)Wo*@m7-jD5;nQHDS0 z&D@7tsq=3r+AewR5s%|Zw~SC7APSSUrjUq_RpP{1xt=)MrZHJW2s@?mO$5 zy&i3N-WI~uhrs8hg;p$i$|)$IP{Ug96{tByZG*lj=;wKX_hbw_SG|$Aq9*a}ryiq# z2S^C}q(vs-)px_^NUlKIlbr=df3-%WP3(RFvH}7K00e>wNQ40om zu(H{pGsc5Bw9l;?Wtgi3@cI%6=wC|q(5BdmgI9kVzDpHr8ro$R-3_06(IM}2$$7O$ zARv);gUIIhY`(!D+u50~?i*ZgVHOP~^HZ$$SPClA^{Pj=KFt%|)62sM@?xw_QyvHC z7Y>jg9s`vV!^&$ejv>tRf7^pilrD@OJ`S7BiSiv&lG)gpNF&4;J1QD2qm0JR7f{gM z0Fm0yQ6NUPG%u(4Fn|8YeeiPcVb-kz)im?|K>=9s_KzLGu|H+~bE9FTja|Ya^Fc#A zsc1+0OGlRzPZqf`K0v9vBhCWXmBsd4R$jVN$&#{a%z<3`x%pxHe}QW zUSII)`wP#57U5jK1n!MlLR5N3Mi`uYS0^zXu{gw}Zm)-h%{Y3&kSfjwvwY-s^>xsY zXGe|^+ovq~QX3V|f2-7hZqXSJ!72H6!cZ>bnuHIBafh#^`M*(?!s)?U6h(fWmspfSD)~=ep zSP5U}s|N`LC{-!N^acAi_ild5uc1l1?Gza>o_!=#_$Vf}el)>UI=#a9Np>QviZWu%c+;Y-WVv&yU0ch%))+0COCQX9e9RVEaSO~{u+)wg23 zXz4rjqh7FNTxS(pxy#wF=2KZ7FB7OkBl-YpsUm5@IZy&HjP3Sg)k`Lz64^nuO?^YL z)>o}CkWxPCfB$Z`a-u)`gaX)DUorT;)98G6$guhp*+()dtF)<-<%1ccDWUp7JMB@< zN&l~@(INvSj5^M_qD`5etj(R!d9|9;HHKLYqP5^cxPO?Nxn3;-Px4K}Xq?h{lspwl z)>_md)Zwx}EtXpo<3QEgH|c)xeQbn?uoj>3;fvsje=N&k9d1CUOXBpWAl{wSe&!r;3QCPS|-*fY5@B8T>NopUWMyefhgKF5RM3hOlErUgh{T7 z*5bNpnK~^+My&NkV1R&&LjA`#HcnPOR8rycYaI#Z?mTiVb~P`;p~a}u#$kh)iC3{r z|1`H0Kn{dxX^OO{!~-hP*v90#J^Om~omN zF!8R|Uk(%cu?MT7@@aLH;x;YO3;|gPCfz9tRez#8ON+8@OvCjea+`|_+4xw%dq9nW z4hHU3u}cA(VOyR9Dz<)sh(6DJ&))J8^Q~p6SYeWlm!}oa1WU`8=Fq58p$pFVyzyIn ze|nsplSmrdliL(!OvckI`;=LK2_+E^ROUisC6((}6i575kdO|t;O2slc7{rr4Xe{n zJ2x9tXid)lW1GLB;GRLh*Zs@W^q4YR%NW&d-EnbVY+XYI;CJ$Kyf5!3L>%5D(IQN} z8gr1P-e|s1vru6O=h=ppLaIfk?aVxIf5I6c<5fQP;Z5z*_pMI8fBi*+AA=DjaEL?* z+hdfPXE+2v9P0C-GjY9F>F7!mC)T8z*>jic&_3N2A1VopupFZ{G>tKe{k#^M&KOWb zN*xb|sNXd&)f8vK+!S{fG$;Z7^!qkAMx$$P3Me+YOp(*rWAyrhF97xQ@rSZQe`~YJ zZY`UJ2#^>+7;>4yB?MEJ_iK1xfl^>~Q-bq#1t;lz(>K8=U7bnA<)(4EpY;=`;$~S~ zW)~G0zJ2AxS8^|%30YdF+uzR0HU_MT#p$SN(5qW7H}zx8-`Z{%r6}%_Qdiz%o|CPr zTW4ilMvjD(!y_oXVABKh2hyf{f5u=g=Y%evxv{bf@rVLk%L|Cm*}sCtuszMc!;L z>%5(6ZPmw_6}hmR(Dq2Of2N)kp$r5RMLVU0d6>5#=*V{LP!rJ~iOvp#X#i_a z=zXq$he4A1A+kAA*p74b&-)B;W#K5cU5chpu$bBoZ(1dQQLxp3xINI7{@g9(~lrjoe zHOosPScHXqtJ+Khm5lda%2(06C7+iPQHJK$2TpsC5ejRkem;psYhvR%mYnZ)UC{wK zL5Ren02fXW9N{_(X2^SwGz{X(T^EmTM~{QIWGVY9SAjt@f0NfXf=o)T!#Df&{WghQ zNcMBRaEDlIDz2Hj!z0352&|aq7|UbxC$T)-RYh$JpbaV+248L+(AfeW6e+kMwfC#( zJijG1E8qd`|8lI&jn+NzujwQ9O+ZXWwpRQ$5dqCN9==CM?C%jVNH8G=2`Yw2hW8Bt z2^29D9ufd!lTZ&KM{`1OWXoUbYsdtlRu{zfTPRWhp)fHpAutIB1uG5%0vZJX1Qei& j&_LVj?80iaS?>Yc_6lSYNZtep*ryu3@?Rd@0s;sCfbed! diff --git a/spring-security-modules/spring-security-x509/store/keystore.jks b/spring-security-modules/spring-security-x509/store/keystore.jks index 8650651a1e0a884555a4219049340ce2314315cb..c317c1d5ba5ba67fe18af77ec98ce6085616a2f6 100644 GIT binary patch delta 3702 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 diff --git a/spring-security-modules/spring-security-x509/store/localhost.ext b/spring-security-modules/spring-security-x509/store/localhost.ext new file mode 100644 index 0000000000..45324cc75a --- /dev/null +++ b/spring-security-modules/spring-security-x509/store/localhost.ext @@ -0,0 +1,5 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +subjectAltName = @alt_names +[alt_names] +DNS.1 = localhost diff --git a/spring-security-modules/spring-security-x509/store/rootCA.crt b/spring-security-modules/spring-security-x509/store/rootCA.crt index 12677eb99f..b2ab681744 100644 --- a/spring-security-modules/spring-security-x509/store/rootCA.crt +++ b/spring-security-modules/spring-security-x509/store/rootCA.crt @@ -1,30 +1,30 @@ -----BEGIN CERTIFICATE----- -MIIFDzCCAvegAwIBAgIUHBIbl/8i0uLnPD8BuNHninzcqEMwDQYJKoZIhvcNAQEL -BQAwFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMB4XDTIwMDQxOTE2MTYyOFoXDTMw -MDQxNzE2MTYyOFowFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAx5UzDt8Q+p8fAERc8mb8vPJTMi1oTe3YsMjj -QsMpRJBjVyQ2BLe0AzevQjDthCD56sv+u6EoBibIDQ3rtXUpTi20XQU6aaU6tsmG -QBp/PapXU0qoRzoyTPjSpkjp8/VngH52adeQ0YFSQQfxzcFsEpIlceKC8bSqplQg -mM9GoRLzEHu8JoLtHHQvZhTZabB/t0SUNy6O848OmoEjW2PCyMG/XczP0BlSFDT/ -3FIJlTnKe+MfhXxbYuydQQbStoDuRqkHxprjRaCT/PXeEuW68FahyiTgeKL5Ite9 -NI0k37mRsO/gMPIMgJDU0Soz0zcaRZdQDrxTZBk43i2O/LSwPtcpxvOy5JCLJSP7 -Ff6yx6BkkIAxLrWZGIQ0DiL4L+XocjEy3WMhzQ/ka6M1Zi0JxCRBOPpV2yO1GE7U -NUVvHaHijiJlXGZ/YGzplkLGaPIPGLHRsJFf9+IDepyJ9+E2mKD1rXAYXrcGW/Hk -Is1A2Je0iH4IjYTrieMSuHG4Jb0fytMAPoFOXnLS18xv7CPX0m9M2OIL9/kFfI+f -4M7/mEOUwQw+Jt9EAz9QsjUdZ0ybT0gtq9GaIHBo844YbyEKe7Hzp5Msk4/+3qJz -FHyC8ay73jkLDv1jOKr9D/wd/TOfSrytktcP+y96+gUdp1RxMxv9hfFSAZ0lXd2E -X18X6RECAwEAAaNTMFEwHQYDVR0OBBYEFPIRVQmLHgzCWfvENpeURm3jt2K4MB8G -A1UdIwQYMBaAFPIRVQmLHgzCWfvENpeURm3jt2K4MA8GA1UdEwEB/wQFMAMBAf8w -DQYJKoZIhvcNAQELBQADggIBAGa6bvEvira9FJ559bRvnqNsdaybj++Q9ItRyejs -BvLupLhhCnFWC1rX3WufpyGxgQCu4Lng+ZXtJxSo4dJL4wXDf5U+/EgL0nNQXhQh -kcqm2k1GBgAPnKEt+9nF3326EchI7Vx7JV4AO89ifdfc3Z7q9MOWE4siro6JtK7l -WWfv7LwT9QdDW/Ww7wUAOKdJYlUBzqMYHwEBnIhNMyuFejDzc2GmkZiIjFq5bKoN -FpsjHCkPH4DdDhQKdwa1JRvML7r8IkVqL3NoSp2vkB07MkRiHtQL5R2/wI/WhiK2 -19YPeEP2fQc5NduFAqyz8VaxwskwtjCjUxJHKpEzUTa1n53X+0jx6yw7bmDnE4SW -JEq9563apphJWeFTGCSuTvc98TcZvxWDW8FeLoaWdBF+Tohddje10BW2IUvrSJHI -jh0LpWIJ6QTY+amwLF2USSgnBZwPZT34PS81FYmA1bn/Sa6uWc/dPZg9lvwKU6ta -Z9K4loc8OF+FXQHruV+3tqzXybR9dZG3fvW4RPR9BgxApzSw8lYKAfR5Lth7ihVi -/zlxZjvbXy0D+4xPg5OGwn3g/3n4XLhAMT87KvHc9VjbHt6uwmLgny+6Dw9JXuTC -R004LuQe3wfUye4x9WmQD5Zlg1dENvezCG8l9z5LRUDF+Rh0qXPMpUCaCuT3TvEN -clOH +MIIFDzCCAvegAwIBAgIUDmhG1yLlF83ydOWPit8/MYNbaC8wDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMB4XDTIwMDQyMjE1MzEyMFoXDTMw +MDQyMDE1MzEyMFowFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAmkOSeQRQBQdoJio7Odm19kKVm4Y1ju1zscGM +LBWQ4GU8d3Y5AiOVzHtYUbKyJvmmUSYOH/mYdQ8F5nKKaXhTz92LIMnSXnusAqdD +YSvKa+mBoMLsd4Gl9lljipTvRwkkPlPXGVBDEVzXPf32l+5YxpGZzyVyj0WYT1cP +sZyThbOwue4h6gwer4SZ0HNPSts8TG7oiA4UTZSN5hhhbJmRBc87Xz+hJOMayZp6 +HA3tGTlrTkP/Vc3nii/G9tBeydmTTKj+BGFQW4qzDG6nJVvYyB4iri4ActREREGD +ycPS7SVXqEcA4rvSMR7DYoHVLkOg0uiQDWtj4zYcN9qgWVjcnIlUSPxrCgdJbakl +lRzrVpbkdlOC3hFSytoOBmCPS56gJ5npeLFh6IoPPdoXJwIXIJ1twCWtKzvlvlzb +DkMDytRVk2LYjh7IvtAWPTz5QofRdd2fW6iAWPdWbwcnq1xjO5BT8uGj+zOiA19/ +T2YebwD+pLAUM2w0ykLm+bH+DiSRa76wpKxuo6sSUefkeEt8Avojwh8nNbEOvXhf +El4zyimwTlfUYnaKEllUjRWVPhQPGCeCBHe1ES8UFf8hqGS2LRjKAZK70OcFdLyd +18sas/EXkNbd+Mpgata/zO9Oy/3h+xY426T5bPAt+wU38yMUaE+z5BS84m2GOtuQ +nC3a/HcCAwEAAaNTMFEwHQYDVR0OBBYEFFyRjr/LWlOZHv7JU7kQ1g76nq4SMB8G +A1UdIwQYMBaAFFyRjr/LWlOZHv7JU7kQ1g76nq4SMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQELBQADggIBAJWjUR/HBw5f7ogfyCVK/5fJutOFIIHqzNhExvDe +5wu9msPRAj+5ruGHtMWwOKm5qT82gZKJnAVct8XZXTIHU8mKS5Lbk02hu3e2tR/0 +RCzH4TCCD3fDJaW/jAZyU3oPtvcCaSmPwibG7SvDXtUvSSwCW8Omg7WqhnSWGUOn +WH3105lw8UKRTg57CaNu0GunqO4r0GcrgVShNKjCvNv7nGcP3+KWouZekBdn/iY5 +3Q8llL8WUMOHRwH6Raa6CV+vckCthUSpJdBAgGN44QtkA0iL/afVuE7VuTqsnCBA +nbOz/ssZOP0TUVYwoRiDN50gJdB8IKMHZu9Px2m7fJuGgZ7QDe56+tePypgM9KDq +yx4MKMP3Qc5xLE4pGM9SI1sGo+waW0+gPShNECHY4z8fOHw5bn+J1mrEWQbHfMGg +Z/352qps5Hd6PljLAHmWAJL2nXS2zlXbccdYuv4ZtNIeDUT8eX/9NuJdXrITq9QQ +oSBmyzH1bUJi2/mULcFy0Ibcu+OY/r8t67NrGKwLPLyozScwnFQE9SZR9d2cu6sC +yxQtcd68vdvAIEDTk4DcSldeT44HIJ7RYQuBNZ5NU3SngMLDleec/3AZSUXTExFW +TrbMTb+djM+XcTkRyO0wO0MYpjKGqN3sAGfppx0G9kgmJ9HB38nZfvqj3G1L9YFQ +6kSA -----END CERTIFICATE----- diff --git a/spring-security-modules/spring-security-x509/store/truststore.jks b/spring-security-modules/spring-security-x509/store/truststore.jks index 56654d8894466a86807235b65167f49f0a4b5a1d..1d0d20058040144717dadcfbc0560b85a0e9a284 100644 GIT binary patch delta 1196 zcmV;d1XKIY3eF0U7zCn`0jiN48Wav_M%Nf4Kpw>G%_$TH8U|XFp-fvf0{#*c?3`e2WTcLJ2~04_Cl4LhBc1ubFsmUEESO8 zWjuFwIRYb<%zIc-va%-mrcoviANiPd4+Z9OifMRL&)th4$4Bia z?012s_E}?!lx=kPT~N<2D>O+Mrojf83mjR7m`53I|DTsU?*h>sFTJc2k1h5mL(94hCS4OP-)7 zndx}3Vd#nvJ=zy10v8~iZNMe1D?8=BT-y#q1IpA@lVaG89>~7X7Ck)qLWj|H-Je^i zfLQldZwDue;mcuRZ&`Xj<0CpEDSy?9>|UNg!muufOhVs?rWSyYV`l|B>?7$<@RceN2O6czs= zsARS+7|H>XyU^zabiAF{%Nn!s7m(K7_{v~v*1yc}PRsq_`xZFcr1@;{E&ByG^CJ{! zPqX9{yy9(!I@^$(O)c8|cLDUqf$GfIM8@#m=L@}>!_fjixvt@dw8gMEskx~?Hi43foCRFB#o1jl z2UE$4OOo4@O`*GYwzVJhL@dYQFoF+v!zHD^j0SR3dJneu0%<9a!Y0P;E5lyZFG(x{ zTf?S)0uGbLXl1mdkLd%&}*lt?kmt|D}hv@G^oP7+xwhn58vXJ zqUK(Z7iaz^Io%H>l)n~G!-q!!`bDO?316>rK&^#DsU^@rfMa;!3uFUGi~Xn7xK7o% zI;@-^K%KL*{>vFS{S#4EFrgTOH=Q6Q(0m}H2WIb2$7#EKn}&aZp3n{MdivLo%9srF zpz6yW3@F3*LC$e3PAM4AQX^XiqwE@6PoO<0O%Ng2<3Arbd^v7^iPmbwSq8^^!JudT z`P!;%1r6fJSyyuI7N zAVAZTfZR$~UQdn(AfC}-3xPGBO;dEIfWpI-=bZm=8A(Oc6A@NUw#-exos7?yaXAsl z?Jzq-7^X6YsNL)UXX&RM2KGoMC(*&*$=QDTqugyv^??{r>O_FH=7mnG%+_ZHZe9bIFXS%f5(+G4&M;^pC153T=Hi8yz)~rEoe>c*s#dsLc=LU zkYiUQHUzh{12?ZiFztjO`RdF5yP+rsCdds9>$P<$PA#-u1v+V^I=0D%KpKBNs#jA= zs7E?7O!(5KNa^$SXMlcoY1fd^fl@&S@y)?(5|Slx;)3zCs-{#Rn9oL`e-iT$d%Pxs z?HqJ3W)#_Juz$Bils7Jp^N$Xifg@XE!pOnDUChtW8B!E9|J+gul{w0L;~#~5TVm{; zK?c&cfbK@A2gaJ?MWB=X_1+TYy6{$^$|T@;qWL1%y)=y^-?@>n@8B@<41kc-(JC|3 zHyTBkP!7CPWEnW#Esp%Of3QB+DaP}%6SvqXz~vjvC*)R zU-#kzdYp;(;Wn6{^{sFiUbhBY@#G@SK-ibGh<*r-gzJgp61Z`=e z($~yy>?7CGZ%o+Y3-|d2e2<^t&i|N0l)(%>Cf`H@KTxtY9cN6NPe?7R(V8G|X!DL3 zZy^eMvGb>sER&D^-lB69e1h?;yWTkq4*g>|s{IfA9sM((O1!O-*AM$Idin(&r&Mt> z8~ugxQURSMUEPFVO`D}{P6^K)UQ zk(h{#TDfeh4Hlat94QYUfZYxh3U>yzB^%5yy8I$VYAi$Hno4Bo!9$F@#`!*ZeZsV zgq9>qz2~jkrkF`t;ZqnSu1@zo@i!U26@y#BUM_}~bP;||h+TF!wa^u|AxrB>k;sl6 z3#DQS=>*vMsjw_vlu0Nj1)L9MJ@`E@H5G|~)w%ykuC7_n-94B+mi!7+t6FE$xR!@J zIA4Wb0qeP6x3+(**U7Yfb&gHX@M8)j?l^w{ From 8985f601a7c9b32951f2fb369092f8ab89ca0741 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Wed, 22 Apr 2020 22:15:54 -0600 Subject: [PATCH 42/52] BAEL-3961 move the sql string into a new line to improve readability. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index 8637f6f851..45f206a2b9 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -37,7 +37,8 @@ public class EmployeeDAO { public List getEmployeesFromIdList(List ids) { String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); - List employees = jdbcTemplate.query(String.format("SELECT * FROM EMPLOYEE WHERE id IN (%s)", inSql), + List employees = jdbcTemplate.query( + String.format("SELECT * FROM EMPLOYEE WHERE id IN (%s)", inSql), ids.toArray(), (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); @@ -53,7 +54,8 @@ public class EmployeeDAO { } jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds); - List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", + List employees = jdbcTemplate.query( + "SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); jdbcTemplate.update("DELETE FROM employee_tmp"); From 38f62ad24d646f18d66019eb808861462868ad80 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Wed, 22 Apr 2020 22:36:18 -0600 Subject: [PATCH 43/52] BAEL-3961 move the sql string into a new line to improve readability. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index 45f206a2b9..2ea42381eb 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -28,7 +28,8 @@ public class EmployeeDAO { public List getEmployeesFromIdListNamed(List ids) { SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); - List employees = namedJdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (:ids)", + List employees = namedJdbcTemplate.query( + "SELECT * FROM EMPLOYEE WHERE id IN (:ids)", parameters, (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); From 8bd69814b04b55c54fb7da0c80682b5b84d2e742 Mon Sep 17 00:00:00 2001 From: Benjamin Caure Date: Thu, 23 Apr 2020 07:23:11 +0200 Subject: [PATCH 44/52] BAEL-3964 HTML emails with Thymeleaf and FreeMarker (#9119) --- spring-mvc-basics-2/README.md | 1 + .../ApplicationConfiguration.java | 30 +----- .../configuration/EmailConfiguration.java | 89 ++++++++++++++++++ .../spring/configuration/WebInitializer.java | 1 + .../spring/controller/MailController.java | 80 ++++++++++++---- .../baeldung/spring/domain/MailObject.java | 29 ++++++ .../baeldung/spring/mail/EmailService.java | 20 +++- .../spring/mail/EmailServiceImpl.java | 84 ++++++++++++++--- .../src/main/resources/mail-logo.png | Bin 0 -> 7391 bytes .../main/resources/mailMessages.properties | 5 + .../resources/mailMessages_fr_FR.properties | 5 + .../src/main/webapp/WEB-INF/views/emails.jsp | 7 +- .../webapp/WEB-INF/views/mail/sendHtml.jsp | 73 ++++++++++++++ .../views/mail/template-freemarker.ftl | 15 +++ .../views/mail/template-thymeleaf.html | 15 +++ .../java/com/baeldung/SpringContextTest.java | 3 +- .../rss/ArticleRssIntegrationTest.java | 4 +- 17 files changed, 396 insertions(+), 65 deletions(-) create mode 100644 spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java create mode 100644 spring-mvc-basics-2/src/main/resources/mail-logo.png create mode 100644 spring-mvc-basics-2/src/main/resources/mailMessages.properties create mode 100644 spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties create mode 100644 spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp create mode 100644 spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl create mode 100644 spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html diff --git a/spring-mvc-basics-2/README.md b/spring-mvc-basics-2/README.md index 9d1402a210..e52459bd6e 100644 --- a/spring-mvc-basics-2/README.md +++ b/spring-mvc-basics-2/README.md @@ -9,6 +9,7 @@ This module contains articles about Spring MVC - [Servlet Redirect vs Forward](https://www.baeldung.com/servlet-redirect-forward) - [Apache Tiles Integration with Spring MVC](https://www.baeldung.com/spring-mvc-apache-tiles) - [Guide to Spring Email](https://www.baeldung.com/spring-email) +- [Using ThymeLeaf and FreeMarker Emails Templates with Spring](https://www.baeldung.com/thymeleaf-freemarker-email) - [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405) - [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param) - More articles: [[more -->]](/spring-mvc-basics-3) diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java index 941a984684..e70e801577 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java @@ -2,7 +2,6 @@ package com.baeldung.spring.configuration; import java.util.ArrayList; import java.util.List; -import java.util.Properties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -10,9 +9,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.feed.RssChannelHttpMessageConverter; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @@ -65,29 +61,5 @@ public class ApplicationConfiguration implements WebMvcConfigurer { converters.add(new RssChannelHttpMessageConverter()); converters.add(new JsonChannelHttpMessageConverter()); } - - @Bean - public SimpleMailMessage templateSimpleMessage() { - SimpleMailMessage message = new SimpleMailMessage(); - message.setText("This is the test email template for your email:\n%s\n"); - return message; - } - - @Bean - public JavaMailSender getJavaMailSender() { - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost("smtp.gmail.com"); - mailSender.setPort(587); - - mailSender.setUsername("my.gmail@gmail.com"); - mailSender.setPassword("password"); - - Properties props = mailSender.getJavaMailProperties(); - props.put("mail.transport.protocol", "smtp"); - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.debug", "true"); - - return mailSender; - } + } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java new file mode 100644 index 0000000000..1bbbc51304 --- /dev/null +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java @@ -0,0 +1,89 @@ +package com.baeldung.spring.configuration; + +import java.util.Properties; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; +import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; +import org.thymeleaf.spring4.SpringTemplateEngine; +import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; + +@Configuration +@ComponentScan(basePackages = { "com.baeldung.spring.mail" }) +public class EmailConfiguration { + + @Bean + public JavaMailSender getJavaMailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + + mailSender.setHost("smtp.gmail.com"); + mailSender.setPort(587); + + mailSender.setUsername("my.gmail@gmail.com"); + mailSender.setPassword("password"); + + Properties props = mailSender.getJavaMailProperties(); + props.put("mail.transport.protocol", "smtp"); + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.starttls.enable", "false"); + props.put("mail.debug", "true"); + + return mailSender; + } + + @Bean + public SimpleMailMessage templateSimpleMessage() { + SimpleMailMessage message = new SimpleMailMessage(); + message.setText("This is the test email template for your email:\n%s\n"); + return message; + } + + @Bean + public SpringTemplateEngine thymeleafTemplateEngine() { + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + templateEngine.setTemplateResolver(thymeleafTemplateResolver()); + templateEngine.setTemplateEngineMessageSource(emailMessageSource()); + return templateEngine; + } + + @Bean + public SpringResourceTemplateResolver thymeleafTemplateResolver() { + SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); + templateResolver.setPrefix("/WEB-INF/views/mail/"); + templateResolver.setSuffix(".html"); + templateResolver.setTemplateMode("HTML"); + templateResolver.setCharacterEncoding("UTF-8"); + return templateResolver; + } + + @Bean + public FreeMarkerConfigurer freemarkerConfig() { + FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); + freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/mail"); + return freeMarkerConfigurer; + } + + @Bean + public FreeMarkerViewResolver freemarkerViewResolver() { + FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); + resolver.setCache(true); + resolver.setPrefix(""); + resolver.setSuffix(".ftl"); + return resolver; + } + + + @Bean + public ResourceBundleMessageSource emailMessageSource() { + final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasename("/mailMessages"); + return messageSource; + } + +} diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java index 74094a11c7..4d43549440 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java @@ -20,6 +20,7 @@ public class WebInitializer implements WebApplicationInitializer { // ctx.register(GroovyConfiguration.class); // ctx.register(JadeTemplateConfiguration.class); // ctx.register(PushConfiguration.class); + ctx.register(EmailConfiguration.class); // ctx.setServletContext(container); //ctx.register(TilesApplicationConfiguration.class); diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java index 16d1202eef..b6e19a4c39 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java @@ -1,10 +1,17 @@ package com.baeldung.spring.controller; -import com.baeldung.spring.mail.EmailServiceImpl; -import com.baeldung.spring.domain.MailObject; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import javax.mail.MessagingException; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; @@ -12,26 +19,21 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import com.baeldung.spring.domain.MailObject; +import com.baeldung.spring.mail.EmailService; + +import freemarker.template.TemplateException; @Controller @RequestMapping("/mail") public class MailController { @Autowired - public EmailServiceImpl emailService; + public EmailService emailService; @Value("${attachment.invoice}") private String attachmentPath; - @Autowired - public SimpleMailMessage template; - private static final Map> labels; static { @@ -46,7 +48,7 @@ public class MailController { //Email with template props = new HashMap<>(); - props.put("headerText", "Send Email Using Template"); + props.put("headerText", "Send Email Using Text Template"); props.put("messageLabel", "Template Parameter"); props.put("additionalInfo", "The parameter value will be added to the following message template:
" + @@ -60,6 +62,7 @@ public class MailController { props.put("messageLabel", "Message"); props.put("additionalInfo", "To make sure that you send an attachment with this email, change the value for the 'attachment.invoice' in the application.properties file to the path to the attachment."); labels.put("sendAttachment", props); + } @RequestMapping(method = RequestMethod.GET) @@ -85,6 +88,7 @@ public class MailController { return "mail/send"; } + @RequestMapping(value = "/send", method = RequestMethod.POST) public String createMail(Model model, @ModelAttribute("mailObject") @Valid MailObject mailObject, @@ -95,7 +99,7 @@ public class MailController { emailService.sendSimpleMessage(mailObject.getTo(), mailObject.getSubject(), mailObject.getText()); - return "redirect:/home"; + return "emails"; } @RequestMapping(value = "/sendTemplate", method = RequestMethod.POST) @@ -107,10 +111,9 @@ public class MailController { } emailService.sendSimpleMessageUsingTemplate(mailObject.getTo(), mailObject.getSubject(), - template, mailObject.getText()); - return "redirect:/home"; + return "redirect:/mail"; } @RequestMapping(value = "/sendAttachment", method = RequestMethod.POST) @@ -127,6 +130,47 @@ public class MailController { attachmentPath ); - return "redirect:/home"; + return "redirect:/mail"; + } + + + @RequestMapping(value = {"/sendHtml"}, method = RequestMethod.GET) + public String getHtmlMailView(Model model, + HttpServletRequest request) { + + Map templateEngines = new HashMap<>(); + templateEngines.put("Thymeleaf", "Thymeleaf"); + templateEngines.put("Freemarker", "Freemarker"); + model.addAttribute("mailObject", new MailObject()); + model.addAttribute("templateEngines", templateEngines); + return "mail/sendHtml"; + } + + @RequestMapping(value = "/sendHtml", method = RequestMethod.POST) + public String createHtmlMail(Model model, + @ModelAttribute("mailObject") @Valid MailObject mailObject, + Errors errors) throws IOException, MessagingException, TemplateException { + if (errors.hasErrors()) { + return "mail/send"; + } + + Map templateModel = new HashMap<>(); + templateModel.put("recipientName", mailObject.getRecipientName()); + templateModel.put("text", mailObject.getText()); + templateModel.put("senderName", mailObject.getSenderName()); + + if (mailObject.getTemplateEngine().equalsIgnoreCase("thymeleaf")) { + emailService.sendMessageUsingThymeleafTemplate( + mailObject.getTo(), + mailObject.getSubject(), + templateModel); + } else { + emailService.sendMessageUsingFreemarkerTemplate( + mailObject.getTo(), + mailObject.getSubject(), + templateModel); + } + + return "redirect:/mail"; } } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java index aceaf685fa..d425ca9a26 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java @@ -12,8 +12,11 @@ public class MailObject { @NotNull @Size(min = 1, message = "Please, set an email address to send the message to it") private String to; + private String recipientName; private String subject; private String text; + private String senderName; + private String templateEngine; public String getTo() { return to; @@ -38,4 +41,30 @@ public class MailObject { public void setText(String text) { this.text = text; } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getSenderName() { + return senderName; + } + + public void setSenderName(String senderName) { + this.senderName = senderName; + } + + public String getTemplateEngine() { + return templateEngine; + } + + public void setTemplateEngine(String templateEngine) { + this.templateEngine = templateEngine; + } + + } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java index 43d7378227..b7d5be09c8 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java @@ -1,6 +1,11 @@ package com.baeldung.spring.mail; -import org.springframework.mail.SimpleMailMessage; +import java.io.IOException; +import java.util.Map; + +import javax.mail.MessagingException; + +import freemarker.template.TemplateException; /** * Created by Olga on 8/22/2016. @@ -11,10 +16,19 @@ public interface EmailService { String text); void sendSimpleMessageUsingTemplate(String to, String subject, - SimpleMailMessage template, - String ...templateArgs); + String ...templateModel); void sendMessageWithAttachment(String to, String subject, String text, String pathToAttachment); + + void sendMessageUsingThymeleafTemplate(String to, + String subject, + Map templateModel) + throws IOException, MessagingException; + + void sendMessageUsingFreemarkerTemplate(String to, + String subject, + Map templateModel) + throws IOException, TemplateException, MessagingException; } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index 039b970d8e..0592415ab5 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -1,26 +1,49 @@ package com.baeldung.spring.mail; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.FileSystemResource; -import org.springframework.mail.MailException; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.stereotype.Component; - import java.io.File; +import java.io.IOException; +import java.util.Map; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.mail.MailException; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; +import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring4.SpringTemplateEngine; + +import freemarker.template.Template; +import freemarker.template.TemplateException; + /** * Created by Olga on 7/15/2016. */ -@Component +@Service("EmailService") public class EmailServiceImpl implements EmailService { @Autowired public JavaMailSender emailSender; + + @Autowired + public SimpleMailMessage template; + + @Autowired + private SpringTemplateEngine thymeleafTemplateEngine; + + @Autowired + private FreeMarkerConfigurer freemarkerConfigurer; + + @Value("classpath:/mail-logo.png") + Resource resourceFile; public void sendSimpleMessage(String to, String subject, String text) { try { @@ -38,9 +61,8 @@ public class EmailServiceImpl implements EmailService { @Override public void sendSimpleMessageUsingTemplate(String to, String subject, - SimpleMailMessage template, - String ...templateArgs) { - String text = String.format(template.getText(), templateArgs); + String ...templateModel) { + String text = String.format(template.getText(), templateModel); sendSimpleMessage(to, subject, text); } @@ -66,4 +88,42 @@ public class EmailServiceImpl implements EmailService { e.printStackTrace(); } } + + + @Override + public void sendMessageUsingThymeleafTemplate( + String to, String subject, Map templateModel) + throws MessagingException { + + Context thymeleafContext = new Context(); + thymeleafContext.setVariables(templateModel); + + String htmlBody = thymeleafTemplateEngine.process("template-thymeleaf.html", thymeleafContext); + + sendHtmlMessage(to, subject, htmlBody); + } + + @Override + public void sendMessageUsingFreemarkerTemplate( + String to, String subject, Map templateModel) + throws IOException, TemplateException, MessagingException { + + Template freemarkerTemplate = freemarkerConfigurer.createConfiguration().getTemplate("template-freemarker.ftl"); + String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString(freemarkerTemplate, templateModel); + + sendHtmlMessage(to, subject, htmlBody); + } + + private void sendHtmlMessage(String to, String subject, String htmlBody) throws MessagingException { + + MimeMessage message = emailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + helper.setTo(to); + helper.setSubject(subject); + helper.setText(htmlBody, true); + helper.addInline("attachment.png", resourceFile); + emailSender.send(message); + + } + } diff --git a/spring-mvc-basics-2/src/main/resources/mail-logo.png b/spring-mvc-basics-2/src/main/resources/mail-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..edb83efbe3d4f083363fea616d5c0e2df6e1fe03 GIT binary patch literal 7391 zcmc(E=?>`{LP{DWMH&Vi zfp`1-2k(dHdgjBKGuN5D&))m4wbmV{rKv=SPlJzvfkCLEte}H|aW5O(hv4CW>#1E^ zF!;jqlvB~e1D_x~n^^Fh+Dp;MOV`cL%lEa1Erz|Tn~N=vr?rQzt*fVlo7WL$rxXST z-5V7JSv|j;-^-yv(-*n8$5cW*4{qehXjmgZ7ZRFe%bCWdseJaWb@r+aXw|;BocGi6 z_VXpK$qrQ4UP@VPrg*URRm;*s;pHslH|Pyxw9Tj&@jf{V3}CL z9vfrH;cHp50(cMr9tcT0G0>=r6bd0J(VZ293Dbs8I-J^YTzvPl)7KaChYL^ZuX%zUg~Q1xKQps ze8x@66zPD8O&j%h>?>rmyT@@9nU(3)D(1N@lb;bWINwK}kw_vpl@gw$F2dKs5NdJm zPrhyP0W}0KmdE;cxV5<0v~gc7wBC-5%zbNih}sSI_N>+8_%|&THf^ez9qwWKAA`yq zp&aANN-?3091P0#2bAs4_JqR*pWILFCePrI0y{37W?$|n+gH(s4yr45zkKVeNja<$ z<-V1<2K)Pndy>|c(evQ+!~Lf$g0JfP;xrmQe_TAcXe^#wg%v&OYn(BU@UVV8<>DH+ zIZ2)oJ*r3UyfHYl_eSlO&?ws?9KzE=)O;V}ZIxuM!#;n&9jaBMqjmqTZkc8`Qo;{w zeK&T0hc$B4ncSIwC1>5pkI-O?Cx+$7r1FC@PcdwAL|Z?lTDar7Y{@9r-3u$}*5}~J zyR6kHl7uijqkH=gHntJmUfy`cqjI#iJ3Z}394r+vnVtvH$QgfIbxEU_ML)kXqu?eM z`L0PoYX0Zw46tN$hQF}hPl_VeBbw3d?A(S^8%J9+SMJ{N)3Hyews(m9R1)S_FLAQX zav3u0a9ss6H%b-fm;%4}NNsE3820*%$BUa%_*|Pzy&{*3?RO}ngblsRh#2lGX$pQr zos(c7Bchb;X*`}{uIx*yS6|qL?R$(z6s7sGl>@9Ae$s6RXJYiF(%U#wbCXMsUa@>M zbZ&`>k?pK6`m+#3&UNIa(+*bRLh~n!H&jxd`o=8@%){^$WZA{v4)@MoDGE*dx4EXn zZNbe55@5{VX`~OBe*DK0p)vCw|NG)mZ_mN?9&fw@<12Ny8vm6!=JL3NX=*LgwMRLT zgB3y&6YAdzA25;G>8+3l8whuJep_8%6j{o?l<{=ll~+MyPt!Snq{)X&N7FBlsV|mU zc|2pX+5YffcR#EZD``CD4f_457Zo;eAae;%qp6NEX{j=Is7}T6iJ^2{HI5xBCL13( z>6nAsIh&+mgVS-q+!7mfb((r21<^UjbG2=i36El0Ir%n;7ql*AJdnYx zou83@TkVzgM{MdM*e=`;RhBiRT*l^-8#kwU)@>Iy{?>kkVM4tCDt>|Mhs+P3W(|Sf zvuq2`+9P`Qx0q9evS`T&Pr_a?3PF<7r<(tsI(lc^lx-b%USwyTV=M|R>?@KmHpHC^`v zI}p;T`yD+9Hf#;zc}8H8MI_uJW_*>Yk1Fo6)b!QHz!->;>NO9Q7(Ru`=V!14+^JLN z_USMY;sqHbtVCYGWVlYXy+^~zS*Z*{RcR%mO=bVB@2ZPc@odj2Ul%DL%o3`B&KYd_Fd88 z^`Cg${|ip(VqdjYnn(clE;>>H@8u!e%Qu=A<7)UZz^*HTYC+7cO8xd5lJe!uET8kL zDYtmT?rP-c-I73hw#;%Dh8W3oPq@ZWLFdy*Rk_F2RY=R)a+SzIqJh`ho5uXOPvzq! zQY_y?_OwjUGOY@~9-DVztGq!}+vQEsePC_|tP|=6V12n; z*}CFd;dk5~tDIMozO~-(2G~p~^0=2d&}WO_5GdvZTw1G|D7_oJ-`^km?s>?)%H4|8 zBg`TczTi4k^(D13m$>0I`E!ef!6C>S<8Pk#ar68kZaTNY54`$J%nz5*+E5>kQ|m{} z+g0T~Mj!Wyr^k&E1IGF98Ko?SI4*8}h;fBzwP;`bDtQjxQN(EUzMOoQZ_^9Mnd^)G z`MtzxY9VTOA!_H@EHxoPNU^jBC4_OA5seC<7U`QTG=CbOZs0S{`Pf;qFb^6`Srw+) z9gu|u5(E~H-w_PNe($FZ>MB zzxR-gm|&RqFGma;+L^)Vw%Ln{X*=!jtmx%m1no(X2I1EE*Zc!TEggE~-F91}c$92;Vcy4^zuE<2nz zLMoiEzxrUc&u=+(8w4gCea6TQ79?4|=aOF9&n0mrv-X7M#zmzOdgyHpLIyKcR>(_4ZFqWi z*DZlCSF_)i7f$K?nMbpun33Ul}s;Msk>KTVT>@> z?_PZw_+ZF;wzL=I;$gpEY4{}T;dM7G%h-N(jfWA z5ag+f?WjQ5ce4G|oT`@QIi3$pR+3y{#}jWTD=A>?-&r0zu$@Jr-7R*;69;{mW|9x> zO3`atyI8uE2}7t{Ez0{0P6g{x#Vi0@uu24mnFvuh8*DF3y~2|Gdx)GA@wkk?8yOkz zYk4Z7DpeZlhhfi0G{lp|mO)E^=rb=i!sf(LvlaD^t{X99Zo2tSJ#Y2f7VjhXmSy)T zmIPf=EWVIrhrhdDQHquDYZtjKgx+CV1mUj>x7`(XsQXKK-`d^O{PKcwOWm(B0fHH3 z)|q_krZK33z}*OFXe(;pv=BKA3vw>;jDuJa+X4#R?04$9-`9?_AB&>yOsy#+Y?;uh7uVa z72ROr*-r*zCfvty2Pqx=2TxfDPuH}98|=%x^3<6f#&bd<<~tE z`^aJ+GLulZS+Qyw_3HXYA(Z(^7z{c322R{9rttg5jct*d_Jl?r5sIGGw4gYYY96b< z*ufdfW+6*X#=}9XuM?ouLb3rufJe*KIt!9e>#;UcV`pQ*N})eTDlm`M zsBWcuZ%jkR?=Pek-3DDg=1mOd{`FY(eG9ix^^XmO+$zpJ<)&O=e?B?4VFBija?F z30p2uCe{Ipb<-PgOlK(*9O2kMbD&nE&LR|aYE#{0U4L`ehV#`dE!_hGNcDBD$1wL^7Q z-Wg4mCxQ6PUe51|9QEtgnU+2?a<>M2sahk!u<8DFYjsspe|u* zo+I=LeWwLAg_c#7xcT_jq}bUC-yJ+0_X26}ynaf<8*W^OGE=K3%<@aI(i8;aC|&Ik zJJMYfdW~^~q0guRdIbD1T`#us!IMUO?!b4kxwW5L8j|Mqt{gMj^^LwNoRJlmy!*;; z%IUy1|1gPjQR@1r%zQv_;5Hk&NQmu(_+exCv+Z{MUR%g^4fDVhr-Z$&34_V#$;X3l z4XkJEZqnS(T>IIJRjVgJMfry>UyKK|ZTw*X0K%%>w*Dtuu?_n7QE=McV_H`3Si7Cd zQLe1hMM(eD>XYq2Qd0&VYn562L}~RnLYkl!4jv++N%a~rMh!`FU8~KGvzjS@V^ODs@iza!TkJmn6j69byfcmVJJWp|KfNKjDPa3_a!l$NgjXmnT zoN-31GC{52>1?$i0s&X<{_F8K5?NkRtl3xX z{+N$Y^J}oV$r%R`7LnCl?{EUQabhFIT+wI~9TFYFb(QWqnO%yV^QRZlSDR^ax74%$I@;q#h6=GyIe zF2?-XS1<-_Y;xBv;(vI)vh(Q|z_IFk3tmrV*9;h^0N^mAB(BQDmMwfopJX9&MDalW z`WKrp+(jJt#yP~eM!hmj884*`#r*dhrurh^XkLo_NJptd>0aoIlX$BE9W_q3!Iz=5 zJ(HwO5$4^O*B~)+iE?EHE+bTN9}`plox;@N${XVHi7saG8?2=b%()0h>zn3$5|Xf@ zxcP~nj#C{K8ekh<{{$8;nxn|{dwh#Mk<*%;U9*v-`OXK8kj8$Et*m%C7p z9^3@5T7#g*Po4-H7I39A^OH z64g>h*m;;T7}&MJg?iONIWJb>IP@~6m=y3&MSGbeyZ{PXglN4a;WGLI!{fS2mfgNv z^TvbG(-Y-(JI5*Y{IT6F1a#!T+If^LZpXC zqP|0bvPOSY$hG=I*$XVJb+o_(eXukuQ+DvQ!1zSNPZygx;%nwny{ExUru)j4Q&=_v z8X!>5Hh6ei&+&C7f%4$AobTfS0|flC}yoB=f8#{Ri@VJL_2*nlj0gZiNqaT@9+< zyv|dX)AksNJ0#Ii1trT67S?a9v9x{s;90)m~ zs6i1gJsYfz;zC&2@THT;26(;>O`Db}0$p^=SJ`*u>9Qe3pi3>O3E zSix$SHIiG@Xka{pC));BxL+8~W4Gd!l?wtzPCVaI=kD0M{?AHtVKgGQSnNSODUlJ8CB5>Q`Sy0dknM{s;nT3(u6gD*hC_JvP=q&2^*% zD9)#w$Q(MNHMlh&SHLJ7=yu&rODUy?Wqo2$z%oa`^D4X~bDzP9)4Tny%p948zT=+wc zoOSt?DP}IB-q(zbCDe%1pd%6FqtXJ}YUjn)EG?HeR`Ow7P$lV5UdSh0dRe!gqfVCH zBwLu>H8+r*#KX<$@aWX%vA&7S%q+~t9bWCAgN4Z}ZSg-J#;q^NLH58TR+yrZUos|W z^K({HbUI&j+__{{+iv{Gu*9~{y`1PG4)uYU?fBIRlL!1$!;8#u)G@fuoSR%uRR7Lw zWEe^ELC$X@sJ{8F+i-=<@!ih21L+S53)aY3Pf78;x$idY(7}{n<7ogmv7uR+j15WH zV8O?RopLhvtvU;!K2WMZ?93YmHrDb|IC+BHdx&Uz4KzPWEud}L*xujn%pA&B+($_^ zCw5&8iqGN_hggJEvE=bB#T+Z}XIMGH>*n23Rk_n-kNlmKh7G**CFgf*zpe|tiZLA{ z3KGA=*$(;OXMPw=7WlVX)p3A(td$Z{RjF%Bd6JTR6JTKD%@#ST4y05=vsJRC!v+xs z{Z4)|a_Gwur19Iu%=AsW=?iyW6DG7@sCeK*>B}1&Ml(FsA9t4(!^gSr`9^q^B!Sss z=P*S)rW5s$Kz;m?pOELJEUYXN^Gi9QFY?UG)rT{`?PzX9?y%`#)8M6ov<-Otj0`D~P@h|c-a+6F?y?4AjZ294#1x@uNc5f>mck zdA_*5TEUqOZnh+Kb6?vIq;T)MQ_=QF?^#KBy`OUT=vbORGQa2Y3)@5UhZP<{a)SqC ze4hS52QT@f_*H-vXf(FNfsGcu6G0_|M8Y?zwM8BR!Cr6hs%~bek<8&_nk#h;MFTWeHs{B9d$z0SQr0>02Iws6LL z!}Iw_5&+i?RN#-(0Xq0%60XM-|1dbD2dx(5GnB-?hPO<-tseIQQZ5u)07Tx$!$oqMo!HL@WlvV zNQ-c%ZN7d1`H-p0;lX(h9Hkid?M=_)JTw7OuEag0C9zb;$6PPL$af177M&_p-m!i| zrz0g(iG;#&Kljhqyl}WDs4WMFyPGFp2YJ0wo)J2YBw?NbNy{-I$6xNnKRM!Sy3mk~ z8R%5KgZCGSsHnPU#j<}V^YxzhD*D&bq5;Uo3f|Jkn+tU1F0y?fx9XC)3F!V$Z!76D zKV{hT9@(W*MTWl_A=Fqh3G}%5L*Q6E&tp_FW^IA$9yv<%f87-O|8Kvw+~Edlh`bM1 TggyZsN(>c6O@%LVmf`;o*#$Af literal 0 HcmV?d00001 diff --git a/spring-mvc-basics-2/src/main/resources/mailMessages.properties b/spring-mvc-basics-2/src/main/resources/mailMessages.properties new file mode 100644 index 0000000000..46f7a80ed3 --- /dev/null +++ b/spring-mvc-basics-2/src/main/resources/mailMessages.properties @@ -0,0 +1,5 @@ +greetings=Hi {0}, +subscriptions=Please find below your current subscriptions to our forum: +regards=Regards, +unsubscribe=Unsubscribe from these emails here +signature={0} at Baeldung \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties b/spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties new file mode 100644 index 0000000000..6f300a9ab7 --- /dev/null +++ b/spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties @@ -0,0 +1,5 @@ +greetings=Bonjour {0}, +subscriptions=Voici vos différentes souscriptions sur notre forum : +regards=Cordialement, +unsubscribe=Se désinscrire de ces emails ici +signature={0} à Baeldung \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp index 63351bbf3a..dafa71cbb0 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp @@ -26,7 +26,7 @@ - + @@ -34,6 +34,11 @@ + + + + + diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp new file mode 100644 index 0000000000..f91a8826d1 --- /dev/null +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp @@ -0,0 +1,73 @@ +<%-- + User: Benjamin CAURE + Date: 4/14/2020 +--%> +<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + Send HTML Email + + +

+

Send Email Using Text Template

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Enter email address
+ +
+ Enter the recipient name
+ +
+ Enter the subject
+ +
+ +
+ Enter the sender name
+ +
+ Select the template engine
+ +
+ +
+
+
+
+
+ + diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl new file mode 100644 index 0000000000..066fc0302c --- /dev/null +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl @@ -0,0 +1,15 @@ + + + + + + +

Hi ${recipientName}

+

${text}

+

Regards,

+

+ ${senderName} at Baeldung
+ +

+ + diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html new file mode 100644 index 0000000000..b255b5dee5 --- /dev/null +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html @@ -0,0 +1,15 @@ + + + + + + +

+

+

+

+
+ +

+ + diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java index ab0b23c4a5..5c276254d3 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java @@ -7,10 +7,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import com.baeldung.spring.configuration.ApplicationConfiguration; +import com.baeldung.spring.configuration.EmailConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes={ApplicationConfiguration.class}) +@ContextConfiguration(classes={ApplicationConfiguration.class, EmailConfiguration.class}) @WebAppConfiguration public class SpringContextTest { diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java index fe7aeeb570..2ed70489c0 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java @@ -1,6 +1,8 @@ package com.baeldung.controller.rss; import com.baeldung.spring.configuration.ApplicationConfiguration; +import com.baeldung.spring.configuration.EmailConfiguration; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -13,7 +15,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@SpringJUnitWebConfig(ApplicationConfiguration.class) +@SpringJUnitWebConfig(classes={ApplicationConfiguration.class, EmailConfiguration.class}) public class ArticleRssIntegrationTest { public static final String APPLICATION_RSS_XML = "application/rss+xml"; public static final String APPLICATION_RSS_JSON = "application/rss+json"; From 7367f3b0ba099d02f98b78599ca6c860047595b8 Mon Sep 17 00:00:00 2001 From: Usman Mohyuddin Date: Thu, 23 Apr 2020 22:54:55 +0500 Subject: [PATCH 45/52] add code files for "How to determine the data type in Groovy" (#9123) * add code files for "How to groovy data types" add code files for "How to groovy data types" * added Tests in example * Update pom.xml change tab into spaces --- core-groovy-2/determine-datatype/pom.xml | 40 ++++++++++++++ .../groovy/determine/datatype/Person.groovy | 14 +++++ .../determine/datatype/PersonTest.groovy | 55 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 core-groovy-2/determine-datatype/pom.xml create mode 100644 core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy create mode 100644 core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy diff --git a/core-groovy-2/determine-datatype/pom.xml b/core-groovy-2/determine-datatype/pom.xml new file mode 100644 index 0000000000..0bcef4e5d8 --- /dev/null +++ b/core-groovy-2/determine-datatype/pom.xml @@ -0,0 +1,40 @@ + + 4.0.0 + com.baeldung.groovy + determine-datatype + 0.0.1-SNAPSHOT + + src + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + org.codehaus.gmaven + groovy-maven-plugin + + + org.codehaus.groovy + groovy-all + 2.0.6 + + + + + + + + + org.junit + junit5-engine + 5.0.0-ALPHA + + + \ No newline at end of file diff --git a/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy new file mode 100644 index 0000000000..1a89dce435 --- /dev/null +++ b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy @@ -0,0 +1,14 @@ +package com.baeldung.groovy.determine.datatype + +class Person { + + private int ageAsInt + private Double ageAsDouble + private String ageAsString + + Person() {} + Person(int ageAsInt) { this.ageAsInt = ageAsInt} + Person(Double ageAsDouble) { this.ageAsDouble = ageAsDouble} + Person(String ageAsString) { this.ageAsString = ageAsString} +} +class Student extends Person {} diff --git a/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy new file mode 100644 index 0000000000..56095a3f1b --- /dev/null +++ b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy @@ -0,0 +1,55 @@ +package com.baeldung.groovy.determine.datatype; + +import org.junit.Assert +import org.junit.Test; + +public class PersonTest { + + @Test + public void givenWhenParameterTypeIsInteger_thenReturnTrue() { + Person personObj = new Person(10) + Assert.assertTrue(personObj.ageAsInt instanceof Integer); + } + + @Test + public void givenWhenParameterTypeIsDouble_thenReturnTrue() { + Person personObj = new Person(10.0) + Assert.assertTrue((personObj.ageAsDouble).getClass() == Double) + } + + @Test + public void givenWhenParameterTypeIsString_thenReturnTrue() { + Person personObj = new Person("10 years") + Assert.assertTrue(personObj.ageAsString.class == String) + } + + @Test + public void givenClassName_WhenParameterIsInteger_thenReturnTrue() { + Assert.assertTrue(Person.class.getDeclaredField('ageAsInt').type == int.class) + } + + @Test + public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { + Person personObj = new Person() + Assert.assertTrue(personObj instanceof Person) + } + + @Test + public void givenWhenInstanceIsOfSubtype_thenReturnTrue() { + Student studentObj = new Student() + Assert.assertTrue(studentObj in Person) + } + + @Test + public void givenGroovyList_WhenFindClassName_thenReturnTrue() { + def ageList = ['ageAsString','ageAsDouble', 10] + Assert.assertTrue(ageList.class == ArrayList) + Assert.assertTrue(ageList.getClass() == ArrayList) + } + + @Test + public void givenGrooyMap_WhenFindClassName_thenReturnTrue() { + def ageMap = [ageAsString: '10 years', ageAsDouble: 10.0] + Assert.assertFalse(ageMap.class == LinkedHashMap) + } +} \ No newline at end of file From b31b84d475f77972c2fb512707489e0354c4169a Mon Sep 17 00:00:00 2001 From: Gergo Petrik Date: Fri, 24 Apr 2020 16:00:30 +0200 Subject: [PATCH 46/52] Mockint objectmapper with mockito (#9017) * Mockint objectmapper with mockito * enforcing naming convention for test classes * removed Spring * removed unattended changes * modified example * simplified call stack in flower validator --- spring-mockito/pom.xml | 2 +- testing-modules/mockito-2/pom.xml | 15 ++++++ .../baeldung/mockito/objectmapper/Flower.java | 32 +++++++++++ .../FlowerJsonStringValidator.java | 17 ++++++ .../FlowerJsonStringValidatorUnitTest.java | 53 +++++++++++++++++++ 5 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index f3e0b04808..5d2cd7c445 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -28,7 +28,7 @@
- 2.21.0 + 2.24.0 diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 76608a3039..340af89c82 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -14,8 +14,23 @@ ../../ + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + 2.21.0 + 2.10.3 diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java new file mode 100644 index 0000000000..bc366a39f9 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java @@ -0,0 +1,32 @@ +package com.baeldung.mockito.objectmapper; + +public class Flower { + + private String name; + private Integer petals; + + public Flower(String name, Integer petals) { + this.name = name; + this.petals = petals; + } + + public Flower() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getPetals() { + return petals; + } + + public void setPetals(Integer petals) { + this.petals = petals; + } + +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java new file mode 100644 index 0000000000..91bad66e6d --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java @@ -0,0 +1,17 @@ +package com.baeldung.mockito.objectmapper; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class FlowerJsonStringValidator { + private ObjectMapper objectMapper; + + public FlowerJsonStringValidator(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + public boolean flowerHasPetals(String jsonFlowerAsString) throws JsonProcessingException { + Flower flower = objectMapper.readValue(jsonFlowerAsString, Flower.class); + return flower.getPetals() > 0; + } +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java new file mode 100644 index 0000000000..31c3f0d01d --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.mockito.objectmapper; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class FlowerJsonStringValidatorUnitTest { + + @Mock + private ObjectMapper objectMapper; + + private FlowerJsonStringValidator flowerJsonStringValidator; + + @BeforeEach + public void setUp() { + flowerJsonStringValidator = new FlowerJsonStringValidator(objectMapper); + } + + @Test + public void whenCallingHasPetalsWithPetals_thenReturnsTrue() throws JsonProcessingException { + Flower rose = new Flower("testFlower", 100); + + when(objectMapper.readValue(anyString(), eq(Flower.class))).thenReturn(rose); + + assertTrue(flowerJsonStringValidator.flowerHasPetals("this can be a very long json flower")); + + verify(objectMapper, times(1)).readValue(anyString(), eq(Flower.class)); + } + + @Test + public void whenCallingHasPetalsWithZeroPetal_thenReturnsFalse() throws JsonProcessingException { + Flower rose = new Flower("testFlowerWithoutPetal", 0); + + when(objectMapper.readValue(anyString(), eq(Flower.class))).thenReturn(rose); + + assertFalse(flowerJsonStringValidator.flowerHasPetals("this can be a very long json flower")); + + verify(objectMapper, times(1)).readValue(anyString(), eq(Flower.class)); + } +} From 35f1a3eba55288d0141e6394a616691a6ed1c124 Mon Sep 17 00:00:00 2001 From: Roque Santos Date: Fri, 24 Apr 2020 11:10:44 -0300 Subject: [PATCH 47/52] BAEL-3927 : Encode a String to UTF-8 in Java (#8954) * BAEL-3927 : Encode a String to UTF-8 in Java * Update core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encode/StringEncodeUnitTest.java Co-Authored-By: KevinGilmore * BAEL-3927 : Applying suggested adjustments * BAEL-3927 : Simplifying the code snippets * BAEL-3927 : Coding styles adjustements * BAEL-3927 : Test adjustements to fit changes in article Co-authored-by: KevinGilmore --- .../encodetoutf8/StringEncodeUnitTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java new file mode 100644 index 0000000000..a73104b234 --- /dev/null +++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.encodetoutf8; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.codec.binary.StringUtils; +import org.junit.Test; + +public class StringEncodeUnitTest { + + @Test + public void givenGermanAsciiString_whenComparing_thenCompareNotEquals() { + String germanString = "Entwickeln Sie mit Vergnügen"; + byte[] germanBytes = germanString.getBytes(); + + String asciiEncodedString = new String(germanBytes, StandardCharsets.US_ASCII); + + assertNotEquals(germanString, asciiEncodedString); + } + + @Test + public void givenUsAsciiString_whenComparing_thenCompareNotEquals() { + String englishString = "Develop with pleasure"; + byte[] englishBytes = englishString.getBytes(); + + String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII); + + assertEquals(englishString, asciiEncondedEnglishString); + } + + /* + * ApacheCommonsCodecEncode + */ + @Test + public void givenSomeUnencodedString_whenApacheCommonsCodecEncode_thenCompareEquals() { + String rawString = "Entwickeln Sie mit Vergnügen"; + byte[] bytes = StringUtils.getBytesUtf8(rawString); + + String utf8EncodedString = StringUtils.newStringUtf8(bytes); + + assertEquals(rawString, utf8EncodedString); + } + + /* + * CoreJavaEncode + */ + @Test + public void givenSomeUnencodedString_whenCoreJavaEncode_thenCompareEquals() { + String rawString = "Entwickeln Sie mit Vergnügen"; + byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8); + + String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8); + + assertEquals(rawString, utf8EncodedString); + } + + /* + * Java7StandardCharsetsEncode + */ + @Test + public void givenSomeUnencodedString_whenJava7StandardCharsetsEncode_thenCompareEquals() { + String rawString = "Entwickeln Sie mit Vergnügen"; + ByteBuffer buffer = StandardCharsets.UTF_8.encode(rawString); + + String utf8EncodedString = StandardCharsets.UTF_8.decode(buffer) + .toString(); + + assertEquals(rawString, utf8EncodedString); + } +} From 73f96969da098b873415b475f3ad1463dc4f45cd Mon Sep 17 00:00:00 2001 From: Paturi Radhe Sravan Date: Sat, 25 Apr 2020 03:06:41 +0530 Subject: [PATCH 48/52] BAEL-3567 An Introduction to Kaniko (#9150) * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3567 An Introduction to Kaniko * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3567 An Introduction to Kaniko * BAEL-3567 An Introduction to Kaniko --- kaniko/dockerfile | 2 ++ kaniko/pod.yaml | 19 +++++++++++++++++++ kaniko/volume-claim.yaml | 11 +++++++++++ kaniko/volume.yaml | 14 ++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 kaniko/dockerfile create mode 100644 kaniko/pod.yaml create mode 100644 kaniko/volume-claim.yaml create mode 100644 kaniko/volume.yaml diff --git a/kaniko/dockerfile b/kaniko/dockerfile new file mode 100644 index 0000000000..0290bf16ed --- /dev/null +++ b/kaniko/dockerfile @@ -0,0 +1,2 @@ +FROM ubuntu +ENTRYPOINT ["/bin/bash", "-c", "echo hello"] diff --git a/kaniko/pod.yaml b/kaniko/pod.yaml new file mode 100644 index 0000000000..17f9a81b6d --- /dev/null +++ b/kaniko/pod.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kaniko +spec: + containers: + - name: kaniko + image: gcr.io/kaniko-project/executor:latest + args: ["--dockerfile=/workspace/dockerfile", + "--context=dir://workspace", + "--no-push"] + volumeMounts: + - name: dockerfile-storage + mountPath: /workspace + restartPolicy: Never + volumes: + - name: dockerfile-storage + persistentVolumeClaim: + claimName: dockerfile-claim diff --git a/kaniko/volume-claim.yaml b/kaniko/volume-claim.yaml new file mode 100644 index 0000000000..7a1abbf05c --- /dev/null +++ b/kaniko/volume-claim.yaml @@ -0,0 +1,11 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: dockerfile-claim +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi + storageClassName: local-storage diff --git a/kaniko/volume.yaml b/kaniko/volume.yaml new file mode 100644 index 0000000000..e44663ec5a --- /dev/null +++ b/kaniko/volume.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: dockerfile + labels: + type: local +spec: + capacity: + storage: 10Gi + accessModes: + - ReadWriteOnce + storageClassName: local-storage + hostPath: + path: /home/docker/kaniko # Path to the local mount directory that was setup From d090c9b059c5e3d2752a6d7422fe344cca8b1dd5 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Fri, 24 Apr 2020 22:28:04 -0500 Subject: [PATCH 49/52] BAEL-2893 BAEL-3927 update README files (#9171) * BAEL-3336 BAEL-3058 add links * BAEL-3319: add link * BAEL-3284: add link * BAEL-3198: add link to article * BAEL-3479: add link to article * BAEL-3485: add article link * SCALA-38: move to new package and add link back to article * SCALA-38: add imports back into unit test * BAEL-3908: add link back to article * BAEL-2893 BAEL-3927 add link back to article --- core-java-modules/core-java-string-operations-2/README.md | 1 + testing-modules/mockito-2/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md index 45b02a3e10..2f54aa9467 100644 --- a/core-java-modules/core-java-string-operations-2/README.md +++ b/core-java-modules/core-java-string-operations-2/README.md @@ -11,4 +11,5 @@ This module contains articles about string operations. - [Case-Insensitive String Matching in Java](https://www.baeldung.com/java-case-insensitive-string-matching) - [L-Trim and R-Trim Alternatives in Java](https://www.baeldung.com/java-trim-alternatives) - [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) +- [Encode a String to UTF-8 in Java](https://www.baeldung.com/java-string-encode-utf-8) - More articles: [[<-- prev]](../core-java-string-operations) diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index 064366dfd5..6c9ddee01d 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -4,3 +4,4 @@ - [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) - [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis) +- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value) From 89fd7872c476c05a1a362f502910f31b59c4a916 Mon Sep 17 00:00:00 2001 From: sasam0320 <63002713+sasam0320@users.noreply.github.com> Date: Sat, 25 Apr 2020 07:32:20 +0200 Subject: [PATCH 50/52] BAEL-3973 (#9061) --- gradle/gradle-employee-app/.gitignore | 3 ++ gradle/gradle-employee-app/build.gradle | 38 +++++++++++++++++++ .../src/main/java/employee/Employee.java | 9 +++++ .../src/main/java/employee/EmployeeApp.java | 16 ++++++++ .../test/java/employee/EmployeeAppTest.java | 31 +++++++++++++++ gradle/settings.gradle | 2 +- 6 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 gradle/gradle-employee-app/.gitignore create mode 100644 gradle/gradle-employee-app/build.gradle create mode 100644 gradle/gradle-employee-app/src/main/java/employee/Employee.java create mode 100644 gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java create mode 100644 gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java diff --git a/gradle/gradle-employee-app/.gitignore b/gradle/gradle-employee-app/.gitignore new file mode 100644 index 0000000000..d347f664af --- /dev/null +++ b/gradle/gradle-employee-app/.gitignore @@ -0,0 +1,3 @@ +/.idea +/.gradle +/build diff --git a/gradle/gradle-employee-app/build.gradle b/gradle/gradle-employee-app/build.gradle new file mode 100644 index 0000000000..19b80c0c4a --- /dev/null +++ b/gradle/gradle-employee-app/build.gradle @@ -0,0 +1,38 @@ + +plugins { + id 'java-library' + id 'application' +} + +apply plugin: 'application' +mainClassName = 'employee.EmployeeApp' + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +println 'This is executed during configuration phase' + +task configured { + println 'The project is configured' +} + +task wrapper(type: Wrapper){ + gradleVersion = '5.3.1' +} + +repositories { + jcenter() +} + +dependencies { + + compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10' + testImplementation('junit:junit:4.13') + testRuntime('junit:junit:4.13') +} +test { + useJUnit() +} + diff --git a/gradle/gradle-employee-app/src/main/java/employee/Employee.java b/gradle/gradle-employee-app/src/main/java/employee/Employee.java new file mode 100644 index 0000000000..6940c8c28c --- /dev/null +++ b/gradle/gradle-employee-app/src/main/java/employee/Employee.java @@ -0,0 +1,9 @@ +package employee; + +public class Employee { + + String name; + String emailAddress; + int yearOfBirth; + +} \ No newline at end of file diff --git a/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java b/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java new file mode 100644 index 0000000000..48ef9f5d61 --- /dev/null +++ b/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java @@ -0,0 +1,16 @@ +package employee; + +public class EmployeeApp { + + public static void main(String[] args){ + + Employee employee = new Employee(); + employee.name = "John"; + employee.emailAddress = "john@baeldung.com"; + employee.yearOfBirth = 1978; + System.out.println("Name: " + employee.name); + System.out.println("Email Address: " + employee.emailAddress); + System.out.println("Year Of Birth:" + employee.yearOfBirth); + } + +} diff --git a/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java b/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java new file mode 100644 index 0000000000..013bcc35b6 --- /dev/null +++ b/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java @@ -0,0 +1,31 @@ +package employee; + +import employee.Employee; +import org.junit.*; +import static org.junit.Assert.*; + +public class EmployeeAppTest { + + @Test + public void testData(){ + + Employee testEmp = this.getEmployeeTest(); + + assertEquals(testEmp.name, "John"); + assertEquals(testEmp.emailAddress, "john@baeldung.com"); + assertEquals(testEmp.yearOfBirth, 1978); + + + } + + private Employee getEmployeeTest(){ + + Employee employee = new Employee(); + employee.name = "John"; + employee.emailAddress = "john@baeldung.com"; + employee.yearOfBirth = 1978; + + return employee; + } + +} \ No newline at end of file diff --git a/gradle/settings.gradle b/gradle/settings.gradle index f1d64de58a..59300f9281 100644 --- a/gradle/settings.gradle +++ b/gradle/settings.gradle @@ -1,10 +1,10 @@ rootProject.name = 'gradletutorial' - include 'greeting-library' include 'greeting-library-java' include 'greeter' include 'gradletaskdemo' include 'junit5' +include 'gradle-employee-app' println 'This will be executed during the initialization phase.' From b7588a7a3335ade294b463b98c6775269701a885 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Sat, 25 Apr 2020 22:14:35 +0530 Subject: [PATCH 51/52] BAEL-3989: Calling a SOAP web service from Spring (#9174) --- spring-soap/pom.xml | 22 +++ .../springsoap/client/CountryClient.java | 26 ++++ .../client/CountryClientConfig.java | 25 +++ .../springsoap/client/gen/Country.java | 146 ++++++++++++++++++ .../springsoap/client/gen/Currency.java | 47 ++++++ .../client/gen/GetCountryRequest.java | 71 +++++++++ .../client/gen/GetCountryResponse.java | 71 +++++++++ .../springsoap/client/gen/ObjectFactory.java | 63 ++++++++ .../springsoap/client/gen/package-info.java | 9 ++ spring-soap/src/main/resources/countries.wsdl | 74 +++++++++ .../client/CountryClientLiveTest.java | 36 +++++ 11 files changed, 590 insertions(+) create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java create mode 100644 spring-soap/src/main/resources/countries.wsdl create mode 100644 spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index 9403b70636..d0987329c0 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -58,6 +58,28 @@ + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + 0.14.0 + + + + generate + + + + + WSDL + ${project.basedir}/src/main/java + com.baeldung.springsoap.client.gen + ${project.basedir}/src/main/resources + + countries.wsdl + + + diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java new file mode 100644 index 0000000000..e0b9172ece --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java @@ -0,0 +1,26 @@ +package com.baeldung.springsoap.client; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.ws.client.core.support.WebServiceGatewaySupport; + +import com.baeldung.springsoap.client.gen.GetCountryRequest; +import com.baeldung.springsoap.client.gen.GetCountryResponse; + +public class CountryClient extends WebServiceGatewaySupport { + + private static final Logger logger = LoggerFactory.getLogger(CountryClient.class); + + public GetCountryResponse getCountry(String country) { + + GetCountryRequest request = new GetCountryRequest(); + request.setName(country); + + logger.info("Requesting information for " + country); + + GetCountryResponse response = (GetCountryResponse) getWebServiceTemplate().marshalSendAndReceive(request); + + return response; + } + +} \ No newline at end of file diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java new file mode 100644 index 0000000000..8dabdbc00d --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.springsoap.client; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; + +@Configuration +public class CountryClientConfig { + + @Bean + public Jaxb2Marshaller marshaller() { + Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); + marshaller.setContextPath("com.baeldung.springsoap.client.gen"); + return marshaller; + } + + @Bean + public CountryClient countryClient(Jaxb2Marshaller marshaller) { + CountryClient client = new CountryClient(); + client.setDefaultUri("http://localhost:8080/ws"); + client.setMarshaller(marshaller); + client.setUnmarshaller(marshaller); + return client; + } +} \ No newline at end of file diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java new file mode 100644 index 0000000000..e17dce55f9 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java @@ -0,0 +1,146 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for country complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="country">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="population" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *         <element name="capital" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="currency" type="{http://www.baeldung.com/springsoap/gen}currency"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "country", propOrder = { + "name", + "population", + "capital", + "currency" +}) +public class Country { + + @XmlElement(required = true) + protected String name; + protected int population; + @XmlElement(required = true) + protected String capital; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected Currency currency; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the population property. + * + */ + public int getPopulation() { + return population; + } + + /** + * Sets the value of the population property. + * + */ + public void setPopulation(int value) { + this.population = value; + } + + /** + * Gets the value of the capital property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCapital() { + return capital; + } + + /** + * Sets the value of the capital property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCapital(String value) { + this.capital = value; + } + + /** + * Gets the value of the currency property. + * + * @return + * possible object is + * {@link Currency } + * + */ + public Currency getCurrency() { + return currency; + } + + /** + * Sets the value of the currency property. + * + * @param value + * allowed object is + * {@link Currency } + * + */ + public void setCurrency(Currency value) { + this.currency = value; + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java new file mode 100644 index 0000000000..12fdef58c2 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java @@ -0,0 +1,47 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for currency. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="currency">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     <enumeration value="GBP"/>
+ *     <enumeration value="EUR"/>
+ *     <enumeration value="PLN"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "currency") +@XmlEnum +public enum Currency { + + GBP, + EUR, + PLN; + + public String value() { + return name(); + } + + public static Currency fromValue(String v) { + return valueOf(v); + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java new file mode 100644 index 0000000000..5739ee3b96 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java @@ -0,0 +1,71 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "name" +}) +@XmlRootElement(name = "getCountryRequest") +public class GetCountryRequest { + + @XmlElement(required = true) + protected String name; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java new file mode 100644 index 0000000000..ba1ab56cf8 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java @@ -0,0 +1,71 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="country" type="{http://www.baeldung.com/springsoap/gen}country"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "country" +}) +@XmlRootElement(name = "getCountryResponse") +public class GetCountryResponse { + + @XmlElement(required = true) + protected Country country; + + /** + * Gets the value of the country property. + * + * @return + * possible object is + * {@link Country } + * + */ + public Country getCountry() { + return country; + } + + /** + * Sets the value of the country property. + * + * @param value + * allowed object is + * {@link Country } + * + */ + public void setCountry(Country value) { + this.country = value; + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java new file mode 100644 index 0000000000..88b27245be --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java @@ -0,0 +1,63 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.baeldung.springsoap.client.gen package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.springsoap.client.gen + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link GetCountryRequest } + * + */ + public GetCountryRequest createGetCountryRequest() { + return new GetCountryRequest(); + } + + /** + * Create an instance of {@link GetCountryResponse } + * + */ + public GetCountryResponse createGetCountryResponse() { + return new GetCountryResponse(); + } + + /** + * Create an instance of {@link Country } + * + */ + public Country createCountry() { + return new Country(); + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java new file mode 100644 index 0000000000..eefed169a8 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java @@ -0,0 +1,9 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + +@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.baeldung.com/springsoap/gen", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +package com.baeldung.springsoap.client.gen; diff --git a/spring-soap/src/main/resources/countries.wsdl b/spring-soap/src/main/resources/countries.wsdl new file mode 100644 index 0000000000..2a2eaf05bb --- /dev/null +++ b/spring-soap/src/main/resources/countries.wsdl @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java b/spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java new file mode 100644 index 0000000000..63dbe2a5cf --- /dev/null +++ b/spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java @@ -0,0 +1,36 @@ +package com.baeldung.springsoap.client; + +import static org.junit.Assert.assertEquals; + +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; + +import com.baeldung.springsoap.client.gen.Currency; +import com.baeldung.springsoap.client.gen.GetCountryResponse; + +//Ensure that the server - com.baeldung.springsoap.Application - is running before executing this test +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) +public class CountryClientLiveTest { + + @Autowired + CountryClient client; + + @Test + public void givenCountryService_whenCountryPoland_thenCapitalIsWarsaw() { + GetCountryResponse response = client.getCountry("Poland"); + assertEquals("Warsaw", response.getCountry() + .getCapital()); + } + + @Test + public void givenCountryService_whenCountrySpain_thenCurrencyEUR() { + GetCountryResponse response = client.getCountry("Spain"); + assertEquals(Currency.EUR, response.getCountry() + .getCurrency()); + } +} From ee898632d354bfeb972ba3a01217910834517535 Mon Sep 17 00:00:00 2001 From: Aaron Juarez Date: Sat, 25 Apr 2020 16:23:13 -0400 Subject: [PATCH 52/52] BAEL-3966: find object's class in Java (#9118) --- .../com/baeldung/objectclass/Borrower.java | 23 ++++++ .../java/com/baeldung/objectclass/Lender.java | 20 +++++ .../java/com/baeldung/objectclass/User.java | 12 +++ .../objectclass/CreditAppUnitTest.java | 74 +++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java new file mode 100644 index 0000000000..62062aa7fc --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java @@ -0,0 +1,23 @@ +package com.baeldung.objectclass; + +import lombok.Data; + +@Data +public class Borrower extends User { + + private double totalLoanAmount; + + public double requestLoan(double amount) { + totalLoanAmount = amount; + return totalLoanAmount; + } + + public double increaseLoan(double increaseBy) { + return totalLoanAmount + increaseBy; + } + + public double payLoan(double amount) { + return totalLoanAmount - amount; + } + +} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java new file mode 100644 index 0000000000..b45272cbb1 --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java @@ -0,0 +1,20 @@ +package com.baeldung.objectclass; + +public class Lender extends User { + + private double totalInvestmentAmount; + + public double invest(double amount) { + totalInvestmentAmount = amount; + return totalInvestmentAmount; + } + + public double increaseInvestment(double increaseBy) { + return totalInvestmentAmount + increaseBy; + } + + public double collectDividends() { + return totalInvestmentAmount * 0.07; + } + +} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java new file mode 100644 index 0000000000..b1f3887f2f --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java @@ -0,0 +1,12 @@ +package com.baeldung.objectclass; + +import lombok.Data; + +@Data +public class User { + + private String firstName; + private String lastName; + + +} diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java new file mode 100644 index 0000000000..8330ddbac5 --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.objectclass; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Test; + +public class CreditAppUnitTest { + + @Test + public void givenLender_whenInstanceOf_thenReturnTrue() { + User lender = new Lender(); + assertTrue(lender instanceof Lender); + assertTrue(lender instanceof User); + } + + @Test + public void givenUser_whenInstanceOfLender_thenDowncast() { + User user = new Lender(); + Lender lender = null; + + if(user instanceof Lender) { + lender = (Lender) user; + } + + assertNotNull(lender); + } + + @Test + public void givenUser_whenIsInstanceOfLender_thenDowncast() { + User user = new Lender(); + Lender lender = null; + + if(Lender.class.isInstance(user)) { + lender = (Lender) user; + } + + assertNotNull(lender); + } + + @Test + public void givenBorrower_whenLoanAmountIsDouble_thenRequestLoan() { + Borrower borrower = new Borrower(); + double amount = 100.0; + + //if(amount instanceof Double) // Compilation error, no autoboxing + if(Double.class.isInstance(amount)) { + borrower.requestLoan(amount); + } + assertEquals(100, borrower.getTotalLoanAmount()); + } + + @Test + public void givenBorrower_whenLoanAmountIsNotString_thenRequestLoan() { + Borrower borrower = new Borrower(); + Double amount = 100.0; + + //if(amount instanceof String) // Compilation error, incompatible operands + if(!String.class.isInstance(amount)) { + borrower.requestLoan(amount); + } + assertEquals(100, borrower.getTotalLoanAmount()); + } + + @Test + public void givenLender_whenGetClass_thenEqualsLenderType() { + User lender = new Lender(); + assertEquals(Lender.class, lender.getClass()); + assertNotEquals(User.class, lender.getClass()); + } + +}