diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
index 4c220b4047..45ef842670 100644
--- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
+++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
@@ -31,6 +31,6 @@ public class BalancedBracketsUsingDeque {
}
}
- return true;
+ return deque.isEmpty();
}
}
\ No newline at end of file
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
index 964c1ce11a..4c0a56dabc 100644
--- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
+++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
@@ -49,6 +49,12 @@ public class BalancedBracketsUsingDequeUnitTest {
assertThat(result).isFalse();
}
+ @Test
+ public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() {
+ boolean result = balancedBracketsUsingDeque.isBalanced("{{}(");
+ assertThat(result).isFalse();
+ }
+
@Test
public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() {
boolean result = balancedBracketsUsingDeque.isBalanced("{[()]}");
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
index 69ce42b0f1..bda85a75ce 100644
--- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
+++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
@@ -49,6 +49,12 @@ public class BalancedBracketsUsingStringUnitTest {
assertThat(result).isFalse();
}
+ @Test
+ public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() {
+ boolean result = balancedBracketsUsingString.isBalanced("{{}(");
+ assertThat(result).isFalse();
+ }
+
@Test
public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() {
boolean result = balancedBracketsUsingString.isBalanced("{[()]}");
diff --git a/apache-spark/data/customerData.csv b/apache-spark/data/customerData.csv
new file mode 100644
index 0000000000..8661bcb352
--- /dev/null
+++ b/apache-spark/data/customerData.csv
@@ -0,0 +1,9 @@
+id,zoneId,FIRST_NAME,MIDDLE_NAME,LAST_NAME,CITY,gender,transaction_date,transaction_amount
+1,EU11,Ana1,A,MN, London,Female,1/2/2018,5200
+2,EU12,Ana2,A,MN, London,Female,29/3/2018,1000
+3,EU13,Jack1,Josh,MN, London,Male,19/6/2018,9600
+4,EU14,Jack2,Josh,MN, London,Male,9/9/2018,1000
+5,EU15,Nick1,H,Dee,London,Male,9/6/2021,3000
+6,EU16,Nick2,H,Dee,London,Male,27/9/2021,500
+7,EU17,Nick3,H,Dee,London,Male,8/12/2021,500
+8,EU18,Sara1,H,Dee,London,Female,7/4/2021,2000
\ No newline at end of file
diff --git a/apache-spark/data/customerData.json b/apache-spark/data/customerData.json
new file mode 100644
index 0000000000..d713d75678
--- /dev/null
+++ b/apache-spark/data/customerData.json
@@ -0,0 +1,114 @@
+[
+ {
+ "zoneId": "LONDON",
+ "customerId": 1,
+ "gender": "Female",
+ "name": "jane austin",
+ "contact": {
+ "street_Address": "XYZ Road",
+ "address2": "house 47",
+ "zipcode": "MK1110",
+ "county": "DCounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityA"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 15000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 2,
+ "gender": "Male",
+ "name": "Jack Trevor",
+ "contact": {
+ "street_Address": " kingfisher road",
+ "address2": "SUITE 110",
+ "zipcode": "HM1190",
+ "county": "CCounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityB"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 12000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 11,
+ "gender": "Female",
+ "name": "jane1 austin",
+ "contact": {
+ "street_Address": "B Road",
+ "address2": "house 47",
+ "zipcode": "MK1110",
+ "county": "BCounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityA"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 1000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 21,
+ "gender": "Male",
+ "name": "Jack1 Trevor",
+ "contact": {
+ "street_Address": " A road",
+ "address2": "SUITE 777",
+ "zipcode": "AZ890",
+ "county": "ACounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityB"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 1000
+ },
+ {
+ "zoneId": "Wales",
+ "customerId": 3,
+ "gender": "Male",
+ "name": "John Jack",
+ "contact": {
+ "street_Address": "sunny croft",
+ "address2": "SUITE 1",
+ "zipcode": "SN1030",
+ "county": "bucks",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "Cardiff"
+ },
+ "transaction_date": "2018-02-05",
+ "transaction_amount": 5000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 4,
+ "gender": "Male",
+ "name": "Jack Trevor",
+ "contact": {
+ "street_Address": " kingfisher road",
+ "address2": "SUITE 110",
+ "zipcode": "HM1190",
+ "county": "Hampshire",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityB"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 500
+ },
+ {
+ "zoneId": "Wales",
+ "customerId": 5,
+ "gender": "Male",
+ "name": "John Jack",
+ "contact": {
+ "street_Address": "sunny croft",
+ "address2": "SUITE 1",
+ "zipcode": "SN1030",
+ "county": "ECounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "Cardiff"
+ },
+ "transaction_date": "2018-01-25",
+ "transaction_amount": 500
+ }
+]
diff --git a/apache-spark/data/minCustomerData.json b/apache-spark/data/minCustomerData.json
new file mode 100644
index 0000000000..a47a739d51
--- /dev/null
+++ b/apache-spark/data/minCustomerData.json
@@ -0,0 +1,20 @@
+[
+ {
+ "id": "1",
+ "gender": "Female",
+ "name": "Jo",
+ "transaction_amount": 200
+ },
+ {
+ "id":"2",
+ "gender": "Male",
+ "name": "Mike",
+ "transaction_amount": 500
+ },
+ {
+ "id": "3",
+ "gender": "Male",
+ "name": "Dave",
+ "transaction_amount": 5000
+ }
+]
\ No newline at end of file
diff --git a/apache-spark/docker/docker-compose.yaml b/apache-spark/docker/docker-compose.yaml
new file mode 100644
index 0000000000..960e543229
--- /dev/null
+++ b/apache-spark/docker/docker-compose.yaml
@@ -0,0 +1,33 @@
+version: "3"
+
+services:
+ postgres:
+ image: postgres:12.3-alpine
+ restart: always
+ environment:
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_USER: postgres
+ expose:
+ - 5432
+ ports:
+ - 5432:5432
+ command: -p 5432
+ volumes:
+ - ./init.sql:/docker-entrypoint-initdb.d/init.sql
+# - postgres:/var/lib/postgresql/data
+
+ pgadmin:
+ image: dpage/pgadmin4:4.23
+ environment:
+ PGADMIN_DEFAULT_EMAIL: admin@pgadmin.com
+ PGADMIN_DEFAULT_PASSWORD: password
+ PGADMIN_LISTEN_PORT: 80
+ ports:
+ - 15432:80
+ volumes:
+ - pgadmin:/var/lib/pgadmin
+ depends_on:
+ - postgres
+
+volumes:
+ pgadmin:
\ No newline at end of file
diff --git a/apache-spark/docker/init.sql b/apache-spark/docker/init.sql
new file mode 100755
index 0000000000..371135faa3
--- /dev/null
+++ b/apache-spark/docker/init.sql
@@ -0,0 +1 @@
+CREATE DATABASE customerdb;
\ No newline at end of file
diff --git a/apache-spark/pom.xml b/apache-spark/pom.xml
index 05c5088662..b86e99433a 100644
--- a/apache-spark/pom.xml
+++ b/apache-spark/pom.xml
@@ -20,37 +20,31 @@
org.apache.spark
spark-core_2.11
${org.apache.spark.spark-core.version}
- provided
org.apache.spark
spark-sql_2.11
${org.apache.spark.spark-sql.version}
- provided
org.apache.spark
spark-graphx_2.11
${org.apache.spark.spark-graphx.version}
- provided
graphframes
graphframes
${graphframes.version}
- provided
org.apache.spark
spark-streaming_2.11
${org.apache.spark.spark-streaming.version}
- provided
org.apache.spark
spark-mllib_2.11
${org.apache.spark.spark-mllib.version}
- provided
org.apache.spark
@@ -67,6 +61,11 @@
spark-cassandra-connector-java_2.11
${com.datastax.spark.spark-cassandra-connector-java.version}
+
+ org.postgresql
+ postgresql
+ ${postgres.version}
+
@@ -108,6 +107,7 @@
2.4.8
2.5.2
1.6.0-M1
+ 42.3.3
\ No newline at end of file
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java b/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java
new file mode 100644
index 0000000000..97fa160872
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java
@@ -0,0 +1,52 @@
+package com.baeldung.dataframes;
+
+public class Customer {
+ String id;
+ String name;
+ String gender;
+ int transaction_amount;
+
+ public Customer() {
+
+ }
+
+ public Customer(String id, String name, String gender, int transaction_amount) {
+ this.id = id;
+ this.name = name;
+ this.gender = gender;
+ this.transaction_amount = transaction_amount;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ public int getTransaction_amount() {
+ return transaction_amount;
+ }
+
+ public void setTransaction_amount(int transaction_amount) {
+ this.transaction_amount = transaction_amount;
+ }
+
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java
new file mode 100644
index 0000000000..869645624a
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java
@@ -0,0 +1,129 @@
+package com.baeldung.dataframes;
+
+import static org.apache.spark.sql.functions.col;
+import static org.apache.spark.sql.functions.column;
+import static org.apache.spark.sql.functions.concat;
+import static org.apache.spark.sql.functions.lit;
+
+import java.util.Properties;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SaveMode;
+import org.apache.spark.sql.SparkSession;
+import org.apache.spark.sql.functions;
+
+public class CustomerDataAggregationPipeline {
+ private static final SparkSession SPARK_SESSION = SparkDriver.getSparkSession();
+
+ private final Properties dbProperties;
+
+ public CustomerDataAggregationPipeline(Properties properties) {
+ dbProperties = properties;
+ }
+
+ public static void main(String[] args) {
+ // replace with actual DB properties
+ Properties dbProps = new Properties();
+ dbProps.setProperty("connectionURL", "jdbc:postgresql://localhost:5432/customerdb");
+ dbProps.setProperty("driver", "org.postgresql.Driver");
+ dbProps.setProperty("user", "postgres");
+ dbProps.setProperty("password", "postgres");
+
+ new CustomerDataAggregationPipeline(dbProps).run();
+ }
+
+ public void run() {
+ Dataset ebayDFRaw = ingestCustomerDataFromEbay();
+ Dataset ebayDf = normalizeCustomerDataFromEbay(ebayDFRaw);
+
+ Dataset amazonDFRaw = ingestCustomerDataFromAmazon();
+ Dataset amazonDf = normalizeCustomerDataFromAmazon(amazonDFRaw);
+
+ Dataset combineDataframes = combineDataframes(ebayDf, amazonDf);
+
+ Dataset rowDataset = aggregateYearlySalesByGender(combineDataframes);
+
+ exportData(rowDataset);
+ }
+
+ private static Dataset ingestCustomerDataFromAmazon() {
+ return SPARK_SESSION.read()
+ .format("csv")
+ .option("header", "true")
+ .schema(SchemaFactory.customerSchema())
+ .option("dateFormat", "m/d/YYYY")
+ .load("data/customerData.csv");
+ }
+
+ private static Dataset ingestCustomerDataFromEbay() {
+ return SPARK_SESSION.read()
+ .format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat")
+ .option("multiline", true)
+ .load("data/customerData.json");
+ }
+
+ private static Dataset combineDataframes(Dataset df1, Dataset df2) {
+ return df1.unionByName(df2);
+ }
+
+ private static Dataset normalizeCustomerDataFromEbay(Dataset rawDataset) {
+ Dataset transformedDF = rawDataset.withColumn("id", concat(rawDataset.col("zoneId"), lit("-"), rawDataset.col("customerId")))
+ .drop(column("customerId"))
+ .withColumn("source", lit("ebay"))
+ .withColumn("city", rawDataset.col("contact.customer_city"))
+ .drop(column("contact"))
+ .drop(column("zoneId"))
+ .withColumn("year", functions.year(col("transaction_date")))
+ .drop("transaction_date")
+ .withColumn("firstName", functions.split(column("name"), " ")
+ .getItem(0))
+ .withColumn("lastName", functions.split(column("name"), " ")
+ .getItem(1))
+ .drop(column("name"));
+
+ print(transformedDF);
+ return transformedDF;
+ }
+
+ private static Dataset normalizeCustomerDataFromAmazon(Dataset rawDataset) {
+
+ Dataset transformedDF = rawDataset.withColumn("id", concat(rawDataset.col("zoneId"), lit("-"), rawDataset.col("id")))
+ .withColumn("source", lit("amazon"))
+ .withColumnRenamed("CITY", "city")
+ .withColumnRenamed("PHONE_NO", "contactNo")
+ .withColumnRenamed("POSTCODE", "postCode")
+ .withColumnRenamed("FIRST_NAME", "firstName")
+ .drop(column("MIDDLE_NAME"))
+ .drop(column("zoneId"))
+ .withColumnRenamed("LAST_NAME", "lastName")
+ .withColumn("year", functions.year(col("transaction_date")))
+ .drop("transaction_date");
+
+ print(transformedDF);
+ return transformedDF;
+ }
+
+ private static Dataset aggregateYearlySalesByGender(Dataset dataset) {
+
+ Dataset aggDF = dataset.groupBy(column("year"), column("source"), column("gender"))
+ .sum("transaction_amount")
+ .withColumnRenamed("sum(transaction_amount)", "annual_spending")
+ .orderBy(col("year").asc(), col("annual_spending").desc());
+
+ print(aggDF);
+ return aggDF;
+ }
+
+ private static void print(Dataset aggDs) {
+ aggDs.show();
+ aggDs.printSchema();
+ }
+
+ private void exportData(Dataset dataset) {
+ String connectionURL = dbProperties.getProperty("connectionURL");
+ dataset.write()
+ .mode(SaveMode.Overwrite)
+ .jdbc(connectionURL, "customer", dbProperties);
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java
new file mode 100644
index 0000000000..53799c1079
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java
@@ -0,0 +1,46 @@
+package com.baeldung.dataframes;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+
+public class CustomerToDataFrameConverterApp {
+
+ private static final List CUSTOMERS = Arrays.asList(
+ aCustomerWith("01", "jo", "Female", 2000),
+ aCustomerWith("02", "jack", "Male", 1200)
+ );
+
+ public static void main(String[] args) {
+ Dataset dataFrame = convertAfterMappingRows(CUSTOMERS);
+ print(dataFrame);
+ Dataset customerDF = convertToDataFrameWithNoChange();
+ print(customerDF);
+ }
+
+ public static Dataset convertToDataFrameWithNoChange() {
+ return SparkDriver.getSparkSession().createDataFrame(CUSTOMERS, Customer.class);
+ }
+
+ public static Dataset convertAfterMappingRows(List customer) {
+ List rows = customer.stream()
+ .map(c -> new CustomerToRowMapper().call(c))
+ .collect(Collectors.toList());
+
+ return SparkDriver.getSparkSession()
+ .createDataFrame(rows, SchemaFactory.minimumCustomerDataSchema());
+ }
+
+ private static Customer aCustomerWith(String id, String name, String gender, int amount) {
+ return new Customer(id, name, gender, amount);
+ }
+
+ private static void print(Dataset dataFrame) {
+ dataFrame.printSchema();
+ dataFrame.show();
+ }
+
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java
new file mode 100644
index 0000000000..e54bceb3ad
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java
@@ -0,0 +1,18 @@
+package com.baeldung.dataframes;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.spark.api.java.function.MapFunction;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.RowFactory;
+
+public class CustomerToRowMapper implements MapFunction {
+
+ @Override
+ public Row call(Customer customer) {
+ Row row = RowFactory.create(
+ customer.getId(), customer.getName().toUpperCase(),
+ StringUtils.substring(customer.getGender(),0, 1),
+ customer.getTransaction_amount());
+ return row;
+ }
+}
\ No newline at end of file
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java
new file mode 100644
index 0000000000..31ad8de12b
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java
@@ -0,0 +1,21 @@
+package com.baeldung.dataframes;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Encoders;
+import org.apache.spark.sql.Row;
+
+public class DataFrameToCustomerConverterApp {
+
+ public static void main(String[] args) {
+ Dataset df = SparkDriver.getSparkSession()
+ .read()
+ .format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat")
+ .option("multiline", true)
+ .load("data/minCustomerData.json");
+ df.show();
+ df.printSchema();
+ Dataset customerDS = df.map(new RowToCustomerMapper(), Encoders.bean(Customer. class));
+ customerDS.show();
+ customerDS.printSchema();
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java
new file mode 100644
index 0000000000..23db18dddf
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java
@@ -0,0 +1,57 @@
+package com.baeldung.dataframes;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Encoders;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SparkSession;
+
+public class DataSetToDataFrameConverterApp {
+
+ private static final SparkSession SPARK_SESSION = SparkDriver.getSparkSession();
+
+ public static void main(String[] args) {
+
+ Dataset customerDataset = convertToDataSetFromPOJO();
+ Dataset customerDataFrame = customerDataset.toDF();
+ print(customerDataFrame);
+
+ List names = getNames();
+ Dataset namesDataset = convertToDataSetFromStrings(names);
+ Dataset namesDataFrame = namesDataset.toDF();
+ print(namesDataFrame);
+ }
+
+ private static Dataset convertToDataSetFromStrings(List names) {
+ return SPARK_SESSION.createDataset(names, Encoders.STRING());
+ }
+
+ private static Dataset convertToDataSetFromPOJO() {
+ return SPARK_SESSION.createDataset(CUSTOMERS, Encoders.bean(Customer.class));
+ }
+
+ private static final List CUSTOMERS = Arrays.asList(
+ aCustomerWith("01", "jo", "Female", 2000),
+ aCustomerWith("02", "jack", "Female", 1200),
+ aCustomerWith("03", "ash", "male", 2000),
+ aCustomerWith("04", "emma", "Female", 2000)
+ );
+
+ private static List getNames() {
+ return CUSTOMERS.stream()
+ .map(Customer::getName)
+ .collect(Collectors.toList());
+ }
+
+ private static void print(Dataset df) {
+ df.show();
+ df.printSchema();
+ }
+
+ private static Customer aCustomerWith(String id, String name, String gender, int amount) {
+ return new Customer(id, name, gender, amount);
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java b/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java
new file mode 100644
index 0000000000..02fde539c8
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java
@@ -0,0 +1,19 @@
+package com.baeldung.dataframes;
+
+import org.apache.spark.api.java.function.MapFunction;
+import org.apache.spark.sql.Row;
+
+class RowToCustomerMapper implements MapFunction {
+
+ @Override
+ public Customer call(Row row) {
+
+ Customer customer = new Customer();
+ customer.setId(row.getAs("id"));
+ customer.setName(row.getAs("name"));
+ customer.setGender(row.getAs("gender"));
+ customer.setTransaction_amount(Math.toIntExact(row.getAs("transaction_amount")));
+
+ return customer;
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java b/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java
new file mode 100644
index 0000000000..6c298e4829
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java
@@ -0,0 +1,31 @@
+package com.baeldung.dataframes;
+
+import org.apache.spark.sql.types.DataTypes;
+import org.apache.spark.sql.types.StructField;
+import org.apache.spark.sql.types.StructType;
+
+public class SchemaFactory {
+
+ public static StructType customerSchema() {
+ return DataTypes.createStructType(
+ new StructField[] { DataTypes.createStructField("id", DataTypes.IntegerType, false),
+ DataTypes.createStructField("zoneId", DataTypes.StringType, false),
+ DataTypes.createStructField("FIRST_NAME", DataTypes.StringType, false),
+ DataTypes.createStructField("MIDDLE_NAME", DataTypes.StringType, false),
+ DataTypes.createStructField("LAST_NAME", DataTypes.StringType, false),
+ DataTypes.createStructField("CITY", DataTypes.StringType, false),
+ DataTypes.createStructField("gender", DataTypes.StringType, false),
+ DataTypes.createStructField("transaction_date", DataTypes.DateType, false),
+ DataTypes.createStructField("transaction_amount", DataTypes.IntegerType, false)
+ });
+ }
+
+ public static StructType minimumCustomerDataSchema() {
+ return DataTypes.createStructType(new StructField[] {
+ DataTypes.createStructField("id", DataTypes.StringType, true),
+ DataTypes.createStructField("name", DataTypes.StringType, true),
+ DataTypes.createStructField("gender", DataTypes.StringType, true),
+ DataTypes.createStructField("transaction_amount", DataTypes.IntegerType, true)
+ });
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java b/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java
new file mode 100644
index 0000000000..adc25170a7
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java
@@ -0,0 +1,16 @@
+package com.baeldung.dataframes;
+
+import java.io.Serializable;
+
+import org.apache.spark.sql.SparkSession;
+
+public class SparkDriver implements Serializable {
+
+ public static SparkSession getSparkSession() {
+ return SparkSession.builder()
+ .appName("Customer Aggregation pipeline")
+ .master("local")
+ .getOrCreate();
+
+ }
+}
diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java
new file mode 100644
index 0000000000..52a7b1451f
--- /dev/null
+++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.dataframes;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+class CustomerDataAggregationPipelineLiveTest {
+
+ private static Connection conn;
+
+ @BeforeAll
+ static void beforeAll() throws SQLException {
+ DriverManager.registerDriver(new org.postgresql.Driver());
+ String dbURL1 = "jdbc:postgresql://localhost:5432/customerdb";
+ conn = DriverManager.getConnection(dbURL1, "postgres", "postgres");
+
+ String sql = "drop table if exists customer";
+
+ PreparedStatement statement = conn.prepareStatement(sql);
+ statement.executeUpdate();
+ }
+
+ @Test
+ void givenCSVAndJSON_whenRun_thenStoresAggregatedDataFrameInDB() throws Exception {
+ Properties dbProps = new Properties();
+ dbProps.setProperty("connectionURL", "jdbc:postgresql://localhost:5432/customerdb");
+ dbProps.setProperty("driver", "org.postgresql.Driver");
+ dbProps.setProperty("user", "postgres");
+ dbProps.setProperty("password", "postgres");
+
+ CustomerDataAggregationPipeline pipeline = new CustomerDataAggregationPipeline(dbProps);
+ pipeline.run();
+
+ String allCustomersSql = "Select count(*) from customer";
+
+ Statement statement = conn.createStatement();
+ ResultSet resultSet = statement.executeQuery(allCustomersSql);
+ resultSet.next();
+ int count = resultSet.getInt(1);
+ assertEquals(7, count);
+ }
+
+}
diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
new file mode 100644
index 0000000000..06c8f66bcd
--- /dev/null
+++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.dataframes;
+
+import static com.baeldung.dataframes.CustomerToDataFrameConverterApp.convertAfterMappingRows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.junit.jupiter.api.Test;
+
+class CustomerToDataFrameConverterAppUnitTest {
+
+ @Test
+ void givenCustomers_whenConvertAfterMappingRows_thenConvertsToDataSet() {
+
+ List customers = Arrays.asList(
+ new Customer("01", "jo", "Female", 2000),
+ new Customer("02", "jack", "Male", 1200)
+ );
+
+ Dataset customerDF = convertAfterMappingRows(customers);
+ List rows = customerDF.collectAsList();
+ Row row1 = rows.get(0);
+ Row row2 = rows.get(1);
+
+ assertEquals("01", row1.get(0));
+ assertEquals( "JO", row1.get(1));
+ assertEquals( "F", row1.get(2));
+ assertEquals( 2000, row1.get(3));
+
+ assertEquals("02", row2.get(0));
+ assertEquals( "JACK", row2.get(1));
+ assertEquals( "M", row2.get(2));
+ assertEquals( 1200, row2.get(3));
+ }
+
+ @Test
+ void givenCustomers_whenConvertWithNoChange_thenConvertsToDataSet() {
+
+ List customers = Arrays.asList(
+ new Customer("01", "jo", "Female", 2000),
+ new Customer("02", "jack", "Male", 1200)
+ );
+
+ Dataset customerDF = CustomerToDataFrameConverterApp.convertToDataFrameWithNoChange();
+ List rows = customerDF.collectAsList();
+ Row row1 = rows.get(0);
+ Row row2 = rows.get(1);
+
+ assertEquals("01", row1.getAs("id"));
+ assertEquals( "jo", row1.getAs("name"));
+ assertEquals( "Female", row1.getAs("gender"));
+ assertEquals( 2000, (int)row1.getAs("transaction_amount"));
+
+ assertEquals("02", row2.getAs("id"));
+ assertEquals( "jack", row2.getAs("name"));
+ assertEquals( "Male", row2.getAs("gender"));
+ assertEquals( 1200, (int)row2.getAs("transaction_amount"));
+ }
+}
diff --git a/core-java-modules/README.md b/core-java-modules/README.md
index fa77846b45..d07dff8751 100644
--- a/core-java-modules/README.md
+++ b/core-java-modules/README.md
@@ -4,6 +4,6 @@ This module contains modules about core Java
## Relevant articles:
-- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms)
- [Understanding the NumberFormatException in Java](https://www.baeldung.com/java-number-format-exception)
-- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch)
+
+
diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java
new file mode 100644
index 0000000000..37424147a7
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java
@@ -0,0 +1,35 @@
+package com.baeldung.setvslazyset;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Application {
+
+ AtomicInteger atomic = new AtomicInteger(0);
+
+ public static void main(String[] args) {
+ Application app = new Application();
+ new Thread(() -> {
+ for (int i = 0; i < 10; i++) {
+ //app.atomic.set(i);
+ app.atomic.lazySet(i);
+ System.out.println("Set: " + i);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ }).start();
+
+ new Thread(() -> {
+ for (int i = 0; i < 10; i++) {
+ synchronized (app.atomic) {
+ int counter = app.atomic.get();
+ System.out.println("Get: " + counter);
+ }
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ }).start();
+ }
+
+}
diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md
index 5f47aa69fb..b74ede51e8 100644
--- a/core-java-modules/core-java-exceptions/README.md
+++ b/core-java-modules/core-java-exceptions/README.md
@@ -13,4 +13,5 @@ This module contains articles about core java exceptions
- [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error)
- [Checked and Unchecked Exceptions in Java](https://www.baeldung.com/java-checked-unchecked-exceptions)
- [Common Java Exceptions](https://www.baeldung.com/java-common-exceptions)
+- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch)
- [[Next -->]](/core-java-modules/core-java-exceptions-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md
index 65a46eeed3..c05618afbd 100644
--- a/core-java-modules/core-java-io-4/README.md
+++ b/core-java-modules/core-java-io-4/README.md
@@ -9,4 +9,5 @@ This module contains articles about core Java input and output (IO)
- [SequenceInputStream Class in Java](https://www.baeldung.com/java-sequenceinputstream)
- [Read a File Into a Map in Java](https://www.baeldung.com/java-read-file-into-map)
- [Read User Input Until a Condition is Met](https://www.baeldung.com/java-read-input-until-condition)
+- [Java Scanner.skip method with examples](https://www.baeldung.com/java-scanner-skip)
- [[<-- Prev]](/core-java-modules/core-java-io-3)
diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md
index 832d4783f2..53414eb14c 100644
--- a/core-java-modules/core-java-lambdas/README.md
+++ b/core-java-modules/core-java-lambdas/README.md
@@ -6,4 +6,5 @@
- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
- [Method References in Java](https://www.baeldung.com/java-method-references)
-- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator)
\ No newline at end of file
+- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator)
+- [Serialize a Lambda in Java](https://www.baeldung.com/java-serialize-lambda)
diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md
new file mode 100644
index 0000000000..012f4edc51
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/README.md
@@ -0,0 +1,5 @@
+## Core Java Lang (Part 5)
+
+This module contains articles about core features in the Java language
+
+## TODO ##
diff --git a/core-java-modules/core-java-lang-5/pom.xml b/core-java-modules/core-java-lang-5/pom.xml
new file mode 100644
index 0000000000..6d3771bd31
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/pom.xml
@@ -0,0 +1,27 @@
+
+
+ 4.0.0
+ core-java-lang-5
+ 0.1.0-SNAPSHOT
+ core-java-lang-5
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+ core-java-lang-5
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java
new file mode 100644
index 0000000000..12b3db734d
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java
@@ -0,0 +1,125 @@
+package com.baeldung.nullchecks;
+
+import org.junit.Test;
+
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class NullChecksUnitTest {
+
+ @Test
+ public void whenReferenceEqualityOnPrimitives_thenCompareValues() {
+ int a = 10;
+ int b = 15;
+ int c = 10;
+ int d = a;
+
+ // different values check
+ assertFalse(a == b);
+
+ // same values check
+ assertTrue(a == c);
+
+ // same references check
+ assertTrue(a == d);
+ }
+
+ @Test
+ public void whenReferenceEqualityOnObjects_thenCompareReferences() {
+ Person a = new Person("Bob", 20);
+ Person b = new Person("Mike", 40);
+ Person c = new Person("Bob", 20);
+ Person d = a;
+ Person e = null;
+
+ // different values check
+ assertFalse(a == b);
+
+ // same values check
+ assertFalse(a == c);
+
+ // same references check
+ assertTrue(a == d);
+
+ // same references check - for nulls
+ assertTrue(e == null);
+ }
+
+ @Test
+ public void whenValueEqualityOnPrimitives_thenCompareValues() {
+ int a = 10;
+ Integer b = a;
+
+ assertTrue(b.equals(10));
+ }
+
+ @Test
+ public void whenValueEqualityOnObjects_thenCompareValues() {
+ Person a = new Person("Bob", 20);
+ Person b = new Person("Mike", 40);
+ Person c = new Person("Bob", 20);
+ Person d = a;
+ Person e = null;
+
+ // different values check
+ assertFalse(a.equals(b));
+
+ // same values check
+ assertTrue(a.equals(c));
+
+ // same references check
+ assertTrue(a.equals(d));
+
+ // null checks
+ assertFalse(a.equals(e));
+ assertThrows(NullPointerException.class, () -> e.equals(a));
+
+ // null checks fixed
+ assertFalse(e != null && e.equals(a));
+
+ // using Objects.equals
+ assertFalse(Objects.equals(e, a));
+ assertTrue(Objects.equals(null, e));
+
+ }
+
+ private class Person {
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Person person = (Person) o;
+ return age == person.age && Objects.equals(name, person.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, age);
+ }
+ }
+}
diff --git a/java-collections-conversions-2/README.md b/core-java-modules/java-collections-conversions-2/README.md
similarity index 100%
rename from java-collections-conversions-2/README.md
rename to core-java-modules/java-collections-conversions-2/README.md
diff --git a/java-collections-conversions-2/pom.xml b/core-java-modules/java-collections-conversions-2/pom.xml
similarity index 90%
rename from java-collections-conversions-2/pom.xml
rename to core-java-modules/java-collections-conversions-2/pom.xml
index 9f8ef7addc..0f8e80fdbf 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/core-java-modules/java-collections-conversions-2/pom.xml
@@ -9,10 +9,9 @@
jar
- com.baeldung
- parent-java
+ com.baeldung.core-java-modules
+ core-java-modules
0.0.1-SNAPSHOT
- ../parent-java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
diff --git a/java-collections-conversions/README.md b/core-java-modules/java-collections-conversions/README.md
similarity index 100%
rename from java-collections-conversions/README.md
rename to core-java-modules/java-collections-conversions/README.md
diff --git a/java-collections-conversions/pom.xml b/core-java-modules/java-collections-conversions/pom.xml
similarity index 89%
rename from java-collections-conversions/pom.xml
rename to core-java-modules/java-collections-conversions/pom.xml
index 7f5ba38e3e..2751e0100a 100644
--- a/java-collections-conversions/pom.xml
+++ b/core-java-modules/java-collections-conversions/pom.xml
@@ -9,10 +9,9 @@
jar
- com.baeldung
- parent-java
+ com.baeldung.core-java-modules
+ core-java-modules
0.0.1-SNAPSHOT
- ../parent-java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
diff --git a/java-collections-conversions/src/main/resources/logback.xml b/core-java-modules/java-collections-conversions/src/main/resources/logback.xml
similarity index 100%
rename from java-collections-conversions/src/main/resources/logback.xml
rename to core-java-modules/java-collections-conversions/src/main/resources/logback.xml
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
diff --git a/java-collections-maps-3/README.md b/core-java-modules/java-collections-maps-3/README.md
similarity index 100%
rename from java-collections-maps-3/README.md
rename to core-java-modules/java-collections-maps-3/README.md
diff --git a/java-collections-maps-3/pom.xml b/core-java-modules/java-collections-maps-3/pom.xml
similarity index 90%
rename from java-collections-maps-3/pom.xml
rename to core-java-modules/java-collections-maps-3/pom.xml
index 729b357b76..db56550d10 100644
--- a/java-collections-maps-3/pom.xml
+++ b/core-java-modules/java-collections-maps-3/pom.xml
@@ -9,10 +9,9 @@
jar
- com.baeldung
- parent-java
+ com.baeldung.core-java-modules
+ core-java-modules
0.0.1-SNAPSHOT
- ../parent-java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 2f684beea0..04b46e3740 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -73,6 +73,7 @@
core-java-lang-2
core-java-lang-3
core-java-lang-4
+ core-java-lang-5
core-java-lang-math
core-java-lang-math-2
core-java-lang-math-3
@@ -117,6 +118,9 @@
core-java-regex
core-java-regex-2
core-java-uuid
+ java-collections-conversions
+ java-collections-conversions-2
+ java-collections-maps-3
pre-jpms
diff --git a/docker/docker-push-to-private-repo/.gitignore b/docker/docker-push-to-private-repo/.gitignore
new file mode 100644
index 0000000000..549e00a2a9
--- /dev/null
+++ b/docker/docker-push-to-private-repo/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/docker/docker-push-to-private-repo/Dockerfile b/docker/docker-push-to-private-repo/Dockerfile
new file mode 100644
index 0000000000..42a13e2a93
--- /dev/null
+++ b/docker/docker-push-to-private-repo/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:11
+ARG JAR_FILE=target/*.jar
+COPY ${JAR_FILE} app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
\ No newline at end of file
diff --git a/docker/docker-push-to-private-repo/README.md b/docker/docker-push-to-private-repo/README.md
new file mode 100644
index 0000000000..e320af31b4
--- /dev/null
+++ b/docker/docker-push-to-private-repo/README.md
@@ -0,0 +1 @@
+### Relevant Articles:
\ No newline at end of file
diff --git a/docker/docker-push-to-private-repo/pom.xml b/docker/docker-push-to-private-repo/pom.xml
new file mode 100644
index 0000000000..59a909ff07
--- /dev/null
+++ b/docker/docker-push-to-private-repo/pom.xml
@@ -0,0 +1,43 @@
+
+
+ 4.0.0
+
+ com.baeldung.docker
+ docker
+ 0.0.1
+
+ push-to-private-repo
+ 0.0.1-SNAPSHOT
+ push-to-private-repo
+ Example application to showcase how to push a docker image to a private repository
+
+ 11
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java
new file mode 100644
index 0000000000..58486c3086
--- /dev/null
+++ b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java
@@ -0,0 +1,12 @@
+package com.baeldung.docker.push;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloWorldController {
+ @GetMapping("/helloworld")
+ String helloWorld() {
+ return "Hello World!";
+ }
+}
\ No newline at end of file
diff --git a/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java
new file mode 100644
index 0000000000..7f516b3158
--- /dev/null
+++ b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.push;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class PushToPrivateRepoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PushToPrivateRepoApplication.class, args);
+ }
+
+}
diff --git a/docker/docker-push-to-private-repo/src/main/resources/application.properties b/docker/docker-push-to-private-repo/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/docker/docker-push-to-private-repo/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/docker/pom.xml b/docker/pom.xml
index 5c6267c6dd..67f9a5b3bd 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -28,6 +28,7 @@
docker-sample-app
docker-caching/single-module-caching
docker-caching/multi-module-caching
+ docker-push-to-private-repo
diff --git a/graphql/graphql-error-handling/README.md b/graphql/graphql-error-handling/README.md
new file mode 100644
index 0000000000..06a2957ac1
--- /dev/null
+++ b/graphql/graphql-error-handling/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Error Handling in GraphQL With Spring Boot](https://www.baeldung.com/spring-graphql-error-handling)
diff --git a/java-numbers-4/README.md b/java-numbers-4/README.md
index 267639a829..c18a5ebe6f 100644
--- a/java-numbers-4/README.md
+++ b/java-numbers-4/README.md
@@ -7,3 +7,4 @@
- [Automorphic Numbers in Java](https://www.baeldung.com/java-automorphic-numbers)
- [Convert Byte Size Into a Human-Readable Format in Java](https://www.baeldung.com/java-human-readable-byte-size)
- [Convert boolean to int in Java](https://www.baeldung.com/java-boolean-to-int)
+- [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value)
diff --git a/json-2/README.md b/json-2/README.md
index ed5a79dd3d..b3e7fb0b94 100644
--- a/json-2/README.md
+++ b/json-2/README.md
@@ -9,4 +9,5 @@ This module contains articles about JSON.
- [Hypermedia Serialization With JSON-LD](https://www.baeldung.com/json-linked-data)
- [Generate a Java Class From JSON](https://www.baeldung.com/java-generate-class-from-json)
- [A Guide to FastJson](https://www.baeldung.com/fastjson)
+- [Check Whether a String is Valid JSON in Java](https://www.baeldung.com/java-validate-json-string)
- More Articles: [[<-- prev]](/json)
diff --git a/maven-modules/maven-parent-pom-resolution/README.md b/maven-modules/maven-parent-pom-resolution/README.md
index b315b2f626..ec4ef41149 100644
--- a/maven-modules/maven-parent-pom-resolution/README.md
+++ b/maven-modules/maven-parent-pom-resolution/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [Understanding Maven’s “relativePath” Tag for a Parent POM](https://www.baeldung.com/maven-relativepath)
+- [How to Disable a Maven Plugin Defined in a Parent POM](https://www.baeldung.com/maven-disable-parent-pom-plugin)
diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml
index f151255948..0142e746a1 100644
--- a/persistence-modules/deltaspike/pom.xml
+++ b/persistence-modules/deltaspike/pom.xml
@@ -278,13 +278,6 @@
-
-
- redhat-repository-techpreview
- https://maven.repository.redhat.com/techpreview/all/
-
-
-
3.7.4
1.8.2
@@ -296,7 +289,7 @@
2.6
1.1.3
- 1.2.5.Final-redhat-1
+ 1.2.4.Final
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml
index 023e5aa30f..dc5f245f22 100644
--- a/persistence-modules/hibernate-annotations/pom.xml
+++ b/persistence-modules/hibernate-annotations/pom.xml
@@ -85,7 +85,7 @@
5.6.7.Final
true
2.1.7.RELEASE
- 1.4.200
+ 2.1.212
9.0.0.M26
2.3.4
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java
index afe2aeac89..65d9f249fa 100644
--- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java
@@ -1,10 +1,5 @@
package com.baeldung.hibernate;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Properties;
-
import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
@@ -12,62 +7,58 @@ import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
-import com.baeldung.hibernate.joincolumn.Email;
-import com.baeldung.hibernate.joincolumn.Office;
-import com.baeldung.hibernate.joincolumn.OfficeAddress;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+import java.util.Properties;
+
+import static java.util.Objects.requireNonNull;
public class HibernateUtil {
- private static String PROPERTY_FILE_NAME;
- public static SessionFactory getSessionFactory() throws IOException {
- return getSessionFactory(null);
+ public static SessionFactory getSessionFactory(String propertyFileName, List> classes) throws IOException {
+ ServiceRegistry serviceRegistry = configureServiceRegistry(propertyFileName);
+ return makeSessionFactory(serviceRegistry, classes);
}
- public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
- PROPERTY_FILE_NAME = propertyFileName;
- ServiceRegistry serviceRegistry = configureServiceRegistry();
- return makeSessionFactory(serviceRegistry);
- }
-
- public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException {
- ServiceRegistry serviceRegistry = configureServiceRegistry(properties);
- return makeSessionFactory(serviceRegistry);
- }
-
- private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
+ private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry, List> classes) {
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ for (Class> clazz: classes) {
+ metadataSources = metadataSources.addAnnotatedClass(clazz);
+ }
- metadataSources.addPackage("com.baeldung.hibernate.pojo");
- metadataSources.addAnnotatedClass(com.baeldung.hibernate.joincolumn.OfficialEmployee.class);
- metadataSources.addAnnotatedClass(Email.class);
- metadataSources.addAnnotatedClass(Office.class);
- metadataSources.addAnnotatedClass(OfficeAddress.class);
-
- Metadata metadata = metadataSources.getMetadataBuilder()
- .build();
-
- return metadata.getSessionFactoryBuilder()
- .build();
+ Metadata metadata = metadataSources
+ .getMetadataBuilder()
+ .build();
+ return metadata.getSessionFactoryBuilder().build();
}
- private static ServiceRegistry configureServiceRegistry() throws IOException {
- return configureServiceRegistry(getProperties());
+ private static ServiceRegistry configureServiceRegistry(String propertyFileName) throws IOException {
+ return configureServiceRegistry(getProperties(propertyFileName));
}
- private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException {
+ private static ServiceRegistry configureServiceRegistry(Properties properties) {
return new StandardServiceRegistryBuilder().applySettings(properties)
.build();
}
- public static Properties getProperties() throws IOException {
+ public static Properties getProperties(String propertyFileName) throws IOException {
Properties properties = new Properties();
- URL propertiesURL = Thread.currentThread()
- .getContextClassLoader()
- .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties"));
- try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
+
+ String file = getResourceURL(propertyFileName).getFile();
+
+ try (FileInputStream inputStream = new FileInputStream(file)) {
properties.load(inputStream);
}
+
return properties;
}
+
+ private static URL getResourceURL(String propertyFileName) {
+ return requireNonNull(Thread.currentThread()
+ .getContextClassLoader()
+ .getResource(StringUtils.defaultString(propertyFileName, "hibernate.properties")));
+ }
}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
index 3ca06e4316..1ffeb0b99d 100644
--- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
@@ -1,6 +1,5 @@
package com.baeldung.hibernate.customtypes;
-import com.baeldung.hibernate.pojo.Phone;
import org.hibernate.annotations.Columns;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
index 6c94d34339..ef82c1c9ad 100644
--- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
@@ -7,45 +7,51 @@ import com.baeldung.hibernate.oneToMany.model.ItemOIO;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
-import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
public class HibernateAnnotationUtil {
- private static final Logger LOGGER = LoggerFactory.getLogger(HibernateAnnotationUtil.class);
+ private static final SessionFactory SESSION_FACTORY = buildSessionFactory();
- private static SessionFactory sessionFactory;
+ /**
+ * Utility class
+ */
+ private HibernateAnnotationUtil() {
+ }
public static SessionFactory getSessionFactory() {
- if (sessionFactory == null) {
- sessionFactory = buildSessionFactory();
- }
- return sessionFactory;
+ return SESSION_FACTORY;
}
private static SessionFactory buildSessionFactory() {
- try {
- ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
- .configure("hibernate-annotation.cfg.xml")
- .build();
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
+ .applySettings(dbSettings())
+ .build();
- Metadata metadata = new MetadataSources(serviceRegistry)
- .addAnnotatedClass(Cart.class)
- .addAnnotatedClass(CartOIO.class)
- .addAnnotatedClass(Item.class)
- .addAnnotatedClass(ItemOIO.class)
- .getMetadataBuilder()
- .applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE)
- .build();
+ Metadata metadata = new MetadataSources(serviceRegistry)
+ .addAnnotatedClass(Cart.class)
+ .addAnnotatedClass(CartOIO.class)
+ .addAnnotatedClass(Item.class)
+ .addAnnotatedClass(ItemOIO.class)
+ .buildMetadata();
- return metadata.getSessionFactoryBuilder().build();
+ return metadata.buildSessionFactory();
+ }
- } catch (Throwable ex) {
- LOGGER.error("Initial SessionFactory creation failed.", ex);
- throw new ExceptionInInitializerError(ex);
- }
+ private static Map dbSettings() {
+ Map dbSettings = new HashMap<>();
+ dbSettings.put(Environment.URL, "jdbc:h2:mem:spring_hibernate_one_to_many");
+ dbSettings.put(Environment.USER, "sa");
+ dbSettings.put(Environment.PASS, "");
+ dbSettings.put(Environment.DRIVER, "org.h2.Driver");
+ dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
+ dbSettings.put(Environment.SHOW_SQL, "true");
+ dbSettings.put(Environment.HBM2DDL_AUTO, "create");
+ return dbSettings;
}
}
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java
index 7fc077eeb2..3029aae640 100644
--- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java
@@ -12,7 +12,7 @@ import javax.persistence.ManyToMany;
import org.hibernate.annotations.WhereJoinTable;
-@Entity
+@Entity(name = "users")
public class User {
@Id
diff --git a/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml b/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml
deleted file mode 100644
index 6e845b3781..0000000000
--- a/persistence-modules/hibernate-annotations/src/main/resources/hibernate-annotation.cfg.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
- org.h2.Driver
- sa
-
- jdbc:h2:mem:spring_hibernate_one_to_many
-
- org.hibernate.dialect.H2Dialect
- thread
- true
- create
-
-
diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java
similarity index 52%
rename from persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java
rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java
index 63dc6330be..460b65ee12 100644
--- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java
+++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java
@@ -1,20 +1,27 @@
package com.baeldung.hibernate.customtypes;
-import com.baeldung.hibernate.HibernateUtil;
import org.hibernate.SessionFactory;
-import org.hibernate.query.Query;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Environment;
+import org.hibernate.service.ServiceRegistry;
import org.junit.Assert;
import org.junit.Test;
-import java.io.IOException;
+import javax.persistence.TypedQuery;
import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.Map;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
-public class HibernateCustomTypesManualTest {
+public class HibernateCustomTypesIntegrationTest {
@Test
- public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() throws IOException {
+ public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() {
final OfficeEmployee e = new OfficeEmployee();
e.setDateOfJoining(LocalDate.now());
@@ -39,13 +46,13 @@ public class HibernateCustomTypesManualTest {
doInHibernate(this::sessionFactory, session -> {
session.save(e);
boolean contains = session.contains(e);
- Assert.assertTrue(contains);
+ assertTrue(contains);
});
}
@Test
- public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() throws IOException {
+ public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() {
final OfficeEmployee e = new OfficeEmployee();
e.setDateOfJoining(LocalDate.now());
@@ -69,22 +76,39 @@ public class HibernateCustomTypesManualTest {
doInHibernate(this::sessionFactory, session -> {
session.save(e);
- Query query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode");
+ TypedQuery query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode", OfficeEmployee.class);
query.setParameter("pinCode",100);
- int size = query.list().size();
+ int size = query.getResultList().size();
- Assert.assertEquals(1, size);
+ assertEquals(1, size);
});
}
private SessionFactory sessionFactory() {
- try {
- return HibernateUtil.getSessionFactory("hibernate-customtypes.properties");
- } catch (IOException e) {
- e.printStackTrace();
- }
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
+ .applySettings(getProperties())
+ .build();
- return null;
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ Metadata metadata = metadataSources
+ .addAnnotatedClass(OfficeEmployee.class)
+ .getMetadataBuilder()
+ .applyBasicType(LocalDateStringType.INSTANCE)
+ .build();
+
+ return metadata.buildSessionFactory();
+ }
+
+ private static Map getProperties() {
+ Map dbSettings = new HashMap<>();
+ dbSettings.put(Environment.URL, "jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1");
+ dbSettings.put(Environment.USER, "sa");
+ dbSettings.put(Environment.PASS, "");
+ dbSettings.put(Environment.DRIVER, "org.h2.Driver");
+ dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
+ dbSettings.put(Environment.SHOW_SQL, "true");
+ dbSettings.put(Environment.HBM2DDL_AUTO, "create");
+ return dbSettings;
}
}
diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java
index 0998ff1d90..37125e8b15 100644
--- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java
+++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java
@@ -1,14 +1,21 @@
package com.baeldung.hibernate.joincolumn;
-import com.baeldung.hibernate.HibernateUtil;
-import java.io.IOException;
+import com.baeldung.hibernate.customtypes.LocalDateStringType;
import org.hibernate.Session;
+import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
-
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import java.util.HashMap;
+import java.util.Map;
public class JoinColumnIntegrationTest {
@@ -16,9 +23,8 @@ public class JoinColumnIntegrationTest {
private Transaction transaction;
@Before
- public void setUp() throws IOException {
- session = HibernateUtil.getSessionFactory("hibernate-spatial.properties")
- .openSession();
+ public void setUp() {
+ session = sessionFactory().openSession();
transaction = session.beginTransaction();
}
@@ -54,4 +60,34 @@ public class JoinColumnIntegrationTest {
session.clear();
}
-}
\ No newline at end of file
+ private SessionFactory sessionFactory() {
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
+ .applySettings(getProperties())
+ .build();
+
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ Metadata metadata = metadataSources
+ .addAnnotatedClass(Email.class)
+ .addAnnotatedClass(Office.class)
+ .addAnnotatedClass(OfficeAddress.class)
+ .addAnnotatedClass(OfficialEmployee.class)
+ .getMetadataBuilder()
+ .applyBasicType(LocalDateStringType.INSTANCE)
+ .build();
+
+ return metadata.buildSessionFactory();
+ }
+
+ private static Map getProperties() {
+ Map dbSettings = new HashMap<>();
+ dbSettings.put(Environment.URL, "jdbc:h2:mem:mydbJoinColumn;DB_CLOSE_DELAY=-1");
+ dbSettings.put(Environment.USER, "sa");
+ dbSettings.put(Environment.PASS, "");
+ dbSettings.put(Environment.DRIVER, "org.h2.Driver");
+ dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
+ dbSettings.put(Environment.SHOW_SQL, "true");
+ dbSettings.put(Environment.HBM2DDL_AUTO, "create");
+ return dbSettings;
+ }
+
+}
diff --git a/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties
deleted file mode 100644
index 1657c838e3..0000000000
--- a/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-hibernate.connection.driver_class=org.h2.Driver
-hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1
-hibernate.connection.username=sa
-hibernate.connection.autocommit=true
-jdbc.password=
-
-hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
-hibernate.show_sql=true
-hibernate.hbm2ddl.auto=create-drop
-
-hibernate.c3p0.min_size=5
-hibernate.c3p0.max_size=20
-hibernate.c3p0.acquire_increment=5
-hibernate.c3p0.timeout=1800
diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java
index 994d3f3800..8771e02e0b 100644
--- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java
+++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java
@@ -3,74 +3,81 @@ package com.baeldung.hibernate.criteria.model;
import java.io.Serializable;
import javax.persistence.Entity;
-@org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "Employee_findByEmployeeId", query = "from Employee where id = :employeeId"),
- @org.hibernate.annotations.NamedQuery(name = "Employee_findAllByEmployeeSalary", query = "from Employee where salary = :employeeSalary")})
-@org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "Employee_FindByEmployeeId", query = "select * from employee emp where employeeId=:employeeId", resultClass = Employee.class)})
+@org.hibernate.annotations.NamedQueries({
+ @org.hibernate.annotations.NamedQuery(name = "Employee_findByEmployeeId", query = "from Employee where id = :employeeId"),
+ @org.hibernate.annotations.NamedQuery(name = "Employee_findAllByEmployeeSalary", query = "from Employee where salary = :employeeSalary")})
+@org.hibernate.annotations.NamedNativeQueries({
+ @org.hibernate.annotations.NamedNativeQuery(name = "Employee_FindByEmployeeId", query = "select * from employee emp where employeeId=:employeeId", resultClass = Employee.class)})
@Entity
public class Employee implements Serializable {
- private static final long serialVersionUID = 1L;
- private Integer id;
- private String name;
- private Long salary;
+ private static final long serialVersionUID = 1L;
+ private Integer id;
+ private String name;
+ private Long salary;
- // constructors
- public Employee() {
- }
+ // constructors
+ public Employee() {
+ }
- public Employee(final Integer id, final String name, final Long salary) {
- super();
- this.id = id;
- this.name = name;
- this.salary = salary;
- }
+ public Employee(final Integer id, final String name, final Long salary) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.salary = salary;
+ }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((id == null) ? 0 : id.hashCode());
- return result;
- }
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
- @Override
- public boolean equals(final Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- final Employee other = (Employee) obj;
- if (id == null) {
- if (other.id != null)
- return false;
- } else if (!id.equals(other.id))
- return false;
- return true;
- }
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final Employee other = (Employee) obj;
+ if (id == null) {
+ if (other.id != null) {
+ return false;
+ }
+ } else if (!id.equals(other.id)) {
+ return false;
+ }
+ return true;
+ }
- public Integer getId() {
- return id;
- }
+ public Integer getId() {
+ return id;
+ }
- public void setId(Integer id) {
- this.id = id;
- }
+ public void setId(Integer id) {
+ this.id = id;
+ }
- public String getName() {
- return name;
- }
+ public String getName() {
+ return name;
+ }
- public void setName(String name) {
- this.name = name;
- }
+ public void setName(String name) {
+ this.name = name;
+ }
- public Long getSalary() {
- return salary;
- }
+ public Long getSalary() {
+ return salary;
+ }
- public void setSalary(Long salary) {
- this.salary = salary;
- }
+ public void setSalary(Long salary) {
+ this.salary = salary;
+ }
}
diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java
index 04e27d2ec1..f8c525611b 100644
--- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java
+++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java
@@ -11,35 +11,34 @@ import org.hibernate.query.Query;
public class EmployeeCriteriaQueries {
- public List getAllEmployees() {
- final Session session = HibernateUtil.getHibernateSession();
- final CriteriaBuilder cb = session.getCriteriaBuilder();
- final CriteriaQuery cr = cb.createQuery(Employee.class);
- final Root root = cr.from(Employee.class);
- cr.select(root);
- Query query = session.createQuery(cr);
- List results = query.getResultList();
- session.close();
- return results;
- }
-
- // To get items having salary more than 50000
- public String[] greaterThanCriteria() {
- final Session session = HibernateUtil.getHibernateSession();
- final CriteriaBuilder cb = session.getCriteriaBuilder();
- final CriteriaQuery cr = cb.createQuery(Employee.class);
- final Root root = cr.from(Employee.class);
- cr.select(root)
- .where(cb.gt(root.get("salary"), 50000));
- Query query = session.createQuery(cr);
- final List greaterThanEmployeeList = query.getResultList();
- final String employeeWithGreaterSalary[] = new String[greaterThanEmployeeList.size()];
- for (int i = 0; i < greaterThanEmployeeList.size(); i++) {
- employeeWithGreaterSalary[i] = greaterThanEmployeeList.get(i)
- .getName();
+ public List getAllEmployees() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final CriteriaBuilder cb = session.getCriteriaBuilder();
+ final CriteriaQuery cr = cb.createQuery(Employee.class);
+ final Root root = cr.from(Employee.class);
+ cr.select(root);
+ Query query = session.createQuery(cr);
+ List results = query.getResultList();
+ session.close();
+ return results;
}
- session.close();
- return employeeWithGreaterSalary;
- }
+ // To get items having salary more than 50000
+ public String[] greaterThanCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final CriteriaBuilder cb = session.getCriteriaBuilder();
+ final CriteriaQuery cr = cb.createQuery(Employee.class);
+ final Root root = cr.from(Employee.class);
+ cr.select(root)
+ .where(cb.gt(root.get("salary"), 50000));
+ Query query = session.createQuery(cr);
+ final List greaterThanEmployeeList = query.getResultList();
+ final String employeeWithGreaterSalary[] = new String[greaterThanEmployeeList.size()];
+ for (int i = 0; i < greaterThanEmployeeList.size(); i++) {
+ employeeWithGreaterSalary[i] = greaterThanEmployeeList.get(i)
+ .getName();
+ }
+ session.close();
+ return employeeWithGreaterSalary;
+ }
}
diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java
index b2ad4240bf..61f54aaea8 100644
--- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java
+++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/EmployeeCriteriaIntegrationTest.java
@@ -11,26 +11,26 @@ import org.junit.Test;
public class EmployeeCriteriaIntegrationTest {
- final private EmployeeCriteriaQueries employeeCriteriaQueries = new EmployeeCriteriaQueries();
+ final private EmployeeCriteriaQueries employeeCriteriaQueries = new EmployeeCriteriaQueries();
- @Test
- public void testGreaterThanCriteriaQuery() {
- final Session session = HibernateUtil.getHibernateSession();
- final List expectedGreaterThanList = session.createQuery("From Employee where salary>50000").list();
- final String expectedGreaterThanEmployees[] = new String[expectedGreaterThanList.size()];
- for (int i = 0; i < expectedGreaterThanList.size(); i++) {
- expectedGreaterThanEmployees[i] = expectedGreaterThanList.get(i).getName();
+ @Test
+ public void testGreaterThanCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List expectedGreaterThanList = session.createQuery("From Employee where salary>50000").list();
+ final String expectedGreaterThanEmployees[] = new String[expectedGreaterThanList.size()];
+ for (int i = 0; i < expectedGreaterThanList.size(); i++) {
+ expectedGreaterThanEmployees[i] = expectedGreaterThanList.get(i).getName();
+ }
+ session.close();
+ assertArrayEquals(expectedGreaterThanEmployees, employeeCriteriaQueries.greaterThanCriteria());
}
- session.close();
- assertArrayEquals(expectedGreaterThanEmployees, employeeCriteriaQueries.greaterThanCriteria());
- }
- @Test
- public void testGetAllEmployeesQuery() {
- final Session session = HibernateUtil.getHibernateSession();
- final List expectedSortCritEmployeeList = session.createQuery("From Employee").list();
- session.close();
- assertArrayEquals(expectedSortCritEmployeeList.toArray(), employeeCriteriaQueries.getAllEmployees().toArray());
- }
+ @Test
+ public void testGetAllEmployeesQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List expectedSortCritEmployeeList = session.createQuery("From Employee").list();
+ session.close();
+ assertArrayEquals(expectedSortCritEmployeeList.toArray(), employeeCriteriaQueries.getAllEmployees().toArray());
+ }
}
diff --git a/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml b/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml
index 90e1c2fefd..0cc1c54680 100644
--- a/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml
+++ b/persistence-modules/hibernate-queries/src/test/resources/com/baeldung/hibernate/criteria/model/Employee.hbm.xml
@@ -1,19 +1,19 @@
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 132a8b6b20..3f4e906348 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -69,7 +69,7 @@
spring-data-dynamodb
spring-data-eclipselink
spring-data-elasticsearch
- spring-data-gemfire
+
spring-data-geode
spring-data-jpa-annotations
spring-data-jpa-crud
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties
index 9de2ee476b..39872e9a00 100644
--- a/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties
+++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties
@@ -23,12 +23,12 @@ spring.datasource.tomcat.minIdle=5
# UCP settings
#Note: These properties require JDBC version 21.0.0.0
-spring.datasource.ucp.connection-factory-class-name=oracle.jdbc.pool.OracleDataSource
-spring.datasource.ucp.sql-for-validate-connection=select * from dual
-spring.datasource.ucp.connection-pool-name=UcpPoolBooks
-spring.datasource.ucp.initial-pool-size=5
-spring.datasource.ucp.min-pool-size=5
-spring.datasource.ucp.max-pool-size=10
+spring.datasource.oracleucp.connection-factory-class-name=oracle.jdbc.pool.OracleDataSource
+spring.datasource.oracleucp.sql-for-validate-connection=select * from dual
+spring.datasource.oracleucp.connection-pool-name=UcpPoolBooks
+spring.datasource.oracleucp.initial-pool-size=5
+spring.datasource.oracleucp.min-pool-size=5
+spring.datasource.oracleucp.max-pool-size=10
# JPA settings
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java
index cf418b2cf4..aa448bc44a 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java
@@ -26,4 +26,5 @@ public class SpringOraclePoolingApplicationOracleUCPLiveTest {
assertTrue(dataSource instanceof oracle.ucp.jdbc.UCPDataSource);
}
+
}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/README.md b/persistence-modules/spring-boot-persistence-mongodb/README.md
index 6659e82677..91dd8718e1 100644
--- a/persistence-modules/spring-boot-persistence-mongodb/README.md
+++ b/persistence-modules/spring-boot-persistence-mongodb/README.md
@@ -8,4 +8,3 @@
- [A Guide to @DBRef in MongoDB](https://www.baeldung.com/spring-mongodb-dbref-annotation)
- [Import Data to MongoDB From JSON File Using Java](https://www.baeldung.com/java-import-json-mongodb)
- [Logging MongoDB Queries with Spring Boot](https://www.baeldung.com/spring-boot-mongodb-logging)
-- [Return Only Specific Fields for a Query in Spring Data MongoDB](https://www.baeldung.com/mongodb-return-specific-fields)
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java
index 214cb09e57..a511686f1b 100644
--- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/entity/Employee.java
@@ -7,12 +7,12 @@ import javax.persistence.Id;
@Entity
public class Employee {
- @Id
- @GeneratedValue
- private Integer id;
+ @Id
+ @GeneratedValue
+ private Integer id;
- private String name;
+ private String name;
- private Long salary;
+ private Long salary;
}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java
index 652b7b93d2..85d1a1b324 100644
--- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/repository/EmployeeRepository.java
@@ -9,29 +9,32 @@ import org.springframework.data.repository.query.Param;
public interface EmployeeRepository extends JpaRepository {
- @Query(value = "SELECT e FROM Employee e")
- List findAllEmployees(Sort sort);
+ @Query(value = "SELECT e FROM Employee e")
+ List findAllEmployees(Sort sort);
- @Query("SELECT e FROM Employee e WHERE e.salary = ?1")
- Employee findAllEmployeesWithSalary(Long salary);
+ @Query("SELECT e FROM Employee e WHERE e.salary = ?1")
+ Employee findAllEmployeesWithSalary(Long salary);
- @Query("SELECT e FROM Employee e WHERE e.name = ?1 and e.salary = ?2")
- Employee findUserByNameAndSalary(String name, Long salary);
+ @Query("SELECT e FROM Employee e WHERE e.name = ?1 and e.salary = ?2")
+ Employee findUserByNameAndSalary(String name, Long salary);
- @Query(
- value = "SELECT * FROM Employee e WHERE e.salary = ?1",
- nativeQuery = true)
- Employee findUserBySalaryNative(Long salary);
+ @Query(
+ value = "SELECT * FROM Employee e WHERE e.salary = ?1",
+ nativeQuery = true
+ )
+ Employee findUserBySalaryNative(Long salary);
- @Query("SELECT e FROM Employee e WHERE e.name = :name and e.salary = :salary")
- Employee findUserByEmployeeNameAndSalaryNamedParameters(
- @Param("name") String employeeName,
- @Param("salary") Long employeeSalary);
+ @Query("SELECT e FROM Employee e WHERE e.name = :name and e.salary = :salary")
+ Employee findUserByEmployeeNameAndSalaryNamedParameters(
+ @Param("name") String employeeName,
+ @Param("salary") Long employeeSalary);
- @Query(value = "SELECT * FROM Employee e WHERE e.name = :name and e.salary = :salary",
- nativeQuery = true)
- Employee findUserByNameAndSalaryNamedParamsNative(
- @Param("name") String employeeName,
- @Param("salary") Long employeeSalary);
+ @Query(
+ value = "SELECT * FROM Employee e WHERE e.name = :name and e.salary = :salary",
+ nativeQuery = true
+ )
+ Employee findUserByNameAndSalaryNamedParamsNative(
+ @Param("name") String employeeName,
+ @Param("salary") Long employeeSalary);
}
diff --git a/persistence-modules/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md
index acc978c68e..7dd0a82def 100644
--- a/persistence-modules/spring-data-mongodb/README.md
+++ b/persistence-modules/spring-data-mongodb/README.md
@@ -11,6 +11,7 @@
- [Spring Data MongoDB: Projections and Aggregations](http://www.baeldung.com/spring-data-mongodb-projections-aggregations)
- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
- [Spring Data MongoDB Transactions](https://www.baeldung.com/spring-data-mongodb-transactions)
+- [Return Only Specific Fields for a Query in Spring Data MongoDB](https://www.baeldung.com/mongodb-return-specific-fields)
## Spring Data MongoDB Live Testing
diff --git a/pom.xml b/pom.xml
index 9670e57612..f06c75b3be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -431,9 +431,6 @@
jackson-simple
java-blockchain
- java-collections-conversions
- java-collections-conversions-2
- java-collections-maps-3
javafx
@@ -905,9 +902,6 @@
jackson-simple
java-blockchain
- java-collections-conversions
- java-collections-conversions-2
- java-collections-maps-3
javafx
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 003a52db13..dd81072ad1 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -44,7 +44,7 @@
spring-boot-groovy
spring-boot-jasypt
-
+ spring-boot-keycloak
spring-boot-libraries
spring-boot-libraries-2
spring-boot-libraries-comparison
diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md
index e7d39a78e9..9ff2b2caf8 100644
--- a/spring-boot-modules/spring-boot-data-2/README.md
+++ b/spring-boot-modules/spring-boot-data-2/README.md
@@ -5,6 +5,6 @@
- [“HttpMessageNotWritableException: No converter found for return value of type”](https://www.baeldung.com/spring-no-converter-found)
- [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository)
- [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit)
-- [BootstrapMode for JPA Repositories](https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-data-2)
+- [BootstrapMode for JPA Repositories](https://www.baeldung.com/jpa-bootstrap-mode)
- [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation)
diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml
index 09ddcaa724..9e39176765 100644
--- a/spring-boot-modules/spring-boot-keycloak/pom.xml
+++ b/spring-boot-modules/spring-boot-keycloak/pom.xml
@@ -89,7 +89,7 @@
org.codehaus.mojo
jaxb2-maven-plugin
- 2.5.0
+ 2.3.1
xjc
diff --git a/spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json b/spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json
new file mode 100644
index 0000000000..8245152bdd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/test/resources/GraphQL collection.postman_collection.json
@@ -0,0 +1,169 @@
+{
+ "info": {
+ "_postman_id": "910d9690-f629-4491-bbbd-adb30982a386",
+ "name": "GraphQL collection",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "mutations",
+ "item": [
+ {
+ "name": "writePost",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "graphql",
+ "graphql": {
+ "query": "mutation writePost ($title: String!, $text: String!, $category: String) {\n writePost (title: $title, text: $text, category: $category) {\n id\n title\n text\n category\n }\n}",
+ "variables": "{\n \"title\": \"\",\n \"text\": \"\",\n \"category\": \"\"\n}"
+ },
+ "options": {
+ "graphql": {}
+ }
+ },
+ "url": {
+ "raw": "http://localhost:9090/springbootapp/graphql",
+ "protocol": "http",
+ "host": [
+ "localhost"
+ ],
+ "port": "9090",
+ "path": [
+ "springbootapp",
+ "graphql"
+ ]
+ }
+ },
+ "response": []
+ }
+ ],
+ "protocolProfileBehavior": {}
+ },
+ {
+ "name": "queries",
+ "item": [
+ {
+ "name": "get recent posts",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "graphql",
+ "graphql": {
+ "query": "{\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n text\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}",
+ "variables": ""
+ }
+ },
+ "url": {
+ "raw": "http://localhost:9090/springbootapp/graphql",
+ "protocol": "http",
+ "host": [
+ "localhost"
+ ],
+ "port": "9090",
+ "path": [
+ "springbootapp",
+ "graphql"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "recentPosts - variables",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "graphql",
+ "graphql": {
+ "query": "query recentPosts ($count: Int, $offset: Int) {\n recentPosts (count: $count, offset: $offset) {\n id\n title\n text\n category\n }\n}",
+ "variables": "{\n \"count\": 1,\n \"offset\": 0\n}"
+ },
+ "options": {
+ "graphql": {}
+ }
+ },
+ "url": {
+ "raw": "http://localhost:9090/springbootapp/graphql",
+ "protocol": "http",
+ "host": [
+ "localhost"
+ ],
+ "port": "9090",
+ "path": [
+ "springbootapp",
+ "graphql"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "get recent posts - raw",
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/graphql",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "query {\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}"
+ },
+ "url": {
+ "raw": "http://localhost:9090/springbootapp/graphql",
+ "protocol": "http",
+ "host": [
+ "localhost"
+ ],
+ "port": "9090",
+ "path": [
+ "springbootapp",
+ "graphql"
+ ]
+ }
+ },
+ "response": []
+ }
+ ],
+ "protocolProfileBehavior": {}
+ }
+ ],
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "id": "b54f267b-c450-4f2d-8105-2f23bab4c922",
+ "type": "text/javascript",
+ "exec": [
+ ""
+ ]
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "id": "00b575be-03d4-4b29-b137-733ead139638",
+ "type": "text/javascript",
+ "exec": [
+ ""
+ ]
+ }
+ }
+ ],
+ "variable": [
+ {
+ "id": "20a274e5-6d51-40d6-81cb-af9eb115b21b",
+ "key": "url",
+ "value": "",
+ "type": "string"
+ }
+ ],
+ "protocolProfileBehavior": {}
+}
diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json
new file mode 100644
index 0000000000..1cce92b7dc
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/Student_API_Collection.postman_collection.json
@@ -0,0 +1,101 @@
+{
+ "info": {
+ "_postman_id": "2dd2d46e-cb0a-4fcd-a1a3-461930df0c38",
+ "name": "Student API Collection",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "http://localhost:8080/students/",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "protocolProfileBehavior": {
+ "disabledSystemHeaders": {}
+ },
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "image/*",
+ "type": "text",
+ "disabled": true
+ },
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "type": "text",
+ "disabled": true
+ }
+ ],
+ "url": {
+ "raw": "http://localhost:8080/students/",
+ "protocol": "http",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "students",
+ ""
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "http://localhost:8080/students/2",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "http://localhost:8080/students/3",
+ "protocol": "http",
+ "host": [
+ "localhost"
+ ],
+ "port": "8080",
+ "path": [
+ "students",
+ "3"
+ ]
+ }
+ },
+ "response": []
+ }
+ ],
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "type": "text/javascript",
+ "exec": [
+ "pm.request.headers.add({ ",
+ " key: \"Accept\",",
+ " value: \"application/json\" ",
+ "});",
+ ""
+ ]
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "type": "text/javascript",
+ "exec": [
+ ""
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md
index d215525ab5..a7a341deee 100644
--- a/spring-boot-modules/spring-boot-mvc-4/README.md
+++ b/spring-boot-modules/spring-boot-mvc-4/README.md
@@ -9,3 +9,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects.
- [Configure a Spring Boot Web Application](https://www.baeldung.com/spring-boot-application-configuration)
- [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer)
- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring)
+- [Hide a Request Field in Swagger API](https://www.baeldung.com/spring-swagger-hide-field)
diff --git a/spring-boot-modules/spring-boot-mvc/README.md b/spring-boot-modules/spring-boot-mvc/README.md
index cdb2bd0fce..fdd7c70af2 100644
--- a/spring-boot-modules/spring-boot-mvc/README.md
+++ b/spring-boot-modules/spring-boot-mvc/README.md
@@ -7,7 +7,7 @@ This module contains articles about Spring Web MVC in Spring Boot projects.
- [Custom Validation MessageSource in Spring Boot](https://www.baeldung.com/spring-custom-validation-message-source)
- [Display RSS Feed with Spring MVC](https://www.baeldung.com/spring-mvc-rss-feed)
- [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao)
-- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
+- [Setting Up Swagger 2 with a Spring REST API Using Springfox](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
- [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity)
- [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan)
- [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization)
diff --git a/spring-boot-modules/spring-boot-springdoc/README.md b/spring-boot-modules/spring-boot-springdoc/README.md
index 4ac4147da6..5daca79bd2 100644
--- a/spring-boot-modules/spring-boot-springdoc/README.md
+++ b/spring-boot-modules/spring-boot-springdoc/README.md
@@ -4,3 +4,4 @@
- [Spring REST Docs vs OpenAPI](https://www.baeldung.com/spring-rest-docs-vs-openapi)
- [Hiding Endpoints From Swagger Documentation in Spring Boot](https://www.baeldung.com/spring-swagger-hiding-endpoints)
- [Swagger @Api Description Is Deprecated](https://www.baeldung.com/java-swagger-api-description-deprecated)
+- [Set List of Objects in Swagger API Response](https://www.baeldung.com/java-swagger-set-list-response)
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md
deleted file mode 100644
index a7ff3285ee..0000000000
--- a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/swaggerresponseapi/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Set List of Objects in Swagger API Response](https://www.baeldung.com/java-swagger-set-list-response)
diff --git a/spring-security-modules/spring-security-web-rest/README.md b/spring-security-modules/spring-security-web-rest/README.md
index fd1f86f6b8..5a94504762 100644
--- a/spring-security-modules/spring-security-web-rest/README.md
+++ b/spring-security-modules/spring-security-web-rest/README.md
@@ -9,7 +9,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com
### Relevant Articles:
-- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
+- [Setting Up Swagger 2 with a Spring REST API Using Springfox](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
- [Custom Error Message Handling for REST API](https://www.baeldung.com/global-error-handler-in-a-spring-rest-api)
- [Spring Security Context Propagation with @Async](https://www.baeldung.com/spring-security-async-principal-propagation)
- [Servlet 3 Async Support with Spring MVC and Spring Security](https://www.baeldung.com/spring-mvc-async-security)
diff --git a/testing-modules/junit5-migration/pom.xml b/testing-modules/junit5-migration/pom.xml
index 3ea035c4f9..3720c1dc4a 100644
--- a/testing-modules/junit5-migration/pom.xml
+++ b/testing-modules/junit5-migration/pom.xml
@@ -22,7 +22,7 @@
org.junit.platform
- junit-platform-runner
+ junit-platform-suite
${junit-platform.version}
test
diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java
index 16de0be9d8..52d8f8f60a 100644
--- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java
+++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java
@@ -1,17 +1,14 @@
package com.baeldung.junit5;
+import java.time.Duration;
+
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
-import org.junit.platform.runner.JUnitPlatform;
-import org.junit.runner.RunWith;
-
-import java.time.Duration;
@Tag("annotations")
@Tag("junit5")
-@RunWith(JUnitPlatform.class)
public class AnnotationTestExampleUnitTest {
@Test
public void shouldRaiseAnException() throws Exception {
diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java
index 297d0f1730..df509f561a 100644
--- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java
+++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java
@@ -2,10 +2,7 @@ package com.baeldung.junit5;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
-import org.junit.platform.runner.JUnitPlatform;
-import org.junit.runner.RunWith;
-@RunWith(JUnitPlatform.class)
@ExtendWith(TraceUnitExtension.class)
public class RuleExampleUnitTest {
diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java
index 7b4bd746bf..f307a75274 100644
--- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java
+++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java
@@ -1,10 +1,9 @@
package com.baeldung.junit5vstestng;
-import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectClasses;
-import org.junit.runner.RunWith;
+import org.junit.platform.suite.api.Suite;
-@RunWith(JUnitPlatform.class)
+@Suite
@SelectClasses({Class1UnitTest.class, Class2UnitTest.class})
public class SelectClassesSuiteUnitTest {
diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java
index 7378eafaa7..ef8756a2bb 100644
--- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java
+++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java
@@ -1,10 +1,9 @@
package com.baeldung.junit5vstestng;
-import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
-import org.junit.runner.RunWith;
+import org.junit.platform.suite.api.Suite;
-@RunWith(JUnitPlatform.class)
+@Suite
@SelectPackages({ "com.baeldung.java.suite.childpackage1", "com.baeldung.java.suite.childpackage2" })
public class SelectPackagesSuiteUnitTest {