diff --git a/akka-modules/akka-actors/README.md b/akka-modules/akka-actors/README.md
new file mode 100644
index 0000000000..20611aee6a
--- /dev/null
+++ b/akka-modules/akka-actors/README.md
@@ -0,0 +1,7 @@
+## Akka HTTP
+
+This module contains articles about Akka actors.
+
+### Relevant articles:
+
+- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
diff --git a/akka-modules/akka-actors/pom.xml b/akka-modules/akka-actors/pom.xml
new file mode 100644
index 0000000000..f354b13bd9
--- /dev/null
+++ b/akka-modules/akka-actors/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+ akka-actors
+ akka-actors
+
+
+ com.baeldung
+ akka-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.typesafe.akka
+ akka-actor_${scala.version}
+ ${typesafe-akka.version}
+
+
+ com.typesafe.akka
+ akka-testkit_${scala.version}
+ ${typesafe-akka.version}
+ test
+
+
+
+
+ 2.5.11
+
+
+
\ No newline at end of file
diff --git a/libraries-5/src/main/java/com/baeldung/akka/FirstActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/FirstActor.java
similarity index 95%
rename from libraries-5/src/main/java/com/baeldung/akka/FirstActor.java
rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/FirstActor.java
index 9680429fb1..1d166604ee 100644
--- a/libraries-5/src/main/java/com/baeldung/akka/FirstActor.java
+++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/FirstActor.java
@@ -1,4 +1,4 @@
-package com.baeldung.akka;
+package com.baeldung.akkaactors;
import akka.actor.AbstractActor;
import akka.actor.Props;
diff --git a/libraries-5/src/main/java/com/baeldung/akka/MyActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/MyActor.java
similarity index 95%
rename from libraries-5/src/main/java/com/baeldung/akka/MyActor.java
rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/MyActor.java
index 99ee3158b6..2149242c19 100644
--- a/libraries-5/src/main/java/com/baeldung/akka/MyActor.java
+++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/MyActor.java
@@ -1,4 +1,4 @@
-package com.baeldung.akka;
+package com.baeldung.akkaactors;
import akka.actor.AbstractActor;
import akka.event.Logging;
diff --git a/libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/PrinterActor.java
similarity index 97%
rename from libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java
rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/PrinterActor.java
index 55b6e4e0f4..85a4fcc7ad 100644
--- a/libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java
+++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/PrinterActor.java
@@ -1,4 +1,4 @@
-package com.baeldung.akka;
+package com.baeldung.akkaactors;
import akka.actor.AbstractActor;
import akka.actor.Props;
diff --git a/libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/ReadingActor.java
similarity index 98%
rename from libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java
rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/ReadingActor.java
index f1a21c8e28..bc68754364 100644
--- a/libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java
+++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/ReadingActor.java
@@ -1,4 +1,4 @@
-package com.baeldung.akka;
+package com.baeldung.akkaactors;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
diff --git a/libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/WordCounterActor.java
similarity index 97%
rename from libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java
rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/WordCounterActor.java
index 3e23683971..07eb6f4aa2 100644
--- a/libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java
+++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/WordCounterActor.java
@@ -1,4 +1,4 @@
-package com.baeldung.akka;
+package com.baeldung.akkaactors;
import akka.actor.AbstractActor;
import akka.event.Logging;
diff --git a/libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java b/akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors/AkkaActorsUnitTest.java
similarity index 99%
rename from libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
rename to akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors/AkkaActorsUnitTest.java
index adaff86565..362aef4600 100644
--- a/libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
+++ b/akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors/AkkaActorsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.akka;
+package com.baeldung.akkaactors;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
diff --git a/akka-modules/pom.xml b/akka-modules/pom.xml
index 3a9d5e41ff..60432c4eea 100644
--- a/akka-modules/pom.xml
+++ b/akka-modules/pom.xml
@@ -14,6 +14,7 @@
+ akka-actors
akka-http
akka-streams
spring-akka
diff --git a/apache-httpclient/pom.xml b/apache-httpclient/pom.xml
index 3b178d4df8..f671c93cfc 100644
--- a/apache-httpclient/pom.xml
+++ b/apache-httpclient/pom.xml
@@ -63,11 +63,6 @@
${wiremock.version}
test
-
- org.apache.httpcomponents
- httpclient
- ${httpclient.version}
-
@@ -84,10 +79,9 @@
5.6.1
3.3.1
- 5.2
- 5.2
- 5.2
- 4.5.14
+ 5.2.2
+ 5.2.2
+ 5.2.2
diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java
index 50cf1b7a64..7b818f871a 100644
--- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java
+++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java
@@ -25,6 +25,7 @@ import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBu
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
+import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
@@ -33,7 +34,6 @@ import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.hc.core5.reactor.IOReactorConfig;
import org.apache.hc.core5.ssl.SSLContexts;
import org.apache.hc.core5.ssl.TrustStrategy;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.junit.jupiter.api.Test;
@@ -120,7 +120,7 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer {
.build();
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
- .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
+ .setHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setSslContext(sslContext)
.build();
diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml
index d1f74e8aae..68d547d489 100644
--- a/apache-kafka-2/pom.xml
+++ b/apache-kafka-2/pom.xml
@@ -55,15 +55,15 @@
com.fasterxml.jackson.core
jackson-databind
- ${jackson.databind.version}
+ ${jackson.databind.version}
5.7.0
- 2.8.0
- 1.15.3
- 1.15.3
+ 3.6.1
+ 1.19.3
+ 1.19.3
2.15.2
diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java
new file mode 100644
index 0000000000..f4cefb21eb
--- /dev/null
+++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java
@@ -0,0 +1,56 @@
+package com.baeldung.kafka.consumer;
+
+import java.io.Closeable;
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.logging.Logger;
+
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.common.serialization.StringDeserializer;
+
+public class CustomKafkaListener implements Runnable {
+ private static final Logger log = Logger.getLogger(CustomKafkaListener.class.getName());
+ private final String topic;
+ private final KafkaConsumer consumer;
+ private Consumer recordConsumer;
+
+
+ public CustomKafkaListener(String topic, KafkaConsumer consumer) {
+ this.topic = topic;
+ this.consumer = consumer;
+ this.recordConsumer = record -> log.info("received: " + record);
+ }
+
+ public CustomKafkaListener(String topic, String bootstrapServers) {
+ this(topic, defaultKafkaConsumer(bootstrapServers));
+ }
+
+ private static KafkaConsumer defaultKafkaConsumer(String boostrapServers) {
+ Properties props = new Properties();
+ props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, boostrapServers);
+ props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "test_group_id");
+ props.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
+ props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
+ props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
+ return new KafkaConsumer<>(props);
+ }
+
+ public CustomKafkaListener onEach(Consumer newConsumer) {
+ recordConsumer = recordConsumer.andThen(newConsumer);
+ return this;
+ }
+
+ @Override
+ public void run() {
+ consumer.subscribe(Arrays.asList(topic));
+ while (true) {
+ consumer.poll(Duration.ofMillis(100))
+ .forEach(record -> recordConsumer.accept(record.value()));
+ }
+ }
+
+}
diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java
new file mode 100644
index 0000000000..201a72114d
--- /dev/null
+++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.kafka.consumer;
+
+import static java.time.Duration.ofMillis;
+import static java.time.Duration.ofSeconds;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testcontainers.shaded.org.awaitility.Awaitility.await;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.apache.kafka.common.serialization.StringSerializer;
+import org.junit.jupiter.api.Test;
+import org.testcontainers.containers.KafkaContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
+import org.testcontainers.utility.DockerImageName;
+
+@Testcontainers
+class CustomKafkaListenerLiveTest {
+
+ @Container
+ private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest"));
+
+ static {
+ Awaitility.setDefaultTimeout(ofSeconds(5L));
+ Awaitility.setDefaultPollInterval(ofMillis(50L));
+ }
+
+ @Test
+ void givenANewCustomKafkaListener_thenConsumesAllMessages() {
+ // given
+ String topic = "baeldung.articles.published";
+ String bootstrapServers = KAFKA_CONTAINER.getBootstrapServers();
+ List consumedMessages = new ArrayList<>();
+
+ // when
+ CustomKafkaListener listener = new CustomKafkaListener(topic, bootstrapServers).onEach(consumedMessages::add);
+ CompletableFuture.runAsync(listener);
+
+ // and
+ publishArticles(topic,
+ "Introduction to Kafka",
+ "Kotlin for Java Developers",
+ "Reactive Spring Boot",
+ "Deploying Spring Boot Applications",
+ "Spring Security"
+ );
+
+ // then
+ await().untilAsserted(() ->
+ assertThat(consumedMessages).containsExactlyInAnyOrder(
+ "Introduction to Kafka",
+ "Kotlin for Java Developers",
+ "Reactive Spring Boot",
+ "Deploying Spring Boot Applications",
+ "Spring Security"
+ ));
+ }
+
+ private void publishArticles(String topic, String... articles) {
+ try (KafkaProducer producer = testKafkaProducer()) {
+ Arrays.stream(articles)
+ .map(article -> new ProducerRecord<>(topic, "key-1", article))
+ .forEach(producer::send);
+ }
+ }
+
+ private static KafkaProducer testKafkaProducer() {
+ Properties props = new Properties();
+ props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers());
+ props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
+ props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
+ return new KafkaProducer<>(props);
+ }
+}
\ No newline at end of file
diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml
index 494bc94961..6aa5fb894a 100644
--- a/apache-kafka/pom.xml
+++ b/apache-kafka/pom.xml
@@ -181,8 +181,9 @@
+ 2.13.4
3.4.0
- 1.15.3
+ 1.19.3
1.15.3
1.16.1
3.0.0
diff --git a/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java b/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java
similarity index 99%
rename from apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java
rename to apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java
index f46fffbb59..046a9bb9ec 100644
--- a/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java
+++ b/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java
@@ -29,7 +29,7 @@ import java.util.List;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
-public class BackupCreatorIntegrationTest {
+public class BackupCreatorUnitTest {
public static ObjectMapper mapper;
@Before
diff --git a/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java b/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java
similarity index 95%
rename from apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java
rename to apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java
index 8a98dae4b5..c521cfa62e 100644
--- a/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java
+++ b/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java
@@ -10,7 +10,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
-public class WordCapitalizerIntegrationTest {
+public class WordCapitalizerUnitTest {
@Test
public void givenDataSet_whenExecuteWordCapitalizer_thenReturnCapitalizedWords() throws Exception {
diff --git a/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
index 3b559b619e..c733a4a1f4 100644
--- a/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
+++ b/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
@@ -21,8 +21,7 @@ import org.junit.Ignore;
import org.junit.Test;
public class KafkaStreamsLiveTest {
- private String bootstrapServers = "localhost:9092";
- private Path stateDirectory;
+ private final String bootstrapServers = "localhost:9092";
@Test
@Ignore("it needs to have kafka broker running on local")
@@ -44,8 +43,8 @@ public class KafkaStreamsLiveTest {
// Use a temporary directory for storing state, which will be automatically removed after the test.
try {
- this.stateDirectory = Files.createTempDirectory("kafka-streams");
- streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, this.stateDirectory.toAbsolutePath()
+ Path stateDirectory = Files.createTempDirectory("kafka-streams");
+ streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, stateDirectory.toAbsolutePath()
.toString());
} catch (final IOException e) {
throw new UncheckedIOException("Cannot create temporary directory", e);
diff --git a/asm/README.md b/asm/README.md
deleted file mode 100644
index e10cdc45bd..0000000000
--- a/asm/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## ASM
-
-This module contains articles about ASM
-
-### Relevant Articles:
-
-- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm)
diff --git a/asm/pom.xml b/asm/pom.xml
deleted file mode 100644
index 4edfe86ae5..0000000000
--- a/asm/pom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
- 4.0.0
- com.baeldung.examples
- asm
- 1.0
- asm
- jar
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
-
-
- org.ow2.asm
- asm
- ${asm.version}
-
-
- org.ow2.asm
- asm-util
- ${asm.version}
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- ${maven-jar-plugin.version}
-
-
-
-
- com.baeldung.examples.asm.instrumentation.Premain
-
-
-
-
-
-
-
-
-
- 5.2
-
-
-
\ No newline at end of file
diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml
index adce036733..199b9a187e 100644
--- a/aws-modules/aws-dynamodb/pom.xml
+++ b/aws-modules/aws-dynamodb/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
aws-dynamodb
0.1.0-SNAPSHOT
@@ -40,22 +40,6 @@
-
- org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
-
- false
-
-
-
- package
-
- shade
-
-
-
-
org.apache.maven.plugins
maven-dependency-plugin
diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml
index b6326b6eb1..f04e84e14f 100644
--- a/aws-modules/aws-miscellaneous/pom.xml
+++ b/aws-modules/aws-miscellaneous/pom.xml
@@ -34,22 +34,6 @@
-
- org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
-
- false
-
-
-
- package
-
- shade
-
-
-
-
org.apache.maven.plugins
maven-dependency-plugin
diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml
index e6b50cadb2..965ce8fdcf 100644
--- a/aws-modules/aws-reactive/pom.xml
+++ b/aws-modules/aws-reactive/pom.xml
@@ -63,6 +63,7 @@
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -94,6 +95,7 @@
2.2.1.RELEASE
2.17.283
1.18.20
+ 3.6.0
\ No newline at end of file
diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml
index e2bc04964a..9ba436b43f 100644
--- a/aws-modules/aws-s3/pom.xml
+++ b/aws-modules/aws-s3/pom.xml
@@ -39,27 +39,6 @@
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
-
- false
-
-
-
- package
-
- shade
-
-
-
-
-
-
-
2.20.52
1.10.L001
diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml
index 06cea2f260..ce27a4f2e0 100644
--- a/aws-modules/pom.xml
+++ b/aws-modules/pom.xml
@@ -5,6 +5,13 @@
4.0.0
aws-modules
aws-modules
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
com.amazonaws
@@ -15,12 +22,6 @@
pom
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
aws-app-sync
aws-dynamodb
diff --git a/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml b/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml
index 975ad6f689..256b5e88ab 100644
--- a/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml
+++ b/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml
@@ -167,7 +167,6 @@
UTF-8
3.9
- 1.8
1.2.3
diff --git a/core-groovy-modules/core-groovy-2/pom.xml b/core-groovy-modules/core-groovy-2/pom.xml
index de750daf0f..cc1d860ad1 100644
--- a/core-groovy-modules/core-groovy-2/pom.xml
+++ b/core-groovy-modules/core-groovy-2/pom.xml
@@ -13,6 +13,13 @@
1.0.0-SNAPSHOT
+
+
+ groovy-plugins-release
+ https://groovy.jfrog.io/artifactory/plugins-release-local
+
+
+
org.apache.commons
@@ -156,8 +163,8 @@
1.1.3
3.4.2
3.8.1
- 3.7.0
- 3.0.8-01
+ 3.9.0
+ 3.0.9-03
diff --git a/core-java-modules/core-java-11-3/pom.xml b/core-java-modules/core-java-11-3/pom.xml
index 22db9e62ab..0161f4dcca 100644
--- a/core-java-modules/core-java-11-3/pom.xml
+++ b/core-java-modules/core-java-11-3/pom.xml
@@ -45,7 +45,7 @@
11
11
- 2.14.1
+ 2.16.0
2.10
diff --git a/core-java-modules/core-java-12/pom.xml b/core-java-modules/core-java-12/pom.xml
index 8165549d8c..ae61bdfad0 100644
--- a/core-java-modules/core-java-12/pom.xml
+++ b/core-java-modules/core-java-12/pom.xml
@@ -21,8 +21,4 @@
-
- 17
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml
index 52cf227583..b8ec8cfdb9 100644
--- a/core-java-modules/core-java-13/pom.xml
+++ b/core-java-modules/core-java-13/pom.xml
@@ -13,8 +13,4 @@
0.0.1-SNAPSHOT
-
- 17
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-15/pom.xml b/core-java-modules/core-java-15/pom.xml
index 3996c69fa4..e6193b4ea3 100644
--- a/core-java-modules/core-java-15/pom.xml
+++ b/core-java-modules/core-java-15/pom.xml
@@ -26,8 +26,4 @@
-
- 17
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-20/README.md b/core-java-modules/core-java-20/README.md
index f859bf9e23..994fbccdbd 100644
--- a/core-java-modules/core-java-20/README.md
+++ b/core-java-modules/core-java-20/README.md
@@ -1,3 +1,4 @@
## Relevant Articles
- [Scoped Values in Java 20](https://www.baeldung.com/java-20-scoped-values)
- [How to Read Zip Files Entries With Java](https://www.baeldung.com/java-read-zip-files)
+- [Deserializing JSON to Java Record using Gson](https://www.baeldung.com/java-json-deserialize-record-gson)
diff --git a/core-java-modules/core-java-20/pom.xml b/core-java-modules/core-java-20/pom.xml
index ad0a956b80..68c6ca4c93 100644
--- a/core-java-modules/core-java-20/pom.xml
+++ b/core-java-modules/core-java-20/pom.xml
@@ -3,19 +3,34 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ core-java-20
+
com.baeldung.core-java-modules
core-java-modules
0.0.1-SNAPSHOT
- core-java-20
-
-
- 20
- 20
- UTF-8
-
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+ 6.0.0
+ provided
+
+
+ org.assertj
+ assertj-core
+ 3.24.2
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ 5.2.0
+ test
+
+
@@ -41,25 +56,10 @@
-
-
- jakarta.servlet
- jakarta.servlet-api
- 6.0.0
- provided
-
-
- org.assertj
- assertj-core
- 3.24.2
- test
-
-
- org.mockito
- mockito-junit-jupiter
- 5.2.0
- test
-
-
+
+ 20
+ 20
+ UTF-8
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java
new file mode 100644
index 0000000000..80df1393af
--- /dev/null
+++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java
@@ -0,0 +1,5 @@
+package com.baeldung.deserialization;
+
+public record Contact(String email, String phone) {
+ // Constructor, getters, and other methods are automatically generated
+}
diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java
new file mode 100644
index 0000000000..38e3882668
--- /dev/null
+++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java
@@ -0,0 +1,5 @@
+package com.baeldung.deserialization;
+
+public record Person(String name, int age, String address, Contact contact) {
+ // Constructor, getters, and other methods are automatically generated
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
new file mode 100644
index 0000000000..1256505e0d
--- /dev/null
+++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.deserialization;
+
+import com.google.gson.Gson;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class DeserializationUnitTest {
+
+ @Test
+ public void givenJsonString_whenDeserialized_thenPersonRecordCreated() {
+ String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\"}";
+
+ Person person = new Gson().fromJson(json, Person.class);
+
+ assertEquals("John Doe", person.name());
+ assertEquals(30, person.age());
+ assertEquals("123 Main St", person.address());
+ }
+
+ @Test
+ public void givenNestedJsonString_whenDeserialized_thenPersonRecordCreated() {
+ String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\",\"contact\":{\"email\":\"john.doe@example.com\",\"phone\":\"555-1234\"}}";
+
+ Person person = new Gson().fromJson(json, Person.class);
+
+ assertNotNull(person);
+ assertEquals("John Doe", person.name());
+ assertEquals(30, person.age());
+ assertEquals("123 Main St", person.address());
+
+ Contact contact = person.contact();
+
+ assertNotNull(contact);
+ assertEquals("john.doe@example.com", contact.email());
+ assertEquals("555-1234", contact.phone());
+ }
+}
diff --git a/core-java-modules/core-java-8-datetime-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md
index f7ada52da6..6fe450816e 100644
--- a/core-java-modules/core-java-8-datetime-2/README.md
+++ b/core-java-modules/core-java-8-datetime-2/README.md
@@ -8,4 +8,5 @@
- [Add Minutes to a Time String in Java](https://www.baeldung.com/java-string-time-add-mins)
- [Round the Date in Java](https://www.baeldung.com/java-round-the-date)
- [Representing Furthest Possible Date in Java](https://www.baeldung.com/java-date-represent-max)
+- [Retrieving Unix Time in Java](https://www.baeldung.com/java-retrieve-unix-time)
- [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1)
diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java
new file mode 100644
index 0000000000..e09d823ce4
--- /dev/null
+++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java
@@ -0,0 +1,44 @@
+package com.baeldung.localdatetoiso;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.ISODateTimeFormat;
+
+import org.apache.commons.lang3.time.FastDateFormat;
+
+public class LocalDateToISO {
+ public String formatUsingDateTimeFormatter(LocalDate localDate) {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
+ String formattedDate = localDate.atStartOfDay().atOffset(ZoneOffset.UTC).format(formatter);
+ return formattedDate;
+ }
+
+ public String formatUsingSimpleDateFormat(LocalDate date) {
+ Date utilDate = Date.from(date.atStartOfDay(ZoneOffset.UTC).toInstant());
+ DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
+ String formattedDate = dateFormat.format(utilDate);
+ return formattedDate;
+ }
+
+ public String formatUsingJodaTime(org.joda.time.LocalDate localDate) {
+ org.joda.time.format.DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
+ return formatter.print(localDate.toDateTimeAtStartOfDay(DateTimeZone.UTC));
+ }
+
+ public String formatUsingApacheCommonsLang(LocalDate localDate) {
+ Date date = Date.from(localDate.atStartOfDay().toInstant(ZoneOffset.UTC));
+ String formattedDate = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", TimeZone.getTimeZone("UTC"))
+ .format(date);
+ return formattedDate;
+ }
+}
diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java
new file mode 100644
index 0000000000..7ad10ab253
--- /dev/null
+++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java
@@ -0,0 +1,44 @@
+package com.baeldung.monthintervalbetweentwodates;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class MonthInterval {
+
+ public int monthsBetween(Date startDate, Date endDate) {
+ if (startDate == null || endDate == null) {
+ throw new IllegalArgumentException("Both startDate and endDate must be provided");
+ }
+
+ Calendar startCalendar = Calendar.getInstance();
+ startCalendar.setTime(startDate);
+ int startDateTotalMonths = 12 * startCalendar.get(Calendar.YEAR) + startCalendar.get(Calendar.MONTH);
+
+ Calendar endCalendar = Calendar.getInstance();
+ endCalendar.setTime(endDate);
+ int endDateTotalMonths = 12 * endCalendar.get(Calendar.YEAR) + endCalendar.get(Calendar.MONTH);
+
+ return endDateTotalMonths - startDateTotalMonths;
+ }
+
+ public int monthsBetweenWithDayValue(Date startDate, Date endDate) {
+ if (startDate == null || endDate == null) {
+ throw new IllegalArgumentException("Both startDate and endDate must be provided");
+ }
+
+ Calendar startCalendar = Calendar.getInstance();
+ startCalendar.setTime(startDate);
+
+ int startDateDayOfMonth = startCalendar.get(Calendar.DAY_OF_MONTH);
+ int startDateTotalMonths = 12 * startCalendar.get(Calendar.YEAR) + startCalendar.get(Calendar.MONTH);
+
+ Calendar endCalendar = Calendar.getInstance();
+ endCalendar.setTime(endDate);
+
+ int endDateDayOfMonth = endCalendar.get(Calendar.DAY_OF_MONTH);
+ int endDateTotalMonths = 12 * endCalendar.get(Calendar.YEAR) + endCalendar.get(Calendar.MONTH);
+
+ return (startDateDayOfMonth > endDateDayOfMonth) ? (endDateTotalMonths - startDateTotalMonths) - 1 : (endDateTotalMonths - startDateTotalMonths);
+ }
+
+}
diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java
new file mode 100644
index 0000000000..1979c91eca
--- /dev/null
+++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.localdatetoiso;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import java.time.LocalDate;
+
+public class LocalDateToISOUnitTest {
+ @Test
+ void givenLocalDate_whenUsingDateTimeFormatter_thenISOFormat(){
+ LocalDateToISO localDateToISO = new LocalDateToISO();
+ LocalDate localDate = LocalDate.of(2023, 11, 6);
+
+ String expected = "2023-11-06T00:00:00.000Z";
+ String actual = localDateToISO.formatUsingDateTimeFormatter(localDate);
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ void givenLocalDate_whenUsingSimpleDateFormat_thenISOFormat(){
+ LocalDateToISO localDateToISO = new LocalDateToISO();
+ LocalDate localDate = LocalDate.of(2023, 11, 6);
+
+ String expected = "2023-11-06T00:00:00.000Z";
+ String actual = localDateToISO.formatUsingSimpleDateFormat(localDate);
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ void givenLocalDate_whenUsingJodaTime_thenISOFormat() {
+ LocalDateToISO localDateToISO = new LocalDateToISO();
+ org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 11, 6);
+
+ String expected = "2023-11-06T00:00:00.000Z";
+ String actual = localDateToISO.formatUsingJodaTime(localDate);
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ void givenLocalDate_whenUsingApacheCommonsLang_thenISOFormat() {
+ LocalDateToISO localDateToISO = new LocalDateToISO();
+ LocalDate localDate = LocalDate.of(2023, 11, 6);
+
+ String expected = "2023-11-06T00:00:00.000Z";
+ String actual = localDateToISO.formatUsingApacheCommonsLang(localDate);
+ assertEquals(expected, actual);
+ }
+}
diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java
new file mode 100644
index 0000000000..2cd5638cc8
--- /dev/null
+++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.monthintervalbetweentwodates;
+
+import org.joda.time.DateTime;
+import org.joda.time.Months;
+import org.junit.jupiter.api.Test;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.YearMonth;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class MonthIntervalUnitTest {
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingJodaTime_thenReturnMonthsDifference() {
+ DateTime firstDate = new DateTime(2023, 5, 25, 0, 0);
+ DateTime secondDate = new DateTime(2023, 11, 23, 0, 0);
+
+ int monthsBetween = Months.monthsBetween(firstDate, secondDate)
+ .getMonths();
+ assertEquals(5, monthsBetween);
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingJodaTimeSetTimeToFirstDayOfMonth_thenReturnMonthsDifference() {
+ DateTime firstDate = new DateTime(2023, 5, 25, 0, 0).withDayOfMonth(1);
+ DateTime secondDate = new DateTime(2023, 11, 23, 0, 0).withDayOfMonth(1);
+
+ int monthsBetween = Months.monthsBetween(firstDate, secondDate)
+ .getMonths();
+ assertEquals(6, monthsBetween);
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingPeriodClass_thenReturnMonthsDifference() {
+ Period diff = Period.between(LocalDate.parse("2023-05-25"), LocalDate.parse("2023-11-23"));
+ assertEquals(5, diff.getMonths());
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingPeriodClassAndAdjsutingDatesToFirstDayOfTheMonth_thenReturnMonthsDifference() {
+ Period diff = Period.between(LocalDate.parse("2023-05-25")
+ .withDayOfMonth(1), LocalDate.parse("2023-11-23")
+ .withDayOfMonth(1));
+ assertEquals(6, diff.getMonths());
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingChronoUnitAndYearMonth_thenReturnMonthsDifference() {
+ long diff = ChronoUnit.MONTHS.between(YearMonth.from(LocalDate.parse("2023-05-25")), LocalDate.parse("2023-11-23"));
+ assertEquals(6, diff);
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingChronoUnitEnum_thenReturnMonthsDifference() {
+ long monthsBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2023-05-25"), LocalDate.parse("2023-11-23"));
+ assertEquals(5, monthsBetween);
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingChronoUnitEnumdSetTimeToFirstDayOfMonth_thenReturnMonthsDifference() {
+ long monthsBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2023-05-25")
+ .withDayOfMonth(1), LocalDate.parse("2023-11-23")
+ .withDayOfMonth(1));
+ assertEquals(6, monthsBetween);
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingLegacyDateApi_thenReturnMonthsDifference() throws ParseException {
+ MonthInterval monthDifference = new MonthInterval();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ Date startDate = sdf.parse("2016-05-31");
+ Date endDate = sdf.parse("2016-11-30");
+ int monthsBetween = monthDifference.monthsBetween(startDate, endDate);
+ assertEquals(6, monthsBetween);
+
+ }
+
+ @Test
+ void givenTwoDates_whenCalculatingMonthsBetweenUsingLegacyDateApiDayValueConsidered_thenReturnMonthsDifference() throws ParseException {
+ MonthInterval monthDifference = new MonthInterval();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ Date startDate = sdf.parse("2016-05-31");
+ Date endDate = sdf.parse("2016-11-28");
+ int monthsBetween = monthDifference.monthsBetweenWithDayValue(startDate, endDate);
+ assertEquals(5, monthsBetween);
+ }
+}
diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java
new file mode 100644
index 0000000000..eedd897e91
--- /dev/null
+++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.unixtime;
+
+import static org.junit.Assert.assertEquals;
+import java.time.Instant;
+import java.time.LocalDate;
+
+import java.time.Month;
+import java.time.ZoneId;
+import java.util.Date;
+
+import org.joda.time.DateTime;
+
+import org.junit.jupiter.api.Test;
+
+public class UnixTimeUnitTest {
+
+ @Test
+ public void givenTimeUsingDateApi_whenConvertedToUnixTime_thenMatch() {
+ Date date = new Date(2023 - 1900, 1, 15, 0, 0, 0);
+ long expected = 1676419200;
+ long actual = date.getTime() / 1000L;
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenTimeUsingJodaTime_whenConvertedToUnixTime_thenMatch() {
+ DateTime dateTime = new DateTime(2023, 2, 15, 00, 00, 00, 0);
+ long expected = 1676419200;
+ long actual = dateTime.getMillis() / 1000L;
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenTimeUsingLocalDate_whenConvertedToUnixTime_thenMatch() {
+ LocalDate date = LocalDate.of(2023, Month.FEBRUARY, 15);
+ Instant instant = date.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant();
+ long expected = 1676419200;
+ long actual = instant.getEpochSecond();
+ assertEquals(expected, actual);
+ }
+
+}
diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md
index 2e34829525..118d8e00ed 100644
--- a/core-java-modules/core-java-arrays-convert/README.md
+++ b/core-java-modules/core-java-arrays-convert/README.md
@@ -11,3 +11,4 @@ This module contains articles about arrays conversion in Java
- [Converting an int[] to HashSet in Java](https://www.baeldung.com/java-converting-int-array-to-hashset)
- [Convert an ArrayList of String to a String Array in Java](https://www.baeldung.com/java-convert-string-arraylist-array)
- [Convert Char Array to Int Array in Java](https://www.baeldung.com/java-convert-char-int-array)
+- [How to Convert Byte Array to Char Array](https://www.baeldung.com/java-convert-byte-array-char)
diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
index 52787cc0c9..265577f75e 100644
--- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
@@ -57,7 +57,7 @@
-
+
11
diff --git a/core-java-modules/core-java-collections-conversions-2/pom.xml b/core-java-modules/core-java-collections-conversions-2/pom.xml
index da6b6a564a..7723daa6db 100644
--- a/core-java-modules/core-java-collections-conversions-2/pom.xml
+++ b/core-java-modules/core-java-collections-conversions-2/pom.xml
@@ -43,7 +43,6 @@
0.10.3
- 11
3.2.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml
index b8832df357..c11781eeda 100644
--- a/core-java-modules/core-java-collections-list-5/pom.xml
+++ b/core-java-modules/core-java-collections-list-5/pom.xml
@@ -39,7 +39,7 @@
org.projectlombok
lombok
- 1.18.26
+ ${lombok.version}
provided
@@ -67,7 +67,7 @@
1.21
2.2
2.10.1
- 2.15.2
+ 2.16.0
20230618
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-6/pom.xml b/core-java-modules/core-java-collections-list-6/pom.xml
index 46ef4ff4c9..18a153ff06 100644
--- a/core-java-modules/core-java-collections-list-6/pom.xml
+++ b/core-java-modules/core-java-collections-list-6/pom.xml
@@ -13,4 +13,20 @@
0.0.1-SNAPSHOT
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+
+
+ 0.10.4
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java b/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java
new file mode 100644
index 0000000000..b53b3a946a
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java
@@ -0,0 +1,52 @@
+package com.baeldung.sorting;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Ordering;
+
+public class SortingBasedOnAnotherList {
+ static List sortUsingForLoop(List listToSort, List listWithOrder) {
+ List sortedList = new ArrayList<>();
+ for(String element: listWithOrder) {
+ if(listToSort.contains(element)) {
+ sortedList.add(element);
+ }
+ }
+ return sortedList;
+ }
+
+ static void sortUsingComparator(List listToSort, List listWithOrder) {
+ listToSort.sort(Comparator.comparingInt(listWithOrder::indexOf));
+ }
+
+ static void sortUsingStreamAPI(List listToSort, List listWithOrder) {
+ Map indicesMap = listWithOrder.stream().collect(Collectors.toMap(e->e, listWithOrder::indexOf));
+ listToSort.sort(Comparator.comparingInt(indicesMap::get));
+ }
+
+ static void sortUsingMap(List listToSort, List listWithOrder) {
+ Map orderedIndicesMap = new HashMap<>();
+ for(int i = 0; i < listWithOrder.size(); i++) {
+ orderedIndicesMap.put(listWithOrder.get(i), i);
+ }
+ listToSort.sort(Comparator.comparingInt(orderedIndicesMap::get));
+ }
+
+ static List sortUsingGuava(List listToSort, List listWithOrder) {
+ Ordering explicitOrdering = Ordering.explicit(listWithOrder);
+ List sortedList = explicitOrdering.sortedCopy(listToSort);
+ return sortedList;
+ }
+
+ static List sortUsingVavr(List listToSort, List listWithOrder) {
+ io.vavr.collection.List listWithOrderedElements = io.vavr.collection.List.ofAll(listWithOrder);
+ io.vavr.collection.List listToSortElements = io.vavr.collection.List.ofAll(listToSort);
+ io.vavr.collection.List sortedList = listToSortElements.sortBy(listWithOrderedElements::indexOf);
+ return sortedList.asJava();
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java b/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java
new file mode 100644
index 0000000000..2ed7d52eee
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.sorting;
+
+import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingComparator;
+import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingForLoop;
+import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingGuava;
+import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingMap;
+import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingStreamAPI;
+import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingVavr;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+public class SortingBasedOnAnotherListUnitTest {
+ @Test
+ public void givenTwoList_whenUsingForLoop_thenSort() {
+ List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
+ sortUsingForLoop(listToSort, listWithOrder);
+ List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ assertEquals(expectedSortedList, listWithOrder);
+ }
+
+ @Test
+ public void givenTwoList_whenUsingComparator_thenSort() {
+ List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
+ sortUsingComparator(listToSort, listWithOrder);
+ List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ assertEquals(expectedSortedList, listToSort);
+ }
+
+ @Test
+ public void givenTwoList_whenUsingStreamAPI_thenSort() {
+ List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
+ sortUsingStreamAPI(listToSort, listWithOrder);
+ List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ assertEquals(expectedSortedList, listToSort);
+ }
+
+ @Test
+ public void givenTwoList_whenUsingMap_thenSort() {
+ List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
+ sortUsingMap(listToSort, listWithOrder);
+ List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ assertEquals(expectedSortedList, listToSort);
+ }
+
+ @Test
+ public void givenTwoList_whenUsingGuavaExplicit_thenSort() {
+ List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
+ sortUsingGuava(listToSort, listWithOrder);
+ List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ assertEquals(expectedSortedList, listWithOrder);
+ }
+
+ @Test
+ public void givenTwoList_whenUsingVavr_thenSort() {
+ List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
+ sortUsingVavr(listToSort, listWithOrder);
+ List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
+ assertEquals(expectedSortedList, listWithOrder);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml
index 8c35dcee6e..a0cdc07644 100644
--- a/core-java-modules/core-java-collections-maps-6/pom.xml
+++ b/core-java-modules/core-java-collections-maps-6/pom.xml
@@ -13,14 +13,11 @@
0.0.1-SNAPSHOT
-
- 5.2.5.RELEASE
-
com.fasterxml.jackson.core
jackson-databind
- 2.13.1
+ 2.16.0
org.openjdk.jmh
@@ -40,7 +37,7 @@
junit
junit
- 4.13.1
+ ${junit.version}
test
@@ -51,4 +48,8 @@
+
+ 5.2.5.RELEASE
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md
index c9f39dd2fa..73b36394a3 100644
--- a/core-java-modules/core-java-collections-maps-7/README.md
+++ b/core-java-modules/core-java-collections-maps-7/README.md
@@ -4,5 +4,7 @@
- [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv)
- [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair)
- [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file)
-- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-max-size)
-- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6)
\ No newline at end of file
+- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound)
+- [How to Sort LinkedHashMap By Values in Java](https://www.baeldung.com/java-sort-linkedhashmap-using-values)
+- [How to Increment a Map Value in Java](https://www.baeldung.com/java-increment-map-value)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6)
diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml
index 2d08c0a438..bd355bea1e 100644
--- a/core-java-modules/core-java-collections-maps-7/pom.xml
+++ b/core-java-modules/core-java-collections-maps-7/pom.xml
@@ -1,15 +1,11 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
core-java-collections-maps-7
core-java-collections-maps-7
jar
-
- 2.10.1
- 1.5
-
core-java-modules
@@ -63,4 +59,10 @@
+
+
+ 2.10.1
+ 1.5
+
+
diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md
index 3badd36d5e..5d05c900b8 100644
--- a/core-java-modules/core-java-concurrency-2/README.md
+++ b/core-java-modules/core-java-concurrency-2/README.md
@@ -7,3 +7,4 @@
- [Testing Multi-Threaded Code in Java](https://www.baeldung.com/java-testing-multithreaded)
- [How to Check if All Runnables Are Done](https://www.baeldung.com/java-runnables-check-status)
- [Parallelize for Loop in Java](https://www.baeldung.com/java-for-loop-parallel)
+- [How to Effectively Unit Test CompletableFuture](https://www.baeldung.com/java-completablefuture-unit-test)
diff --git a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java
new file mode 100644
index 0000000000..5953c6d87a
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java
@@ -0,0 +1,150 @@
+package com.baeldung.concurrent.completablefuture;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+
+public class CompletableFutureUnitTest {
+
+ @Test
+ public void givenAsyncTask_whenProcessingAsyncSucceed_thenReturnSuccess() throws ExecutionException, InterruptedException {
+ Microservice mockMicroserviceA = mock(Microservice.class);
+ Microservice mockMicroserviceB = mock(Microservice.class);
+
+ when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("Hello"));
+ when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("World"));
+
+ CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB));
+
+ String result = resultFuture.get();
+ assertEquals("HelloWorld", result);
+ }
+
+ @Test
+ public void givenAsyncTask_whenProcessingAsyncWithException_thenReturnException() throws ExecutionException, InterruptedException {
+ Microservice mockMicroserviceA = mock(Microservice.class);
+ Microservice mockMicroserviceB = mock(Microservice.class);
+
+ when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("Hello"));
+ when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.failedFuture(new RuntimeException("Simulated Exception")));
+ CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB));
+ // Use assertThrows to verify that the expected exception is thrown
+ ExecutionException exception = assertThrows(ExecutionException.class, resultFuture::get);
+ // Assert the exception message
+ assertEquals("Simulated Exception", exception.getCause()
+ .getMessage());
+ }
+
+ @Test
+ public void givenAsyncTask_whenProcessingAsyncWithTimeout_thenHandleTimeoutException() throws ExecutionException, InterruptedException {
+ Microservice mockMicroserviceA = mock(Microservice.class);
+ Microservice mockMicroserviceB = mock(Microservice.class);
+ Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS);
+ when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor));
+ Executor delayedExecutor2 = CompletableFuture.delayedExecutor(500, TimeUnit.MILLISECONDS);
+ when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.supplyAsync(() -> "World", delayedExecutor2));
+ CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB));
+ assertThrows(TimeoutException.class, () -> resultFuture.get(300, TimeUnit.MILLISECONDS));
+ }
+
+ @Test
+ public void givenCompletableFuture_whenCompleted_thenStateIsDone() {
+ Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS);
+ CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor);
+ CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> " World");
+ CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!");
+ CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 };
+
+ CompletableFuture allCf = CompletableFuture.allOf(cfs);
+
+ assertFalse(allCf.isDone());
+ allCf.join();
+ String result = Arrays.stream(cfs)
+ .map(CompletableFuture::join)
+ .collect(Collectors.joining());
+
+ assertFalse(allCf.isCancelled());
+ assertTrue(allCf.isDone());
+ assertFalse(allCf.isCompletedExceptionally());
+ assertEquals(result, "Hello World!");
+ }
+
+ @Test
+ public void givenCompletableFuture_whenCompletedWithException_thenStateIsCompletedExceptionally() throws ExecutionException, InterruptedException {
+ Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS);
+ CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor);
+ CompletableFuture cf2 = CompletableFuture.failedFuture(new RuntimeException("Simulated Exception"));
+ CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!");
+ CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 };
+
+ CompletableFuture allCf = CompletableFuture.allOf(cfs);
+
+ assertFalse(allCf.isDone());
+ assertFalse(allCf.isCompletedExceptionally());
+
+ // Exception is expected, assert the cause
+ CompletionException exception = assertThrows(CompletionException.class, allCf::join);
+
+ assertEquals("Simulated Exception", exception.getCause()
+ .getMessage());
+ assertTrue(allCf.isCompletedExceptionally());
+ assertTrue(allCf.isDone());
+ assertFalse(allCf.isCancelled());
+ }
+
+ @Test
+ public void givenCompletableFuture_whenCancelled_thenStateIsCancelled() throws ExecutionException, InterruptedException {
+ Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS);
+ CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor);
+ CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> " World");
+ CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!");
+ CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 };
+ CompletableFuture allCf = CompletableFuture.allOf(cfs);
+ assertFalse(allCf.isDone());
+ assertFalse(allCf.isCompletedExceptionally());
+ allCf.cancel(true);
+ assertTrue(allCf.isCancelled());
+ assertTrue(allCf.isDone());
+ }
+
+ CompletableFuture processAsync(List microservices) {
+ List> dataFetchFutures = fetchDataAsync(microservices);
+ return combineResults(dataFetchFutures);
+ }
+
+ private List> fetchDataAsync(List microservices) {
+ return microservices.stream()
+ .map(client -> client.retrieveAsync(""))
+ .collect(Collectors.toList());
+ }
+
+ private CompletableFuture combineResults(List> dataFetchFutures) {
+ return CompletableFuture.allOf(dataFetchFutures.toArray(new CompletableFuture[0]))
+ .thenApply(v -> dataFetchFutures.stream()
+ .map(future -> future.exceptionally(ex -> {
+ throw new CompletionException(ex);
+ })
+ .join())
+ .collect(Collectors.joining()));
+ }
+
+ interface Microservice {
+ CompletableFuture retrieveAsync(String input);
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java
new file mode 100644
index 0000000000..1c642d4ef7
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java
@@ -0,0 +1,30 @@
+package com.baeldung.callback.completablefuture;
+
+import java.util.concurrent.CompletableFuture;
+
+public class CompletableFutureCallbackExample {
+ public static void main(String[] args) {
+ CompletableFuture completableFuture = new CompletableFuture<>();
+ Runnable runnable = downloadFile(completableFuture);
+ completableFuture.whenComplete((res, error) -> {
+ if (error != null) {
+ // handle the exception scenario
+ } else if (res != null) {
+ // send data to DB
+ }
+ });
+ new Thread(runnable).start();
+ }
+
+ private static Runnable downloadFile(CompletableFuture completableFuture) {
+ return () -> {
+ try {
+ //logic to download file
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ completableFuture.complete("pic.jpg");
+ };
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java
new file mode 100644
index 0000000000..f3a5e889af
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java
@@ -0,0 +1,42 @@
+package com.baeldung.callback.listenablefuture;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+
+public class ListenableFutureCallbackExample {
+ public static void main(String[] args) {
+
+ ExecutorService executorService = Executors.newFixedThreadPool(1);
+ ListeningExecutorService pool = MoreExecutors.listeningDecorator(executorService);
+ ListenableFuture listenableFuture = pool.submit(downloadFile());
+
+ Futures.addCallback(listenableFuture, new FutureCallback() {
+ @Override
+ public void onSuccess(String result) {
+ // code to push fileName to DB
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+ // code to take appropriate action when there is an error
+ }
+ }, executorService);
+ }
+
+ private static Callable downloadFile() {
+ return () -> {
+ // Mimicking the downloading of a file by adding a sleep call
+ Thread.sleep(5000);
+ return "pic.jpg";
+ };
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java
new file mode 100644
index 0000000000..6b6d6e3e8a
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java
@@ -0,0 +1,24 @@
+package com.baeldung.concurrent.executorservice;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class ExecuteExample {
+ public static void main(String[] args) {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ // Task using Runnable
+ Runnable task = () -> {
+ int[] numbers = { 1, 2, 3, 4, 5 };
+ int sum = 0;
+ for (int num : numbers) {
+ sum += num;
+ }
+ System.out.println("Sum calculated using execute:" + sum);
+ };
+ // Submit the task using execute
+ executorService.execute(task);
+ executorService.shutdown();
+
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java
new file mode 100644
index 0000000000..cd715edcc0
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java
@@ -0,0 +1,31 @@
+package com.baeldung.concurrent.executorservice;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class SubmitExample {
+ public static void main(String[] args) {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ Callable task = () -> {
+ int[] numbers = { 1, 2, 3, 4, 5 };
+ int sum = 0;
+ for (int num : numbers) {
+ sum += num;
+ }
+ return sum;
+ };
+ // Submit the task and obtain a Future
+ Future result = executorService.submit(task);
+ try {
+ // Get the result
+ int sum = result.get();
+ System.out.println("Sum calculated using submit:" + sum);
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ executorService.shutdown();
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md
index c7ba333222..f30a21f84c 100644
--- a/core-java-modules/core-java-datetime-conversion/README.md
+++ b/core-java-modules/core-java-datetime-conversion/README.md
@@ -11,3 +11,4 @@ This module contains articles about converting between Java date and time object
- [Conversion From 12-Hour Time to 24-Hour Time in Java](https://www.baeldung.com/java-convert-time-format)
- [Convert Epoch Time to LocalDate and LocalDateTime](https://www.baeldung.com/java-convert-epoch-localdate)
- [Convert Timestamp String to Long in Java](https://www.baeldung.com/java-convert-timestamp-string-long)
+- [Convert Long Timestamp to LocalDateTime in Java](https://www.baeldung.com/java-convert-long-timestamp-localdatetime)
diff --git a/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java
new file mode 100644
index 0000000000..36cd1b31ae
--- /dev/null
+++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java
@@ -0,0 +1,16 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+public class LambdaSupplier {
+
+ protected final Supplier expensiveData;
+
+ public LambdaSupplier(Supplier expensiveData) {
+ this.expensiveData = expensiveData;
+ }
+
+ public T getData() {
+ return expensiveData.get();
+ }
+}
diff --git a/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java
new file mode 100644
index 0000000000..dce3cc4997
--- /dev/null
+++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java
@@ -0,0 +1,21 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+public class LazyLambdaSupplier extends LambdaSupplier {
+
+ private T data;
+
+ public LazyLambdaSupplier(Supplier expensiveData) {
+ super(expensiveData);
+ }
+
+ @Override
+ public T getData() {
+ if (data != null) {
+ return data;
+ }
+ return data = expensiveData.get();
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java
new file mode 100644
index 0000000000..32eec0a5d8
--- /dev/null
+++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java
@@ -0,0 +1,26 @@
+package com.baeldung.lazylambda;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+public class LazyLambdaThreadSafeSupplier extends LambdaSupplier {
+
+ private final AtomicReference data;
+
+ public LazyLambdaThreadSafeSupplier(Supplier expensiveData) {
+ super(expensiveData);
+ data = new AtomicReference<>();
+ }
+
+ public T getData() {
+ if (data.get() == null) {
+ synchronized (data) {
+ if (data.get() == null) {
+ data.set(expensiveData.get());
+ }
+ }
+ }
+ return data.get();
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java
new file mode 100644
index 0000000000..f0a500e084
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.lazylambda;
+
+import java.util.function.Supplier;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class LambdaSupplierUnitTest {
+
+ @Test
+ public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get())
+ .thenReturn("expensive call");
+ LambdaSupplier testee = new LambdaSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never())
+ .get();
+ testee.getData();
+ testee.getData();
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(2))
+ .get();
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java
new file mode 100644
index 0000000000..1371983a3d
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.lazylambda;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
+
+public class LazyLambdaSupplierUnitTest {
+
+ @Test
+ public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get())
+ .thenReturn("expensive call");
+ LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never())
+ .get();
+ testee.getData();
+ testee.getData();
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
+ .get();
+ }
+
+ @Test
+ public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledMultipleTimes() throws InterruptedException {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get())
+ .thenAnswer((Answer) invocation -> {
+ Thread.sleep(1000L);
+ return "Late response!";
+ });
+ LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never())
+ .get();
+
+ ExecutorService executorService = Executors.newFixedThreadPool(4);
+ executorService.invokeAll(List.of(testee::getData, testee::getData));
+ executorService.shutdown();
+ if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
+ executorService.shutdownNow();
+ }
+
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(2))
+ .get();
+ }
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java
new file mode 100644
index 0000000000..83bd49aa7e
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.lazylambda;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
+
+public class LazyLambdaThreadSafeSupplierUnitTest {
+
+ @Test
+ public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get())
+ .thenReturn("expensive call");
+ LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never())
+ .get();
+ testee.getData();
+ testee.getData();
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
+ .get();
+ }
+
+ @Test
+ public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledOnlyOnce() throws InterruptedException {
+ @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class);
+ Mockito.when(mockedExpensiveFunction.get())
+ .thenAnswer((Answer) invocation -> {
+ Thread.sleep(1000L);
+ return "Late response!";
+ });
+ LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
+ Mockito.verify(mockedExpensiveFunction, Mockito.never())
+ .get();
+
+ ExecutorService executorService = Executors.newFixedThreadPool(4);
+ executorService.invokeAll(List.of(testee::getData, testee::getData));
+ executorService.shutdown();
+ if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
+ executorService.shutdownNow();
+ }
+
+ Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
+ .get();
+ }
+
+}
diff --git a/core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java
new file mode 100644
index 0000000000..59b7a86602
--- /dev/null
+++ b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java
@@ -0,0 +1,59 @@
+package com.baeldung.splitlargefile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.FilenameUtils;
+
+class SplitLargeFile {
+
+ public List splitByFileSize(File largeFile, int maxSizeOfSplitFiles,
+ String splitedFileDirPath) throws IOException {
+ List listOfSplitFiles = new ArrayList<>();
+ try (InputStream in = Files.newInputStream(largeFile.toPath())) {
+ final byte[] buffer = new byte[maxSizeOfSplitFiles];
+ int dataRead = in.read(buffer);
+ while (dataRead > -1) {
+ File splitFile = getSplitFile(FilenameUtils.removeExtension(largeFile.getName()),
+ buffer, dataRead, splitedFileDirPath);
+ listOfSplitFiles.add(splitFile);
+ dataRead = in.read(buffer);
+ }
+ }
+ return listOfSplitFiles;
+ }
+
+ private File getSplitFile(String largeFileName, byte[] buffer, int length,
+ String splitedFileDirPath) throws IOException {
+ File splitFile = File.createTempFile(largeFileName + "-", "-split",
+ new File(splitedFileDirPath));
+ try (FileOutputStream fos = new FileOutputStream(splitFile)) {
+ fos.write(buffer, 0, length);
+ }
+ return splitFile;
+ }
+
+ public List splitByNumberOfFiles(File largeFile, int noOfFiles, String splitedFileDirPath)
+ throws IOException {
+ return splitByFileSize(largeFile, getSizeInBytes(largeFile.length(), noOfFiles),
+ splitedFileDirPath);
+ }
+
+ private int getSizeInBytes(long largefileSizeInBytes, int numberOfFilesforSplit) {
+ if (largefileSizeInBytes % numberOfFilesforSplit != 0) {
+ largefileSizeInBytes = ((largefileSizeInBytes / numberOfFilesforSplit) + 1)
+ * numberOfFilesforSplit;
+ }
+ long x = largefileSizeInBytes / numberOfFilesforSplit;
+ if (x > Integer.MAX_VALUE) {
+ throw new NumberFormatException("size too large");
+
+ }
+ return (int) x;
+ }
+}
diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java
new file mode 100644
index 0000000000..ed0cab250a
--- /dev/null
+++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.outputstreamtobytearray;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class OutputStreamToByteArrayUnitTest {
+
+ @Test
+ public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray(@TempDir Path tempDir) throws IOException {
+ String data = "Welcome to Baeldung!";
+ String fileName = "file.txt";
+ Path filePath = tempDir.resolve(fileName);
+
+ try (FileOutputStream outputStream = new FileOutputStream(filePath.toFile())) {
+ outputStream.write(data.getBytes(StandardCharsets.UTF_8));
+ }
+
+ byte[] writtenData = FileUtils.readFileToByteArray(filePath.toFile());
+ String result = new String(writtenData, StandardCharsets.UTF_8);
+ assertEquals(data, result);
+ }
+
+
+ @Test
+ public void givenSystemOut_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException {
+ String data = "Welcome to Baeldung!\n";
+
+ DrainableOutputStream drainableOutputStream = new DrainableOutputStream(System.out);
+ try (drainableOutputStream) {
+ drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8));
+ }
+
+ byte[] writtenData = drainableOutputStream.toByteArray();
+ assertEquals(data, new String(writtenData, StandardCharsets.UTF_8));
+ }
+
+ public class DrainableOutputStream extends FilterOutputStream {
+ private final ByteArrayOutputStream buffer;
+
+ public DrainableOutputStream(OutputStream out) {
+ super(out);
+ this.buffer = new ByteArrayOutputStream();
+ }
+
+ @Override
+ public void write(byte b[]) throws IOException {
+ buffer.write(b);
+ super.write(b);
+ }
+
+ public byte[] toByteArray() {
+ return buffer.toByteArray();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java
new file mode 100644
index 0000000000..d31cbd67ad
--- /dev/null
+++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.splitlargefile;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.junit.BeforeClass;
+
+public class SplitLargeFileUnitTest {
+
+ @BeforeClass
+ public static void prepareData() throws IOException {
+ Files.createDirectories(Paths.get("target/split"));
+ }
+
+ private String splitedFileDirPath() throws Exception {
+ return Paths.get("target").toString() + "/split";
+ }
+
+ private Path largeFilePath() throws Exception {
+ return Paths.get(this.getClass().getClassLoader().getResource("large-file.txt").toURI());
+ }
+
+
+ @org.junit.Test
+ public void givenLargeFile_whenSplitLargeFile_thenSplitBySize() throws Exception {
+ File input = largeFilePath().toFile();
+ SplitLargeFile slf = new SplitLargeFile();
+ slf.splitByFileSize(input, 1024_000, splitedFileDirPath());
+ }
+
+ @org.junit.Test
+ public void givenLargeFile_whenSplitLargeFile_thenSplitByNumberOfFiles() throws Exception {
+ File input = largeFilePath().toFile();
+ SplitLargeFile slf = new SplitLargeFile();
+ slf.splitByNumberOfFiles(input, 3, splitedFileDirPath());
+ }
+
+}
diff --git a/core-java-modules/core-java-ipc/README.md b/core-java-modules/core-java-ipc/README.md
new file mode 100644
index 0000000000..bbfbf6d070
--- /dev/null
+++ b/core-java-modules/core-java-ipc/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+- [Inter-Process Communication Methods in Java](https://www.baeldung.com/java-ipc)
diff --git a/core-java-modules/core-java-lang-6/README.md b/core-java-modules/core-java-lang-6/README.md
index 91c0e5212c..214409dd04 100644
--- a/core-java-modules/core-java-lang-6/README.md
+++ b/core-java-modules/core-java-lang-6/README.md
@@ -9,3 +9,5 @@ This module contains articles about core features in the Java language
- [Get a Random Element From a Set in Java](https://www.baeldung.com/java-set-draw-sample)
- [Stop Executing Further Code in Java](https://www.baeldung.com/java-stop-running-code)
- [Using the Apache Commons Lang 3 for Comparing Objects in Java](https://www.baeldung.com/java-apache-commons-lang-3-compare-objects)
+- [Return First Non-null Value in Java](https://www.baeldung.com/java-first-non-null)
+- [Static Final Variables in Java](https://www.baeldung.com/java-static-final-variables)
diff --git a/core-java-modules/core-java-lang-6/pom.xml b/core-java-modules/core-java-lang-6/pom.xml
index 54035c1eb0..a47ed459f6 100644
--- a/core-java-modules/core-java-lang-6/pom.xml
+++ b/core-java-modules/core-java-lang-6/pom.xml
@@ -23,6 +23,16 @@
commons-lang3
${commons-lang3.version}
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
+
@@ -39,6 +49,11 @@
mapstruct-processor
${mapstruct.version}
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
+
@@ -50,6 +65,7 @@
17
UTF-8
1.6.0.Beta1
+ 1.37
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java
index 88e2283985..5a7ea2da58 100644
--- a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java
+++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java
@@ -23,6 +23,23 @@ public class CompressByteArrayUtil {
return outputStream.toByteArray();
}
+ public static byte[] compressWithCustomLevel(byte[] input, int level) {
+ Deflater deflater = new Deflater();
+ deflater.setInput(input);
+ deflater.setLevel(level);
+ deflater.finish();
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+
+ while (!deflater.finished()) {
+ int compressedSize = deflater.deflate(buffer);
+ outputStream.write(buffer, 0, compressedSize);
+ }
+
+ return outputStream.toByteArray();
+ }
+
public static byte[] decompress(byte[] input) throws DataFormatException {
Inflater inflater = new Inflater();
inflater.setInput(input);
diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java
new file mode 100644
index 0000000000..bde7b44897
--- /dev/null
+++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java
@@ -0,0 +1,14 @@
+package com.baeldung.staticfinal;
+
+import java.util.HashMap;
+
+public class Bike {
+ public static final int TIRE = 2;
+ public static final int PEDAL;
+ public static final HashMap PART = new HashMap<>();
+
+ static {
+ PEDAL = 5;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java
new file mode 100644
index 0000000000..822ad5063c
--- /dev/null
+++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.compressbytes;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.zip.DataFormatException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class CompressByteArrayUnitTest {
+
+ private static final String INPUT_STRING = "Building a REST API is not a trivial task – from the high-level RESTful " +
+ "constraints down to the nitty-gritty of making everything work and work well." +
+ "Spring has made REST a first-class citizen and the platform has been maturing in leaps and bounds." +
+ "With this guide, my aim is to organize the mountains of information that are available on the subject and " +
+ "guide you through properly building an API." +
+ "The guide starts with the basics – bootstrapping the REST API, the Spring MVC Configuration, and basic customization.";
+
+ @Test
+ void givenInputString_whenCompressWithDefaultLevel_thenDecompressWithSameSize() throws DataFormatException {
+ byte[] input = INPUT_STRING.getBytes();
+ byte[] compressedData = CompressByteArrayUtil.compress(input);
+ byte[] decompressedData = CompressByteArrayUtil.decompress(compressedData);
+ System.out.println("Original: " + input.length + " bytes");
+ System.out.println("Compressed: " + compressedData.length + " bytes");
+ System.out.println("Decompressed: " + decompressedData.length + " bytes");
+ assertEquals(input.length, decompressedData.length);
+ }
+
+ @Test
+ void givenInputString_whenCompressWithCustomLevel_thenDecompressWithSameSize() throws DataFormatException {
+ byte[] input = INPUT_STRING.getBytes();
+ byte[] compressedData = CompressByteArrayUtil.compressWithCustomLevel(input, 1);
+ byte[] decompressedData = CompressByteArrayUtil.decompress(compressedData);
+ System.out.println("Original: " + input.length + " bytes");
+ System.out.println("Compressed: " + compressedData.length + " bytes");
+ System.out.println("Decompressed: " + decompressedData.length + " bytes");
+ assertEquals(input.length, decompressedData.length);
+ }
+}
diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java
new file mode 100644
index 0000000000..fc61a806e1
--- /dev/null
+++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.recursivelysumintarray;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class RecursivelySumIntArrayUnitTest {
+
+ private static final int[] INT_ARRAY = { 1, 2, 3, 4, 5 };
+
+ static int sumIntArray1(int[] array) {
+ if (array.length == 1) {
+ return array[0];
+ } else {
+ return array[0] + sumIntArray1(Arrays.copyOfRange(array, 1, array.length));
+ }
+ }
+
+ static int sumIntArray2(int[] array, int index) {
+ if (index == 0) {
+ return array[index];
+ } else {
+ return array[index] + sumIntArray2(array, index - 1);
+ }
+ }
+
+ @Test
+ void whenUsingSumIntArray1_thenGetExpectedResult() {
+ assertEquals(15, sumIntArray1(INT_ARRAY));
+ }
+
+ @Test
+ void whenUsingSumIntArray2_thenGetExpectedResult() {
+ assertEquals(15, sumIntArray2(INT_ARRAY, INT_ARRAY.length - 1));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java
new file mode 100644
index 0000000000..7d6a612a8d
--- /dev/null
+++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java
@@ -0,0 +1,61 @@
+package com.baeldung.recursivelysumintarray;
+
+import static com.baeldung.recursivelysumintarray.RecursivelySumIntArrayUnitTest.sumIntArray1;
+import static com.baeldung.recursivelysumintarray.RecursivelySumIntArrayUnitTest.sumIntArray2;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+@BenchmarkMode(Mode.AverageTime)
+@State(Scope.Thread)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@Warmup(iterations = 2)
+@Fork(1)
+@Measurement(iterations = 5)
+public class SumArrayBenchmark {
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder().include(SumArrayBenchmark.class.getSimpleName())
+ .build();
+ new Runner(options).run();
+ }
+
+ @Param({ "10", "10000" })
+ public int size;
+ int[] array;
+
+ @Setup
+ public void setup() {
+ var r = new Random();
+ array = new int[size];
+
+ for (int i = 0; i < size; i++) {
+ array[i] = r.nextInt();
+ }
+ }
+
+ @Benchmark
+ public int withArrayCopy() {
+ return sumIntArray1(array);
+ }
+
+ @Benchmark
+ public int withoutArrayCopy() {
+ return sumIntArray2(array, array.length - 1);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java
new file mode 100644
index 0000000000..2201dae4d1
--- /dev/null
+++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.staticfinal;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class BikeUnitTest {
+
+ @Test
+ void givenTireConstantSetUponDeclaration_whenGetTire_thenReturnTwo() {
+ assertEquals(2, Bike.TIRE);
+ }
+
+ @Test
+ void givenPedalConstantSetByStaticBlock_whenGetPedal_thenReturnFive() {
+ assertEquals(5, Bike.PEDAL);
+ }
+
+ @Test
+ void givenPartConstantObject_whenObjectStateChanged_thenCorrect() {
+ Bike.PART.put("seat", 1);
+ assertEquals(1, Bike.PART.get("seat"));
+
+ Bike.PART.put("seat", 5);
+ assertEquals(5, Bike.PART.get("seat"));
+ }
+
+ @Test
+ void givenMathClass_whenAccessingPiConstant_thenVerifyPiValueIsCorrect() {
+ assertEquals(3.141592653589793, Math.PI);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
index 551e5db1d5..a229327415 100644
--- a/core-java-modules/core-java-lang-math/pom.xml
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -5,6 +5,14 @@
4.0.0
core-java-lang-math
core-java-lang-math
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+ compile
+
+
jar
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java
new file mode 100644
index 0000000000..91fde335e9
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java
@@ -0,0 +1,20 @@
+package com.baeldung.algorithms.percentage;
+
+import lombok.experimental.ExtensionMethod;
+import java.math.BigDecimal;
+import java.util.Scanner;
+
+@ExtensionMethod(FastBigDecimalPercentage.class)
+public class BigDecimalPercentageCalculator {
+ public static void main(String[] args) {
+
+ Scanner in = new Scanner(System.in);
+ System.out.println("Enter obtained marks:");
+ BigDecimal obtained = new BigDecimal(in.nextDouble());
+ System.out.println("Enter total marks:");
+ BigDecimal total = new BigDecimal(in.nextDouble());
+
+ System.out.println("Percentage obtained :"+ obtained.toPercentageOf(total));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java
new file mode 100644
index 0000000000..c91cf0e9d4
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java
@@ -0,0 +1,18 @@
+package com.baeldung.algorithms.percentage;
+
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class BigDecimalPercentages {
+
+ private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
+
+ public BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) {
+ return value.divide(total, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
+ }
+
+ public BigDecimal percentOf(BigDecimal percentage, BigDecimal total) {
+ return percentage.multiply(total).divide(ONE_HUNDRED, 2, RoundingMode.HALF_UP);
+ }
+}
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java
new file mode 100644
index 0000000000..f00a9f3e35
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java
@@ -0,0 +1,16 @@
+package com.baeldung.algorithms.percentage;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class FastBigDecimalPercentage {
+
+ public static BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) {
+ return value.divide(total, 4, RoundingMode.HALF_UP).scaleByPowerOfTen(2);
+ }
+
+ public static BigDecimal percentOf(BigDecimal percentage, BigDecimal total) {
+ return percentage.multiply(total).scaleByPowerOfTen(-2);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java
new file mode 100644
index 0000000000..dac2cb4de6
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.algorithms.percentage;
+
+import org.hamcrest.number.BigDecimalCloseTo;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+public class BigDecimalPercentageUnitTest {
+ private BigDecimalPercentages pc = new BigDecimalPercentages();
+
+
+ @Test
+ public void shouldConvertToPercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000))));
+ }
+
+ @Test
+ public void shouldCalculatePercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000))));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java
new file mode 100644
index 0000000000..dd97e5881c
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.algorithms.percentage;
+
+import org.hamcrest.number.BigDecimalCloseTo;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+public class FastBigDecimalPercentageUnitTest {
+ private FastBigDecimalPercentage pc = new FastBigDecimalPercentage();
+
+
+ @Test
+ public void shouldConvertToPercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000))));
+ }
+
+ @Test
+ public void shouldCalculatePercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000))));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-operators-2/README.md b/core-java-modules/core-java-lang-operators-2/README.md
index e8b792e634..4b93f8d192 100644
--- a/core-java-modules/core-java-lang-operators-2/README.md
+++ b/core-java-modules/core-java-lang-operators-2/README.md
@@ -10,3 +10,4 @@ This module contains articles about Java operators
- [Check if at Least Two Out of Three Booleans Are True in Java](https://www.baeldung.com/java-check-two-of-three-booleans)
- [Alternatives for instanceof Operator in Java](https://www.baeldung.com/java-instanceof-alternatives)
- [What Does “––>†Mean in Java?](https://www.baeldung.com/java-minus-minus-greaterthan)
+- [All the Ways Java Uses the Colon Character](https://www.baeldung.com/java-colon)
diff --git a/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java b/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java
new file mode 100644
index 0000000000..873e28c3f6
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java
@@ -0,0 +1,178 @@
+package com.baeldung.colonexamples;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Connection;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Examples of the different ways Java uses the colon (:) character.
+ */
+public class ColonExamples {
+
+ private final static Logger LOG = LoggerFactory.getLogger(ColonExamples.class);
+
+ public void example1_enhancedForLoop() {
+
+ // Original style
+ for(int i = 0; i < 10; i++) {
+ // do something
+ }
+
+ // Using enhanced for loop
+ int[] numbers = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
+ for(int i : numbers) {
+ // do something
+ }
+
+ // Using List instead of array
+ List numbersList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ for(Integer i : numbersList) {
+ // do something
+ }
+ }
+
+ public void example2_switchStatement(String animal) {
+
+ // Original style
+ if(animal.equals("cat")) {
+ System.out.println("meow");
+ }
+ else if(animal.equals("lion")) {
+ System.out.println("roar");
+ }
+ else if(animal.equals("dog") || animal.equals("seal")) {
+ System.out.println("bark");
+ }
+ else {
+ System.out.println("unknown");
+ }
+
+ // Using switch statement
+ switch(animal) {
+ case "cat":
+ System.out.println("meow");
+ break;
+ case "lion":
+ System.out.println("roar");
+ break;
+ case "dog":
+ case "seal":
+ System.out.println("bark");
+ break;
+ default:
+ System.out.println("unknown");
+ }
+ }
+
+ public void example3_labels() {
+
+ // For loops without labels
+ for(int i = 0; i < 10; i++) {
+ for (int j = 0; j < 10; j++) {
+ if (checkSomeCondition()) {
+ break;
+ }
+ }
+ }
+
+ outterLoop: for(int i = 0; i < 10; i++) {
+ innerLoop: for (int j = 0; j < 10; j++) {
+ if (checkSomeCondition()) {
+ break outterLoop;
+ }
+ }
+ }
+ }
+
+ public void example4_ternaryOperator() {
+
+ // Original way using if/else
+ int x;
+ if(checkSomeCondition()) {
+ x = 1;
+ }
+ else {
+ x = 2;
+ }
+
+ // Using ternary operator
+ x = checkSomeCondition() ? 1 : 2;
+
+ // Using with other statements
+ boolean remoteCallResult = callRemoteApi();
+ LOG.info(String.format(
+ "The result of the remote API call %s successful",
+ remoteCallResult ? "was" : "was not"
+ ));
+ }
+
+ public void example5_methodReferences() {
+ // Original way without lambdas and method references
+ List names = Arrays.asList("ross", "joey", "chandler");
+ List upperCaseNames = new ArrayList<>();
+ for(String name : names) {
+ upperCaseNames.add(name.toUpperCase());
+ }
+
+ // Using method reference with stream map operation
+ List petNames = Arrays.asList("ross", "joey", "chandler");
+ List petUpperCaseNames = petNames
+ .stream()
+ .map(String::toUpperCase)
+ .collect(Collectors.toList());
+
+ // Method reference with stream filter
+ List pets = Arrays.asList(new Cat(), new Dog(), new Parrot());
+ List onlyDogs = pets
+ .stream()
+ .filter(Dog.class::isInstance)
+ .collect(Collectors.toList());
+
+ // Method reference with constructors
+ Set onlyDogsSet = pets
+ .stream()
+ .filter(Dog.class::isInstance)
+ .collect(Collectors.toCollection(TreeSet::new));
+ }
+
+ public void example6_asserttion() {
+ // Original way without assertions
+ Connection conn = getConnection();
+ if(conn == null) {
+ throw new RuntimeException("Connection is null");
+ }
+
+ // Using assert keyword
+ assert getConnection() != null : "Connection is null";
+ }
+
+ private boolean checkSomeCondition() {
+ return new Random().nextBoolean();
+ }
+
+ private boolean callRemoteApi() {
+ return new Random().nextBoolean();
+ }
+
+ private Connection getConnection() {
+ return null;
+ }
+
+ private static interface Animal {
+
+ }
+ private static class Dog implements Animal {
+
+ }
+
+ private static class Cat implements Animal {
+
+ }
+
+ private static class Parrot implements Animal {
+
+ }
+}
diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java
index 6ba8ed024c..dc81a0290b 100644
--- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java
@@ -11,55 +11,55 @@ import static org.junit.jupiter.api.Assertions.*;
public class InstanceOfUnitTest {
@Test
- void giveWhenInstanceIsCorrect_thenReturnTrue() {
+ void givenWhenInstanceIsCorrect_thenReturnTrue() {
Ring ring = new Ring();
assertTrue(ring instanceof Round);
}
@Test
- void giveWhenObjectIsInstanceOfType_thenReturnTrue() {
+ void givenWhenObjectIsInstanceOfType_thenReturnTrue() {
Circle circle = new Circle();
assertTrue(circle instanceof Circle);
}
@Test
- void giveWhenInstanceIsOfSubtype_thenReturnTrue() {
+ void givenWhenInstanceIsOfSubtype_thenReturnTrue() {
Circle circle = new Circle();
assertTrue(circle instanceof Round);
}
@Test
- void giveWhenTypeIsInterface_thenReturnTrue() {
+ void givenWhenTypeIsInterface_thenReturnTrue() {
Circle circle = new Circle();
assertTrue(circle instanceof Shape);
}
@Test
- void giveWhenTypeIsOfObjectType_thenReturnTrue() {
+ void givenWhenTypeIsOfObjectType_thenReturnTrue() {
Thread thread = new Thread();
assertTrue(thread instanceof Object);
}
@Test
- void giveWhenInstanceValueIsNull_thenReturnFalse() {
+ void givenWhenInstanceValueIsNull_thenReturnFalse() {
Circle circle = null;
assertFalse(circle instanceof Round);
}
@Test
- void giveWhenComparingClassInDiffHierarchy_thenCompilationError() {
+ void givenWhenComparingClassInDiffHierarchy_thenCompilationError() {
//assertFalse( circle instanceof Triangle);
}
@Test
- void giveWhenStream_whenCastWithoutInstanceOfChk_thenGetException() {
+ void givenWhenStream_whenCastWithoutInstanceOfChk_thenGetException() {
Stream roundStream = Stream.of(new Ring(), new Ring(), new Circle());
assertThrows(ClassCastException.class, () -> roundStream.map(it -> (Ring) it).collect(Collectors.toList()));
}
@Test
- void giveWhenStream_whenCastAfterInstanceOfChk_thenGetExpectedResult() {
+ void givenWhenStream_whenCastAfterInstanceOfChk_thenGetExpectedResult() {
Stream roundStream = Stream.of(new Ring(), new Ring(), new Circle());
List ringList = roundStream.filter(it -> it instanceof Ring).map(it -> (Ring) it).collect(Collectors.toList());
assertEquals(2, ringList.size());
diff --git a/core-java-modules/core-java-loops/README.md b/core-java-modules/core-java-loops/README.md
new file mode 100644
index 0000000000..5616cce48b
--- /dev/null
+++ b/core-java-modules/core-java-loops/README.md
@@ -0,0 +1 @@
+## Relevant Articles
diff --git a/core-java-modules/core-java-loops/pom.xml b/core-java-modules/core-java-loops/pom.xml
new file mode 100644
index 0000000000..c9ce86f54b
--- /dev/null
+++ b/core-java-modules/core-java-loops/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+ core-java-loops
+ core-java-loops
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
diff --git a/core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java b/core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java
new file mode 100644
index 0000000000..e8e20d4db7
--- /dev/null
+++ b/core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.loops;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+import org.junit.jupiter.api.Test;
+
+public class TheLastIterationInForEachUnitTest {
+
+ //@formatter:off
+ private static final List MOVIES = List.of(
+ "Titanic",
+ "The Deer Hunter",
+ "Lord of the Rings",
+ "One Flew Over the Cuckoo's Nest",
+ "No Country For Old Men");
+ //@formatter:on
+
+ @Test
+ void whenUsingForEach_thenGetTheLastElementAfterTheLoop() {
+ String myLastMovie = "";
+ for (String movie : MOVIES) {
+ // ... work with movie
+ myLastMovie = movie;
+ }
+ assertEquals("No Country For Old Men", myLastMovie);
+ }
+
+ @Test
+ void whenLoopingWithIndexes_thenGetExpectedResult() {
+ int size = MOVIES.size();
+ String myLastMovie = null;
+ for (int i = 0; i < size; i++) {
+ String movie = MOVIES.get(i);
+ // ... work with movie
+ if (i == size - 1) {
+ myLastMovie = movie;
+ }
+ }
+ assertEquals("No Country For Old Men", myLastMovie);
+ }
+
+ @Test
+ void whenUsingIntStream_thenGetExpectedResult() {
+ int size = MOVIES.size();
+ final Map myLastMovie = new HashMap<>();
+ IntStream.range(0, size)
+ .forEach(idx -> {
+ String movie = MOVIES.get(idx);
+ // ... work with movie
+ if (idx == size - 1) {
+ myLastMovie.put(idx, movie);
+ }
+ });
+ assertEquals(1, myLastMovie.size());
+ assertTrue(myLastMovie.containsKey(size - 1));
+ assertTrue(myLastMovie.containsValue("No Country For Old Men"));
+ }
+
+ @Test
+ void whenUsingCounter_thenGetExpectedResult() {
+ int size = MOVIES.size();
+ String myLastMovie = null;
+ int cnt = 0;
+ for (String movie : MOVIES) {
+ // ... work with movie
+ if (++cnt == size) {
+ myLastMovie = movie;
+ }
+ }
+ assertEquals("No Country For Old Men", myLastMovie);
+ }
+
+ @Test
+ void whenUsingIterator_thenGetExpectedResult() {
+ String movie;
+ String myLastMovie = null;
+ for (Iterator it = MOVIES.iterator(); it.hasNext(); ) {
+ movie = it.next();
+ // ... work with movie
+ if (!it.hasNext()) { // the last element
+ myLastMovie = movie;
+ }
+ }
+ assertEquals("No Country For Old Men", myLastMovie);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-numbers-7/README.md b/core-java-modules/core-java-numbers-7/README.md
new file mode 100644
index 0000000000..42a43fd1fd
--- /dev/null
+++ b/core-java-modules/core-java-numbers-7/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+- [Check if a double Is an Integer in Java](https://www.baeldung.com/java-check-double-integer)
diff --git a/core-java-modules/core-java-numbers-7/pom.xml b/core-java-modules/core-java-numbers-7/pom.xml
new file mode 100644
index 0000000000..dec3084108
--- /dev/null
+++ b/core-java-modules/core-java-numbers-7/pom.xml
@@ -0,0 +1,37 @@
+
+ 4.0.0
+ core-java-numbers-7
+ core-java-numbers-7
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ core-java-numbers-7
+
+
+ src/main/resources
+ true
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java
new file mode 100644
index 0000000000..a10a615e2f
--- /dev/null
+++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.bigdecimalzero;
+
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class BigDecimalZeroVsNewBigDecimalUnitTest {
+ @Test
+ void whenComparingZeroAndNewBigDecimal_thenGetExpectedResult() {
+ BigDecimal bd1 = new BigDecimal("42.00");
+ BigDecimal bd2 = new BigDecimal("42.0000");
+ assertEquals(0, bd1.compareTo(bd2));
+
+ assertNotEquals(bd1, bd2);
+
+ BigDecimal zero0 = new BigDecimal(0);
+ assertNotEquals(zero0, new BigDecimal("0.000"));
+
+ BigDecimal zero = BigDecimal.ZERO;
+ assertEquals(zero, zero0);
+ }
+
+ @Test
+ void whenCallingBigDecimalZero_thenAlwaysGetTheSameObject() {
+ BigDecimal z1 = BigDecimal.ZERO;
+ BigDecimal z2 = BigDecimal.ZERO;
+ assertSame(z1, z2);
+ }
+
+ @Test
+ void whenCallingNewBigDecimal_thenAlwaysGetTheSameObject() {
+ BigDecimal z1 = new BigDecimal(0);
+ BigDecimal z2 = new BigDecimal(0);
+ assertNotSame(z1, z2);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java
new file mode 100644
index 0000000000..90d2c52595
--- /dev/null
+++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.doubleisint;
+
+import com.google.common.math.DoubleMath;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class CheckDoubleIsAnIntegerUnitTest {
+
+ boolean notNaNOrInfinity(double d) {
+ return !(Double.isNaN(d) || Double.isInfinite(d));
+ }
+
+ @Test
+ void whenConvertingToInt_thenGetExpectedResult() {
+ double d1 = 42.0D;
+ boolean d1IsInteger = notNaNOrInfinity(d1) && (int) d1 == d1;
+ assertTrue(d1IsInteger);
+
+ double d2 = 42.42D;
+ boolean d2IsInteger = notNaNOrInfinity(d2) && (int) d2 == d2;
+ assertFalse(d2IsInteger);
+
+ double d3 = 2.0D * Integer.MAX_VALUE;
+ boolean d3IsInteger = notNaNOrInfinity(d3) && (int) d3 == d3;
+ assertTrue(!d3IsInteger); // <-- fails if exceeding Integer's range
+ }
+
+ @Test
+ void whenUsingModuloOperator_thenGetExpectedResult() {
+ double d1 = 42.0D;
+ boolean d1IsInteger = notNaNOrInfinity(d1) && (d1 % 1) == 0;
+ assertTrue(d1IsInteger);
+
+ double d2 = 42.42D;
+ boolean d2IsInteger = notNaNOrInfinity(d2) && (d2 % 1) == 0;
+ assertFalse(d2IsInteger);
+
+ double d3 = 2.0D * Integer.MAX_VALUE;
+ boolean d3IsInteger = notNaNOrInfinity(d3) && (d3 % 1) == 0;
+ assertTrue(d3IsInteger);
+
+ }
+
+
+ @Test
+ void whenCheckingFloorOrCeilingValue_thenGetExpectedResult() {
+ double d1 = 42.0D;
+ boolean d1IsInteger = notNaNOrInfinity(d1) && Math.floor(d1) == d1;
+ assertTrue(d1IsInteger);
+
+ double d2 = 42.42D;
+ boolean d2IsInteger = notNaNOrInfinity(d2) && Math.floor(d2) == d2;
+ assertFalse(d2IsInteger);
+
+ double d3 = 2.0D * Integer.MAX_VALUE;
+ boolean d3IsInteger = notNaNOrInfinity(d3) && Math.floor(d3) == d3;
+ assertTrue(d3IsInteger);
+
+ }
+
+ @Test
+ void whenUsingGuava_thenGetExpectedResult() {
+ double d1 = 42.0D;
+ boolean d1IsInteger = DoubleMath.isMathematicalInteger(d1);
+ assertTrue(d1IsInteger);
+
+ double d2 = 42.42D;
+ boolean d2IsInteger = DoubleMath.isMathematicalInteger(d2);
+ assertFalse(d2IsInteger);
+
+ double d3 = 2.0D * Integer.MAX_VALUE;
+ boolean d3IsInteger = DoubleMath.isMathematicalInteger(d3);
+ assertTrue(d3IsInteger);
+
+ boolean isInfinityInt = DoubleMath.isMathematicalInteger(Double.POSITIVE_INFINITY);
+ assertFalse(isInfinityInt);
+
+ boolean isNanInt = DoubleMath.isMathematicalInteger(Double.NaN);
+ assertFalse(isNanInt);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java
new file mode 100644
index 0000000000..a9e78c76a0
--- /dev/null
+++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java
@@ -0,0 +1,113 @@
+package com.baeldung.withoutscientificnotation;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.Locale;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class PrintDoubleWithoutScientificNotationUnitTest {
+
+ private final PrintStream standardOut = System.out;
+ private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream();
+
+ @BeforeEach
+ public void setUp() {
+ System.setOut(new PrintStream(outputStreamCaptor));
+ Locale.setDefault(Locale.US);
+ }
+
+ @AfterEach
+ public void tearDown() {
+ System.setOut(standardOut);
+ }
+
+ @Test
+ void givenLargeNumber_whenPrintWithDecimalFormat_thenOutputIsWithoutScientificNotation() {
+
+ DecimalFormat df = new DecimalFormat("#.###########");
+ double largeNumber = 256450000d;
+ System.out.println("Large Number: " + df.format(largeNumber));
+
+ Assertions.assertEquals("Large Number: 256450000", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenSmallNumber_whenPrintWithDecimalFormat_thenOutputIsWithoutScientificNotation() {
+
+ DecimalFormat df = new DecimalFormat("#.###########");
+ double smallNumber = 0.0000046d;
+ System.out.println("Small Number: " + df.format(smallNumber));
+
+ Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenLargeNumber_whenPrintWithPrintf_thenOutputIsWithoutScientificNotation() {
+
+ double largeNumber = 256450000d;
+ System.out.printf("Large Number: %.7f", largeNumber);
+
+ Assertions.assertEquals("Large Number: 256450000.0000000", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenSmallNumber_whenPrintWithPrintf_thenOutputIsWithoutScientificNotation() {
+
+ double smallNumber = 0.0000046d;
+ System.out.printf("Small Number: %.7f", smallNumber);
+
+ Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenLargeNumber_whenPrintWithBigDecimal_thenOutputIsWithoutScientificNotation() {
+
+ double largeNumber = 256450000d;
+ System.out.println("Large Number: " + BigDecimal.valueOf(largeNumber).toPlainString());
+
+ Assertions.assertEquals("Large Number: 256450000", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenSmallNumber_whenPrintWithBigDecimal_thenOutputIsWithoutScientificNotation() {
+
+ double smallNumber = 0.0000046d;
+ System.out.println("Small Number: " + BigDecimal.valueOf(smallNumber).toPlainString());
+
+ Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenLargeNumber_whenPrintWithStringFormat_thenOutputIsWithoutScientificNotation() {
+
+ double largeNumber = 256450000d;
+ String formattedLargeNumber = String.format("%.7f", largeNumber);
+ System.out.println("Large Number: " + formattedLargeNumber);
+
+ Assertions.assertEquals("Large Number: 256450000.0000000", outputStreamCaptor.toString()
+ .trim());
+ }
+
+ @Test
+ void givenSmallNumber_whenPrintWithStringFormat_thenOutputIsWithoutScientificNotation() {
+
+ double smallNumber = 0.0000046d;
+ String formattedSmallNumber = String.format("%.7f", smallNumber);
+ System.out.println("Small Number: " + formattedSmallNumber);
+
+ Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString()
+ .trim());
+ }
+}
diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md
index dead88f025..b5f02a9d47 100644
--- a/core-java-modules/core-java-numbers-conversions/README.md
+++ b/core-java-modules/core-java-numbers-conversions/README.md
@@ -4,3 +4,5 @@
- [Convert int to Long in Java](https://www.baeldung.com/java-convert-int-long)
- [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float)
- [Converting from float to BigDecimal in Java](https://www.baeldung.com/java-convert-float-bigdecimal)
+- [Convert Positive Integer to Negative and Vice Versa in Java](https://www.baeldung.com/java-negating-integer)
+- [Rounding Up a Number to Nearest Multiple of 5 in Java](https://www.baeldung.com/java-round-nearest-multiple-five)
diff --git a/core-java-modules/core-java-numbers-conversions/pom.xml b/core-java-modules/core-java-numbers-conversions/pom.xml
index d014675ead..43809e8453 100644
--- a/core-java-modules/core-java-numbers-conversions/pom.xml
+++ b/core-java-modules/core-java-numbers-conversions/pom.xml
@@ -27,7 +27,7 @@
junit
junit
- 4.13.2
+ ${junit.version}
test
diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java
new file mode 100644
index 0000000000..24090be343
--- /dev/null
+++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.roundnumbertonearestmultiple;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class RoundNumberToNearestMultipleUnitTest {
+
+ public static int originalNumber = 18;
+ public static int expectedRoundedNumber = 20;
+ public static int nearest = 5;
+
+ @Test
+ public void givenNumber_whenUsingBasicMathOperations_thenRoundUpToNearestMultipleOf5() {
+
+ int roundedNumber = (originalNumber % nearest == 0) ? originalNumber : ((originalNumber / nearest) + 1) * nearest;
+ assertEquals(expectedRoundedNumber, roundedNumber);
+ }
+
+ @Test
+ public void givenNumber_whenUsingMathCeil_thenRoundUpToNearestMultipleOf5() {
+
+ int roundedNumber = (int) (Math.ceil(originalNumber / (float) (nearest)) * nearest);
+ assertEquals(expectedRoundedNumber, roundedNumber);
+ }
+
+ @Test
+ public void givenNumber_whenUsingMathRound_thenRoundUpToNearestMultipleOf5() {
+
+ int roundedNumber = Math.round(originalNumber / (float) (nearest)) * nearest;
+ assertEquals(expectedRoundedNumber, roundedNumber);
+ }
+
+ @Test
+ public void givenNumber_whenUsingMathFloor_thenRoundUpToNearestMultipleOf5() {
+
+ int roundedNumber = (int) (Math.floor((double) (originalNumber + nearest / 2) / nearest) * nearest);
+ assertEquals(expectedRoundedNumber, roundedNumber);
+ }
+
+}
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java
index 27bc750d8a..849f71dc03 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java
@@ -23,7 +23,7 @@ public class AppUnitTest {
soundRecorder.build(af);
try {
soundRecorder.start();
- Thread.sleep(20000);
+ Thread.sleep(5000);
soundRecorder.stop();
} catch (InterruptedException ex) {
fail("Exception: " + ex);
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java
index c3f390d8ae..dae1a705ed 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java
@@ -69,7 +69,7 @@ public class ProcessApiUnitTest {
});
});
- Thread.sleep(10000);
+ Thread.sleep(5000);
childProc = ProcessHandle.current().children();
childProc.forEach(procHandle -> {
@@ -100,7 +100,7 @@ public class ProcessApiUnitTest {
private void waistCPU() throws NoSuchAlgorithmException {
ArrayList randArr = new ArrayList(4096);
SecureRandom sr = SecureRandom.getInstanceStrong();
- Duration somecpu = Duration.ofMillis(4200L);
+ Duration somecpu = Duration.ofMillis(2000L);
Instant end = Instant.now().plus(somecpu);
while (Instant.now().isBefore(end)) {
// System.out.println(sr.nextInt());
diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java
index c98eef5ed1..bef910024d 100644
--- a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java
+++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java
@@ -9,7 +9,7 @@ import org.slf4j.LoggerFactory;
public class CombiningUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(CombiningUnitTest.class);
- public static final int TOP = 10000000;
+ public static final int TOP = 1000000;
public static final double FRACTION = 0.1;
@Test
diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java
index 6f80624502..3a434d942b 100644
--- a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java
+++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java
@@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory;
public class IfUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(IfUnitTest.class);
- public static final int TOP = 10000000;
+ public static final int TOP = 1000000;
@Test
public void majorBranchSorted() {
diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java
index 6af40bd57a..0def407e73 100644
--- a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java
+++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java
@@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory;
public class SortingUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(SortingUnitTest.class);
- public static final int BIG = 10000000;
+ public static final int BIG = 1000000;
public static final int SMALL = 100000;
@Test
diff --git a/core-java-modules/core-java-reflection-3/pom.xml b/core-java-modules/core-java-reflection-3/pom.xml
index fa5fe897e0..e60652f1f2 100644
--- a/core-java-modules/core-java-reflection-3/pom.xml
+++ b/core-java-modules/core-java-reflection-3/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
core-java-reflection-3
core-java-reflection-3
diff --git a/core-java-modules/core-java-security-4/README.md b/core-java-modules/core-java-security-4/README.md
index 236715713b..3c910e50be 100644
--- a/core-java-modules/core-java-security-4/README.md
+++ b/core-java-modules/core-java-security-4/README.md
@@ -5,4 +5,5 @@ This module contains articles about core Java Security
### Relevant Articles:
- [Check if Certificate Is Self-Signed or CA-Signed With Java](https://www.baeldung.com/java-check-certificate-sign)
- [Extract CN From X509 Certificate in Java](https://www.baeldung.com/java-extract-common-name-x509-certificate)
+- [Check Certificate Name and Alias in Keystore File](https://www.baeldung.com/java-keystore-check-certificate-name-alias)
- More articles: [[<-- prev]](/core-java-modules/core-java-security-3)
diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml
index e832cc1616..383f14d573 100644
--- a/core-java-modules/core-java-streams-4/pom.xml
+++ b/core-java-modules/core-java-streams-4/pom.xml
@@ -71,7 +71,7 @@
io.projectreactor
reactor-core
- ${io.reactor3.version}
+ ${reactor-core.version}
org.apache.commons
@@ -121,7 +121,7 @@
2.2.2
3.1.5
1.0.0-alpha-4
- 3.5.1
+ 3.6.0
4.4
10.4.1
diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md
index dfd5a649b5..41fcb129df 100644
--- a/core-java-modules/core-java-streams-5/README.md
+++ b/core-java-modules/core-java-streams-5/README.md
@@ -8,3 +8,5 @@
- [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration)
- [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap)
- [How to Avoid NoSuchElementException in Stream API](https://www.baeldung.com/java-streams-api-avoid-nosuchelementexception)
+- [Get Index of First Element Matching Boolean Using Java Streams](https://www.baeldung.com/java-streams-find-first-match-index)
+- [Handling NullPointerException in findFirst() When the First Element Is Null](https://www.baeldung.com/java-handle-nullpointerexception-findfirst-first-null)
diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml
index e217271f4c..33cd69f761 100644
--- a/core-java-modules/core-java-streams-5/pom.xml
+++ b/core-java-modules/core-java-streams-5/pom.xml
@@ -48,6 +48,11 @@
guava
${guava.version}
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java
new file mode 100644
index 0000000000..cb29af529a
--- /dev/null
+++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java
@@ -0,0 +1,21 @@
+package com.baeldung.streams.firstmatchingelement;
+
+public class User {
+
+ private String userName;
+ private Integer userId;
+
+ public User(Integer userId, String userName) {
+ this.userId = userId;
+ this.userName = userName;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java
new file mode 100644
index 0000000000..074aec29d6
--- /dev/null
+++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.findfirstnullpointerexception;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Function;
+
+import org.junit.Test;
+
+public class FindFirstNullPointerExceptionUnitTest {
+
+ private final List inputs = Arrays.asList(null, "foo", "bar");
+
+ @Test(expected = NullPointerException.class)
+ public void givenStream_whenCallingFindFirst_thenThrowNullPointerException() {
+ Optional firstElement = inputs.stream()
+ .findFirst();
+ }
+
+ @Test
+ public void givenStream_whenUsingOfNullableBeforeFindFirst_thenCorrect() {
+ Optional firstElement = inputs.stream()
+ .map(Optional::ofNullable)
+ .findFirst()
+ .flatMap(Function.identity());
+
+ assertTrue(firstElement.isEmpty());
+ }
+
+ @Test
+ public void givenStream_whenUsingFilterBeforeFindFirst_thenCorrect() {
+ Optional firstNonNullElement = inputs.stream()
+ .filter(Objects::nonNull)
+ .findFirst();
+
+ assertTrue(firstNonNullElement.isPresent());
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java
new file mode 100644
index 0000000000..0820138b3b
--- /dev/null
+++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.streams.firstmatchingelement;
+
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+
+import org.apache.commons.collections4.IterableUtils;
+import org.junit.Test;
+
+import com.google.common.collect.Iterables;
+
+public class FirstMatchingElementUnitTest {
+
+ private List userList = List.of(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John"));
+ private String searchName = "John";
+
+ @Test
+ public void whenUsingStream_thenFindFirstMatchingUserIndex() {
+ AtomicInteger counter = new AtomicInteger(-1);
+ int index = userList.stream()
+ .filter(user -> {
+ counter.getAndIncrement();
+ return searchName.equals(user.getUserName());
+ })
+ .mapToInt(user -> counter.get())
+ .findFirst()
+ .orElse(-1);
+
+ assertEquals(1, index);
+ }
+
+ @Test
+ public void whenUsingIntStream_thenFindFirstMatchingUserIndex() {
+ int index = IntStream.range(0, userList.size())
+ .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName()))
+ .findFirst()
+ .orElse(-1);
+ assertEquals(1, index);
+ }
+
+ @Test
+ public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() {
+ long predicateIndex = userList.stream()
+ .takeWhile(user -> !user.getUserName().equals(searchName))
+ .count();
+ assertEquals(1, predicateIndex);
+ }
+
+ @Test
+ public void whenUsingTakeWhile_thenFindIndexFromNoMatchingElement() {
+ List userList = List.of(new User(1, "David"), new User(2, "Vick"), new User(3, "Roger"), new User(4, "James"));
+ long predicateIndex = userList.stream()
+ .takeWhile(user -> !user.getUserName().equals(searchName))
+ .count();
+ assertEquals(4, predicateIndex);
+ }
+
+ @Test
+ public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() {
+ int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName()));
+ assertEquals(1, index);
+ }
+
+ @Test
+ public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() {
+ int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName()));
+ assertEquals(1, index);
+ }
+}
diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md
index adb4c1dda1..158ae84591 100644
--- a/core-java-modules/core-java-streams/README.md
+++ b/core-java-modules/core-java-streams/README.md
@@ -12,4 +12,5 @@ This module contains articles about the Stream API in Java.
- [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count)
- [Summing Numbers with Java Streams](https://www.baeldung.com/java-stream-sum)
- [How to Find All Getters Returning Null](https://www.baeldung.com/java-getters-returning-null)
+- [Skip Bytes in InputStream in Java](https://www.baeldung.com/java-inputstream-skip-bytes)
- More articles: [[next -->]](/../core-java-streams-2)
diff --git a/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java
new file mode 100644
index 0000000000..a41e5642fe
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.skipinputstream;
+
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.junit.Assert.assertArrayEquals;
+
+public class SkipInputStreamUnitTest {
+ @Test
+ public void givenInputStreamWithBytes_whenSkipBytes_thenRemainingBytes() throws IOException {
+ byte[] inputData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ InputStream inputStream = new ByteArrayInputStream(inputData);
+
+ long bytesToSkip = 3;
+ long skippedBytes = inputStream.skip(bytesToSkip);
+
+ assertArrayEquals(new byte[]{4, 5, 6, 7, 8, 9, 10}, readRemainingBytes(inputStream));
+
+ assert skippedBytes == bytesToSkip : "Incorrect number of bytes skipped";
+ }
+
+ private byte[] readRemainingBytes(InputStream inputStream) throws IOException {
+ byte[] buffer = new byte[inputStream.available()];
+ int bytesRead = inputStream.read(buffer);
+ if (bytesRead == -1) {
+ throw new IOException("End of stream reached");
+ }
+ return buffer;
+ }
+}
diff --git a/core-java-modules/core-java-string-algorithms-4/README.md b/core-java-modules/core-java-string-algorithms-4/README.md
new file mode 100644
index 0000000000..0651448493
--- /dev/null
+++ b/core-java-modules/core-java-string-algorithms-4/README.md
@@ -0,0 +1,5 @@
+## Java String Algorithms
+
+This module contains articles about string-related algorithms.
+
+### Relevant Articles:
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-4/pom.xml b/core-java-modules/core-java-string-algorithms-4/pom.xml
new file mode 100644
index 0000000000..b374b48743
--- /dev/null
+++ b/core-java-modules/core-java-string-algorithms-4/pom.xml
@@ -0,0 +1,14 @@
+
+ 4.0.0
+ core-java-string-algorithms-4
+ core-java-string-algorithms-4
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java b/core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java
new file mode 100644
index 0000000000..92bbc48c98
--- /dev/null
+++ b/core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.string.shiftchar;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+public class ShiftCharInStringUnitTest {
+
+ private final static String STRING = "abcdefg";
+
+ private final static String EXPECT_1X = "gabcdef";
+ private final static String EXPECT_2X = "fgabcde";
+ private final static String EXPECT_3X = "efgabcd";
+ private final static String EXPECT_6X = "bcdefga";
+ private final static String EXPECT_7X = "abcdefg";
+ private final static String EXPECT_24X = "efgabcd";
+
+ private final static String B_EXPECT_1X = "bcdefga";
+ private final static String B_EXPECT_2X = "cdefgab";
+ private final static String B_EXPECT_3X = "defgabc";
+ private final static String B_EXPECT_6X = "gabcdef";
+ private final static String B_EXPECT_7X = "abcdefg";
+ private final static String B_EXPECT_24X = "defgabc";
+
+ static String rotateString1(String s, int c, boolean forward) {
+ if (c < 0) {
+ throw new IllegalArgumentException("Rotation character count cannot be negative!");
+ }
+ int len = s.length();
+ int n = c % len;
+ if (n == 0) {
+ return s;
+ }
+ n = forward ? n : len - n;
+ return s.substring(len - n, len) + s.substring(0, len - n);
+ }
+
+ static String rotateString2(String s, int c, boolean forward) {
+ if (c < 0) {
+ throw new IllegalArgumentException("Rotation character count cannot be negative!");
+ }
+ int len = s.length();
+ int n = c % len;
+ if (n == 0) {
+ return s;
+ }
+ String ss = s + s;
+ n = forward ? n : len - n;
+ return ss.substring(len - n, 2 * len - n);
+ }
+
+ static boolean rotatedFrom(String rotated, String rotateFrom) {
+ return rotateFrom.length() == rotated.length() && (rotateFrom + rotateFrom).contains(rotated);
+ }
+
+ @Test
+ void whenUsingRotateString1_thenGetExpectedResults() {
+ assertEquals(EXPECT_1X, rotateString1(STRING, 1, true));
+ assertEquals(EXPECT_2X, rotateString1(STRING, 2, true));
+ assertEquals(EXPECT_3X, rotateString1(STRING, 3, true));
+ assertEquals(EXPECT_6X, rotateString1(STRING, 6, true));
+ assertEquals(EXPECT_7X, rotateString1(STRING, 7, true));
+ assertEquals(EXPECT_24X, rotateString1(STRING, 24, true));
+
+ //backward
+ assertEquals(B_EXPECT_1X, rotateString1(STRING, 1, false));
+ assertEquals(B_EXPECT_2X, rotateString1(STRING, 2, false));
+ assertEquals(B_EXPECT_3X, rotateString1(STRING, 3, false));
+ assertEquals(B_EXPECT_6X, rotateString1(STRING, 6, false));
+ assertEquals(B_EXPECT_7X, rotateString1(STRING, 7, false));
+ assertEquals(B_EXPECT_24X, rotateString1(STRING, 24, false));
+ }
+
+ @Test
+ void whenUsingShiftString2_thenGetExpectedResults() {
+ assertEquals(EXPECT_1X, rotateString2(STRING, 1, true));
+ assertEquals(EXPECT_2X, rotateString2(STRING, 2, true));
+ assertEquals(EXPECT_3X, rotateString2(STRING, 3, true));
+ assertEquals(EXPECT_6X, rotateString2(STRING, 6, true));
+ assertEquals(EXPECT_7X, rotateString2(STRING, 7, true));
+ assertEquals(EXPECT_24X, rotateString2(STRING, 24, true));
+
+ //backward
+ assertEquals(B_EXPECT_1X, rotateString2(STRING, 1, false));
+ assertEquals(B_EXPECT_2X, rotateString2(STRING, 2, false));
+ assertEquals(B_EXPECT_3X, rotateString2(STRING, 3, false));
+ assertEquals(B_EXPECT_6X, rotateString2(STRING, 6, false));
+ assertEquals(B_EXPECT_7X, rotateString2(STRING, 7, false));
+ assertEquals(B_EXPECT_24X, rotateString2(STRING, 24, false));
+ }
+
+ @Test
+ void whenUsingRotateFrom_thenGetExpectedResults() {
+ assertTrue(rotatedFrom(EXPECT_7X, STRING));
+ assertTrue(rotatedFrom(B_EXPECT_3X, STRING));
+ assertFalse(rotatedFrom("abcefgd", STRING));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java
new file mode 100644
index 0000000000..1cdbfb9df9
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.stringtocharlist;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class StringToCharListUnitTest {
+ public String inputString = "Convert a String to a List of Characters in Java";
+
+ @Test
+ public void givenString_whenUsingToCharArray_thenConvertToCharList() {
+ char[] charArray = inputString.toCharArray();
+
+ List charList = new ArrayList<>();
+ for (char c : charArray) {
+ charList.add(c);
+ }
+
+ assertEquals(inputString.length(), charList.size());
+ }
+
+ @Test
+ public void givenString_whenUsingMapToObj_thenConvertToCharList() {
+ List charList = inputString.chars()
+ .mapToObj(c -> (char) c)
+ .toList();
+
+ assertEquals(inputString.length(), charList.size());
+ }
+
+ @Test
+ public void givenString_whenUsingSplit_thenConvertToStringList() {
+ String[] charArray = inputString.split("");
+
+ List charList = Arrays.asList(charArray);
+
+ assertEquals(inputString.length(), charList.size());
+ }
+
+ @Test
+ public void givenString_whenUsingGuavaLists_thenConvertToCharList() {
+ List charList = Lists.charactersOf(inputString);
+
+ assertEquals(inputString.length(), charList.size());
+ }
+
+ @Test
+ public void givenString_whenUsingCodePoints_thenConvertToCharList() {
+ List charList = inputString.codePoints()
+ .mapToObj(c -> (char) c)
+ .toList();
+
+ assertEquals(inputString.length(), charList.size());
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml
index 27071e5427..76f21aa726 100644
--- a/core-java-modules/core-java-string-operations-2/pom.xml
+++ b/core-java-modules/core-java-string-operations-2/pom.xml
@@ -44,10 +44,10 @@
commons-codec
${commons-codec.version}
-
- org.springframework
- spring-core
- ${spring-core.version}
+
+ org.springframework
+ spring-core
+ ${spring-core.version}
diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml
index 0558e71a35..59d14805a0 100644
--- a/core-java-modules/core-java-string-operations-3/pom.xml
+++ b/core-java-modules/core-java-string-operations-3/pom.xml
@@ -72,7 +72,7 @@
5.3.9
3.6.3
6.1.1
- 2.11.1
+ 2.16.0
3.1.0
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java
index 145e9788e4..a99778201a 100644
--- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java
@@ -87,7 +87,7 @@ public class VersionComparisonUnitTest {
assertTrue(version1_1_maven.compareTo(version1_1_gradle) < 0);
Version version1_1_snapshot = new Version(1, 1, 0, "snapshot", null, null);
- assertEquals(0, version1_1.compareTo(version1_1_snapshot));
+ assertEquals(1, version1_1.compareTo(version1_1_snapshot));
assertTrue(version1_1_snapshot.isSnapshot());
}
diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md
index a05485ccb9..a0460f26d2 100644
--- a/core-java-modules/core-java-string-operations-7/README.md
+++ b/core-java-modules/core-java-string-operations-7/README.md
@@ -6,3 +6,4 @@
- [Create a Mutable String in Java](https://www.baeldung.com/java-mutable-string)
- [Check if a String Contains a Number Value in Java](https://www.baeldung.com/java-string-number-presence)
- [Difference Between String isEmpty() and isBlank()](https://www.baeldung.com/java-string-isempty-vs-isblank)
+- [String’s Maximum Length in Java](https://www.baeldung.com/java-strings-maximum-length)
diff --git a/core-java-modules/core-java-string-operations-7/pom.xml b/core-java-modules/core-java-string-operations-7/pom.xml
index 33a74365bc..cea3e32f2f 100644
--- a/core-java-modules/core-java-string-operations-7/pom.xml
+++ b/core-java-modules/core-java-string-operations-7/pom.xml
@@ -24,6 +24,21 @@
commons-text
${commons-text.version}
+
+ org.apache.tika
+ tika-core
+ ${apache.tika.version}
+
+
+ org.apache.tika
+ tika-parsers-standard-package
+ ${apache.tika.version}
+
+
+ com.ibm.icu
+ icu4j
+ ${icu4j.version}
+
org.junit.jupiter
junit-jupiter
@@ -60,7 +75,9 @@
11
11
3.13.0
+ 2.9.1
1.10.0
+ 74.1
4.25.0
diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java
new file mode 100644
index 0000000000..42d0c05582
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java
@@ -0,0 +1,35 @@
+package com.baeldung.stringmaxlength;
+
+public class StringMaxLengthMain {
+
+ public static void main(String[] args) {
+ displayRuntimeMaxStringLength();
+ displayMaxStringLength();
+ simulateStringOverflow();
+ }
+
+ public static void simulateStringOverflow() {
+ try {
+ int maxLength = Integer.MAX_VALUE;
+ char[] charArray = new char[maxLength];
+ for (int i = 0; i < maxLength; i++) {
+ charArray[i] = 'a';
+ }
+ String longString = new String(charArray);
+ System.out.println("Successfully created a string of length: " + longString.length());
+ } catch (OutOfMemoryError e) {
+ System.err.println("Overflow error: Attempting to create a string longer than Integer.MAX_VALUE");
+ e.printStackTrace();
+ }
+ }
+
+ public static void displayRuntimeMaxStringLength() {
+ long maxMemory = Runtime.getRuntime().maxMemory();
+ System.out.println("Maximum String length based on available memory: " + (maxMemory));
+ }
+
+ public static void displayMaxStringLength() {
+ int maxStringLength = Integer.MAX_VALUE;
+ System.out.println("Maximum String length based on Integer.MAX_VALUE: " + maxStringLength);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java
new file mode 100644
index 0000000000..c018cca718
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java
@@ -0,0 +1,98 @@
+package com.baeldung.compareany;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+@State(Scope.Benchmark)
+@BenchmarkMode(Mode.AverageTime)
+@Warmup(iterations = 2)
+@Measurement(iterations = 5)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@Fork(value = 1)
+public class CompareAnyBenchmark {
+ private final String[] groupOfFruits = {"Apple", "Mango", "Dragon Fruit", "Water Melon", "Avocado", "Guava", "Orange"};
+ private final String fruit = "Apple";
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingStringUtils() {
+ return StringUtils.equalsAny(fruit, groupOfFruits);
+ }
+
+ @Benchmark
+ public boolean compareCaseInsensitiveWithMultipleStringsUsingStringUtils() {
+ return StringUtils.equalsAnyIgnoreCase(fruit, groupOfFruits);
+ }
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingSet() {
+ return Set.of(groupOfFruits).contains(fruit);
+ }
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingList() {
+ return List.of(groupOfFruits).contains(fruit);
+ }
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingRegularExpression() {
+ return fruit.matches(String.join("|", groupOfFruits));
+ }
+
+ @Benchmark
+ public boolean compareCaseInsensitiveWithMultipleStringsUsingRegularExpression() {
+ return fruit.matches("(?i)" + String.join("|", groupOfFruits));
+ }
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingStream() {
+ return Arrays.stream(groupOfFruits).anyMatch(fruit::equals);
+ }
+
+ @Benchmark
+ public boolean compareCaseInsensitiveWithMultipleStringsUsingStream() {
+ return Arrays.stream(groupOfFruits).anyMatch(fruit::equalsIgnoreCase);
+ }
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingArrayUtils() {
+ return ArrayUtils.contains(groupOfFruits, fruit);
+ }
+
+ @Benchmark
+ public boolean compareWithMultipleStringsUsingIf() {
+ for(String s : groupOfFruits) {
+ if (fruit.equals(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder().include(CompareAnyBenchmark.class.getSimpleName())
+ .threads(1)
+ .shouldFailOnError(true)
+ .shouldDoGC(true)
+ .jvmArgs("-server")
+ .build();
+ new Runner(options).run();
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java
new file mode 100644
index 0000000000..052be2fe58
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java
@@ -0,0 +1,150 @@
+package com.baeldung.compareany;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+
+public class CompareAnyUnitTest {
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingIf_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingIf(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingIf(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingArrayUtils_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingArrayUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingArrayUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingStringUtils_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareCaseInsensitiveWithMultipleStringsUsingStringUtils_thenSuccess() {
+ String presentString = "APPLE";
+ String notPresentString = "AVOCADO";
+
+ assertTrue(compareCaseInsensitiveWithMultipleStringsUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareCaseInsensitiveWithMultipleStringsUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingStream_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareCaseInsensitiveWithMultipleStringsUsingStream_thenSuccess() {
+ String presentString = "APPLE";
+ String notPresentString = "AVOCADO";
+
+ assertTrue(compareCaseInsensitiveWithMultipleStringsUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareCaseInsensitiveWithMultipleStringsUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingSet_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingSet(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingList_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingList(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingList(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareWithMultipleStringsUsingRegularExpression_thenSuccess() {
+ String presentString = "Apple";
+ String notPresentString = "Avocado";
+
+ assertTrue(compareWithMultipleStringsUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareWithMultipleStringsUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ @Test
+ void givenStrings_whenCompareCaseInsensitiveWithMultipleStringsUsingRegularExpression_thenSuccess() {
+ String presentString = "APPLE";
+ String notPresentString = "AVOCADO";
+
+ assertTrue(compareCaseInsensitiveWithMultipleStringsUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ assertFalse(compareCaseInsensitiveWithMultipleStringsUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple"));
+ }
+
+ private boolean compareWithMultipleStringsUsingIf(String str, String... strs) {
+ for (String s : strs) {
+ if (str.equals(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean compareWithMultipleStringsUsingStringUtils(String str, String... strs) {
+ return StringUtils.equalsAny(str, strs);
+ }
+
+ private boolean compareCaseInsensitiveWithMultipleStringsUsingStringUtils(String str, String... strs) {
+ return StringUtils.equalsAnyIgnoreCase(str, strs);
+ }
+
+ private boolean compareWithMultipleStringsUsingSet(String str, String... strs) {
+ return Set.of(strs).contains(str);
+ }
+
+ private boolean compareWithMultipleStringsUsingList(String str, String... strs) {
+ return List.of(strs).contains(str);
+ }
+
+ private boolean compareWithMultipleStringsUsingRegularExpression(String str, String... strs) {
+ return str.matches(String.join("|", strs));
+ }
+
+ private boolean compareCaseInsensitiveWithMultipleStringsUsingRegularExpression(String str, String... strs) {
+ return str.matches("(?i)" + String.join("|", strs));
+ }
+
+ private boolean compareWithMultipleStringsUsingStream(String str, String... strs) {
+ return Arrays.stream(strs).anyMatch(str::equals);
+ }
+
+ private boolean compareCaseInsensitiveWithMultipleStringsUsingStream(String str, String... strs) {
+ return Arrays.stream(strs).anyMatch(str::equalsIgnoreCase);
+ }
+
+ private boolean compareWithMultipleStringsUsingArrayUtils(String str, String... strs) {
+ return ArrayUtils.contains(strs, str);
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java
new file mode 100644
index 0000000000..8d95b5533a
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.stringbuilderhaschar;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class CheckIfStringBuilderContainsCharUnitTest {
+
+ StringBuilder stringBuilder = new StringBuilder("Welcome to Baeldung Java Tutorial!");
+ char targetChar = 'o';
+
+ @Test
+ public void givenStringBuilder_whenUsingIndexOfMethod_thenCheckIfSCharExists() {
+ int index = stringBuilder.indexOf(String.valueOf(targetChar));
+ assertTrue(index != -1);
+ }
+
+ @Test
+ public void givenStringBuilder_whenUsingContainsMethod_thenCheckIfSCharExists() {
+ boolean containsChar = stringBuilder.toString().contains(String.valueOf(targetChar));
+ assertTrue(containsChar);
+ }
+
+ @Test
+ public void givenStringBuilder_whenUsingJavaStream_thenCheckIfSCharExists() {
+ boolean charFound = stringBuilder.chars().anyMatch(c -> c == targetChar);
+
+ assertTrue(charFound);
+ }
+
+ @Test
+ public void givenStringBuilder_whenUsingIterations_thenCheckIfSCharExists() {
+ boolean charFound = false;
+
+ for (int i = 0; i < stringBuilder.length(); i++) {
+ if (stringBuilder.charAt(i) == targetChar) {
+ charFound = true;
+ break;
+ }
+ }
+
+ assertTrue(charFound);
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java
new file mode 100644
index 0000000000..7e737bad1d
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java
@@ -0,0 +1,108 @@
+package com.baeldung.utf8validation;
+
+import com.ibm.icu.text.CharsetDetector;
+import com.ibm.icu.text.CharsetMatch;
+import org.apache.tika.detect.EncodingDetector;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.txt.UniversalEncodingDetector;
+import org.junit.jupiter.api.Test;
+
+import java.io.*;
+import java.nio.CharBuffer;
+import java.nio.charset.*;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class UTF8ValidationUnitTest {
+
+ private static final String UTF8_STRING = "Hello ä½ å¥½";
+
+ private static final byte[] UTF8_BYTES = UTF8_STRING.getBytes(StandardCharsets.UTF_8);
+
+ private static final byte[] INVALID_UTF8_BYTES = {(byte) 0xF0, (byte) 0xC1, (byte) 0x8C, (byte) 0xBC, (byte) 0xD1};
+
+ private static final InputStream ENGLISH_INPUTSTREAM = new ByteArrayInputStream("Hello".getBytes(StandardCharsets.UTF_8));
+
+ private static final InputStream UTF8_INPUTSTREAM = new ByteArrayInputStream(UTF8_BYTES);
+
+ private static final InputStream INVALID_UTF8_INPUTSTREAM = new ByteArrayInputStream(INVALID_UTF8_BYTES);
+
+ @Test
+ void whenConvertValidUTF8BytesToString_thenReturnExpectedString() {
+ String decodedStr = new String(UTF8_BYTES, StandardCharsets.UTF_8);
+ assertEquals(UTF8_STRING, decodedStr);
+ }
+
+ @Test
+ void whenConvertInvalidUTF8BytesToString_thenReturnReplacementCharacters() {
+ String decodedStr = new String(INVALID_UTF8_BYTES, StandardCharsets.UTF_8);
+ assertEquals("�����", decodedStr);
+ }
+
+ @Test
+ void whenDecodeValidUTF8Bytes_thenSucceeds() throws CharacterCodingException {
+
+ CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder();
+ CharBuffer decodedCharBuffer = charsetDecoder.decode(java.nio.ByteBuffer.wrap(UTF8_BYTES));
+ assertEquals(UTF8_STRING, decodedCharBuffer.toString());
+ }
+
+ @Test
+ void whenDecodeInvalidUTF8Bytes_thenThrowsMalformedInputException() {
+
+ CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder();
+ assertThrows(MalformedInputException.class,() -> {charsetDecoder.decode(java.nio.ByteBuffer.wrap(INVALID_UTF8_BYTES));});
+ }
+
+ @Test
+ void whenValidateValidInputStreamByTika_thenReturnsUTF8() throws IOException {
+
+ EncodingDetector encodingDetector = new UniversalEncodingDetector();
+ Charset detectedCharset = encodingDetector.detect(UTF8_INPUTSTREAM, new Metadata());
+ assertEquals(StandardCharsets.UTF_8, detectedCharset);
+ }
+
+ @Test
+ void whenValidateValidEnglishInputStreamByTika_thenReturnsISO_88591_1() throws IOException {
+
+ EncodingDetector encodingDetector = new UniversalEncodingDetector();
+ Charset detectedCharset = encodingDetector.detect(ENGLISH_INPUTSTREAM, new Metadata());
+ assertEquals(StandardCharsets.ISO_8859_1, detectedCharset);
+ }
+
+ @Test
+ void whenValidateInvalidInputStreamByTika_thenReturnsNull() throws IOException {
+
+ EncodingDetector encodingDetector = new UniversalEncodingDetector();
+ Charset detectedCharset = encodingDetector.detect(INVALID_UTF8_INPUTSTREAM, new Metadata());
+ assertNull(detectedCharset);
+ }
+
+ @Test
+ void whenValidateValidInputStreamByICU4J_thenReturnsUTF8() throws IOException {
+
+ CharsetDetector detector = new CharsetDetector();
+ detector.setText(UTF8_INPUTSTREAM);
+ CharsetMatch charsetMatch = detector.detect();
+ assertEquals(StandardCharsets.UTF_8.name(), charsetMatch.getName());
+ }
+
+ @Test
+ void whenValidateValidEnglishInputStreamByICU4J_thenReturnsISO_8859_1() throws IOException {
+
+ CharsetDetector detector = new CharsetDetector();
+ detector.setText(ENGLISH_INPUTSTREAM);
+ CharsetMatch charsetMatch = detector.detect();
+ assertEquals(StandardCharsets.ISO_8859_1.name(), charsetMatch.getName());
+ }
+
+ @Test
+ void whenValidateValidInputStreamByICU4J_thenReturnsNotEqualToUTF_8() throws IOException {
+
+ CharsetDetector detector = new CharsetDetector();
+ detector.setText(INVALID_UTF8_INPUTSTREAM);
+ CharsetMatch charsetMatch = detector.detect();
+ assertNotEquals(StandardCharsets.UTF_8.name(), charsetMatch.getName());
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md
index e782793fea..82dfcca884 100644
--- a/core-java-modules/core-java-strings/README.md
+++ b/core-java-modules/core-java-strings/README.md
@@ -16,3 +16,4 @@ Listed here there are only those articles that does not fit into other core-java
- [Reuse StringBuilder for Efficiency](https://www.baeldung.com/java-reuse-stringbuilder-for-efficiency)
- [How to Iterate Over the String Characters in Java](https://www.baeldung.com/java-iterate-string-characters)
- [Passing Strings by Reference in Java](https://www.baeldung.com/java-method-pass-string-reference)
+- [String vs StringBuffer Comparison in Java](https://www.baeldung.com/java-string-vs-stringbuffer)
diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java
index 28cd2e64e9..4d045fe318 100644
--- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java
+++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java
@@ -28,6 +28,7 @@ public class ComparePerformance {
@Benchmark
public String benchmarkStringConcatenation() {
+ strFinal = "";
strFinal += strInitial;
return strFinal;
}
diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java
new file mode 100644
index 0000000000..02904ad2fc
--- /dev/null
+++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.extractjava;
+
+import com.sun.source.tree.ClassTree;
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.util.JavacTask;
+import com.sun.source.util.SimpleTreeVisitor;
+import org.junit.Test;
+
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+
+public class ExtractJavaLiveTest {
+ @Test
+ public void visitTypeDeclsForClasses() throws Exception {
+ CompilationUnitTree compilationUnitTree = parseFile();
+
+ for (Tree tree : compilationUnitTree.getTypeDecls()) {
+ tree.accept(new SimpleTreeVisitor() {
+ @Override
+ public Object visitClass(ClassTree classTree, Object o) {
+ System.out.println("Found class: " + classTree.getSimpleName());
+ return null;
+ }
+ }, null);
+ }
+ }
+
+ @Test
+ public void iterateTypeDeclsForClasses() throws Exception {
+ CompilationUnitTree compilationUnitTree = parseFile();
+
+ for (Tree tree : compilationUnitTree.getTypeDecls()) {
+ if (tree.getKind() == Tree.Kind.CLASS) {
+ ClassTree classTree = (ClassTree) tree;
+ System.out.println("Found class: " + classTree.getSimpleName());
+ }
+ }
+ }
+
+ @Test
+ public void visitMethodsForClass() throws Exception {
+ CompilationUnitTree compilationUnitTree = parseFile();
+
+ for (Tree tree : compilationUnitTree.getTypeDecls()) {
+ if (tree.getKind() == Tree.Kind.CLASS) {
+ ClassTree classTree = (ClassTree) tree;
+ visitClassMethods(classTree);
+ }
+ }
+
+ }
+
+ private void visitClassMethods(ClassTree classTree) {
+ for (Tree member : classTree.getMembers()) {
+ member.accept(new SimpleTreeVisitor(){
+ @Override
+ public Object visitMethod(MethodTree methodTree, Object o) {
+ System.out.println("Found method: " + classTree.getSimpleName() + "." + methodTree.getName());
+ System.out.println("Return value: " + methodTree.getReturnType());
+ System.out.println("Parameters: " + methodTree.getParameters());
+
+ for (Tree statement : methodTree.getBody().getStatements()) {
+ System.out.println("Found statement: " + statement);
+ }
+
+ return null;
+ }
+ }, null);
+ }
+ }
+
+ private static CompilationUnitTree parseFile() throws IOException {
+ String filename = "src/test/java/com/baeldung/extractjava/ExtractJavaUnitTest.java";
+
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+
+ StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, StandardCharsets.UTF_8);
+ Iterable extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File(filename)));
+
+ JavacTask javacTask = (JavacTask) compiler.getTask(null, fileManager, null, null, null, compilationUnits);
+ Iterable extends CompilationUnitTree> compilationUnitTrees = javacTask.parse();
+
+ CompilationUnitTree compilationUnitTree = compilationUnitTrees.iterator().next();
+ return compilationUnitTree;
+ }
+}
diff --git a/core-java-modules/core-java-swing/target/classes/org/example/Main.class b/core-java-modules/core-java-swing/target/classes/org/example/Main.class
deleted file mode 100644
index 5914458bc4..0000000000
Binary files a/core-java-modules/core-java-swing/target/classes/org/example/Main.class and /dev/null differ
diff --git a/core-java-modules/core-java-uuid/README.md b/core-java-modules/core-java-uuid/README.md
index bd7bd9d9da..a32c1ae04f 100644
--- a/core-java-modules/core-java-uuid/README.md
+++ b/core-java-modules/core-java-uuid/README.md
@@ -6,3 +6,4 @@
- [Validate UUID String in Java](https://www.baeldung.com/java-validate-uuid-string)
- [Generate the Same UUID From a String in Java](https://www.baeldung.com/java-generate-same-uuid-from-string)
- [Generating Time Based UUIDs](https://www.baeldung.com/java-generating-time-based-uuids)
+- [Generating Unique Positive long Using UUID in Java](https://www.baeldung.com/java-uuid-unique-long-generation)
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index b3ef8167a5..639a02a8cf 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -59,16 +59,15 @@
core-java-lang-oop-constructors-2
core-java-methods
core-java-networking-3
- core-java-os
+
core-java-perf-2
core-java-streams-4
core-java-streams-5
core-java-streams-collect
core-java-streams-maps
- core-java-string-algorithms-3
- core-java-string-operations-3
+
core-java-string-operations-4
- core-java-string-operations-5
+
core-java-time-measurements
core-java-annotations
@@ -123,13 +122,13 @@
core-java-io
core-java-io-2
core-java-io-3
- core-java-io-4
+
core-java-io-5
core-java-io-apis
core-java-io-apis-2
core-java-io-conversions
core-java-jar
- core-java-jndi
+
core-java-jvm
core-java-jvm-2
core-java-jvm-3
@@ -144,17 +143,18 @@
core-java-lang-oop-constructors
core-java-lang-oop-patterns
core-java-lang-oop-generics
- core-java-lang-oop-modifiers
+
core-java-lang-oop-types
core-java-lang-oop-types-2
core-java-lang-oop-inheritance
- core-java-lang-oop-methods
+
core-java-lang-oop-others
core-java-lang-operators
core-java-lang-operators-2
core-java-lang-syntax
core-java-lang-syntax-2
core-java-locale
+ core-java-loops
core-java-networking
core-java-networking-2
core-java-networking-4
@@ -166,6 +166,7 @@
core-java-numbers-4
core-java-numbers-5
core-java-numbers-6
+ core-java-numbers-7
core-java-optional
core-java-perf
core-java-properties
@@ -183,9 +184,11 @@
core-java-streams-3
core-java-string-algorithms
core-java-string-algorithms-2
+ core-java-string-algorithms-3
+ core-java-string-algorithms-4
core-java-string-apis
+
core-java-swing
- core-java-string-apis-2
core-java-string-conversions
core-java-string-conversions-2
core-java-string-conversions-3
@@ -225,5 +228,4 @@
-
diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml
index 875d8cdf85..aab19a166d 100644
--- a/deeplearning4j/pom.xml
+++ b/deeplearning4j/pom.xml
@@ -68,7 +68,6 @@
0.9.1
4.3.5
- 1.18.20
\ No newline at end of file
diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml
index bebfb85e8a..f2b52f246d 100644
--- a/docker-modules/docker-caching/multi-module-caching/pom.xml
+++ b/docker-modules/docker-caching/multi-module-caching/pom.xml
@@ -25,8 +25,6 @@
- UTF-8
- 1.8
32.1.3-jre
diff --git a/docker-modules/docker-containers/pom.xml b/docker-modules/docker-containers/pom.xml
index 79bf0aee72..f8b903c87d 100644
--- a/docker-modules/docker-containers/pom.xml
+++ b/docker-modules/docker-containers/pom.xml
@@ -27,6 +27,7 @@
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -45,7 +46,7 @@
com.google.cloud.tools
jib-maven-plugin
- 2.7.1
+ ${jib-maven-plugin.version}
docker-demo-jib
@@ -55,4 +56,10 @@
+
+ 3.6.0
+ 2.7.1
+
+
+
\ No newline at end of file
diff --git a/docker-modules/pom.xml b/docker-modules/pom.xml
index b4c5240718..4eeab746eb 100644
--- a/docker-modules/pom.xml
+++ b/docker-modules/pom.xml
@@ -24,8 +24,4 @@
docker-java-jar
-
- 11
-
-
\ No newline at end of file
diff --git a/gradle-modules/gradle-7/README.md b/gradle-modules/gradle-7/README.md
index fe05a4b9bc..c452ee8b33 100644
--- a/gradle-modules/gradle-7/README.md
+++ b/gradle-modules/gradle-7/README.md
@@ -5,4 +5,5 @@
- [Working With Multiple Repositories in Gradle](https://www.baeldung.com/java-gradle-multiple-repositories)
- [Different Dependency Version Declarations in Gradle](https://www.baeldung.com/gradle-different-dependency-version-declarations)
- [Generating Javadoc With Gradle](https://www.baeldung.com/java-gradle-javadoc)
-- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs)
\ No newline at end of file
+- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs)
+- [Gradle Proxy Configuration](https://www.baeldung.com/gradle-proxy-configuration)
diff --git a/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..c1962a79e2
Binary files /dev/null and b/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml
index a0f2dd6514..e0488bf0b1 100644
--- a/httpclient-simple/pom.xml
+++ b/httpclient-simple/pom.xml
@@ -203,7 +203,6 @@
- 17
1.16.0
diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java
new file mode 100644
index 0000000000..fa62e1c42c
--- /dev/null
+++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java
@@ -0,0 +1,5 @@
+package com.baeldung.exceptions;
+
+public class EmptyObject {
+
+}
diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java
new file mode 100644
index 0000000000..1ad1014414
--- /dev/null
+++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java
@@ -0,0 +1,27 @@
+package com.baeldung.mismatchedinputexception;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class Animals {
+
+ private final int id;
+ private String name;
+
+
+ public Animals(@JsonProperty("id") int id, @JsonProperty("name")String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java
new file mode 100644
index 0000000000..28fe118ac5
--- /dev/null
+++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java
@@ -0,0 +1,27 @@
+package com.baeldung.mismatchedinputexception;
+
+public class Book {
+
+ private int id;
+ private String title;
+
+ public Book(int id, String title) {
+ this.id = id;
+ this.title = title;
+ }
+
+ public Book() {
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java
index 026fd6719f..c680aec703 100644
--- a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java
+++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java
@@ -2,13 +2,15 @@ package com.baeldung.mappingexception;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
+import com.baeldung.exceptions.EmptyObject;
+import com.baeldung.exceptions.Person;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.SerializationFeature;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
@@ -73,4 +75,18 @@ public class JacksonMappingExceptionUnitTest {
assertEquals(Arrays.asList("Amsterdam", "Tamassint"), country.getCities());
}
+ @Test
+ public void givenEmptyBean_whenSerializing_thenCorrect() throws JsonProcessingException {
+ // Create an ObjectMapper
+ ObjectMapper objectMapper = new ObjectMapper();
+ // Disable fail_on_empty_beans during serialization
+ objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+ // Create an empty object
+ EmptyObject emptyObject = new EmptyObject();
+ // Serialize the empty object
+ String json = objectMapper.writeValueAsString(emptyObject);
+ // Verify that serialization is successful
+ assertEquals("{}", json);
+ }
+
}
diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java
new file mode 100644
index 0000000000..178ad1a8db
--- /dev/null
+++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.mismatchedinputexception;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class MismatchedinputExceptionUnitTest {
+
+ @Test
+ void givenJsonString_whenDeserializingToJavaObjectWithImmutableField_thenIdIsCorrect() throws JsonProcessingException {
+ String jsonString = "{\"id\":10,\"name\":\"Dog\"}";
+ ObjectMapper mapper = new ObjectMapper();
+ Animals animal = mapper.readValue(jsonString, Animals.class);
+ assertEquals(animal.getId(),10);
+ }
+
+ @Test
+ void givenJsonString_whenDeserializingToBook_thenIdIsCorrect() throws JsonProcessingException {
+ String jsonString = "{\"id\":\"10\",\"title\":\"Harry Potter\"}";
+ ObjectMapper mapper = new ObjectMapper();
+ Book book = mapper.readValue(jsonString, Book.class);
+ assertEquals(book.getId(),10);
+ }
+
+
+ @Test
+ void givenJsonString_whenDeserializingToBookList_thenTitleIsCorrect() throws JsonProcessingException {
+ String jsonString = "[{\"id\":\"10\",\"title\":\"Harry Potter\"}]";
+ ObjectMapper mapper = new ObjectMapper();
+ List book = mapper.readValue(jsonString, new TypeReference>(){});
+ assertEquals(book.get(0).getTitle(),"Harry Potter");
+ }
+
+}
\ No newline at end of file
diff --git a/jackson-modules/jackson-polymorphic-deserialization/pom.xml b/jackson-modules/jackson-polymorphic-deserialization/pom.xml
index 0d88c19500..cbf67e5013 100644
--- a/jackson-modules/jackson-polymorphic-deserialization/pom.xml
+++ b/jackson-modules/jackson-polymorphic-deserialization/pom.xml
@@ -16,7 +16,7 @@
com.fasterxml.jackson.core
jackson-core
- ${jackson-core.version}
+ ${jackson.version}
org.reflections
@@ -36,7 +36,7 @@
- 2.15.2
+ 2.16.0
0.9.11
diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml
index 3bf523bbfa..daa6504709 100644
--- a/jackson-simple/pom.xml
+++ b/jackson-simple/pom.xml
@@ -33,8 +33,7 @@
- 2.15.2
- 17
+ 2.16.0
\ No newline at end of file
diff --git a/javafx/README.md b/javafx/README.md
index 7db1478129..d6ea5b226f 100644
--- a/javafx/README.md
+++ b/javafx/README.md
@@ -7,4 +7,4 @@ This module contains articles about JavaFX.
- [Introduction to JavaFx](https://www.baeldung.com/javafx)
- [Display Custom Items in JavaFX ListView](https://www.baeldung.com/javafx-listview-display-custom-items)
- [Adding EventHandler to JavaFX Button](https://www.baeldung.com/javafx-button-eventhandler)
-
+- [How to Use a Custom Font in Java](https://www.baeldung.com/java-custom-font)
diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml
index a35abb9c19..0db1f46b1e 100644
--- a/jhipster-6/bookstore-monolith/pom.xml
+++ b/jhipster-6/bookstore-monolith/pom.xml
@@ -107,8 +107,8 @@
commons-lang3
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
org.assertj
@@ -1125,7 +1125,6 @@
3.0.0
- 11
2.12.6
v10.15.0
6.4.1
diff --git a/jhipster-modules/README.md b/jhipster-modules/README.md
index 11c3d5397f..2aae8a5697 100644
--- a/jhipster-modules/README.md
+++ b/jhipster-modules/README.md
@@ -1,7 +1,5 @@
## JHipster
-This module contains articles about JHipster.
-
-### Relevant articles:
-
+This module contains articles about JHipster.
+Relevant articles are listed in the nested module folders.
diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml
index f345688939..069a1f6848 100644
--- a/jhipster-modules/jhipster-microservice/car-app/pom.xml
+++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml
@@ -23,13 +23,13 @@
0.4.13
1.2
5.2.8.Final
- 2.6.0
+ 5.1.0
0.7.9
1.8
3.21.0-GA
1.0.0
1.1.0
- 0.7.0
+ 0.12.3
1.0.0
3.6
2.0.0
@@ -216,7 +216,7 @@
io.jsonwebtoken
- jjwt
+ jjwt-api
${jjwt.version}
diff --git a/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java
index 3908bfa8f3..028f34e3f0 100644
--- a/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java
+++ b/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java
@@ -70,7 +70,7 @@ public class TokenProvider {
public Authentication getAuthentication(String token) {
Claims claims = Jwts.parser()
- .setSigningKey(secretKey)
+ .setSigningKey(secretKey).build()
.parseClaimsJws(token)
.getBody();
@@ -86,7 +86,7 @@ public class TokenProvider {
public boolean validateToken(String authToken) {
try {
- Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken);
+ Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
log.info("Invalid JWT signature.");
diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml
index 056bd60f33..43f9b046c7 100644
--- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml
+++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml
@@ -23,12 +23,12 @@
0.4.13
1.2
5.2.8.Final
- 2.6.0
+ 5.1.0
0.7.9
3.21.0-GA
1.0.0
1.1.0
- 0.7.0
+ 0.12.3
1.0.0
3.6
2.0.0
@@ -215,7 +215,7 @@
io.jsonwebtoken
- jjwt
+ jjwt-api
${jjwt.version}
diff --git a/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java
index 47a5bf75af..38cee99e01 100644
--- a/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java
+++ b/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java
@@ -70,7 +70,7 @@ public class TokenProvider {
public Authentication getAuthentication(String token) {
Claims claims = Jwts.parser()
- .setSigningKey(secretKey)
+ .setSigningKey(secretKey).build()
.parseClaimsJws(token)
.getBody();
@@ -86,7 +86,7 @@ public class TokenProvider {
public boolean validateToken(String authToken) {
try {
- Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken);
+ Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
log.info("Invalid JWT signature.");
diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml
index b90f22f009..90d703b8c7 100644
--- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml
+++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml
@@ -26,12 +26,12 @@
1.3
1.2
5.2.8.Final
- 2.6.0
+ 5.1.0
0.7.9
3.21.0-GA
1.0.0
1.1.0
- 0.7.0
+ 0.12.3
1.0.0
3.6
2.0.0
@@ -243,7 +243,7 @@
io.jsonwebtoken
- jjwt
+ jjwt-api
${jjwt.version}
diff --git a/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java
index 5ffb55f33e..14d343c0d7 100644
--- a/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java
+++ b/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java
@@ -70,7 +70,7 @@ public class TokenProvider {
public Authentication getAuthentication(String token) {
Claims claims = Jwts.parser()
- .setSigningKey(secretKey)
+ .setSigningKey(secretKey).build()
.parseClaimsJws(token)
.getBody();
@@ -86,7 +86,7 @@ public class TokenProvider {
public boolean validateToken(String authToken) {
try {
- Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken);
+ Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
log.info("Invalid JWT signature.");
diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml
index fbcee8f1ff..f1ee479756 100644
--- a/jhipster-modules/jhipster-monolithic/pom.xml
+++ b/jhipster-modules/jhipster-monolithic/pom.xml
@@ -122,7 +122,7 @@
io.jsonwebtoken
- jjwt
+ jjwt-api
${jjwt.version}
@@ -892,12 +892,12 @@
2.2.1
2.2.3
5.2.8.Final
- 2.6.0
+ 5.1.0
0.7.9
3.21.0-GA
1.0.0
1.1.0
- 0.7.0
+ 0.12.3
1.1.3
3.6
2.0.0
diff --git a/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java
index 3ba4d7c793..095663065b 100644
--- a/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java
+++ b/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java
@@ -70,7 +70,7 @@ public class TokenProvider {
public Authentication getAuthentication(String token) {
Claims claims = Jwts.parser()
- .setSigningKey(secretKey)
+ .setSigningKey(secretKey).build()
.parseClaimsJws(token)
.getBody();
@@ -86,7 +86,7 @@ public class TokenProvider {
public boolean validateToken(String authToken) {
try {
- Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken);
+ Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
log.info("Invalid JWT signature.");
diff --git a/jmh/README.md b/jmh/README.md
index 3cfe847a3c..2e249c779c 100644
--- a/jmh/README.md
+++ b/jmh/README.md
@@ -7,3 +7,4 @@ This module contains articles about the Java Microbenchmark Harness (JMH).
- [Microbenchmarking with Java](https://www.baeldung.com/java-microbenchmark-harness)
- [A Guide to False Sharing and @Contended](https://www.baeldung.com/java-false-sharing-contended)
- [Performance Comparison of boolean[] vs BitSet](https://www.baeldung.com/java-boolean-array-bitset-performance)
+- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup)
diff --git a/libraries/src/main/java/com/baeldung/jmh/BenchMark.java b/jmh/src/main/java/com/baeldung/jmh/BenchMark.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jmh/BenchMark.java
rename to jmh/src/main/java/com/baeldung/jmh/BenchMark.java
diff --git a/libraries/src/main/java/com/baeldung/jmh/JmhDemo.java b/jmh/src/main/java/com/baeldung/jmh/JmhDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jmh/JmhDemo.java
rename to jmh/src/main/java/com/baeldung/jmh/JmhDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java b/jmh/src/main/java/com/baeldung/jmh/warmup/MainApplication.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java
rename to jmh/src/main/java/com/baeldung/jmh/warmup/MainApplication.java
diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java b/jmh/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java
rename to jmh/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java
diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java b/jmh/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java
rename to jmh/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java
diff --git a/json-modules/gson-2/README.md b/json-modules/gson-2/README.md
index 3deb61f25d..912f8b0a20 100644
--- a/json-modules/gson-2/README.md
+++ b/json-modules/gson-2/README.md
@@ -5,4 +5,4 @@ This module contains articles about Gson
### Relevant Articles:
- [Solving Gson Parsing Errors](https://www.baeldung.com/gson-parsing-errors)
- [Difference between Gson @Expose and @SerializedName](https://www.baeldung.com/gson-expose-vs-serializedname)
-
+- [Resolving Gson’s “Multiple JSON Fields†Exception](https://www.baeldung.com/java-gson-multiple-json-fields-exception)
diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java
new file mode 100644
index 0000000000..5e33a645b2
--- /dev/null
+++ b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.bytearraytojsonandviceversa;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import org.junit.jupiter.api.Test;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ByteArrayToJsonAndViceVersaUnitTest {
+
+ byte[] byteArray = {34, 123, 92, 34, 110, 97, 109, 101, 92, 34, 58, 92, 34, 65, 108, 105, 99, 101, 92, 34, 44, 92, 34, 97, 103, 101, 92, 34, 58, 50, 53, 44, 92, 34, 105, 115, 83, 116, 117, 100, 101, 110, 116, 92, 34, 58, 116, 114, 117, 101, 44, 92, 34, 104, 111, 98, 98, 105, 101, 115, 92, 34, 58, 91, 92, 34, 114, 101, 97, 100, 105, 110, 103, 92, 34, 44, 92, 34, 112, 97, 105, 110, 116, 105, 110, 103, 92, 34, 93, 44, 92, 34, 97, 100, 100, 114, 101, 115, 115, 92, 34, 58, 123, 92, 34, 99, 105, 116, 121, 92, 34, 58, 92, 34, 83, 109, 97, 108, 108, 118, 105, 108, 108, 101, 92, 34, 44, 92, 34, 122, 105, 112, 99, 111, 100, 101, 92, 34, 58, 92, 34, 49, 50, 51, 52, 53, 92, 34, 125, 125, 34};
+ String jsonString = "{\"name\":\"Alice\",\"age\":25,\"isStudent\":true,\"hobbies\":[\"reading\",\"painting\"],\"address\":{\"city\":\"Smallville\",\"zipcode\":\"12345\"}}";
+
+ @Test
+ void givenByteArray_whenConvertingToJsonUsingJackson_thenJsonString() throws Exception {
+ ObjectMapper objectMapper = new ObjectMapper();
+ String actualJsonString = objectMapper.readValue(byteArray, String.class);
+
+ assertEquals(jsonString, actualJsonString);
+ }
+
+ @Test
+ void givenByteArray_whenConvertingToJsonUsingGson_thenJsonString() {
+ Gson gson = new Gson();
+ String jsonStringFromByteArray = new String(byteArray, StandardCharsets.UTF_8);
+ String actualJsonString = gson.fromJson(jsonStringFromByteArray, String.class);
+
+ assertEquals(jsonString, actualJsonString);
+ }
+
+ @Test
+ void givenJsonString_whenConvertingToByteArrayUsingJackson_thenByteArray() throws JsonProcessingException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ byte[] actualByteArray = objectMapper.writeValueAsBytes(jsonString);
+
+ assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray));
+ }
+
+ @Test
+ void givenJsonString_whenConvertingToByteArrayUsingGson_thenByteArray() {
+ Gson gson = new Gson();
+ byte[] actualByteArray = gson.toJson(jsonString).getBytes();
+
+ assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray));
+ }
+}
diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java
new file mode 100644
index 0000000000..38d097e5b8
--- /dev/null
+++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.jsonnodetojsonobject;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class JsonNodeToJsonObjectUnitTest {
+
+ public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}";
+
+ @Test
+ public void givenJsonNode_whenConvertingToObjectNode_thenVerifyFieldsIntegrity() throws JsonProcessingException {
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ JsonNode jsonNode = objectMapper.readTree(jsonString);
+ ObjectNode objectNode = objectMapper.createObjectNode().setAll((ObjectNode) jsonNode);
+
+ assertEquals("John", objectNode.get("name").asText());
+ assertEquals("male", objectNode.get("gender").asText());
+ assertEquals("Baeldung", objectNode.get("company").asText());
+ assertTrue(objectNode.get("isEmployee").asBoolean());
+ assertEquals(30, objectNode.get("age").asInt());
+ }
+}
diff --git a/json-modules/json/README.md b/json-modules/json/README.md
index d643914fc7..d6e1b400f5 100644
--- a/json-modules/json/README.md
+++ b/json-modules/json/README.md
@@ -12,4 +12,5 @@ This module contains articles about JSON.
- [Iterating Over an Instance of org.json.JSONObject](https://www.baeldung.com/jsonobject-iteration)
- [Escape JSON String in Java](https://www.baeldung.com/java-json-escaping)
- [Reducing JSON Data Size](https://www.baeldung.com/json-reduce-data-size)
+- [How to Convert JsonNode to ObjectNode](https://www.baeldung.com/java-jackson-jsonnode-objectnode)
- More Articles: [[next -->]](../json-2)
diff --git a/ksqldb/pom.xml b/ksqldb/pom.xml
index e55398d635..ebb3bfa7ee 100644
--- a/ksqldb/pom.xml
+++ b/ksqldb/pom.xml
@@ -17,7 +17,7 @@
confluent
confluent-repo
- http://packages.confluent.io/maven/
+ https://packages.confluent.io/maven/
diff --git a/kubernetes-modules/k8s-admission-controller/pom.xml b/kubernetes-modules/k8s-admission-controller/pom.xml
index 18bf98a830..6a1d695f8d 100644
--- a/kubernetes-modules/k8s-admission-controller/pom.xml
+++ b/kubernetes-modules/k8s-admission-controller/pom.xml
@@ -22,6 +22,7 @@
org.projectlombok
lombok
+ ${lombok.version}
true
@@ -32,6 +33,7 @@
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -78,4 +80,9 @@
+
+ 3.6.0
+
+
+
\ No newline at end of file
diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml
index 05532ab0b0..a9c780d59d 100644
--- a/kubernetes-modules/kubernetes-spring/pom.xml
+++ b/kubernetes-modules/kubernetes-spring/pom.xml
@@ -33,6 +33,7 @@
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -46,8 +47,8 @@
-
- 11
-
+
+ 3.6.0
+
\ No newline at end of file
diff --git a/libraries-2/README.md b/libraries-2/README.md
index 8dae12a1cf..16c04cb7ad 100644
--- a/libraries-2/README.md
+++ b/libraries-2/README.md
@@ -10,13 +10,9 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
### Relevant articles
- [A Guide to jBPM with Java](https://www.baeldung.com/jbpm-java)
- [Guide to Classgraph Library](https://www.baeldung.com/classgraph)
-- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program)
-- [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors)
- [Templating with Handlebars](https://www.baeldung.com/handlebars)
- [A Guide to Crawler4j](https://www.baeldung.com/crawler4j)
-- [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map)
-- [Guide to MapDB](https://www.baeldung.com/mapdb)
- [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos)
-- [JasperReports with Spring](https://www.baeldung.com/spring-jasper)
+- [Guide to MapDB](https://www.baeldung.com/mapdb)
- More articles [[<-- prev]](/libraries) [[next -->]](/libraries-3)
diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml
index d9b0545d54..e472628c2b 100644
--- a/libraries-2/pom.xml
+++ b/libraries-2/pom.xml
@@ -13,16 +13,6 @@
-
- org.mapdb
- mapdb
- ${mapdb.version}
-
-
- com.pivovarit
- parallel-collectors
- ${parallel-collectors.version}
-
io.github.classgraph
classgraph
@@ -41,27 +31,11 @@
-
- info.picocli
- picocli
- ${picocli.version}
-
org.springframework.boot
spring-boot-starter
${spring-boot-starter.version}
-
- net.openhft
- chronicle-map
- ${chronicle.map.version}
-
-
- com.sun.java
- tools
-
-
-
edu.uci.ics
crawler4j
@@ -83,17 +57,6 @@
mesos
${mesos.library.version}
-
- net.sf.jasperreports
- jasperreports
- ${jasperreports.version}
-
-
- commons-logging
- commons-logging
-
-
-
org.hsqldb
hsqldb
@@ -114,6 +77,11 @@
je
18.3.12
+
+ org.mapdb
+ mapdb
+ ${mapdb.version}
+
@@ -121,10 +89,6 @@
org.apache.maven.plugins
maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED
-
@@ -133,14 +97,10 @@
3.0.8
4.8.153
7.20.0.Final
- 4.7.0
- 3.24ea1
4.4.0
2.7.8
1.11.0
- 1.1.0
4.3.1
- 6.20.0
5.3.25
2.7.1
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java
index 6f5141b054..a286ed7ea8 100644
--- a/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java
@@ -1,14 +1,14 @@
package com.baeldung.mapdb;
+import static junit.framework.Assert.assertEquals;
+
+import java.util.NavigableSet;
+
import org.junit.Test;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.Serializer;
-import java.util.NavigableSet;
-
-import static junit.framework.Assert.assertEquals;
-
public class CollectionsUnitTest {
@Test
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java
index 3b7cac04fb..80d5375445 100644
--- a/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java
@@ -1,12 +1,12 @@
package com.baeldung.mapdb;
-import org.jetbrains.annotations.NotNull;
-import org.junit.Test;
-import org.mapdb.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
-import java.io.IOException;
-
-import static junit.framework.Assert.assertEquals;
+import org.junit.jupiter.api.Test;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.HTreeMap;
+import org.mapdb.Serializer;
public class HTreeMapUnitTest {
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java
index 952efd0639..89c40fe625 100644
--- a/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java
@@ -1,25 +1,25 @@
package com.baeldung.mapdb;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
-import java.util.concurrent.ConcurrentMap;
-
-import static junit.framework.Assert.assertEquals;
-
public class HelloBaeldungUnitTest {
@Test
public void givenInMemoryDBInstantiateCorrectly_whenDataSavedAndRetrieved_checkRetrievalCorrect() {
- DB db = DBMaker.memoryDB().make();
+ DB db = DBMaker.memoryDB()
+ .make();
String welcomeMessageKey = "Welcome Message";
String welcomeMessageString = "Hello Baeldung!";
- HTreeMap myMap = db.hashMap("myMap").createOrOpen();
+ HTreeMap myMap = db.hashMap("myMap")
+ .createOrOpen();
myMap.put(welcomeMessageKey, welcomeMessageString);
String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey);
@@ -32,12 +32,14 @@ public class HelloBaeldungUnitTest {
@Test
public void givenInFileDBInstantiateCorrectly_whenDataSavedAndRetrieved_checkRetrievalCorrect() {
- DB db = DBMaker.fileDB("file.db").make();
+ DB db = DBMaker.fileDB("file.db")
+ .make();
String welcomeMessageKey = "Welcome Message";
String welcomeMessageString = "Hello Baeldung!";
- HTreeMap myMap = db.hashMap("myMap").createOrOpen();
+ HTreeMap myMap = db.hashMap("myMap")
+ .createOrOpen();
myMap.put(welcomeMessageKey, welcomeMessageString);
String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey);
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java
index 9c53f9c792..c761f877ab 100644
--- a/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java
@@ -1,13 +1,13 @@
package com.baeldung.mapdb;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
import org.mapdb.Serializer;
-import static junit.framework.Assert.assertEquals;
-
public class InMemoryModesUnitTest {
@Test
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java
index 83ba917393..6b6b3942d2 100644
--- a/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java
@@ -1,13 +1,13 @@
package com.baeldung.mapdb;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
import org.mapdb.Serializer;
import org.mapdb.SortedTableMap;
import org.mapdb.volume.MappedFileVol;
import org.mapdb.volume.Volume;
-import static junit.framework.Assert.assertEquals;
-
public class SortedTableMapUnitTest {
private static final String VOLUME_LOCATION = "sortedTableMapVol.db";
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java
index 4de9db10e8..5a053b4422 100644
--- a/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java
@@ -1,13 +1,13 @@
package com.baeldung.mapdb;
-import org.junit.Test;
-import org.mapdb.DB;
-import org.mapdb.DBMaker;
-import org.mapdb.Serializer;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.NavigableSet;
-import static junit.framework.Assert.assertEquals;
+import org.junit.jupiter.api.Test;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.Serializer;
public class TransactionsUnitTest {
diff --git a/libraries-3/README.md b/libraries-3/README.md
index 99b1b60a0a..3416805ad1 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -8,12 +8,7 @@ The code examples related to different libraries are each in their own module.
Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
### Relevant Articles:
-- [Parsing Command-Line Parameters with JCommander](https://www.baeldung.com/jcommander-parsing-command-line-parameters)
-- [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos)
-- [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline)
-- [Introduction to cache2k](https://www.baeldung.com/java-cache2k)
- [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects)
-- [Introduction to Takes](https://www.baeldung.com/java-takes)
- [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
- [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro)
- [Intro to Structurizr](https://www.baeldung.com/structurizr)
diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index 9923e46267..ae8ebb43f3 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -13,32 +13,11 @@
-
- com.beust
- jcommander
- ${jcommander.version}
-
org.projectlombok
lombok
${lombok.version}
-
- com.github.rvesse
- airline
- ${airline.version}
-
-
- org.cactoos
- cactoos
- ${cactoos.version}
-
-
- org.cache2k
- cache2k-base-bom
- ${cache2k.version}
- pom
-
com.jcabi
jcabi-aspects
@@ -50,21 +29,6 @@
${aspectjrt.version}
runtime
-
- org.takes
- takes
- ${takes.version}
-
-
- org.apache.httpcomponents
- httpcore
- ${httpcore.version}
-
-
- org.apache.httpcomponents
- httpclient
- ${httpclient.version}
-
org.apache.velocity
velocity-engine-core
@@ -125,7 +89,7 @@
javax.annotation
javax.annotation-api
- 1.3.2
+ ${javax.annotation-api.version}
@@ -159,10 +123,6 @@
org.apache.maven.plugins
maven-compiler-plugin
-
-
- 11
-
@@ -173,59 +133,13 @@
-
-
- reload
-
-
-
- src/main/resources
- true
-
-
- src/main/webapp
- true
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
-
-
- start-server
- pre-integration-test
-
- java
-
-
-
-
- com.baeldung.takes.TakesApp
- false
-
- --port=${port}
-
-
-
-
-
-
-
- 1.78
- 0.43
- 2.7.2
- 1.2.3.Final
0.22.6
1.9.20.1
0.14.1
1.9.20.1
1.9.20.1
- 1.19
- 4.4.13
- 4.5.12
2.2
0.3.0
2.8
@@ -233,6 +147,7 @@
1.0.0
2.5.6
0.9.6
+ 1.3.2
\ No newline at end of file
diff --git a/libraries-4/README.md b/libraries-4/README.md
index 0dee9f1c1e..03ea3d7a77 100644
--- a/libraries-4/README.md
+++ b/libraries-4/README.md
@@ -8,13 +8,7 @@ The code examples related to different libraries are each in their own module.
Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
### Relevant articles
-- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
-- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
-- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
-- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
- [Introduction to NoException](https://www.baeldung.com/no-exception)
-- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
-- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
- [Guide to JDeferred](https://www.baeldung.com/jdeferred)
- [Introduction to MBassador](https://www.baeldung.com/mbassador)
- [Using Pairs in Java](https://www.baeldung.com/java-pairs)
diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml
index 3949d50875..165f017d89 100644
--- a/libraries-4/pom.xml
+++ b/libraries-4/pom.xml
@@ -17,22 +17,6 @@
jdeferred-core
${jdeferred.version}
-
- org.eclipse.collections
- eclipse-collections
- ${eclipse-collections.version}
-
-
- com.haulmont.yarg
- yarg
- ${yarg.version}
-
-
- org.olap4j
- olap4j
-
-
-
org.olap4j
olap4j
@@ -48,11 +32,6 @@
noexception
${noexception.version}
-
- rome
- rome
- ${rome.version}
-
org.springframework
spring-web
@@ -68,16 +47,6 @@
servlet-api
${javax.servlet.version}
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.pcollections
- pcollections
- ${pcollections.version}
-
org.awaitility
awaitility
@@ -119,22 +88,27 @@
jackson-annotations
${jackson-annotations.version}
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
2.14.2
2.14.2
1.2.6
- 8.2.0
1.1.0
- 2.0.12
1.3.1
- 1.0
4.3.8.RELEASE
2.5
3.2.0-m7
- 0.9.0
- 2.1.2
3.0.0
0.6.5
3.0.0
@@ -142,6 +116,7 @@
1.2.0
19
10.3.0
+ 0.9.0
\ No newline at end of file
diff --git a/libraries-5/README.md b/libraries-5/README.md
index f1e749b293..6b61a7a43c 100644
--- a/libraries-5/README.md
+++ b/libraries-5/README.md
@@ -8,14 +8,8 @@ The code examples related to different libraries are each in their own module.
Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
### Relevant articles
-- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
-- [Introduction to StreamEx](https://www.baeldung.com/streamex)
- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
-- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
-- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
- [Introduction to jOOL](https://www.baeldung.com/jool)
-- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
-- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
- More articles [[<-- prev]](/libraries-4) [[next -->]](/libraries-6)
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index a043b4bfa8..a15679502d 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -6,64 +6,17 @@
libraries-5
+ parent-modules
com.baeldung
- parent-boot-2
- 0.0.1-SNAPSHOT
- ../parent-boot-2
+ 1.0.0-SNAPSHOT
-
- org.springframework
- spring-web
-
org.jooq
jool
${jool.version}
-
- au.com.dius
- pact-jvm-provider-junit5_2.12
- ${pact.version}
-
-
- au.com.dius
- pact-jvm-consumer-junit5_2.12
- ${pact.version}
- test
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- com.typesafe.akka
- akka-actor_${scala.version}
- ${typesafe-akka.version}
-
-
- com.typesafe.akka
- akka-testkit_${scala.version}
- ${typesafe-akka.version}
- test
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- net.bytebuddy
- byte-buddy
- ${byte-buddy.version}
-
-
- net.bytebuddy
- byte-buddy-agent
- ${byte-buddy.version}
-
com.github.docker-java
@@ -84,18 +37,6 @@
-
-
- com.github.ben-manes.caffeine
- caffeine
- ${caffeine.version}
-
-
- com.google.code.findbugs
- jsr305
- ${findbugs.version}
- test
-
io.atlassian.fugue
@@ -107,45 +48,14 @@
jnats
${jnats.version}
-
- org.jctools
- jctools-core
- ${jctools.version}
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- target/mypacts
-
-
-
-
-
-
- 3.6.3
0.9.12
- 4.3.8.RELEASE
2.12
- 2.5.11
- 0.8.1
3.0.14
- 3.1.8
- 3.0.2
4.5.1
1.0
- 2.1.2
\ No newline at end of file
diff --git a/libraries-6/README.md b/libraries-6/README.md
index bbebcbc1e0..4be655f850 100644
--- a/libraries-6/README.md
+++ b/libraries-6/README.md
@@ -10,12 +10,9 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
### Relevant articles
- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
-- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
-- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
- [Guide to Simple Binary Encoding](https://www.baeldung.com/java-sbe)
- [Java-R Integration](https://www.baeldung.com/java-r-integration)
- [Using libphonenumber to Validate Phone Numbers](https://www.baeldung.com/java-libphonenumber)
- [Apache Commons Collections vs Google Guava](https://www.baeldung.com/apache-commons-collections-vs-guava)
-- [Guide to Using ModelMapper](https://www.baeldung.com/java-modelmapper)
-- More articles [[<-- prev]](/libraries-5)
+- More articles [[<-- prev]](/libraries-5) [[next -->]](/libraries-7)
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
index f073ca424c..e9b90fa597 100644
--- a/libraries-6/pom.xml
+++ b/libraries-6/pom.xml
@@ -17,11 +17,6 @@
functionaljava-java8
${functionaljava.version}
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
io.github.resilience4j
resilience4j-circuitbreaker
@@ -47,12 +42,6 @@
javapoet
${javapoet.version}
-
- org.mockftpserver
- MockFtpServer
- ${mockftpserver.version}
- test
-
org.apache.commons
commons-lang3
@@ -68,11 +57,6 @@
guava
${guava.version}
-
- commons-net
- commons-net
- ${commons-net.version}
-
commons-io
commons-io
@@ -100,11 +84,6 @@
libphonenumber
${libphonenumber.version}
-
- org.modelmapper
- modelmapper
- ${org.modelmapper.version}
-
org.agrona
agrona
@@ -195,16 +174,12 @@
1.10.0
- 2.7.1
4.8.1
2.1.0
- 1.15
- 3.6
3.5-beta72
3.0
1.8.1
8.12.9
- 3.2.0
1.17.1
1.6.0
1.27.0
diff --git a/libraries-7/README.md b/libraries-7/README.md
new file mode 100644
index 0000000000..105a2ef16d
--- /dev/null
+++ b/libraries-7/README.md
@@ -0,0 +1,11 @@
+## Libraries-7
+
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- More articles [[<-- prev]](/libraries-6)
diff --git a/libraries-7/pom.xml b/libraries-7/pom.xml
new file mode 100644
index 0000000000..40c4785d40
--- /dev/null
+++ b/libraries-7/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ libraries-7
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+
\ No newline at end of file
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java
new file mode 100644
index 0000000000..408d2dcf36
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java
@@ -0,0 +1,29 @@
+package com.baeldung.findfiles;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Iterator;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.TrueFileFilter;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+
+public class FindFileApacheUtils {
+
+ private FindFileApacheUtils() {
+ }
+
+ public static Iterator find(Path startPath, String extension) {
+ if (!Files.isDirectory(startPath)) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ if (!extension.startsWith("."))
+ extension = "." + extension;
+
+ return FileUtils.iterateFiles(startPath.toFile(), WildcardFileFilter.builder()
+ .setWildcards("*" + extension)
+ .get(), TrueFileFilter.INSTANCE);
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java
new file mode 100644
index 0000000000..8982f918f5
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java
@@ -0,0 +1,34 @@
+package com.baeldung.findfiles;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FindFileJava2Utils {
+
+ private FindFileJava2Utils() {
+ }
+
+ public static List find(File startPath, String extension) {
+ if (!startPath.isDirectory()) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ List matches = new ArrayList<>();
+
+ File[] files = startPath.listFiles();
+ if (files == null)
+ return matches;
+
+ MatchExtensionPredicate filter = new MatchExtensionPredicate(extension);
+ for (File file : files) {
+ if (file.isDirectory()) {
+ matches.addAll(find(file, extension));
+ } else if (filter.test(file.toPath())) {
+ matches.add(file);
+ }
+ }
+
+ return matches;
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java
new file mode 100644
index 0000000000..6d2cc4f946
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java
@@ -0,0 +1,44 @@
+package com.baeldung.findfiles;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FindFileJava7Utils {
+
+ private FindFileJava7Utils() {
+ }
+
+ public static List find(Path startPath, String extension) throws IOException {
+ if (!Files.isDirectory(startPath)) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ final List matches = new ArrayList<>();
+ MatchExtensionPredicate filter = new MatchExtensionPredicate(extension);
+
+ Files.walkFileTree(startPath, new SimpleFileVisitor() {
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
+ if (filter.test(file)) {
+ matches.add(file);
+ }
+
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) {
+ return FileVisitResult.CONTINUE;
+ }
+ });
+
+ return matches;
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java
new file mode 100644
index 0000000000..b265bebe7d
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java
@@ -0,0 +1,21 @@
+package com.baeldung.findfiles;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.function.Consumer;
+
+public class FindFileJava8Utils {
+
+ private FindFileJava8Utils() {
+ }
+
+ public static void find(Path startPath, String extension, Consumer consumer) throws IOException {
+ if (!Files.isDirectory(startPath)) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ MatchExtensionPredicate filter = new MatchExtensionPredicate(extension);
+ Files.walkFileTree(startPath, new SimpleFileConsumerVisitor(filter, consumer));
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java b/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java
new file mode 100644
index 0000000000..351cdd0590
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java
@@ -0,0 +1,26 @@
+package com.baeldung.findfiles;
+
+import java.nio.file.Path;
+import java.util.function.Predicate;
+
+public class MatchExtensionPredicate implements Predicate {
+
+ private final String extension;
+
+ public MatchExtensionPredicate(String extension) {
+ if (!extension.startsWith("."))
+ extension = "." + extension;
+ this.extension = extension.toLowerCase();
+ }
+
+ @Override
+ public boolean test(Path path) {
+ if (path == null)
+ return false;
+
+ return path.getFileName()
+ .toString()
+ .toLowerCase()
+ .endsWith(extension);
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java b/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java
new file mode 100644
index 0000000000..632499d279
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java
@@ -0,0 +1,33 @@
+package com.baeldung.findfiles;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class SimpleFileConsumerVisitor extends SimpleFileVisitor {
+
+ private final Predicate filter;
+ private final Consumer consumer;
+
+ public SimpleFileConsumerVisitor(MatchExtensionPredicate filter, Consumer consumer) {
+ this.filter = filter;
+ this.consumer = consumer;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
+ if (filter.test(file))
+ consumer.accept(file);
+
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+ return FileVisitResult.CONTINUE;
+ }
+}
diff --git a/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java b/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java
new file mode 100644
index 0000000000..ddd7b7e155
--- /dev/null
+++ b/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.findfiles;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+public class FindFileUtilsIntegrationTest {
+
+ private static final String TEST_EXTENSION = ".test";
+ private static final String OTHER_EXTENSION = ".other";
+
+ private static final List TEST_FILES = new ArrayList<>();
+ private static final List OTHER_FILES = new ArrayList<>();
+
+ private static Path TEST_DIR;
+
+ @BeforeAll
+ static void setup() throws IOException {
+ TEST_DIR = Files.createTempDirectory(null);
+
+ final Path nestedDir = TEST_DIR.resolve("sub-dir");
+ Files.createDirectories(nestedDir);
+
+ TEST_FILES.add(Files.createFile(TEST_DIR.resolve("a" + TEST_EXTENSION)));
+ OTHER_FILES.add(Files.createFile(TEST_DIR.resolve("a" + OTHER_EXTENSION)));
+
+ TEST_FILES.add(Files.createFile(nestedDir.resolve("b" + TEST_EXTENSION)));
+ OTHER_FILES.add(Files.createFile(nestedDir.resolve("b" + OTHER_EXTENSION)));
+ }
+
+ @AfterAll
+ static void cleanUp() {
+ FileUtils.deleteQuietly(TEST_DIR.toFile());
+ }
+
+ @Test
+ void whenFindFilesWithJava2_thenOnlyMatchingFilesFound() {
+ List matches = FindFileJava2Utils.find(TEST_DIR.toFile(), TEST_EXTENSION);
+
+ assertEquals(TEST_FILES.size(), matches.size());
+ }
+
+ @Test
+ void whenFindFilesWithJava7_thenOnlyMatchingFilesFound() throws IOException {
+ List matches = FindFileJava7Utils.find(TEST_DIR, TEST_EXTENSION);
+
+ assertEquals(TEST_FILES.size(), matches.size());
+ }
+
+ @Test
+ void whenFindFilesWithJava8_thenOnlyMatchingFilesFound() throws IOException {
+ final AtomicInteger matches = new AtomicInteger(0);
+ FindFileJava8Utils.find(TEST_DIR, TEST_EXTENSION, path -> matches.incrementAndGet());
+
+ assertEquals(TEST_FILES.size(), matches.get());
+ }
+
+ @Test
+ void whenFindFilesWithApache_thenOnlyMatchingFilesFound() {
+ final AtomicInteger matches = new AtomicInteger(0);
+ Iterator iterator = FindFileApacheUtils.find(TEST_DIR, TEST_EXTENSION);
+
+ iterator.forEachRemaining(file -> matches.incrementAndGet());
+
+ assertEquals(TEST_FILES.size(), matches.get());
+ }
+}
diff --git a/libraries-ai/README.md b/libraries-ai/README.md
index 01ec9b1d68..8c211ea1a2 100644
--- a/libraries-ai/README.md
+++ b/libraries-ai/README.md
@@ -1,2 +1,3 @@
## Relevant Articles
- [Overview of NLP Libraries in Java](https://www.baeldung.com/java-nlp-libraries)
+- [Introduction to Neuroph](https://www.baeldung.com/neuroph)
diff --git a/libraries-ai/pom.xml b/libraries-ai/pom.xml
index 48b26e5a31..aa2ef19b45 100644
--- a/libraries-ai/pom.xml
+++ b/libraries-ai/pom.xml
@@ -23,11 +23,17 @@
opennlp-tools
${opennlp-tools.version}
+
+ org.beykery
+ neuroph
+ ${neuroph.version}
+
4.5.3
2.1.1
+ 2.92
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java b/libraries-ai/src/main/java/neuroph/NeurophXOR.java
similarity index 98%
rename from libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java
rename to libraries-ai/src/main/java/neuroph/NeurophXOR.java
index 4cb11c3c05..63ce1c6e16 100644
--- a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java
+++ b/libraries-ai/src/main/java/neuroph/NeurophXOR.java
@@ -1,4 +1,4 @@
-package com.baeldung.neuroph;
+package neuroph;
import org.neuroph.core.Layer;
import org.neuroph.core.NeuralNetwork;
diff --git a/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java b/libraries-ai/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java
similarity index 94%
rename from libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java
rename to libraries-ai/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java
index ea5c09a4d8..6e6bad8142 100644
--- a/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java
+++ b/libraries-ai/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java
@@ -1,11 +1,13 @@
package com.baeldung.neuroph;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.neuroph.core.NeuralNetwork;
-import static org.junit.Assert.*;
+import neuroph.NeurophXOR;
public class XORIntegrationTest {
private NeuralNetwork ann = null;
diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md
index 180c84b31c..70a872dea4 100644
--- a/libraries-apache-commons-2/README.md
+++ b/libraries-apache-commons-2/README.md
@@ -5,4 +5,5 @@ This module contains articles about Apache Commons libraries.
### Relevant articles
- [Extracting a Tar File in Java](https://www.baeldung.com/java-extract-tar-file)
- [Convert a String with Unicode Encoding to a String of Letters](https://www.baeldung.com/java-convert-string-unicode-encoding)
+-
- More articles: [[<--prev]](../libraries-apache-commons)
diff --git a/libraries-apache-commons-2/pom.xml b/libraries-apache-commons-2/pom.xml
index ee9b51e6cc..c555b83273 100644
--- a/libraries-apache-commons-2/pom.xml
+++ b/libraries-apache-commons-2/pom.xml
@@ -33,6 +33,17 @@
commons-text
${apache-commons-text.version}
+
+ commons-net
+ commons-net
+ ${commons-net.version}
+
+
+ org.mockftpserver
+ MockFtpServer
+ ${mockftpserver.version}
+ test
+
@@ -40,6 +51,8 @@
1.10.13
2.9.0
1.10.0
+ 3.6
+ 2.7.1
\ No newline at end of file
diff --git a/libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/ftp/FtpClient.java
similarity index 90%
rename from libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java
rename to libraries-apache-commons-2/src/main/java/com/baeldung/commons/ftp/FtpClient.java
index f885ff13b3..412f0726a7 100644
--- a/libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java
+++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/ftp/FtpClient.java
@@ -1,15 +1,19 @@
-package com.baeldung.ftp;
+package com.baeldung.commons.ftp;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
-import java.io.*;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.stream.Collectors;
-
class FtpClient {
private final String server;
diff --git a/libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/FtpClientIntegrationTest.java
similarity index 98%
rename from libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
rename to libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/FtpClientIntegrationTest.java
index 43da69f96d..4bbebc0ea1 100644
--- a/libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
+++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/FtpClientIntegrationTest.java
@@ -1,4 +1,11 @@
-package com.baeldung.ftp;
+package com.baeldung.commons.ftp;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Collection;
import org.junit.After;
import org.junit.Before;
@@ -10,13 +17,6 @@ import org.mockftpserver.fake.filesystem.FileEntry;
import org.mockftpserver.fake.filesystem.FileSystem;
import org.mockftpserver.fake.filesystem.UnixFakeFileSystem;
-import java.io.File;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.Collection;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
public class FtpClientIntegrationTest {
private FakeFtpServer fakeFtpServer;
diff --git a/libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/JdkFtpClientIntegrationTest.java
similarity index 93%
rename from libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
rename to libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/JdkFtpClientIntegrationTest.java
index ef6809b02d..905bc4906a 100644
--- a/libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
+++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/JdkFtpClientIntegrationTest.java
@@ -1,4 +1,13 @@
-package com.baeldung.ftp;
+package com.baeldung.commons.ftp;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
import org.junit.After;
import org.junit.Before;
@@ -10,18 +19,6 @@ import org.mockftpserver.fake.filesystem.FileEntry;
import org.mockftpserver.fake.filesystem.FileSystem;
import org.mockftpserver.fake.filesystem.UnixFakeFileSystem;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.file.Files;
-import java.util.Collection;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
public class JdkFtpClientIntegrationTest {
private FakeFtpServer fakeFtpServer;
diff --git a/libraries-6/src/test/resources/ftp/baz.txt b/libraries-apache-commons-2/src/test/resources/ftp/baz.txt
similarity index 100%
rename from libraries-6/src/test/resources/ftp/baz.txt
rename to libraries-apache-commons-2/src/test/resources/ftp/baz.txt
diff --git a/libraries-bytecode/.gitignore b/libraries-bytecode/.gitignore
new file mode 100644
index 0000000000..e594daf27a
--- /dev/null
+++ b/libraries-bytecode/.gitignore
@@ -0,0 +1,9 @@
+*.class
+
+# Folders #
+/gensrc
+/target
+
+# Packaged files #
+*.jar
+/bin/
diff --git a/libraries-bytecode/README.md b/libraries-bytecode/README.md
new file mode 100644
index 0000000000..cc30511ad1
--- /dev/null
+++ b/libraries-bytecode/README.md
@@ -0,0 +1,9 @@
+## Server
+
+This module contains articles about bytecode libraries.
+
+### Relevant Articles:
+
+- [Introduction to Javassist](https://www.baeldung.com/javassist)
+- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
+- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm)
\ No newline at end of file
diff --git a/libraries-bytecode/pom.xml b/libraries-bytecode/pom.xml
new file mode 100644
index 0000000000..f21911d77e
--- /dev/null
+++ b/libraries-bytecode/pom.xml
@@ -0,0 +1,85 @@
+
+
+ 4.0.0
+ libraries-bytecode
+ 0.0.1-SNAPSHOT
+ libraries-bytecode
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.javassist
+ javassist
+ ${javaassist.version}
+
+
+ net.bytebuddy
+ byte-buddy
+ ${byte-buddy.version}
+
+
+ net.bytebuddy
+ byte-buddy-agent
+ ${byte-buddy.version}
+
+
+ org.ow2.asm
+ asm
+ ${asm.version}
+
+
+ org.ow2.asm
+ asm-util
+ ${asm.version}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED
+ --add-exports=java.base/sun.nio.ch=ALL-UNNAMED
+ --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
+ --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
+ --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED
+ --add-opens=java.base/java.lang=ALL-UNNAMED
+ --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
+ --add-opens=java.base/java.io=ALL-UNNAMED
+ --add-opens=java.base/java.util=ALL-UNNAMED
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+
+ com.baeldung.examples.asm.instrumentation.Premain
+
+
+
+
+
+
+
+
+
+ 3.29.2-GA
+ 5.2
+
+
+
\ No newline at end of file
diff --git a/asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java b/libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java
similarity index 96%
rename from asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java
rename to libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java
index d41a1a16a3..f05a753320 100644
--- a/asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java
+++ b/libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java
@@ -1,160 +1,160 @@
-package com.baeldung.examples.asm;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
-import static org.objectweb.asm.Opcodes.ACC_STATIC;
-import static org.objectweb.asm.Opcodes.ASM4;
-import static org.objectweb.asm.Opcodes.V1_5;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.util.TraceClassVisitor;
-
-/**
- *
- * @author baeldung
- * @param
- */
-public class CustomClassWriter {
-
- ClassReader reader;
- ClassWriter writer;
- AddFieldAdapter addFieldAdapter;
- AddInterfaceAdapter addInterfaceAdapter;
- PublicizeMethodAdapter pubMethAdapter;
- final static String CLASSNAME = "java.lang.Integer";
- final static String CLONEABLE = "java/lang/Cloneable";
-
- public CustomClassWriter() {
-
- try {
- reader = new ClassReader(CLASSNAME);
- writer = new ClassWriter(reader, 0);
-
- } catch (IOException ex) {
- Logger.getLogger(CustomClassWriter.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
-
- public CustomClassWriter(byte[] contents) {
- reader = new ClassReader(contents);
- writer = new ClassWriter(reader, 0);
- }
-
- public static void main(String[] args) {
- CustomClassWriter ccw = new CustomClassWriter();
- ccw.publicizeMethod();
- }
-
- public byte[] addField() {
- addFieldAdapter = new AddFieldAdapter("aNewBooleanField", org.objectweb.asm.Opcodes.ACC_PUBLIC, writer);
- reader.accept(addFieldAdapter, 0);
- return writer.toByteArray();
- }
-
- public byte[] publicizeMethod() {
- pubMethAdapter = new PublicizeMethodAdapter(writer);
- reader.accept(pubMethAdapter, 0);
- return writer.toByteArray();
- }
-
- public byte[] addInterface() {
- addInterfaceAdapter = new AddInterfaceAdapter(writer);
- reader.accept(addInterfaceAdapter, 0);
- return writer.toByteArray();
- }
-
- public class AddInterfaceAdapter extends ClassVisitor {
-
- public AddInterfaceAdapter(ClassVisitor cv) {
- super(ASM4, cv);
- }
-
- @Override
- public void visit(int version, int access, String name,
- String signature, String superName, String[] interfaces) {
- String[] holding = new String[interfaces.length + 1];
- holding[holding.length - 1] = CLONEABLE;
- System.arraycopy(interfaces, 0, holding, 0, interfaces.length);
-
- cv.visit(V1_5, access, name, signature, superName, holding);
- }
-
- }
-
- public class PublicizeMethodAdapter extends ClassVisitor {
-
- final Logger logger = Logger.getLogger("PublicizeMethodAdapter");
- TraceClassVisitor tracer;
- PrintWriter pw = new PrintWriter(System.out);
-
- public PublicizeMethodAdapter(ClassVisitor cv) {
- super(ASM4, cv);
- this.cv = cv;
- tracer = new TraceClassVisitor(cv, pw);
- }
-
- @Override
- public MethodVisitor visitMethod(int access,
- String name,
- String desc,
- String signature,
- String[] exceptions) {
-
- if (name.equals("toUnsignedString0")) {
- logger.info("Visiting unsigned method");
- return tracer.visitMethod(ACC_PUBLIC + ACC_STATIC, name, desc, signature, exceptions);
- }
- return tracer.visitMethod(access, name, desc, signature, exceptions);
-
- }
-
- public void visitEnd() {
- tracer.visitEnd();
- System.out.println(tracer.p.getText());
- }
-
- }
-
- public class AddFieldAdapter extends ClassVisitor {
-
- String fieldName;
- int access;
- boolean isFieldPresent;
-
- public AddFieldAdapter(String fieldName, int access, ClassVisitor cv) {
- super(ASM4, cv);
- this.cv = cv;
- this.access = access;
- this.fieldName = fieldName;
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- if (name.equals(fieldName)) {
- isFieldPresent = true;
- }
- return cv.visitField(access, name, desc, signature, value);
- }
-
- @Override
- public void visitEnd() {
- if (!isFieldPresent) {
- FieldVisitor fv = cv.visitField(access, fieldName, Type.BOOLEAN_TYPE.toString(), null, null);
- if (fv != null) {
- fv.visitEnd();
- }
- }
- cv.visitEnd();
- }
-
- }
-
-}
+package com.baeldung.asm;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ASM4;
+import static org.objectweb.asm.Opcodes.V1_5;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.util.TraceClassVisitor;
+
+/**
+ *
+ * @author baeldung
+ * @param
+ */
+public class CustomClassWriter {
+
+ ClassReader reader;
+ ClassWriter writer;
+ AddFieldAdapter addFieldAdapter;
+ AddInterfaceAdapter addInterfaceAdapter;
+ PublicizeMethodAdapter pubMethAdapter;
+ final static String CLASSNAME = "java.lang.Integer";
+ final static String CLONEABLE = "java/lang/Cloneable";
+
+ public CustomClassWriter() {
+
+ try {
+ reader = new ClassReader(CLASSNAME);
+ writer = new ClassWriter(reader, 0);
+
+ } catch (IOException ex) {
+ Logger.getLogger(CustomClassWriter.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public CustomClassWriter(byte[] contents) {
+ reader = new ClassReader(contents);
+ writer = new ClassWriter(reader, 0);
+ }
+
+ public static void main(String[] args) {
+ CustomClassWriter ccw = new CustomClassWriter();
+ ccw.publicizeMethod();
+ }
+
+ public byte[] addField() {
+ addFieldAdapter = new AddFieldAdapter("aNewBooleanField", org.objectweb.asm.Opcodes.ACC_PUBLIC, writer);
+ reader.accept(addFieldAdapter, 0);
+ return writer.toByteArray();
+ }
+
+ public byte[] publicizeMethod() {
+ pubMethAdapter = new PublicizeMethodAdapter(writer);
+ reader.accept(pubMethAdapter, 0);
+ return writer.toByteArray();
+ }
+
+ public byte[] addInterface() {
+ addInterfaceAdapter = new AddInterfaceAdapter(writer);
+ reader.accept(addInterfaceAdapter, 0);
+ return writer.toByteArray();
+ }
+
+ public class AddInterfaceAdapter extends ClassVisitor {
+
+ public AddInterfaceAdapter(ClassVisitor cv) {
+ super(ASM4, cv);
+ }
+
+ @Override
+ public void visit(int version, int access, String name,
+ String signature, String superName, String[] interfaces) {
+ String[] holding = new String[interfaces.length + 1];
+ holding[holding.length - 1] = CLONEABLE;
+ System.arraycopy(interfaces, 0, holding, 0, interfaces.length);
+
+ cv.visit(V1_5, access, name, signature, superName, holding);
+ }
+
+ }
+
+ public class PublicizeMethodAdapter extends ClassVisitor {
+
+ final Logger logger = Logger.getLogger("PublicizeMethodAdapter");
+ TraceClassVisitor tracer;
+ PrintWriter pw = new PrintWriter(System.out);
+
+ public PublicizeMethodAdapter(ClassVisitor cv) {
+ super(ASM4, cv);
+ this.cv = cv;
+ tracer = new TraceClassVisitor(cv, pw);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access,
+ String name,
+ String desc,
+ String signature,
+ String[] exceptions) {
+
+ if (name.equals("toUnsignedString0")) {
+ logger.info("Visiting unsigned method");
+ return tracer.visitMethod(ACC_PUBLIC + ACC_STATIC, name, desc, signature, exceptions);
+ }
+ return tracer.visitMethod(access, name, desc, signature, exceptions);
+
+ }
+
+ public void visitEnd() {
+ tracer.visitEnd();
+ System.out.println(tracer.p.getText());
+ }
+
+ }
+
+ public class AddFieldAdapter extends ClassVisitor {
+
+ String fieldName;
+ int access;
+ boolean isFieldPresent;
+
+ public AddFieldAdapter(String fieldName, int access, ClassVisitor cv) {
+ super(ASM4, cv);
+ this.cv = cv;
+ this.access = access;
+ this.fieldName = fieldName;
+ }
+
+ @Override
+ public FieldVisitor visitField(int access, String name, String desc,
+ String signature, Object value) {
+ if (name.equals(fieldName)) {
+ isFieldPresent = true;
+ }
+ return cv.visitField(access, name, desc, signature, value);
+ }
+
+ @Override
+ public void visitEnd() {
+ if (!isFieldPresent) {
+ FieldVisitor fv = cv.visitField(access, fieldName, Type.BOOLEAN_TYPE.toString(), null, null);
+ if (fv != null) {
+ fv.visitEnd();
+ }
+ }
+ cv.visitEnd();
+ }
+
+ }
+
+}
diff --git a/asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java b/libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java
similarity index 88%
rename from asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java
rename to libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java
index a3e69b6785..502137bd3d 100644
--- a/asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java
+++ b/libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java
@@ -1,6 +1,6 @@
-package com.baeldung.examples.asm.instrumentation;
+package com.baeldung.asm.instrumentation;
-import com.baeldung.examples.asm.CustomClassWriter;
+import com.baeldung.asm.CustomClassWriter;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
diff --git a/libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java b/libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Bar.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java
rename to libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Bar.java
diff --git a/libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java b/libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Foo.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java
rename to libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Foo.java
diff --git a/libraries/src/main/java/com/baeldung/javasisst/Point.java b/libraries-bytecode/src/main/java/com/baeldung/javasisst/Point.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/javasisst/Point.java
rename to libraries-bytecode/src/main/java/com/baeldung/javasisst/Point.java
diff --git a/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java b/libraries-bytecode/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java
rename to libraries-bytecode/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java
diff --git a/asm/src/main/resources/logback.xml b/libraries-bytecode/src/main/resources/logback.xml
similarity index 100%
rename from asm/src/main/resources/logback.xml
rename to libraries-bytecode/src/main/resources/logback.xml
diff --git a/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java b/libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
similarity index 93%
rename from libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
rename to libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
index 5f721025c3..398e873223 100644
--- a/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
+++ b/libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
@@ -1,5 +1,16 @@
package com.baeldung.bytebuddy;
+import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy;
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static net.bytebuddy.matcher.ElementMatchers.returns;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.junit.Test;
+
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.dynamic.DynamicType;
@@ -8,14 +19,6 @@ import net.bytebuddy.dynamic.loading.ClassReloadingStrategy;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-import static net.bytebuddy.matcher.ElementMatchers.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
public class ByteBuddyUnitTest {
diff --git a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java b/libraries-bytecode/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java
rename to libraries-bytecode/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java
diff --git a/libraries-cli/.gitignore b/libraries-cli/.gitignore
new file mode 100644
index 0000000000..e594daf27a
--- /dev/null
+++ b/libraries-cli/.gitignore
@@ -0,0 +1,9 @@
+*.class
+
+# Folders #
+/gensrc
+/target
+
+# Packaged files #
+*.jar
+/bin/
diff --git a/libraries-cli/README.md b/libraries-cli/README.md
new file mode 100644
index 0000000000..b31bb2853d
--- /dev/null
+++ b/libraries-cli/README.md
@@ -0,0 +1,9 @@
+## Server
+
+This module contains articles about cli libraries.
+
+### Relevant Articles:
+
+- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program)
+- [Parsing Command-Line Parameters with JCommander](https://www.baeldung.com/jcommander-parsing-command-line-parameters)
+- [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline)
\ No newline at end of file
diff --git a/libraries-cli/pom.xml b/libraries-cli/pom.xml
new file mode 100644
index 0000000000..d204f3c735
--- /dev/null
+++ b/libraries-cli/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+ libraries-cli
+ 0.0.1-SNAPSHOT
+ libraries-cli
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot-starter.version}
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-jdbc
+ ${spring.version}
+
+
+ info.picocli
+ picocli
+ ${picocli.version}
+
+
+ com.beust
+ jcommander
+ ${jcommander.version}
+
+
+ com.github.rvesse
+ airline
+ ${airline.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+
+
+
+
+
+
+
+ 4.7.0
+ 1.78
+ 2.7.2
+ 2.7.8
+ 5.3.25
+
+
+
\ No newline at end of file
diff --git a/libraries-3/src/main/java/com/baeldung/airline/CommandLine.java b/libraries-cli/src/main/java/com/baeldung/airline/CommandLine.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/airline/CommandLine.java
rename to libraries-cli/src/main/java/com/baeldung/airline/CommandLine.java
diff --git a/libraries-3/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java b/libraries-cli/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java
rename to libraries-cli/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java
diff --git a/libraries-3/src/main/java/com/baeldung/airline/LoggingCommand.java b/libraries-cli/src/main/java/com/baeldung/airline/LoggingCommand.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/airline/LoggingCommand.java
rename to libraries-cli/src/main/java/com/baeldung/airline/LoggingCommand.java
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java b/libraries-cli/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java
similarity index 99%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java
index ea6b18af53..a28066ac3d 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java
@@ -1,5 +1,10 @@
package com.baeldung.jcommander.usagebilling.cli;
+import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.FETCH_CMD;
+import static com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService.getDefault;
+
+import java.util.List;
+
import com.baeldung.jcommander.usagebilling.cli.splitter.ColonParameterSplitter;
import com.baeldung.jcommander.usagebilling.cli.validator.UUIDValidator;
import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest;
@@ -7,13 +12,9 @@ import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse;
import com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
+
import lombok.Getter;
-import java.util.List;
-
-import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.*;
-import static com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService.getDefault;
-
@Parameters(
commandNames = { FETCH_CMD },
commandDescription = "Fetch charges for a customer in the current month, can be itemized or aggregated"
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java
similarity index 99%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java
index d3516b19d3..5c12ac665c 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java
@@ -1,5 +1,11 @@
package com.baeldung.jcommander.usagebilling.cli;
+import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.SUBMIT_CMD;
+import static com.baeldung.jcommander.usagebilling.service.SubmitUsageService.getDefault;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+
import com.baeldung.jcommander.usagebilling.cli.converter.ISO8601TimestampConverter;
import com.baeldung.jcommander.usagebilling.cli.validator.UUIDValidator;
import com.baeldung.jcommander.usagebilling.model.UsageRequest;
@@ -7,14 +13,9 @@ import com.baeldung.jcommander.usagebilling.model.UsageRequest.PricingType;
import com.baeldung.jcommander.usagebilling.service.SubmitUsageService;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
+
import lombok.Getter;
-import java.math.BigDecimal;
-import java.time.Instant;
-
-import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.*;
-import static com.baeldung.jcommander.usagebilling.service.SubmitUsageService.getDefault;
-
@Parameters(
commandNames = { SUBMIT_CMD },
commandDescription = "Submit usage for a given customer and subscription, accepts one usage item"
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java
index e54865a811..c173f62684 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java
@@ -1,7 +1,6 @@
package com.baeldung.jcommander.usagebilling.cli.converter;
-import com.beust.jcommander.ParameterException;
-import com.beust.jcommander.converters.BaseConverter;
+import static java.lang.String.format;
import java.time.Instant;
import java.time.LocalDateTime;
@@ -9,7 +8,8 @@ import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
-import static java.lang.String.format;
+import com.beust.jcommander.ParameterException;
+import com.beust.jcommander.converters.BaseConverter;
public class ISO8601TimestampConverter extends BaseConverter {
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java
index f24c028123..1e73b54045 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java
@@ -1,10 +1,10 @@
package com.baeldung.jcommander.usagebilling.cli.splitter;
-import com.beust.jcommander.converters.IParameterSplitter;
+import static java.util.Arrays.asList;
import java.util.List;
-import static java.util.Arrays.asList;
+import com.beust.jcommander.converters.IParameterSplitter;
public class ColonParameterSplitter implements IParameterSplitter {
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java
index a72912f7d0..f8d9f81203 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java
@@ -1,10 +1,10 @@
package com.baeldung.jcommander.usagebilling.cli.validator;
+import java.util.regex.Pattern;
+
import com.beust.jcommander.IParameterValidator;
import com.beust.jcommander.ParameterException;
-import java.util.regex.Pattern;
-
public class UUIDValidator implements IParameterValidator {
private static final String UUID_REGEX =
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java
similarity index 70%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java
index 93dd7a5732..c57805b784 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java
@@ -1,9 +1,13 @@
package com.baeldung.jcommander.usagebilling.model;
-import lombok.*;
-
import java.util.List;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Builder
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java
similarity index 91%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java
index 865a6e4a3d..46fb86ba78 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java
@@ -1,11 +1,15 @@
package com.baeldung.jcommander.usagebilling.model;
-import lombok.*;
-
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Builder
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java
similarity index 89%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java
index 2785474acf..07da8ee4b5 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java
@@ -1,10 +1,14 @@
package com.baeldung.jcommander.usagebilling.model;
-import lombok.*;
-
import java.math.BigDecimal;
import java.time.Instant;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Builder
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java
index 6436d49875..e1c5e25856 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java
@@ -1,13 +1,5 @@
package com.baeldung.jcommander.usagebilling.service;
-import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest;
-import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse;
-import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse.LineItem;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.UUID;
-
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static java.util.Arrays.fill;
@@ -15,6 +7,14 @@ import static java.util.Collections.emptyList;
import static java.util.concurrent.ThreadLocalRandom.current;
import static java.util.stream.Collectors.toList;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.UUID;
+
+import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest;
+import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse;
+import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse.LineItem;
+
class DefaultFetchCurrentChargesService implements FetchCurrentChargesService {
@Override
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java
index 44ac9e9ed7..fb214c9ab9 100644
--- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java
+++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java
@@ -1,9 +1,9 @@
package com.baeldung.jcommander.usagebilling.service;
-import com.baeldung.jcommander.usagebilling.model.UsageRequest;
-
import java.util.UUID;
+import com.baeldung.jcommander.usagebilling.model.UsageRequest;
+
class DefaultSubmitUsageService implements SubmitUsageService {
@Override
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java
diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java
rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/Application.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java
similarity index 99%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/Application.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java
index 04af524e45..80c132d637 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/Application.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java
@@ -1,13 +1,15 @@
package com.baeldung.picocli.git;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
import com.baeldung.picocli.git.commands.programmative.GitCommand;
import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+
import picocli.CommandLine;
@SpringBootApplication
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java
similarity index 99%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java
index f3c690a3e6..fbd7907eb8 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java
@@ -1,14 +1,15 @@
package com.baeldung.picocli.git.commands.declarative;
-import com.baeldung.picocli.git.model.ConfigElement;
-import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
-import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
-import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand;
-import picocli.CommandLine;
-
import static picocli.CommandLine.*;
import static picocli.CommandLine.Command;
+import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
+import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
+import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand;
+import com.baeldung.picocli.git.model.ConfigElement;
+
+import picocli.CommandLine;
+
@Command(
name = "git",
subcommands = {
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java
index 2c3e440b8b..74993a50fe 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java
@@ -1,9 +1,9 @@
package com.baeldung.picocli.git.commands.methods;
-import picocli.CommandLine;
-
import static picocli.CommandLine.Command;
+import picocli.CommandLine;
+
@Command(name = "git")
public class GitCommand implements Runnable {
public static void main(String[] args) {
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java
similarity index 99%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java
index 81ecfd78be..fabd0e4cc7 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java
@@ -1,13 +1,15 @@
package com.baeldung.picocli.git.commands.programmative;
-import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
-import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
-import org.springframework.stereotype.Component;
-import picocli.CommandLine;
-
import static picocli.CommandLine.Command;
import static picocli.CommandLine.RunLast;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
+import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
+
+import picocli.CommandLine;
+
@Command(name = "git")
@Component
public class GitCommand implements Runnable {
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java
index 803cd8dc7d..f87e55a5cc 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java
@@ -1,11 +1,11 @@
package com.baeldung.picocli.git.commands.subcommands;
-import org.springframework.stereotype.Component;
+import static picocli.CommandLine.*;
import java.nio.file.Path;
import java.util.List;
-import static picocli.CommandLine.*;
+import org.springframework.stereotype.Component;
@Command(
name = "add"
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java
index df4928983c..f2136f9c39 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java
@@ -1,10 +1,10 @@
package com.baeldung.picocli.git.commands.subcommands;
-import org.springframework.stereotype.Component;
-
import static picocli.CommandLine.Command;
import static picocli.CommandLine.Option;
+import org.springframework.stereotype.Component;
+
@Command(
name = "commit"
)
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java
similarity index 99%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java
index 80e14c0121..6ba803140a 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java
@@ -1,11 +1,12 @@
package com.baeldung.picocli.git.commands.subcommands;
-import com.baeldung.picocli.git.model.ConfigElement;
-import org.springframework.stereotype.Component;
-
import static picocli.CommandLine.Command;
import static picocli.CommandLine.Parameters;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.picocli.git.model.ConfigElement;
+
@Command(
name = "config"
)
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java
diff --git a/libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java
rename to libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java
index 97a861e2f0..2df8ac0a5b 100644
--- a/libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java
+++ b/libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java
@@ -1,9 +1,9 @@
package com.baeldung.picocli.helloworld;
-import picocli.CommandLine;
-
import static picocli.CommandLine.Command;
+import picocli.CommandLine;
+
@Command(
name = "hello",
description = "Says hello"
diff --git a/libraries-cli/src/main/resources/logback.xml b/libraries-cli/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/libraries-cli/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java
similarity index 99%
rename from libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java
rename to libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java
index 48b3ac2896..c73e8e9d48 100644
--- a/libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java
+++ b/libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java
@@ -1,9 +1,10 @@
package com.baeldung.jcommander.helloworld;
-import com.beust.jcommander.JCommander;
+import static org.junit.Assert.assertEquals;
+
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
+import com.beust.jcommander.JCommander;
public class HelloWorldAppUnitTest {
diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java
similarity index 99%
rename from libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java
rename to libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java
index b639661c39..aba4585f6e 100644
--- a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java
+++ b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java
@@ -1,11 +1,12 @@
package com.baeldung.jcommander.usagebilling.cli;
-import com.beust.jcommander.JCommander;
-import org.junit.Test;
-
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.junit.Assert.assertThat;
+import org.junit.Test;
+
+import com.beust.jcommander.JCommander;
+
public class FetchCurrentChargesCommandUnitTest {
private JCommander jc = JCommander.newBuilder()
diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java
similarity index 95%
rename from libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java
rename to libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java
index d6ce132053..a4d8273638 100644
--- a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java
+++ b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java
@@ -1,12 +1,11 @@
package com.baeldung.jcommander.usagebilling.cli;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.Test;
+
import com.beust.jcommander.JCommander;
import com.beust.jcommander.ParameterException;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
public class SubmitUsageCommandUnitTest {
diff --git a/libraries-concurrency/README.md b/libraries-concurrency/README.md
index d1ffe81fa8..8808335a5b 100644
--- a/libraries-concurrency/README.md
+++ b/libraries-concurrency/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [Intro to Coroutines with Quasar](https://www.baeldung.com/java-quasar-coroutines)
+- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml
index 8b0ccdd5ec..31bce1a982 100644
--- a/libraries-concurrency/pom.xml
+++ b/libraries-concurrency/pom.xml
@@ -28,6 +28,16 @@
quasar-reactive-streams
${quasar.version}
+
+ org.jctools
+ jctools-core
+ ${jctools.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
@@ -77,6 +87,7 @@
0.8.0
+ 2.1.2
\ No newline at end of file
diff --git a/libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java b/libraries-concurrency/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
similarity index 77%
rename from libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
rename to libraries-concurrency/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
index 7b754bf709..d448bb74b6 100644
--- a/libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
+++ b/libraries-concurrency/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
@@ -1,14 +1,27 @@
package com.baeldung.jctools;
-import org.jctools.queues.MpmcArrayQueue;
-import org.jctools.queues.atomic.MpmcAtomicArrayQueue;
-import org.openjdk.jmh.annotations.*;
-import org.openjdk.jmh.infra.Control;
-
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
+import org.jctools.queues.MpmcArrayQueue;
+import org.jctools.queues.atomic.MpmcAtomicArrayQueue;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Group;
+import org.openjdk.jmh.annotations.GroupThreads;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Control;
+
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(1)
diff --git a/libraries-5/src/main/java/com/baeldung/jctools/README.md b/libraries-concurrency/src/main/java/com/baeldung/jctools/README.md
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/jctools/README.md
rename to libraries-concurrency/src/main/java/com/baeldung/jctools/README.md
diff --git a/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java b/libraries-concurrency/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
similarity index 98%
rename from libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
rename to libraries-concurrency/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
index a5dacdbdac..28f42650e9 100644
--- a/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
+++ b/libraries-concurrency/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
@@ -1,20 +1,19 @@
package com.baeldung.jctools;
-import org.assertj.core.api.Assertions;
-import org.jctools.queues.SpscArrayQueue;
-import org.jctools.queues.SpscChunkedArrayQueue;
-import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.IntConsumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.fail;
+import org.assertj.core.api.Assertions;
+import org.jctools.queues.SpscArrayQueue;
+import org.jctools.queues.SpscChunkedArrayQueue;
+import org.junit.Test;
public class JCToolsUnitTest {
diff --git a/libraries-data-3/README.md b/libraries-data-3/README.md
new file mode 100644
index 0000000000..e6f02bf2aa
--- /dev/null
+++ b/libraries-data-3/README.md
@@ -0,0 +1,15 @@
+## Data Libraries
+
+This module contains articles about libraries for data processing in Java.
+
+### Relevant articles
+- [Introduction to Javatuples](https://www.baeldung.com/java-tuples)
+- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
+- [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map)
+- [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos)
+- [Introduction to cache2k](https://www.baeldung.com/java-cache2k)
+- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
+- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
+- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
+- [Guide to Using ModelMapper](https://www.baeldung.com/java-modelmapper)
+- More articles: [[<-- prev]](/../libraries-data-2)
diff --git a/libraries-data-3/pom.xml b/libraries-data-3/pom.xml
new file mode 100644
index 0000000000..536939d435
--- /dev/null
+++ b/libraries-data-3/pom.xml
@@ -0,0 +1,101 @@
+
+
+ 4.0.0
+ libraries-data-3
+ libraries-data-3
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.javatuples
+ javatuples
+ ${javatuples.version}
+
+
+ org.multiverse
+ multiverse-core
+ ${multiverse.version}
+
+
+ net.openhft
+ chronicle-map
+ ${chronicle.map.version}
+
+
+ com.sun.java
+ tools
+
+
+
+
+ org.cactoos
+ cactoos
+ ${cactoos.version}
+
+
+ org.cache2k
+ cache2k-base-bom
+ ${cache2k.version}
+ pom
+
+
+ org.pcollections
+ pcollections
+ ${pcollections.version}
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse-collections.version}
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ ${caffeine.version}
+
+
+ com.google.code.findbugs
+ jsr305
+ ${findbugs.version}
+ test
+
+
+ org.modelmapper
+ modelmapper
+ ${org.modelmapper.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED
+
+
+
+
+
+
+ 1.2
+ 0.7.0
+ 3.24ea1
+ 0.43
+ 1.2.3.Final
+ 2.1.2
+ 8.2.0
+ 3.1.8
+ 3.0.2
+ 3.2.0
+
+
+
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelper.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java
rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelper.java
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java
rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java
rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java
rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java
diff --git a/libraries-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java b/libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java
rename to libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java
diff --git a/libraries-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java b/libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java
rename to libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java
diff --git a/libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java b/libraries-data-3/src/main/java/com/baeldung/caffeine/DataObject.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java
rename to libraries-data-3/src/main/java/com/baeldung/caffeine/DataObject.java
diff --git a/libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries-data-3/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
similarity index 100%
rename from libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
rename to libraries-data-3/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
diff --git a/libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries-data-3/src/main/java/com/baeldung/eclipsecollections/Student.java
similarity index 100%
rename from libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java
rename to libraries-data-3/src/main/java/com/baeldung/eclipsecollections/Student.java
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/Game.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Game.java
similarity index 100%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/Game.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Game.java
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameMode.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameMode.java
similarity index 100%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameMode.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameMode.java
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java
similarity index 100%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/Player.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Player.java
similarity index 100%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/Player.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Player.java
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java
similarity index 99%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java
index 1c8111809c..07e3ba4903 100644
--- a/libraries-6/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java
+++ b/libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java
@@ -1,8 +1,9 @@
package com.baeldung.modelmapper.dto;
-import com.baeldung.modelmapper.domain.GameMode;
import java.util.List;
+import com.baeldung.modelmapper.domain.GameMode;
+
public class GameDTO {
private Long id;
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java
similarity index 100%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java
diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java
similarity index 99%
rename from libraries-6/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java
rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java
index 80b861c981..2b33e8fba6 100644
--- a/libraries-6/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java
+++ b/libraries-data-3/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java
@@ -1,9 +1,10 @@
package com.baeldung.modelmapper.repository;
-import com.baeldung.modelmapper.domain.Game;
import java.util.ArrayList;
import java.util.List;
+import com.baeldung.modelmapper.domain.Game;
+
/**
* Sample in-memory Game Repository
*/
diff --git a/libraries/src/main/java/com/baeldung/stm/Account.java b/libraries-data-3/src/main/java/com/baeldung/stm/Account.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/stm/Account.java
rename to libraries-data-3/src/main/java/com/baeldung/stm/Account.java
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
diff --git a/libraries-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java
index c6bcbd7df7..a57c5def6e 100644
--- a/libraries-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java
@@ -3,8 +3,8 @@ package com.baeldung.cactoos;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.IOException;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
import org.junit.Test;
diff --git a/libraries-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java
diff --git a/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
similarity index 92%
rename from libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
index 65c441c50d..db7e12d78c 100644
--- a/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
@@ -1,6 +1,8 @@
package com.baeldung.caffeine;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import java.util.Arrays;
import java.util.Map;
@@ -11,7 +13,11 @@ import javax.annotation.Nonnull;
import org.junit.Assert;
import org.junit.Test;
-import com.github.benmanes.caffeine.cache.*;
+import com.github.benmanes.caffeine.cache.AsyncLoadingCache;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.Expiry;
+import com.github.benmanes.caffeine.cache.LoadingCache;
public class CaffeineUnitTest {
diff --git a/libraries-2/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java
similarity index 97%
rename from libraries-2/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java
index 7f36a9abdb..6b3898419a 100644
--- a/libraries-2/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java
@@ -1,132 +1,132 @@
-package com.baeldung.chroniclemap;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import net.openhft.chronicle.core.values.LongValue;
-import net.openhft.chronicle.map.ChronicleMap;
-import net.openhft.chronicle.map.ExternalMapQueryContext;
-import net.openhft.chronicle.map.MapEntry;
-import net.openhft.chronicle.values.Values;
-
-public class ChronicleMapUnitTest {
-
- static ChronicleMap persistedCountryMap = null;
-
- static ChronicleMap inMemoryCountryMap = null;
-
- static ChronicleMap> multiMap = null;
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- @BeforeClass
- public static void init() {
- try {
- inMemoryCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class)
- .name("country-map")
- .entries(50)
- .averageValue("America")
- .create();
-
- persistedCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class)
- .name("country-map")
- .entries(50)
- .averageValue("America")
- .createPersistedTo(new File(System.getProperty("user.home") + "/country-details.dat"));
-
- Set averageValue = IntStream.of(1, 2)
- .boxed()
- .collect(Collectors.toSet());
- multiMap = ChronicleMap.of(Integer.class, (Class>) (Class) Set.class)
- .name("multi-map")
- .entries(50)
- .averageValue(averageValue)
- .create();
-
- LongValue qatarKey = Values.newHeapInstance(LongValue.class);
- qatarKey.setValue(1);
- inMemoryCountryMap.put(qatarKey, "Qatar");
-
- LongValue key = Values.newHeapInstance(LongValue.class);
- key.setValue(1);
- persistedCountryMap.put(key, "Romania");
- key.setValue(2);
- persistedCountryMap.put(key, "India");
-
- Set set1 = new HashSet<>();
- set1.add(1);
- set1.add(2);
- multiMap.put(1, set1);
-
- Set set2 = new HashSet<>();
- set2.add(3);
- multiMap.put(2, set2);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- @Test
- public void givenGetQuery_whenCalled_shouldReturnResult() {
- LongValue key = Values.newHeapInstance(LongValue.class);
- key.setValue(1);
- CharSequence country = inMemoryCountryMap.get(key);
- assertThat(country.toString(), is(equalTo("Qatar")));
- }
-
- @Test
- public void givenGetUsingQuery_whenCalled_shouldReturnResult() {
- LongValue key = Values.newHeapInstance(LongValue.class);
- StringBuilder country = new StringBuilder();
- key.setValue(1);
- persistedCountryMap.getUsing(key, country);
- assertThat(country.toString(), is(equalTo("Romania")));
- key.setValue(2);
- persistedCountryMap.getUsing(key, country);
- assertThat(country.toString(), is(equalTo("India")));
- }
-
- @Test
- public void givenMultipleKeyQuery_whenProcessed_shouldChangeTheValue() {
- try (ExternalMapQueryContext, ?> fistContext = multiMap.queryContext(1)) {
- try (ExternalMapQueryContext, ?> secondContext = multiMap.queryContext(2)) {
- fistContext.updateLock()
- .lock();
- secondContext.updateLock()
- .lock();
- MapEntry> firstEntry = fistContext.entry();
- Set firstSet = firstEntry.value()
- .get();
- firstSet.remove(2);
- MapEntry> secondEntry = secondContext.entry();
- Set secondSet = secondEntry.value()
- .get();
- secondSet.add(4);
- firstEntry.doReplaceValue(fistContext.wrapValueAsData(firstSet));
- secondEntry.doReplaceValue(secondContext.wrapValueAsData(secondSet));
- }
- } finally {
- assertThat(multiMap.get(1)
- .size(), is(equalTo(1)));
- assertThat(multiMap.get(2)
- .size(), is(equalTo(2)));
- }
- }
-
- @AfterClass
- public static void finish() {
- persistedCountryMap.close();
- inMemoryCountryMap.close();
- multiMap.close();
- }
-}
+package com.baeldung.chroniclemap;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import net.openhft.chronicle.core.values.LongValue;
+import net.openhft.chronicle.map.ChronicleMap;
+import net.openhft.chronicle.map.ExternalMapQueryContext;
+import net.openhft.chronicle.map.MapEntry;
+import net.openhft.chronicle.values.Values;
+
+public class ChronicleMapUnitTest {
+
+ static ChronicleMap persistedCountryMap = null;
+
+ static ChronicleMap inMemoryCountryMap = null;
+
+ static ChronicleMap> multiMap = null;
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @BeforeClass
+ public static void init() {
+ try {
+ inMemoryCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class)
+ .name("country-map")
+ .entries(50)
+ .averageValue("America")
+ .create();
+
+ persistedCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class)
+ .name("country-map")
+ .entries(50)
+ .averageValue("America")
+ .createPersistedTo(new File(System.getProperty("user.home") + "/country-details.dat"));
+
+ Set averageValue = IntStream.of(1, 2)
+ .boxed()
+ .collect(Collectors.toSet());
+ multiMap = ChronicleMap.of(Integer.class, (Class>) (Class) Set.class)
+ .name("multi-map")
+ .entries(50)
+ .averageValue(averageValue)
+ .create();
+
+ LongValue qatarKey = Values.newHeapInstance(LongValue.class);
+ qatarKey.setValue(1);
+ inMemoryCountryMap.put(qatarKey, "Qatar");
+
+ LongValue key = Values.newHeapInstance(LongValue.class);
+ key.setValue(1);
+ persistedCountryMap.put(key, "Romania");
+ key.setValue(2);
+ persistedCountryMap.put(key, "India");
+
+ Set set1 = new HashSet<>();
+ set1.add(1);
+ set1.add(2);
+ multiMap.put(1, set1);
+
+ Set set2 = new HashSet<>();
+ set2.add(3);
+ multiMap.put(2, set2);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void givenGetQuery_whenCalled_shouldReturnResult() {
+ LongValue key = Values.newHeapInstance(LongValue.class);
+ key.setValue(1);
+ CharSequence country = inMemoryCountryMap.get(key);
+ assertThat(country.toString(), is(equalTo("Qatar")));
+ }
+
+ @Test
+ public void givenGetUsingQuery_whenCalled_shouldReturnResult() {
+ LongValue key = Values.newHeapInstance(LongValue.class);
+ StringBuilder country = new StringBuilder();
+ key.setValue(1);
+ persistedCountryMap.getUsing(key, country);
+ assertThat(country.toString(), is(equalTo("Romania")));
+ key.setValue(2);
+ persistedCountryMap.getUsing(key, country);
+ assertThat(country.toString(), is(equalTo("India")));
+ }
+
+ @Test
+ public void givenMultipleKeyQuery_whenProcessed_shouldChangeTheValue() {
+ try (ExternalMapQueryContext, ?> fistContext = multiMap.queryContext(1)) {
+ try (ExternalMapQueryContext, ?> secondContext = multiMap.queryContext(2)) {
+ fistContext.updateLock()
+ .lock();
+ secondContext.updateLock()
+ .lock();
+ MapEntry> firstEntry = fistContext.entry();
+ Set firstSet = firstEntry.value()
+ .get();
+ firstSet.remove(2);
+ MapEntry> secondEntry = secondContext.entry();
+ Set secondSet = secondEntry.value()
+ .get();
+ secondSet.add(4);
+ firstEntry.doReplaceValue(fistContext.wrapValueAsData(firstSet));
+ secondEntry.doReplaceValue(secondContext.wrapValueAsData(secondSet));
+ }
+ } finally {
+ assertThat(multiMap.get(1)
+ .size(), is(equalTo(1)));
+ assertThat(multiMap.get(2)
+ .size(), is(equalTo(2)));
+ }
+ }
+
+ @AfterClass
+ public static void finish() {
+ persistedCountryMap.close();
+ inMemoryCountryMap.close();
+ multiMap.close();
+ }
+}
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
similarity index 99%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
index ff111a6d72..878964a25f 100644
--- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
@@ -1,9 +1,8 @@
package com.baeldung.eclipsecollections;
+import org.assertj.core.api.Assertions;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.impl.list.mutable.FastList;
-
-import org.assertj.core.api.Assertions;
import org.junit.Test;
public class CollectPatternUnitTest {
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
similarity index 99%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
index b0735267ae..3f57576e5d 100644
--- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
@@ -1,12 +1,11 @@
package com.baeldung.eclipsecollections;
-import org.assertj.core.api.Assertions;
-import org.eclipse.collections.api.list.MutableList;
-import org.eclipse.collections.impl.list.mutable.FastList;
-
import java.util.ArrayList;
import java.util.List;
+import org.assertj.core.api.Assertions;
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.list.mutable.FastList;
import org.junit.Before;
import org.junit.Test;
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
similarity index 95%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
index a1bd280658..3f395324c2 100644
--- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
@@ -1,7 +1,5 @@
package com.baeldung.eclipsecollections;
-import static org.junit.Assert.assertEquals;
-
import org.eclipse.collections.api.tuple.Pair;
import org.eclipse.collections.impl.map.mutable.UnifiedMap;
import org.eclipse.collections.impl.tuple.Tuples;
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
similarity index 99%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
index 942cdf4595..31b91c663e 100644
--- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
@@ -1,11 +1,10 @@
package com.baeldung.eclipsecollections;
+import org.assertj.core.api.Assertions;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.tuple.Pair;
import org.eclipse.collections.impl.factory.Lists;
import org.eclipse.collections.impl.tuple.Tuples;
-
-import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;
diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java
diff --git a/libraries-6/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java
similarity index 99%
rename from libraries-6/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java
index 69bc4059b0..c24e3c1f96 100644
--- a/libraries-6/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java
@@ -5,15 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
-import com.baeldung.modelmapper.domain.Game;
-import com.baeldung.modelmapper.domain.GameMode;
-import com.baeldung.modelmapper.domain.GameSettings;
-import com.baeldung.modelmapper.domain.Player;
-import com.baeldung.modelmapper.dto.GameDTO;
-import com.baeldung.modelmapper.dto.PlayerDTO;
-import com.baeldung.modelmapper.repository.GameRepository;
import java.time.Instant;
import java.util.Collection;
+
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.modelmapper.Condition;
@@ -24,6 +18,14 @@ import org.modelmapper.Provider;
import org.modelmapper.TypeMap;
import org.modelmapper.convention.MatchingStrategies;
+import com.baeldung.modelmapper.domain.Game;
+import com.baeldung.modelmapper.domain.GameMode;
+import com.baeldung.modelmapper.domain.GameSettings;
+import com.baeldung.modelmapper.domain.Player;
+import com.baeldung.modelmapper.dto.GameDTO;
+import com.baeldung.modelmapper.dto.PlayerDTO;
+import com.baeldung.modelmapper.repository.GameRepository;
+
public class ModelMapperUnitTest {
ModelMapper mapper;
diff --git a/libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
similarity index 96%
rename from libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
index 1a75624439..48bf232294 100644
--- a/libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
@@ -1,6 +1,14 @@
package com.baeldung.pcollections;
-import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
import org.pcollections.HashPMap;
import org.pcollections.HashTreePMap;
import org.pcollections.HashTreePSet;
@@ -8,14 +16,6 @@ import org.pcollections.MapPSet;
import org.pcollections.PVector;
import org.pcollections.TreePVector;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
public class PCollectionsUnitTest {
@Test
diff --git a/libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/stm/AccountUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java
rename to libraries-data-3/src/test/java/com/baeldung/stm/AccountUnitTest.java
index aa872ab622..c5c78f7af3 100644
--- a/libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java
+++ b/libraries-data-3/src/test/java/com/baeldung/stm/AccountUnitTest.java
@@ -1,6 +1,7 @@
package com.baeldung.stm;
-import org.junit.Test;
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
@@ -8,8 +9,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
-import static org.assertj.core.api.Java6Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
+import org.junit.Test;
public class AccountUnitTest {
diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml
index ed184d72e0..7f77d40667 100644
--- a/libraries-data-db/pom.xml
+++ b/libraries-data-db/pom.xml
@@ -152,6 +152,7 @@
org.projectlombok
lombok
+ ${lombok.version}
io.ebean
@@ -299,11 +300,12 @@
6.0.0-release
6.0.1
3.2.1
- 5.0.1
+ 5.1.0
13.15.2
2.1.3.Final
2.2.3
1.17.6
+ 3.0.8
\ No newline at end of file
diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml
index c8d895b4e5..9fc2814312 100644
--- a/libraries-data-io/pom.xml
+++ b/libraries-data-io/pom.xml
@@ -98,7 +98,7 @@
- 1.21
+ 2.2
4.0.1
1.7.0
5.8
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java
index cee73f674e..e18277b328 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java
@@ -14,52 +14,52 @@ import java.util.List;
public class Application {
// CSV Reader Examples
- public static List readLineByLineSyncExample() throws Exception {
+ public static List readLineByLineExample() throws Exception {
Path path = Helpers.twoColumnCsvPath();
return CsvReaderExamples.readLineByLine(path);
}
- public static List readAllLinesSyncExample() throws Exception {
+ public static List readAllLinesExample() throws Exception {
Path path = Helpers.twoColumnCsvPath();
return CsvReaderExamples.readAllLines(path);
}
// CSV Writer Examples
- public static String writeLineByLineSyncExample() throws Exception {
+ public static String writeLineByLineExample() throws Exception {
Path path = Helpers.fileOutOnePath();
return CsvWriterExamples.writeLineByLine(Helpers.fourColumnCsvString(), path);
}
- public static String writeAllLinesSyncExample() throws Exception {
+ public static String writeAllLinesExample() throws Exception {
Path path = Helpers.fileOutAllPath();
return CsvWriterExamples.writeAllLines(Helpers.fourColumnCsvString(), path);
}
// Bean Examples
- public static List simpleSyncPositionBeanExample() throws Exception {
+ public static List simplePositionBeanExample() throws Exception {
Path path = Helpers.twoColumnCsvPath();
return BeanExamples.beanBuilderExample(path, SimplePositionBean.class);
}
- public static List namedSyncColumnBeanExample() throws Exception {
+ public static List namedColumnBeanExample() throws Exception {
Path path = Helpers.namedColumnCsvPath();
return BeanExamples.beanBuilderExample(path, NamedColumnBean.class);
}
- public static String writeSyncCsvFromBeanExample() throws Exception {
+ public static String writeCsvFromBeanExample() throws Exception {
Path path = Helpers.fileOutBeanPath();
return BeanExamples.writeCsvFromBean(path);
}
public static void main(String[] args) {
try {
- simpleSyncPositionBeanExample();
- namedSyncColumnBeanExample();
- writeSyncCsvFromBeanExample();
- readLineByLineSyncExample();
- readAllLinesSyncExample();
- writeLineByLineSyncExample();
- writeAllLinesSyncExample();
+ simplePositionBeanExample();
+ namedColumnBeanExample();
+ writeCsvFromBeanExample();
+ readLineByLineExample();
+ readAllLinesExample();
+ writeLineByLineExample();
+ writeAllLinesExample();
} catch (Exception e) {
throw new RuntimeException("Error during csv processing", e);
}
diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java
index 6745b9be7f..c3c85c5baa 100644
--- a/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java
+++ b/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java
@@ -13,7 +13,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenReadUsingPosition_thenContentsRead() throws Exception {
- List values = Application.simpleSyncPositionBeanExample();
+ List values = Application.simplePositionBeanExample();
assertThat(values)
.extracting(Object::toString)
@@ -28,7 +28,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenReadUsingNamedColumn_thenContentsRead() throws Exception {
- List values = Application.namedSyncColumnBeanExample();
+ List values = Application.namedColumnBeanExample();
assertThat(values)
.extracting(Object::toString)
@@ -41,7 +41,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenReadLineByLine_thenContentsRead() throws Exception {
- List lineByLineContents = Application.readLineByLineSyncExample();
+ List lineByLineContents = Application.readLineByLineExample();
assertThat(lineByLineContents)
.containsExactly(
@@ -56,7 +56,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenReadAllLines_thenContentsRead() throws Exception {
- List contents = Application.readAllLinesSyncExample();
+ List contents = Application.readAllLinesExample();
assertThat(contents)
.containsExactly(
@@ -70,7 +70,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenWriteCsvUsingBean_thenContentsWritten() throws Exception {
- String contents = Application.writeSyncCsvFromBeanExample();
+ String contents = Application.writeCsvFromBeanExample();
assertThat(contents.split(NEW_LINE))
.containsExactly(
@@ -82,7 +82,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenWriteCsvLineByLine_thenContentsWritten() throws Exception {
- String contents = Application.writeLineByLineSyncExample();
+ String contents = Application.writeLineByLineExample();
assertThat(contents.split(NEW_LINE))
.containsExactly(
@@ -94,7 +94,7 @@ public class OpenCsvIntegrationTest {
@Test
public void givenSampleData_whenWriteCsvAllLines_thenContentsWritten() throws Exception {
- String contents = Application.writeAllLinesSyncExample();
+ String contents = Application.writeAllLinesExample();
assertThat(contents.split(NEW_LINE))
.containsExactly(
diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java
index 6f32f143a9..4c92bf41e1 100644
--- a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java
+++ b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java
@@ -1,15 +1,19 @@
package com.baeldung.libraries.snakeyaml;
-import org.junit.Test;
-import org.yaml.snakeyaml.TypeDescription;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import java.io.InputStream;
import java.util.Date;
import java.util.Map;
-import static org.junit.Assert.*;
+import org.junit.Test;
+import org.yaml.snakeyaml.LoaderOptions;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.inspector.TagInspector;
public class YAMLToJavaDeserialisationUnitTest {
@@ -27,7 +31,7 @@ public class YAMLToJavaDeserialisationUnitTest {
@Test
public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObject() {
- Yaml yaml = new Yaml(new Constructor(Customer.class));
+ Yaml yaml = new Yaml(new Constructor(Customer.class,new LoaderOptions()));
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("yaml/customer.yaml");
@@ -39,7 +43,11 @@ public class YAMLToJavaDeserialisationUnitTest {
@Test
public void whenLoadYAMLDocumentWithAssumedClass_thenLoadCorrectJavaObject() {
- Yaml yaml = new Yaml();
+ LoaderOptions loaderoptions = new LoaderOptions();
+ TagInspector taginspector = tag -> tag.getClassName()
+ .equals(Customer.class.getName());
+ loaderoptions.setTagInspector(taginspector);
+ Yaml yaml = new Yaml(new Constructor(Customer.class, loaderoptions));
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("yaml/customer_with_type.yaml");
@@ -61,7 +69,7 @@ public class YAMLToJavaDeserialisationUnitTest {
@Test
public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObjectWithNestedObjects() {
- Yaml yaml = new Yaml(new Constructor(Customer.class));
+ Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions()));
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("yaml/customer_with_contact_details_and_address.yaml");
@@ -91,7 +99,7 @@ public class YAMLToJavaDeserialisationUnitTest {
@Test
public void whenLoadYAMLDocumentWithTypeDescription_thenLoadCorrectJavaObjectWithCorrectGenericType() {
- Constructor constructor = new Constructor(Customer.class);
+ Constructor constructor = new Constructor(Customer.class, new LoaderOptions());
TypeDescription customTypeDescription = new TypeDescription(Customer.class);
customTypeDescription.addPropertyParameters("contactDetails", Contact.class);
constructor.addTypeDescription(customTypeDescription);
@@ -116,7 +124,7 @@ public class YAMLToJavaDeserialisationUnitTest {
@Test
public void whenLoadMultipleYAMLDocuments_thenLoadCorrectJavaObjects() {
- Yaml yaml = new Yaml(new Constructor(Customer.class));
+ Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions()));
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("yaml/customers.yaml");
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 85ef01e704..bab544e203 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -97,6 +97,11 @@
+
+ com.h2database
+ h2
+ 1.3.170
+
com.fasterxml.jackson.core
jackson-databind
@@ -150,6 +155,16 @@
xstream
1.4.16
+
+ org.springframework.data
+ spring-data-jpa
+ 2.1.5.RELEASE
+
+
+ javax.persistence
+ javax.persistence-api
+ 2.2
+
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/User.java b/libraries-data/src/main/java/com/baeldung/objecthydration/User.java
new file mode 100644
index 0000000000..9d879d62c4
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/User.java
@@ -0,0 +1,75 @@
+package com.baeldung.objecthydration;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class User implements Serializable {
+ private String uId;
+ private String firstName;
+ private String lastName;
+ private String alias;
+
+ public User() {
+ }
+
+ public User(String firstName, String uId, String lastName, String alias) {
+ this.firstName = firstName;
+ this.uId = uId;
+ this.lastName = lastName;
+ this.alias = alias;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ User user = (User) o;
+ return Objects.equals(firstName, user.firstName) && Objects.equals(uId, user.uId) && Objects.equals(lastName, user.lastName) && Objects.equals(alias, user.alias);
+ }
+
+ public String getuId() {
+ return uId;
+ }
+
+ public void setuId(String uId) {
+ this.uId = uId;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getAlias() {
+ return alias;
+ }
+
+ public void setAlias(String alias) {
+ this.alias = alias;
+ }
+
+ public void generateMyUser() {
+ this.setAlias("007");
+ this.setFirstName("James");
+ this.setLastName("Bond");
+ this.setuId("JB");
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, uId, lastName, alias);
+ }
+}
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java b/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java
new file mode 100644
index 0000000000..c9d8c5773f
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java
@@ -0,0 +1,34 @@
+package com.baeldung.objecthydration;
+
+import java.io.*;
+
+public class UserSerialisationDeserialisation {
+ public void serialisedUser(User user, String outputName) {
+ try {
+ FileOutputStream fileOut = new FileOutputStream(outputName);
+ ObjectOutputStream out = new ObjectOutputStream(fileOut);
+ out.writeObject(user);
+ out.close();
+ fileOut.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public User deserialiseUser(String serialisedFile) {
+ User deserializedUser = null;
+ try {
+ FileInputStream fileIn = new FileInputStream(serialisedFile);
+ ObjectInputStream in = new ObjectInputStream(fileIn);
+ deserializedUser = (User) in.readObject();
+ in.close();
+ fileIn.close();
+ } catch (IOException | ClassNotFoundException e) {
+ e.printStackTrace();
+ } finally {
+ File f = new File(serialisedFile);
+ f.delete();
+ }
+ return deserializedUser;
+ }
+}
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java b/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java
new file mode 100644
index 0000000000..3ae22cee88
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java
@@ -0,0 +1,71 @@
+package com.baeldung.objecthydration.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "books")
+public class Book {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "author")
+ private String author;
+
+ @Column(name = "isbn")
+ private String isbn;
+
+ // Constructors, getters, and setters
+
+ public Book() {
+ // Default constructor required by Hibernate
+ }
+
+ public Book(String name, String author, String isbn) {
+ this.name = name;
+ this.author = author;
+ this.isbn = isbn;
+ }
+
+ // Getters and setters for all attributes
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getIsbn() {
+ return isbn;
+ }
+
+ public void setIsbn(String isbn) {
+ this.isbn = isbn;
+ }
+}
\ No newline at end of file
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java b/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java
new file mode 100644
index 0000000000..a8e92eab8e
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.objecthydration.repository;
+
+import com.baeldung.objecthydration.entity.Book;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface BookRepository extends JpaRepository {
+}
diff --git a/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java b/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java
new file mode 100644
index 0000000000..317827346f
--- /dev/null
+++ b/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.objecthydration;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HydrationUnitTest {
+
+ @Test
+ public void givenEmptyClass_whenLazilyinitialised_thenGiveNullOnGet() {
+ User iamUser = new User();
+ Assert.assertNull(iamUser.getuId());
+ }
+
+ @Test
+ public void givenInitialisedClass_withLazilyInitialised_thenDoesNotGiveNullOnGet() {
+ User iamUser = new User();
+ iamUser.setAlias("007");
+ Assert.assertNotNull(iamUser.getAlias());
+ }
+
+ @Test
+ public void givenEmptyClass_withHydration_thenShouldHaveAllAttributesSet() {
+ User jamesBond = new User();
+ Assert.assertNull(jamesBond.getAlias());
+
+ jamesBond.generateMyUser();
+ Assert.assertEquals("007", jamesBond.getAlias());
+ }
+
+ @Test
+ public void givenUser_thenShouldPerformUserSerialisationDeserialisation() {
+ User iamUser = new User();
+ iamUser.setAlias("007");
+ UserSerialisationDeserialisation usd = new UserSerialisationDeserialisation();
+ usd.serialisedUser(iamUser, "bond.ser");
+ User deserialisedUser = usd.deserialiseUser("bond.ser");
+ Assert.assertEquals(iamUser.getAlias(), deserialisedUser.getAlias());
+
+ }
+}
diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml
index b49e4b9387..5e803cde8a 100644
--- a/libraries-http-2/pom.xml
+++ b/libraries-http-2/pom.xml
@@ -118,7 +118,7 @@
2.3.0
5.1.9.RELEASE
1.0.3
- 3.2.12.RELEASE
+ 3.6.0
1.49
diff --git a/libraries-io/README.md b/libraries-io/README.md
index a9ca5df3d6..1f439b954b 100644
--- a/libraries-io/README.md
+++ b/libraries-io/README.md
@@ -4,3 +4,4 @@
- [Transferring a File Through SFTP in Java](https://www.baeldung.com/java-file-sftp)
- [How to Create Password-Protected Zip Files and Unzip Them in Java](https://www.baeldung.com/java-password-protected-zip-unzip)
- [How to Create CSV File from POJO with Custom Column Headers and Positions](https://www.baeldung.com/java-create-csv-pojo-customize-columns)
+- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml
index 7464b9a507..eb8b8a24c6 100644
--- a/libraries-io/pom.xml
+++ b/libraries-io/pom.xml
@@ -5,18 +5,6 @@
4.0.0
libraries-io
libraries-io
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
- 17
-
-
-
-
com.baeldung
@@ -51,8 +39,31 @@
opencsv
${opencsv.version}
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 17
+
+
+
+
+
0.1.55
@@ -60,9 +71,7 @@
2.4
2.9.0
5.8
- 17
- 17
- UTF-8
+ 4.3.8.RELEASE
\ No newline at end of file
diff --git a/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java b/libraries-io/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
similarity index 99%
rename from libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
rename to libraries-io/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
index c9c8242cd5..bf6c4d9e40 100644
--- a/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
+++ b/libraries-io/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.io;
+package com.baeldung.java.io;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
diff --git a/libraries-reporting/.gitignore b/libraries-reporting/.gitignore
new file mode 100644
index 0000000000..e594daf27a
--- /dev/null
+++ b/libraries-reporting/.gitignore
@@ -0,0 +1,9 @@
+*.class
+
+# Folders #
+/gensrc
+/target
+
+# Packaged files #
+*.jar
+/bin/
diff --git a/libraries-reporting/README.md b/libraries-reporting/README.md
new file mode 100644
index 0000000000..6d405911ab
--- /dev/null
+++ b/libraries-reporting/README.md
@@ -0,0 +1,8 @@
+## Server
+
+This module contains articles about reporting libraries.
+
+### Relevant Articles:
+
+- [JasperReports with Spring](https://www.baeldung.com/spring-jasper)
+- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
\ No newline at end of file
diff --git a/libraries-reporting/pom.xml b/libraries-reporting/pom.xml
new file mode 100644
index 0000000000..526f187af8
--- /dev/null
+++ b/libraries-reporting/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+ libraries-reporting
+ 0.0.1-SNAPSHOT
+ libraries-reporting
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot-starter.version}
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-jdbc
+ ${spring.version}
+
+
+ javax.servlet
+ servlet-api
+ ${javax.servlet.version}
+
+
+ net.sf.jasperreports
+ jasperreports
+ ${jasperreports.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ com.haulmont.yarg
+ yarg
+ ${yarg.version}
+
+
+ org.olap4j
+ olap4j
+
+
+
+
+
+
+ 2.7.8
+ 5.3.25
+ 2.5
+ 6.20.0
+ 2.0.12
+
+
+
\ No newline at end of file
diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/Main.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/Main.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/jasperreports/Main.java
rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/Main.java
diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java
rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java
diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java
rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java
diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java
similarity index 100%
rename from libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java
rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java
diff --git a/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java b/libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java
similarity index 99%
rename from libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java
rename to libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java
index ff0d452108..9ae9b61ad1 100644
--- a/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java
+++ b/libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java
@@ -5,6 +5,16 @@
*/
package com.baeldung.yarg;
+import java.io.File;
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.FileUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
import com.haulmont.yarg.formatters.factory.DefaultFormatterFactory;
import com.haulmont.yarg.loaders.factory.DefaultLoaderFactory;
import com.haulmont.yarg.loaders.impl.JsonDataLoader;
@@ -16,13 +26,6 @@ import com.haulmont.yarg.structure.ReportOutputType;
import com.haulmont.yarg.structure.impl.BandBuilder;
import com.haulmont.yarg.structure.impl.ReportBuilder;
import com.haulmont.yarg.structure.impl.ReportTemplateBuilder;
-import java.io.File;
-import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.io.FileUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
@RestController
public class DocumentController {
diff --git a/libraries-2/src/main/resources/employee-schema.sql b/libraries-reporting/src/main/resources/employee-schema.sql
similarity index 100%
rename from libraries-2/src/main/resources/employee-schema.sql
rename to libraries-reporting/src/main/resources/employee-schema.sql
diff --git a/libraries-2/src/main/resources/employeeEmailReport.jrxml b/libraries-reporting/src/main/resources/employeeEmailReport.jrxml
similarity index 100%
rename from libraries-2/src/main/resources/employeeEmailReport.jrxml
rename to libraries-reporting/src/main/resources/employeeEmailReport.jrxml
diff --git a/libraries-2/src/main/resources/employeeReport.jrxml b/libraries-reporting/src/main/resources/employeeReport.jrxml
similarity index 100%
rename from libraries-2/src/main/resources/employeeReport.jrxml
rename to libraries-reporting/src/main/resources/employeeReport.jrxml
diff --git a/libraries-reporting/src/main/resources/logback.xml b/libraries-reporting/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/libraries-reporting/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-stream/.gitignore b/libraries-stream/.gitignore
new file mode 100644
index 0000000000..e594daf27a
--- /dev/null
+++ b/libraries-stream/.gitignore
@@ -0,0 +1,9 @@
+*.class
+
+# Folders #
+/gensrc
+/target
+
+# Packaged files #
+*.jar
+/bin/
diff --git a/libraries-stream/README.md b/libraries-stream/README.md
new file mode 100644
index 0000000000..6aa5a28cd9
--- /dev/null
+++ b/libraries-stream/README.md
@@ -0,0 +1,11 @@
+## Server
+
+This module contains articles about stream libraries.
+
+### Relevant Articles:
+
+- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams)
+- [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors)
+- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
+- [Introduction to StreamEx](https://www.baeldung.com/streamex)
+- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
\ No newline at end of file
diff --git a/libraries-stream/pom.xml b/libraries-stream/pom.xml
new file mode 100644
index 0000000000..8f00be3dab
--- /dev/null
+++ b/libraries-stream/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+ libraries-stream
+ 0.0.1-SNAPSHOT
+ libraries-stream
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.jooq
+ jool
+ ${jool.version}
+
+
+ com.pivovarit
+ parallel-collectors
+ ${parallel-collectors.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse-collections.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
+
+
+
+
+ 0.9.12
+ 1.1.0
+ 0.9.0
+ 8.2.0
+ 0.8.1
+ 1.15
+
+
+
\ No newline at end of file
diff --git a/libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java b/libraries-stream/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
similarity index 100%
rename from libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
rename to libraries-stream/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
diff --git a/libraries-4/src/main/java/com/baeldung/distinct/Person.java b/libraries-stream/src/main/java/com/baeldung/distinct/Person.java
similarity index 100%
rename from libraries-4/src/main/java/com/baeldung/distinct/Person.java
rename to libraries-stream/src/main/java/com/baeldung/distinct/Person.java
diff --git a/libraries-5/src/main/java/com/baeldung/streamex/Role.java b/libraries-stream/src/main/java/com/baeldung/streamex/Role.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/streamex/Role.java
rename to libraries-stream/src/main/java/com/baeldung/streamex/Role.java
diff --git a/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java b/libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java
similarity index 99%
rename from libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java
rename to libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java
index 56a3860f05..989b65bef6 100644
--- a/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java
+++ b/libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java
@@ -7,6 +7,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
+
import one.util.streamex.DoubleStreamEx;
import one.util.streamex.EntryStream;
import one.util.streamex.IntStreamEx;
diff --git a/libraries-5/src/main/java/com/baeldung/streamex/User.java b/libraries-stream/src/main/java/com/baeldung/streamex/User.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/streamex/User.java
rename to libraries-stream/src/main/java/com/baeldung/streamex/User.java
diff --git a/libraries-stream/src/main/resources/logback.xml b/libraries-stream/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/libraries-stream/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
index 936fd3e839..196c6603dd 100644
--- a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
+++ b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
@@ -1,7 +1,7 @@
package com.baeldung.distinct;
-import static org.junit.Assert.assertTrue;
import static com.baeldung.distinct.DistinctWithJavaFunction.distinctByKey;
+import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
diff --git a/libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java b/libraries-stream/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
similarity index 100%
rename from libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
rename to libraries-stream/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
diff --git a/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java
similarity index 100%
rename from libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java
diff --git a/libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java b/libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java
similarity index 99%
rename from libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java
index c28248e52c..ed5fec254d 100644
--- a/libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java
+++ b/libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java
@@ -1,11 +1,9 @@
package com.baeldung.protonpack;
-import com.codepoetics.protonpack.Indexed;
-import com.codepoetics.protonpack.StreamUtils;
-import com.codepoetics.protonpack.collectors.CollectorUtils;
-import com.codepoetics.protonpack.collectors.NonUniqueValueException;
-import com.codepoetics.protonpack.selectors.Selectors;
-import org.junit.Test;
+import static java.util.Arrays.asList;
+import static java.util.Arrays.stream;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import java.util.List;
import java.util.Optional;
@@ -13,10 +11,13 @@ import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import static java.util.Arrays.asList;
-import static java.util.Arrays.stream;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import org.junit.Test;
+
+import com.codepoetics.protonpack.Indexed;
+import com.codepoetics.protonpack.StreamUtils;
+import com.codepoetics.protonpack.collectors.CollectorUtils;
+import com.codepoetics.protonpack.collectors.NonUniqueValueException;
+import com.codepoetics.protonpack.selectors.Selectors;
public class ProtonpackUnitTest {
@Test
diff --git a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java
diff --git a/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
similarity index 99%
rename from libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
rename to libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
index b267eaea9b..de474b825c 100644
--- a/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
+++ b/libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
@@ -1,13 +1,14 @@
package com.baeldung.streamex;
-import one.util.streamex.StreamEx;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+
+import one.util.streamex.StreamEx;
public class StreamExMergeStreamsUnitTest {
diff --git a/libraries-testing-2/README.md b/libraries-testing-2/README.md
new file mode 100644
index 0000000000..e8fc854a13
--- /dev/null
+++ b/libraries-testing-2/README.md
@@ -0,0 +1,8 @@
+## Testing
+
+This module contains articles about test libraries.
+
+### Relevant articles
+
+- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
+- - More articles: [[<-- prev]](../libraries-testing)
diff --git a/libraries-testing-2/pom.xml b/libraries-testing-2/pom.xml
new file mode 100644
index 0000000000..6e75df172f
--- /dev/null
+++ b/libraries-testing-2/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+ libraries-testing-2
+ libraries-testing-2
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ au.com.dius
+ pact-jvm-provider-junit5_2.12
+ ${pact.version}
+
+
+ au.com.dius
+ pact-jvm-consumer-junit5_2.12
+ ${pact.version}
+ test
+
+
+ org.springframework
+ spring-web
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ target/mypacts
+
+
+
+
+
+
+
+ 3.6.3
+
+
+
\ No newline at end of file
diff --git a/libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java b/libraries-testing-2/src/main/java/com/baeldung/pact/config/MainApplication.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java
rename to libraries-testing-2/src/main/java/com/baeldung/pact/config/MainApplication.java
diff --git a/libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java b/libraries-testing-2/src/main/java/com/baeldung/pact/web/controller/PactController.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java
rename to libraries-testing-2/src/main/java/com/baeldung/pact/web/controller/PactController.java
diff --git a/libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java b/libraries-testing-2/src/main/java/com/baeldung/pact/web/dto/PactDto.java
similarity index 100%
rename from libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java
rename to libraries-testing-2/src/main/java/com/baeldung/pact/web/dto/PactDto.java
diff --git a/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries-testing-2/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
similarity index 100%
rename from libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
rename to libraries-testing-2/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
diff --git a/libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java b/libraries-testing-2/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
similarity index 100%
rename from libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
rename to libraries-testing-2/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
diff --git a/libraries-testing/README.md b/libraries-testing/README.md
index 2c473e8aa6..d3f6bc7ea0 100644
--- a/libraries-testing/README.md
+++ b/libraries-testing/README.md
@@ -14,3 +14,4 @@ This module contains articles about test libraries.
- [Introduction to DBUnit](https://www.baeldung.com/java-dbunit)
- [Introduction to ArchUnit](https://www.baeldung.com/java-archunit-intro)
- [Guide to the ModelAssert Library for JSON](https://www.baeldung.com/json-modelassert)
+- More articles: [[more -->]](../libraries-testing-2)
diff --git a/libraries/README.md b/libraries/README.md
index 33c40ea67c..7e72292f45 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -8,14 +8,7 @@ The code examples related to different libraries are each in their own module.
Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
### Relevant articles
-
-- [Introduction to Javatuples](https://www.baeldung.com/java-tuples)
-- [Introduction to Javassist](https://www.baeldung.com/javassist)
- [Intro to JaVers](https://www.baeldung.com/javers)
-- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams)
- [Introduction to Quartz](https://www.baeldung.com/quartz)
-- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup)
-- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
- [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
-- [Introduction to Neuroph](https://www.baeldung.com/neuroph)
- More articles [[next -->]](/libraries-2)
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 07a4853728..3ff912cae3 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -13,12 +13,6 @@
-
-
- org.beykery
- neuroph
- ${neuroph.version}
-
cglib
@@ -35,16 +29,6 @@
commons-net
${commons-net.version}
-
- org.javatuples
- javatuples
- ${javatuples.version}
-
-
- org.javassist
- javassist
- ${javaassist.version}
-
org.javers
javers-core
@@ -104,11 +88,6 @@
${spring-mock-mvc.version}
test
-
- org.multiverse
- multiverse-core
- ${multiverse.version}
-
pl.pragmatists
JUnitParams
@@ -120,16 +99,6 @@
quartz
${quartz.version}
-
- org.jooq
- jool
- ${jool.version}
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
info.debatty
java-lsh
@@ -264,11 +233,8 @@
2.2
- 0.7.0
3.2.7
- 1.2
3.1.0
- 2.92
1.9.26
1.41.0
1.9.0
@@ -289,8 +255,6 @@
4.3.8.RELEASE
3.0.3
2.3.0
- 3.29.2-GA
- 0.9.12
3.6
2.6
diff --git a/lightrun/lightrun-api-service/pom.xml b/lightrun/lightrun-api-service/pom.xml
index b7ed5f951b..77dbbb8b99 100644
--- a/lightrun/lightrun-api-service/pom.xml
+++ b/lightrun/lightrun-api-service/pom.xml
@@ -40,8 +40,4 @@
-
- 17
-
-
\ No newline at end of file
diff --git a/lightrun/lightrun-tasks-service/pom.xml b/lightrun/lightrun-tasks-service/pom.xml
index 2689a9794d..773c81a9d5 100644
--- a/lightrun/lightrun-tasks-service/pom.xml
+++ b/lightrun/lightrun-tasks-service/pom.xml
@@ -65,8 +65,4 @@
-
- 17
-
-
\ No newline at end of file
diff --git a/lightrun/lightrun-users-service/pom.xml b/lightrun/lightrun-users-service/pom.xml
index 40594db725..0b3e856069 100644
--- a/lightrun/lightrun-users-service/pom.xml
+++ b/lightrun/lightrun-users-service/pom.xml
@@ -57,8 +57,4 @@
-
- 17
-
-
\ No newline at end of file
diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml
index 8df95c18bb..fbd180c74d 100644
--- a/logging-modules/logback/pom.xml
+++ b/logging-modules/logback/pom.xml
@@ -121,7 +121,6 @@
2.0.0
1.4.8
2.0.4
- 1.18.22
\ No newline at end of file
diff --git a/maven-modules/dependency-exclusion/pom.xml b/maven-modules/dependency-exclusion/pom.xml
index 6e348377b0..6a491e552f 100644
--- a/maven-modules/dependency-exclusion/pom.xml
+++ b/maven-modules/dependency-exclusion/pom.xml
@@ -62,7 +62,7 @@
junit
junit
- 4.13
+ ${junit.version}
diff --git a/maven-modules/maven-exec-plugin/pom.xml b/maven-modules/maven-exec-plugin/pom.xml
index 1bac52ae2c..370b344167 100644
--- a/maven-modules/maven-exec-plugin/pom.xml
+++ b/maven-modules/maven-exec-plugin/pom.xml
@@ -47,7 +47,6 @@
1.2.6
3.11.0
3.1.0
- 1.8
\ No newline at end of file
diff --git a/maven-modules/maven-generate-war/pom.xml b/maven-modules/maven-generate-war/pom.xml
index 7de3f15298..d73ffe8b1d 100644
--- a/maven-modules/maven-generate-war/pom.xml
+++ b/maven-modules/maven-generate-war/pom.xml
@@ -70,10 +70,7 @@
- 11
2.17.1
- 11
- 11
\ No newline at end of file
diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml
index 27524637ab..f96d57b960 100644
--- a/messaging-modules/pom.xml
+++ b/messaging-modules/pom.xml
@@ -20,8 +20,8 @@
jgroups
rabbitmq
spring-amqp
- spring-apache-camel
- spring-jms
+
+
postgres-notify
diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml
index 876519f40c..a9b930543b 100644
--- a/messaging-modules/postgres-notify/pom.xml
+++ b/messaging-modules/postgres-notify/pom.xml
@@ -41,13 +41,11 @@
org.projectlombok
lombok
true
+ ${lombok.version}
-
- 1.8
-
diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java
index 70daa14abd..4a1db320dc 100644
--- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java
+++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java
@@ -42,7 +42,7 @@ public class OrdersController {
public ResponseEntity getOrderById(@PathVariable Long id) {
Optional o = orders.findById(id);
- if (o.isEmpty()) {
+ if (!o.isPresent()) {
return ResponseEntity.notFound().build();
}
diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java
index 61b970f3a2..da333b89ff 100644
--- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java
+++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java
@@ -23,7 +23,7 @@ public class NotificationHandler implements Consumer{
public void accept(PGNotification t) {
log.info("Notification received: pid={}, name={}, param={}",t.getPID(),t.getName(),t.getParameter());
Optional order = orders.findById(Long.valueOf(t.getParameter()));
- if ( !order.isEmpty()) {
+ if ( order.isPresent()) {
log.info("order details: {}", order.get());
}
}
diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java
index cc369c1f3e..038c2f6492 100644
--- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java
+++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java
@@ -43,14 +43,14 @@ public class OrdersService {
@Transactional(readOnly = true)
public Optional findById(Long id) {
Optional o = Optional.ofNullable(ordersCache.get(id, Order.class));
- if ( !o.isEmpty() ) {
+ if ( o.isPresent() ) {
log.info("findById: cache hit, id={}",id);
return o;
}
log.info("findById: cache miss, id={}",id);
o = repo.findById(id);
- if ( o.isEmpty()) {
+ if ( !o.isPresent()) {
return o;
}
diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml
index 182d14cfbf..1b22bb8117 100644
--- a/microservices-modules/rest-express/pom.xml
+++ b/microservices-modules/rest-express/pom.xml
@@ -73,7 +73,7 @@
junit
junit
- ${junit4.version}
+ ${junit.version}
jar
test
true
@@ -143,7 +143,6 @@
0.11.3
1.0
0.4.8
- 4.11
2.4.1
2.0
diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml
index 351f079481..ed57eed01e 100644
--- a/netflix-modules/mantis/pom.xml
+++ b/netflix-modules/mantis/pom.xml
@@ -43,6 +43,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.springframework
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index b79be81a66..9b40dbbe8e 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -25,8 +25,8 @@
import
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -106,7 +106,7 @@
1.0.22.RELEASE
2.7.11
1.9.20.1
- 8.0.31
+ 8.2.0
\ No newline at end of file
diff --git a/parent-boot-3/pom.xml b/parent-boot-3/pom.xml
index 9f9d6f7901..f1ab699c83 100644
--- a/parent-boot-3/pom.xml
+++ b/parent-boot-3/pom.xml
@@ -233,9 +233,6 @@
3.1.5
5.8.2
0.9.17
- 17
- ${java.version}
- ${java.version}
1.4.4
2.0.3
diff --git a/patterns-modules/axon/pom.xml b/patterns-modules/axon/pom.xml
index 473a1b0e15..4d83f8f9e6 100644
--- a/patterns-modules/axon/pom.xml
+++ b/patterns-modules/axon/pom.xml
@@ -51,6 +51,7 @@
io.projectreactor
reactor-core
+ ${reactor.version}
com.h2database
@@ -70,6 +71,7 @@
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -114,6 +116,7 @@
4.6.3
3.4.8
+ 3.6.0
\ No newline at end of file
diff --git a/patterns-modules/ddd/pom.xml b/patterns-modules/ddd/pom.xml
index 80147c29c6..1eb1f90741 100644
--- a/patterns-modules/ddd/pom.xml
+++ b/patterns-modules/ddd/pom.xml
@@ -10,29 +10,11 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
-
-
-
- org.junit
- junit-bom
- ${junit-jupiter.version}
- pom
- import
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${spring-boot.version}
- pom
- import
-
-
-
@@ -88,12 +70,15 @@
de.flapdoodle.embed
de.flapdoodle.embed.mongo
+ ${de.flapdoodle.embed.mongo.version}
test
+ com.baeldung.ddd.PersistingDddAggregatesApplication
1.0.1
+ 4.11.1
\ No newline at end of file
diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java
index 81ae3bbd19..e0e7ea9a4e 100644
--- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java
+++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java
@@ -4,12 +4,12 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
@Entity
@Table(name = "order_table")
diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java
index a3b50f0502..bf1d7020be 100644
--- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java
+++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java
@@ -1,7 +1,7 @@
package com.baeldung.ddd.order.jpa;
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.Embedded;
@Embeddable
class JpaOrderLine {
diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java
index 1d2ae5230a..30b074b2e4 100644
--- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java
+++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java
@@ -2,7 +2,7 @@ package com.baeldung.ddd.order.jpa;
import java.math.BigDecimal;
-import javax.persistence.Embeddable;
+import jakarta.persistence.Embeddable;
@Embeddable
class JpaProduct {
diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java
index ec107d635b..76dc438b63 100644
--- a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java
+++ b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java
@@ -4,7 +4,7 @@ import com.baeldung.dddhexagonalspring.domain.Product;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
public class AddProductRequest {
@NotNull private Product product;
diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java
index 8c51fbe479..ff81908811 100644
--- a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java
+++ b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java
@@ -4,7 +4,7 @@ import com.baeldung.dddhexagonalspring.domain.Product;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
public class CreateOrderRequest {
@NotNull private Product product;
diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml
index 4efcca0c6b..20f320f073 100644
--- a/patterns-modules/design-patterns-architectural/pom.xml
+++ b/patterns-modules/design-patterns-architectural/pom.xml
@@ -36,8 +36,8 @@
${hibernate-core.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector.version}
jar
@@ -65,7 +65,7 @@
5.2.16.Final
- 6.0.6
+ 8.2.0
2.7.5
5.3.0
2.7.5
diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml
index 2079ff70e5..430cacbfca 100644
--- a/pdf-2/pom.xml
+++ b/pdf-2/pom.xml
@@ -35,6 +35,21 @@
pdfbox
${pdfbox.version}
+
+ org.apache.poi
+ poi-ooxml
+ ${poi-ooxml.version}
+
+
+ org.apache.logging.log4j
+ log4j-api
+ ${log4j-api.version}
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j-core.version}
+
@@ -52,6 +67,9 @@
7.2.3
3.0.1
3.0.0
+ 5.2.5
+ 2.20.0
+ 2.20.0
\ No newline at end of file
diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java
new file mode 100644
index 0000000000..97d7b36bd6
--- /dev/null
+++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java
@@ -0,0 +1,242 @@
+package com.baeldung.exceltopdf;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Iterator;
+
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.xssf.usermodel.XSSFColor;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Cell;
+
+import com.itextpdf.text.BaseColor;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.FontFactory;
+import com.itextpdf.text.Paragraph;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ExcelToPDFConverter {
+
+ private static final Logger logger = LogManager.getLogger(ExcelToPDFConverter.class);
+
+ public static XSSFWorkbook readExcelFile(String excelFilePath) throws IOException {
+ FileInputStream inputStream = new FileInputStream(excelFilePath);
+ XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
+ inputStream.close();
+ return workbook;
+ }
+
+ private static Document createPDFDocument(String pdfFilePath) throws IOException, DocumentException {
+ Document document = new Document();
+ PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
+ document.open();
+ return document;
+ }
+
+ public static void convertExcelToPDF(String excelFilePath, String pdfFilePath) throws IOException, DocumentException {
+ XSSFWorkbook workbook = readExcelFile(excelFilePath);
+ Document document = createPDFDocument(pdfFilePath);
+
+ for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
+ XSSFSheet worksheet = workbook.getSheetAt(i);
+
+ // Add header with sheet name as title
+ Paragraph title = new Paragraph(worksheet.getSheetName(), new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD));
+ title.setSpacingAfter(20f);
+ title.setAlignment(Element.ALIGN_CENTER);
+ document.add(title);
+
+ createAndAddTable(worksheet, document);
+ // Add a new page for each sheet (except the last one)
+ if (i < workbook.getNumberOfSheets() - 1) {
+ document.newPage();
+ }
+ }
+
+ document.close();
+ workbook.close();
+ }
+
+ private static void createAndAddTable(XSSFSheet worksheet, Document document) throws DocumentException, IOException {
+ PdfPTable table = new PdfPTable(worksheet.getRow(0)
+ .getPhysicalNumberOfCells());
+ table.setWidthPercentage(100);
+ addTableHeader(worksheet, table);
+ addTableData(worksheet, table);
+ document.add(table);
+ }
+
+ private static void addTableHeader(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException {
+ Row headerRow = worksheet.getRow(0);
+ for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) {
+ Cell cell = headerRow.getCell(i);
+ String headerText = getCellText(cell);
+ PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell)));
+ setBackgroundColor(cell, headerCell);
+ setCellAlignment(cell, headerCell);
+ table.addCell(headerCell);
+ }
+ }
+
+ public static String getCellText(Cell cell) {
+ String cellValue;
+ switch (cell.getCellType()) {
+ case STRING:
+ cellValue = cell.getStringCellValue();
+ break;
+ case NUMERIC:
+ cellValue = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue()));
+ break;
+ case BLANK:
+ default:
+ cellValue = "";
+ break;
+ }
+ return cellValue;
+ }
+
+ private static void addTableData(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException {
+ Iterator rowIterator = worksheet.iterator();
+ while (rowIterator.hasNext()) {
+ Row row = rowIterator.next();
+ if (row.getRowNum() == 0) {
+ continue;
+ }
+ for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) {
+ Cell cell = row.getCell(i);
+ String cellValue = getCellText(cell);
+ PdfPCell cellPdf = new PdfPCell(new Phrase(cellValue, getCellStyle(cell)));
+ setBackgroundColor(cell, cellPdf);
+ setCellAlignment(cell, cellPdf);
+ table.addCell(cellPdf);
+ }
+ }
+ }
+
+ private static void setBackgroundColor(Cell cell, PdfPCell cellPdf) {
+ // Set background color
+ short bgColorIndex = cell.getCellStyle()
+ .getFillForegroundColor();
+ if (bgColorIndex != IndexedColors.AUTOMATIC.getIndex()) {
+ XSSFColor bgColor = (XSSFColor) cell.getCellStyle()
+ .getFillForegroundColorColor();
+ if (bgColor != null) {
+ byte[] rgb = bgColor.getRGB();
+ if (rgb != null && rgb.length == 3) {
+ cellPdf.setBackgroundColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF));
+ }
+ }
+ }
+ }
+
+ private static void setCellAlignment(Cell cell, PdfPCell cellPdf) {
+ CellStyle cellStyle = cell.getCellStyle();
+
+ HorizontalAlignment horizontalAlignment = cellStyle.getAlignment();
+ VerticalAlignment verticalAlignment = cellStyle.getVerticalAlignment();
+
+ switch (horizontalAlignment) {
+ case LEFT:
+ cellPdf.setHorizontalAlignment(Element.ALIGN_LEFT);
+ break;
+ case CENTER:
+ cellPdf.setHorizontalAlignment(Element.ALIGN_CENTER);
+ break;
+ case JUSTIFY:
+ case FILL:
+ cellPdf.setVerticalAlignment(Element.ALIGN_JUSTIFIED);
+ break;
+ case RIGHT:
+ cellPdf.setHorizontalAlignment(Element.ALIGN_RIGHT);
+ break;
+ }
+
+ switch (verticalAlignment) {
+ case TOP:
+ cellPdf.setVerticalAlignment(Element.ALIGN_TOP);
+ break;
+ case CENTER:
+ cellPdf.setVerticalAlignment(Element.ALIGN_MIDDLE);
+ break;
+ case JUSTIFY:
+ cellPdf.setVerticalAlignment(Element.ALIGN_JUSTIFIED);
+ break;
+ case BOTTOM:
+ cellPdf.setVerticalAlignment(Element.ALIGN_BOTTOM);
+ break;
+ }
+ }
+
+ private static Font getCellStyle(Cell cell) throws DocumentException, IOException {
+ Font font = new Font();
+ CellStyle cellStyle = cell.getCellStyle();
+ org.apache.poi.ss.usermodel.Font cellFont = cell.getSheet()
+ .getWorkbook()
+ .getFontAt(cellStyle.getFontIndexAsInt());
+
+ short fontColorIndex = cellFont.getColor();
+ if (fontColorIndex != IndexedColors.AUTOMATIC.getIndex() && cellFont instanceof XSSFFont) {
+ XSSFColor fontColor = ((XSSFFont) cellFont).getXSSFColor();
+ if (fontColor != null) {
+ byte[] rgb = fontColor.getRGB();
+ if (rgb != null && rgb.length == 3) {
+ font.setColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF));
+ }
+ }
+ }
+
+ if (cellFont.getItalic()) {
+ font.setStyle(Font.ITALIC);
+ }
+
+ if (cellFont.getStrikeout()) {
+ font.setStyle(Font.STRIKETHRU);
+ }
+
+ if (cellFont.getUnderline() == 1) {
+ font.setStyle(Font.UNDERLINE);
+ }
+
+ short fontSize = cellFont.getFontHeightInPoints();
+ font.setSize(fontSize);
+
+ if (cellFont.getBold()) {
+ font.setStyle(Font.BOLD);
+ }
+
+ String fontName = cellFont.getFontName();
+ if (FontFactory.isRegistered(fontName)) {
+ font.setFamily(fontName); // Use extracted font family if supported by iText
+ } else {
+ logger.warn("Unsupported font type: {}", fontName);
+ // - Use a fallback font (e.g., Helvetica)
+ font.setFamily("Helvetica");
+ }
+
+ return font;
+ }
+
+ public static void main(String[] args) throws DocumentException, IOException {
+ String excelFilePath = "src/main/resources/excelsample.xlsx";
+ String pdfFilePath = "src/main/resources/pdfsample.pdf";
+ convertExcelToPDF(excelFilePath, pdfFilePath);
+ }
+}
diff --git a/pdf-2/src/main/resources/excelsample.xlsx b/pdf-2/src/main/resources/excelsample.xlsx
new file mode 100644
index 0000000000..771d312ae0
Binary files /dev/null and b/pdf-2/src/main/resources/excelsample.xlsx differ
diff --git a/pdf-2/src/main/resources/pdfsample.pdf b/pdf-2/src/main/resources/pdfsample.pdf
new file mode 100644
index 0000000000..6a47504513
--- /dev/null
+++ b/pdf-2/src/main/resources/pdfsample.pdf
@@ -0,0 +1,43 @@
+%PDF-1.4
+%âãÏÓ
+3 0 obj
+<>stream
+xœ•WËRÛ0Ýû+î’.Puõ´–@Ÿ”R žÎtéi¤Íc0d:ü}%K&a¢«daœãsïÑ‘tdªÓ¦’jn ™VXæ,îÞBÀšÛêèG?íz¸˜=>ÁU{×¾kþTÇéqÚyÞðçhøe¸çpŒj¨ÿ±©®«‡Š3'œBàL9.ü@ý]b}säŠú®º-<ŽŠ³ÃBi&bHåX}CiÅT††.àÜûñÙ³5üË
w’ üÐF4?ŒÍKѼ¼É–$îägW&Iš$h’Dq
'GÈìJ¢Ð(‰B£$
+’H®ojGȯú]Iš$h’D IÅõMµ-¹D I&Iš$Q\ßÔï‚$M’4I"Ð$‰âú¦øb`fySh’D I&I;èuH_Ÿ þ‹`-ãaK;h1zUˆ^3\×5„+:órõ9st¹b!i9Ü…dݪ…F±ÚV,Fü×ùŠ"T”`•|{ųõãÓjÑõcÅ—Z¶fJêŠl]^¬5“õa#lVOí<_N9ôq~X¹«v6¥ÄEŒ• *
Xà!ãĬ)òu‹©^3Oû3¤lÈ_ºïÉrúíšp@8Æu‰¯
«ó\ͳ%ê/Ò'ã4EeŸ
+Ìè“(ùT`ŸwËå3|Y}*ðýêv´OÒ–¸—´Q–$É=FÌ9£dÑ(ºïÅzö?)›ÛV‰›mÀ÷úD·.ø¤ER{|¢™Ñ'Uô‰fë–¼*/(í^;åQf⛥DéýaOH¦K{° ¢°ÇPÏìùW–ÅßoÂÛk=˜ƒmÒÁ¢BçÕªáfÎ=ÿŠ‹þ‘]“é^ÑdbxÉdšý½]®»9Lœ¶7gNÞkºŒÙrjÁ`$²yƒÁ>W7û›²Át¯h°)þó˳ÏîÛ~>ëà†íœç‘o“ß÷};Ý7´\©‘Li*hêöTüˆ
+endstream
+endobj
+5 0 obj
+<>>>/Contents 3 0 R/Parent 4 0 R>>
+endobj
+1 0 obj
+<>
+endobj
+2 0 obj
+<>
+endobj
+4 0 obj
+<>
+endobj
+6 0 obj
+<>
+endobj
+7 0 obj
+<>
+endobj
+xref
+0 8
+0000000000 65535 f
+0000000954 00000 n
+0000001047 00000 n
+0000000015 00000 n
+0000001135 00000 n
+0000000833 00000 n
+0000001186 00000 n
+0000001231 00000 n
+trailer
+<<6a28b1036b62f3808f3bfb62a88a5239>]>>
+%iText-5.5.13.3
+startxref
+1391
+%%EOF
diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml
index a661fc3abb..e41af5c64b 100644
--- a/persistence-modules/activejdbc/pom.xml
+++ b/persistence-modules/activejdbc/pom.xml
@@ -28,8 +28,8 @@
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.connector.version}
@@ -64,8 +64,8 @@
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.connector.version}
@@ -76,7 +76,7 @@
3.4-j11
development.test,development
- 8.0.32
+ 8.2.0
\ No newline at end of file
diff --git a/persistence-modules/apache-cayenne/pom.xml b/persistence-modules/apache-cayenne/pom.xml
index 87bf6fe30b..3715198d84 100644
--- a/persistence-modules/apache-cayenne/pom.xml
+++ b/persistence-modules/apache-cayenne/pom.xml
@@ -22,8 +22,8 @@
${cayenne.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.connector.version}
runtime
@@ -40,7 +40,7 @@
- 5.1.44
+ 8.2.0
4.0.M5
diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml
index 2013bdb6af..dea261adca 100644
--- a/persistence-modules/core-java-persistence-2/pom.xml
+++ b/persistence-modules/core-java-persistence-2/pom.xml
@@ -28,8 +28,8 @@
test
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.driver.version}
@@ -85,7 +85,7 @@
8.4.1.jre11
10.2.0.4.0
- 8.0.22
+ 8.2.0
3.11.11
20220320
07.00.00-MS-GA
diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml
index e8add07fbf..20553da4e8 100644
--- a/persistence-modules/core-java-persistence/pom.xml
+++ b/persistence-modules/core-java-persistence/pom.xml
@@ -53,8 +53,8 @@
${springframework.boot.spring-boot-starter.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector.version}
runtime
@@ -62,11 +62,11 @@
2.9.0
- 5.0.1
+ 5.1.0
0.9.5.5
3.0.4
6.0.6
- 8.0.32
+ 8.2.0
\ No newline at end of file
diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml
index a0626e0cd2..4c37c2ae9e 100644
--- a/persistence-modules/fauna/pom.xml
+++ b/persistence-modules/fauna/pom.xml
@@ -44,6 +44,7 @@
org.projectlombok
lombok
provided
+ ${lombok.version}
@@ -57,7 +58,6 @@
- 17
4.2.0
diff --git a/persistence-modules/flyway-repair/pom.xml b/persistence-modules/flyway-repair/pom.xml
index 1a5384a916..2cae31c8a6 100644
--- a/persistence-modules/flyway-repair/pom.xml
+++ b/persistence-modules/flyway-repair/pom.xml
@@ -31,6 +31,7 @@
org.flywaydb
flyway-maven-plugin
+ ${flyway-maven-plugin.version}
org.springframework.boot
@@ -73,6 +74,7 @@
src/main/resources/application-${spring-boot.run.profiles}.properties
+ 10.2.0
\ No newline at end of file
diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml
index 18ff9fdb39..07a2925356 100644
--- a/persistence-modules/flyway/pom.xml
+++ b/persistence-modules/flyway/pom.xml
@@ -25,8 +25,8 @@
spring-boot-starter-jdbc
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
@@ -63,7 +63,7 @@
- 8.5.13
+ 10.2.0
\ No newline at end of file
diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml
index 954f8f40d3..caf7b37a41 100644
--- a/persistence-modules/hibernate-enterprise/pom.xml
+++ b/persistence-modules/hibernate-enterprise/pom.xml
@@ -35,8 +35,8 @@
${geodb.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -79,7 +79,7 @@
6.1.7.Final
- 8.0.32
+ 8.2.0
2.6.0
0.9
diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml
index 5a99c1c4d0..603c749e95 100644
--- a/persistence-modules/hibernate-jpa/pom.xml
+++ b/persistence-modules/hibernate-jpa/pom.xml
@@ -56,8 +56,8 @@
${hibernate.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -83,7 +83,7 @@
- 8.0.32
+ 8.2.0
2.6.0
3.0.4
2.1.214
diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
index d701487676..3fa15ffb0b 100644
--- a/persistence-modules/hibernate-libraries/pom.xml
+++ b/persistence-modules/hibernate-libraries/pom.xml
@@ -63,8 +63,8 @@
test
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
runtime
@@ -168,7 +168,7 @@
2.0.0
3.8.1
3.8.1
- 8.0.19
+ 8.2.0
2.1.3.RELEASE
diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml
index 0ce112b9e6..45d8e24b41 100644
--- a/persistence-modules/hibernate-mapping/pom.xml
+++ b/persistence-modules/hibernate-mapping/pom.xml
@@ -86,7 +86,7 @@
3.0.1-b11
1.1
1.4.2
- 2.14.2
+ 2.16.0
\ No newline at end of file
diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml
index 76f230a72d..0a736346a4 100644
--- a/persistence-modules/hibernate-queries/pom.xml
+++ b/persistence-modules/hibernate-queries/pom.xml
@@ -60,8 +60,8 @@
${hibernate.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -96,7 +96,7 @@
6.0.6
3.0.3
9.0.0.M26
- 8.0.32
+ 8.2.0
2.6.0
2.1.214
6.3.1.Final
diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml
index 1a2c65c6ba..f93fe6c9e7 100644
--- a/persistence-modules/hibernate5/pom.xml
+++ b/persistence-modules/hibernate5/pom.xml
@@ -30,8 +30,8 @@
${hibernate.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -58,7 +58,7 @@
5.4.24.Final
- 6.0.6
+ 8.2.0
2.2.3
2.1.214
diff --git a/persistence-modules/java-harperdb/README.md b/persistence-modules/java-harperdb/README.md
new file mode 100644
index 0000000000..99a91e00ed
--- /dev/null
+++ b/persistence-modules/java-harperdb/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+- [Working With HarperDB and Java](https://www.baeldung.com/java-harperdb)
diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml
new file mode 100644
index 0000000000..7340aa4dbc
--- /dev/null
+++ b/persistence-modules/java-harperdb/pom.xml
@@ -0,0 +1,65 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ java-harperdb
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 9
+
+
+
+
+
+
+ com.baeldung
+ persistence-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ com.baeldung
+ java-harperdb
+ ${haperdb-driver.version}
+ system
+
+ ${project.basedir}/lib/cdata.jdbc.harperdb.jar
+
+
+ org.testcontainers
+ testcontainers
+ test
+
+
+ org.apache.derby
+ derby
+ 10.13.1.1
+
+
+
+
+
+
+ org.testcontainers
+ testcontainers-bom
+ 1.19.3
+ pom
+ import
+
+
+
+
+
+ 4.2
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/java-harperdb/src/main/resources/data-model.puml b/persistence-modules/java-harperdb/src/main/resources/data-model.puml
new file mode 100644
index 0000000000..8e3681c749
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/main/resources/data-model.puml
@@ -0,0 +1,41 @@
+@startuml
+'https://gist.github.com/QuantumGhost/0955a45383a0b6c0bc24f9654b3cb561
+' uncomment the line below if you're using computer with a retina display
+' skinparam dpi 300
+!theme sketchy-outline
+!define Table(name,desc) class name as "desc" << (T, #63b175) >>
+' we use bold for primary key
+' green color for unique
+' and underscore for not_null
+!define primary_key(x) x
+!define unique(x) x
+!define not_null(x) x
+' other tags available:
+'
+' , where color is a color name or html color code
+' (#FFAACC)
+' see: http://plantuml.com/classes.html#More
+hide methods
+hide stereotypes
+
+' entities
+
+
+Table(Teacher, "Teacher") {
+ primary_key(Id) Number
+ Name Varchar
+ joining_date Date
+}
+Table(Subject, "Subject") {
+ primary_key(Id) Number
+ Name Varchar
+}
+Table(Teacher_Details, "Teacher_Details") {
+ primary_key(Id) Number
+ teacher_id Number
+ subject_id Number
+}
+
+Teacher_Details "*" -left-> "1" Subject: " "
+Teacher "1" -left-> "*" Teacher_Details: " "
+@enduml
\ No newline at end of file
diff --git a/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java
new file mode 100644
index 0000000000..361e17bd83
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java
@@ -0,0 +1,78 @@
+package com.baeldung.harperdb;
+
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Base64;
+
+public class HarperDBApiService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class);
+ private String url;
+ private String base64auth;
+
+ public HarperDBApiService(String url, String user, String password) {
+ this.url = url;
+ this.base64auth = Base64.getEncoder()
+ .encodeToString(new StringBuilder().append(user)
+ .append(":")
+ .append(password)
+ .toString()
+ .getBytes());
+ }
+
+ public void createSchema(String schema) throws IOException {
+ String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}";
+ executeHttpPostRequest(requestBody);
+ }
+
+ public void createTable(String schema, String table, String ... attributes) throws IOException {
+ String createTableReq = "{\"operation\":\"create_table\","
+ + "\"schema\":\"" + schema
+ + "\",\"table\":\"" + table
+ + "\",\"hash_attribute\":\"id\""
+ + "}";
+ executeHttpPostRequest(createTableReq);
+ LOGGER.info("created table:" + table);
+ for (String attribute : attributes) {
+ String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\""
+ + schema + "\",\"table\":\""
+ + table + "\",\"attribute\":\""
+ + attribute + "\""
+ + "}";
+ executeHttpPostRequest(createAttrReq);
+ LOGGER.info("created attribute:" + attribute + " in table:" + table);
+ }
+ }
+
+ public void insertRecords(String schema, String table, String records) throws IOException {
+ String requestBody = "{\"table\":" + "\"" + table + "\","
+ + "\"schema\":" + "\"" + schema + "\"" + ","
+ + "\"operation\":" + "\"" + "insert" + "\"" + ","
+ + "\"records\":" + records
+ + "}";
+ executeHttpPostRequest(requestBody);
+ }
+
+ private void executeHttpPostRequest(String httpRequest) throws IOException {
+ LOGGER.info("Post request body:" + httpRequest);
+
+ try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create()
+ .build()) {
+ HttpPost request = new HttpPost(this.url);
+ request.addHeader("Authorization", "Basic " + this.base64auth);
+ request.addHeader("Content-Type", "application/json");
+ request.setEntity((HttpEntity) new StringEntity(httpRequest));
+ CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request);
+ LOGGER.info("REST API response:" + response.toString());
+ assert (200 == response.getCode());
+ }
+ }
+}
diff --git a/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java
new file mode 100644
index 0000000000..12ef87fa99
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java
@@ -0,0 +1,36 @@
+package com.baeldung.harperdb;
+
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
+
+public class HarperDBContainer {
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(HarperDBContainer.class);
+
+ private static final Map DEFAULT_ENV_MAP = Map.of("HDB_ADMIN_USERNAME", "admin", "HDB_ADMIN_PASSWORD", "password",
+ "OPERATIONSAPI_NETWORK_PORT", "9925", "ROOTPATH", "/home/harperdb/hdb", "LOGGING_STDSTREAMS", "true");
+
+ private static final Integer[] DEFAULT_EXPOSED_PORTS = { 9925, 9926 };
+
+ private static final String HARPER_DOCKER_IMAGE = "harperdb/harperdb:latest";
+
+ public void stop() {
+ harperDBContainer.stop();
+ }
+
+ GenericContainer harperDBContainer;
+
+ public GenericContainer installHarperDB() {
+ harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE).withEnv(DEFAULT_ENV_MAP)
+ .withExposedPorts(DEFAULT_EXPOSED_PORTS);
+ return harperDBContainer;
+ }
+
+ public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer... exposedPorts) {
+ return new GenericContainer(dockerImgage).withEnv(envMap)
+ .withExposedPorts(exposedPorts);
+ }
+}
diff --git a/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java
new file mode 100644
index 0000000000..34d2f8d29b
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java
@@ -0,0 +1,379 @@
+package com.baeldung.harperdb;
+
+import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.sql.*;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class HarperDBLiveTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class);
+
+ private static Integer port;
+
+ private static HarperDBContainer harperDBContainer;
+
+ private static HarperDBApiService harperDbApiService;
+
+ @BeforeAll
+ static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException {
+ installHarperDB();
+ initHarperDBApiService();
+ setupDB();
+ }
+
+ private static void installHarperDB() {
+ harperDBContainer = new HarperDBContainer();
+
+ GenericContainer genericContainer = harperDBContainer.installHarperDB();
+
+ genericContainer.start();
+
+ port = genericContainer.getFirstMappedPort();
+ }
+
+ private static void initHarperDBApiService() {
+ String url = "http://localhost:" + port + "/";
+ harperDbApiService = new HarperDBApiService(url, "admin", "password");
+ }
+
+ private static void setupDB() throws IOException {
+ harperDbApiService.createSchema("Demo");
+
+ harperDbApiService.createTable("Demo", "Subject", "name");
+ harperDbApiService.createTable("Demo", "Teacher", "name", "joining_date", "subject_id");
+ harperDbApiService.createTable("Demo", "Teacher_Details", "teacher_id", "subject_id");
+
+ insertSubjectRecords();
+ insertTeacherRecords();
+ insertTeacherDetailsRecords();
+ }
+
+ private static void insertSubjectRecords() throws IOException {
+ String records = "["
+ + "{\"id\":1, \"name\":\"English\"},"
+ + "{\"id\":2, \"name\":\"Maths\"},"
+ + "{\"id\":3, \"name\":\"Science\"}"
+ + "]";
+
+ harperDbApiService.insertRecords("Demo", "Subject", records);
+ }
+
+ private static void insertTeacherRecords() throws IOException {
+ String records = "[" + "{\"id\":1, \"name\":\"James Cameron\", \"joining_date\":\"04-05-2000\"}," +
+ "{\"id\":2, \"name\":\"Joe Biden\", \"joining_date\":\"20-10-2005\"}," +
+ "{\"id\":3, \"name\":\"Jessie Williams\", \"joining_date\":\"04-06-1997\"}," +
+ "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," +
+ "{\"id\":5, \"name\":\"Eric Johnson\", \"joining_date\":\"04-05-2022\"}," +
+ "{\"id\":6, \"name\":\"Raghu Yadav\", \"joining_date\":\"02-02-1999\"}" + "]";
+ harperDbApiService.insertRecords("Demo", "Teacher", records);
+ }
+
+ private static void insertTeacherDetailsRecords() throws IOException {
+ String records = "[" + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," +
+ "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," +
+ "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," +
+ "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," +
+ "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" + "]";
+
+ harperDbApiService.insertRecords("Demo", "Teacher_Details", records);
+ }
+
+ @AfterAll
+ static void stopHarperDB() {
+ harperDBContainer.stop();
+ }
+
+ @Test
+ void whenConnectionInfoInURL_thenConnectSuccess() {
+ assertDoesNotThrow(() -> {
+ final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;";
+
+ try (Connection connection = DriverManager.getConnection(JDBC_URL)) {
+ connection.createStatement()
+ .executeQuery("select 1");
+ logger.info("Connection Successful");
+ }
+ });
+ }
+
+ @Test
+ void whenConnectionInfoInProperties_thenConnectSuccess() {
+ assertDoesNotThrow(() -> {
+ Properties prop = new Properties();
+ prop.setProperty("Server", "127.0.0.1:" + port);
+ prop.setProperty("User", "admin");
+ prop.setProperty("Password", "password");
+
+ try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) {
+ connection.createStatement()
+ .executeQuery("select 1");
+ logger.info("Connection Successful");
+ }
+ });
+ }
+
+ @Test
+ void whenConnectionPooling_thenConnectSuccess() {
+ assertDoesNotThrow(() -> {
+ HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource();
+ final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + ";User=admin;Password=password;";
+ harperdbPoolDataSource.setURL(JDBC_URL);
+
+ try (Connection connection = harperdbPoolDataSource.getPooledConnection()
+ .getConnection()) {
+ connection.createStatement()
+ .executeQuery("select 1");
+ logger.info("Connection Pool Successful");
+ }
+ });
+ }
+
+ @Test
+ void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException {
+ final String CREATE_TABLE_PROC = "CreateTable";
+ try (Connection connection = getConnection()) {
+ CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_PROC);
+
+ callableStatement.setString("SchemaName", "prod");
+ callableStatement.setString("TableName", "subject");
+ callableStatement.setString("PrimaryKey", "id");
+ Boolean result = callableStatement.execute();
+
+ ResultSet resultSet = callableStatement.getResultSet();
+
+ while (resultSet.next()) {
+ String tableCreated = resultSet.getString("Success");
+ assertEquals("true", tableCreated);
+ logger.info("Table Created Successfully");
+ }
+ }
+ }
+
+ @Test
+ void givenStatement_whenInsertRecord_thenSuccess() throws SQLException {
+ final String INSERT_SQL = "insert into Demo.Subject(id, name) values "
+ + "(4, 'Social Studies'),"
+ + "(5, 'Geography')";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> statement.execute(INSERT_SQL));
+ assertEquals(2, statement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenPrepareStatement_whenAddToBatch_thenSuccess() throws SQLException {
+ final String INSERT_SQL = "insert into Demo.Teacher(id, name, joining_date) values"
+ + "(?, ?, ?)";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL);
+ preparedStatement.setInt(1, 7);
+ preparedStatement.setString(2, "Bret Lee");
+ preparedStatement.setString(3, "07-08-2002");
+ preparedStatement.addBatch();
+
+ preparedStatement.setInt(1, 8);
+ preparedStatement.setString(2, "Sarah Glimmer");
+ preparedStatement.setString(3, "07-08-1997");
+ preparedStatement.addBatch();
+
+ int[] recordsInserted = preparedStatement.executeBatch();
+
+ assertEquals(2, Arrays.stream(recordsInserted).sum());
+ }
+ }
+
+ private static Connection getConnection() throws SQLException {
+ String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;";
+ return DriverManager.getConnection(URL);
+ }
+
+ private static Connection getConnection(Map properties) throws SQLException {
+ Properties prop = new Properties();
+ prop.setProperty("Server", "127.0.0.1:" + port);
+ prop.setProperty("User", "admin");
+ prop.setProperty("Password", "password");
+ for (Map.Entry entry : properties.entrySet()) {
+ prop.setProperty(entry.getKey(), entry.getValue());
+ }
+
+ return DriverManager.getConnection("jdbc:harperdb:", prop);
+ }
+
+ @Test
+ void givenStatement_whenFetchRecord_thenSuccess() throws SQLException {
+ final String SQL_QUERY = "select id, name from Demo.Subject where name = 'Maths'";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(SQL_QUERY);
+ while (resultSet.next()) {
+ Integer id = resultSet.getInt("id");
+ String name = resultSet.getString("name");
+ assertNotNull(id);
+ assertEquals("Maths", name);
+ logger.info("Subject id:" + id + " Subject Name:" + name);
+ }
+ }
+ }
+
+ @Test
+ void givenPreparedStatement_whenExecuteJoinQuery_thenSuccess() throws SQLException {
+ final String JOIN_QUERY = "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name "
+ + "from Demo.Teacher_Details AS td "
+ + "INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id "
+ + "INNER JOIN Demo.Subject AS s on s.id = td.subject_id "
+ + "where t.name = ?";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(JOIN_QUERY);
+ preparedStatement.setString(1, "Eric Johnson");
+
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while (resultSet.next()) {
+ String teacherName = resultSet.getString("teacher_name");
+ String subjectName = resultSet.getString("subject_name");
+ String joiningDate = resultSet.getString("joining_date");
+ assertEquals("Eric Johnson", teacherName);
+ assertEquals("Maths", subjectName);
+ logger.info("Teacher Name:" + teacherName + " Subject Name:" + subjectName + " Joining Date:" + joiningDate);
+ }
+ }
+ }
+
+ @Test
+ void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException {
+ final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = 2 "
+ + "where teacher_id in (2, 5)";
+ final String UPDATE_SQL_WITH_SUB_QUERY = "update Demo.Teacher_Details "
+ + "set subject_id = (select id from Demo.Subject where name = 'Maths') "
+ + "where teacher_id in (select id from Demo.Teacher where name in ('Joe Biden', 'Eric Johnson'))";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> statement.execute(UPDATE_SQL));
+ assertEquals(2, statement.getUpdateCount());
+ }
+
+ try (Connection connection = getConnection()) {
+ assertThrows(SQLException.class, () -> connection.createStatement().execute(UPDATE_SQL_WITH_SUB_QUERY));
+ }
+ }
+
+ @Test
+ void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException {
+ final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = ? "
+ + "where teacher_id in (?, ?)";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL);
+ preparedStatement.setInt(1, 1);
+ //following is not supported by the HarperDB driver
+ //Integer[] teacherIds = {4, 5};
+ //Array teacherIdArray = connection.createArrayOf(Integer.class.getTypeName(), teacherIds);
+ preparedStatement.setInt(2, 4);
+ preparedStatement.setInt(3, 5);
+ assertDoesNotThrow(() -> preparedStatement.execute());
+ assertEquals(2, preparedStatement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException {
+ final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = 6 and subject_id = 3";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> statement.execute(DELETE_SQL));
+ assertEquals(1, statement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException {
+ final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = ? and subject_id = ?";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL);
+ preparedStatement.setInt(1, 6);
+ preparedStatement.setInt(2, 2);
+ assertDoesNotThrow(() -> preparedStatement.execute());
+ assertEquals(1, preparedStatement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenTempTable_whenInsertIntoSelectTempTable_thenSuccess() throws SQLException {
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> {
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('12', 'David Flinch', '04-04-2014')");
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('13', 'Stephen Hawkins', '04-07-2017')");
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('14', 'Albert Einstein', '12-08-2020')");
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('15', 'Leo Tolstoy', '20-08-2022')");
+ });
+ assertDoesNotThrow(() -> statement.execute("insert into Demo.Teacher(id, name, joining_date) "
+ + "select id, name, joining_date from Teacher#TEMP"));
+ ResultSet resultSet = statement.executeQuery("select count(id) as rows from Demo.Teacher where id in"
+ + " (12, 13, 14, 15)");
+ resultSet.next();
+ int totalRows = resultSet.getInt("rows");
+ logger.info("total number of rows fetched:" + totalRows);
+ assertEquals(4, totalRows);
+ }
+ }
+
+ @Test
+ void givenUserDefinedView_whenQueryView_thenSuccess() throws SQLException {
+ URL url = ClassLoader.getSystemClassLoader().getResource("UserDefinedViews.json");
+
+ String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/'));
+
+ try(Connection connection = getConnection(Map.of("Location", folderPath))) {
+ PreparedStatement preparedStatement = connection.prepareStatement("select teacher_name,subject_name"
+ + " from UserViews.View_Teacher_Details where subject_name = ?");
+ preparedStatement.setString(1, "Science");
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while(resultSet.next()) {
+ assertEquals("Science", resultSet.getString("subject_name"));
+ logger.info("Science Teacher Name:" + resultSet.getString("teacher_name"));
+ }
+ }
+ }
+
+ @Test
+ void givenAutoCache_whenQuery_thenSuccess() throws SQLException {
+ URL url = ClassLoader.getSystemClassLoader().getResource("test.db");
+ String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/'));
+ logger.info("Cache Location:" + folderPath);
+ try(Connection connection = getConnection(Map.of("AutoCache", "true", "CacheLocation", folderPath))) {
+ PreparedStatement preparedStatement = connection.prepareStatement("select id, name from Demo.Subject");
+
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while(resultSet.next()) {
+ logger.info("Subject Name:" + resultSet.getString("name"));
+ }
+ }
+ }
+}
diff --git a/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json
new file mode 100644
index 0000000000..fba67def3c
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json
@@ -0,0 +1,5 @@
+{
+ "View_Teacher_Details": {
+ "query": "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name from Demo.Teacher_Details AS td INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id INNER JOIN Demo.Subject AS s on s.id = td.subject_id"
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/java-harperdb/src/test/resources/test.db b/persistence-modules/java-harperdb/src/test/resources/test.db
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml
index 0237da7ece..fa3a972623 100644
--- a/persistence-modules/java-jpa-3/pom.xml
+++ b/persistence-modules/java-jpa-3/pom.xml
@@ -29,8 +29,8 @@
${h2.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -86,7 +86,7 @@
5.4.14.Final
2.7.4
- 8.0.21
+ 8.2.0
2.2
3.3.3
3.0.0
diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml
index b96b24582e..169a2e8fd7 100644
--- a/persistence-modules/java-jpa/pom.xml
+++ b/persistence-modules/java-jpa/pom.xml
@@ -70,8 +70,8 @@
${javax.annotation.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -135,7 +135,7 @@
2.1.214
4.0.0
1.3.2
- 8.0.33
+ 8.2.0
\ No newline at end of file
diff --git a/persistence-modules/jooq/pom.xml b/persistence-modules/jooq/pom.xml
index b9229377ab..c6de8e3d40 100644
--- a/persistence-modules/jooq/pom.xml
+++ b/persistence-modules/jooq/pom.xml
@@ -44,7 +44,7 @@
- 3.13.4
+ 3.18.7
\ No newline at end of file
diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml
index f822c5b320..a6e0ed85e9 100644
--- a/persistence-modules/liquibase/pom.xml
+++ b/persistence-modules/liquibase/pom.xml
@@ -14,8 +14,8 @@
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -36,7 +36,7 @@
- 5.1.6
+ 8.2.0
4.25.0
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index d9ee7e358c..5ebc5b2cd4 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -61,14 +61,14 @@
solr
spring-boot-persistence-2
spring-boot-persistence-3
- spring-boot-mysql
+
spring-boot-persistence
spring-boot-persistence-h2
spring-boot-persistence-mongodb
spring-boot-persistence-mongodb-2
spring-boot-persistence-mongodb-3
spring-data-arangodb
- spring-data-cassandra
+
spring-data-cassandra-test
spring-data-cosmosdb
spring-data-couchbase-2
@@ -108,8 +108,8 @@
spring-jpa
spring-jpa-2
spring-jdbc
- spring-jdbc-2
- spring-jooq
+ spring-jdbc-2
+
spring-mybatis
spring-persistence-simple
spring-data-yugabytedb
diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml
index 5260bb9860..a2c8e3148d 100644
--- a/persistence-modules/r2dbc/pom.xml
+++ b/persistence-modules/r2dbc/pom.xml
@@ -52,6 +52,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.springframework.boot
diff --git a/persistence-modules/read-only-transactions/pom.xml b/persistence-modules/read-only-transactions/pom.xml
index 9a347fde88..c485a0d2a8 100644
--- a/persistence-modules/read-only-transactions/pom.xml
+++ b/persistence-modules/read-only-transactions/pom.xml
@@ -38,8 +38,8 @@
test
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
@@ -67,7 +67,7 @@
- 8.0.21
+ 8.2.0
4.0.3
5.6.1.Final
2.6.1
diff --git a/persistence-modules/rethinkdb/pom.xml b/persistence-modules/rethinkdb/pom.xml
index 17c7036ed3..352be80469 100644
--- a/persistence-modules/rethinkdb/pom.xml
+++ b/persistence-modules/rethinkdb/pom.xml
@@ -46,8 +46,4 @@
-
- 17
-
-
diff --git a/persistence-modules/scylladb/pom.xml b/persistence-modules/scylladb/pom.xml
index f84db87742..2ce777edaa 100644
--- a/persistence-modules/scylladb/pom.xml
+++ b/persistence-modules/scylladb/pom.xml
@@ -10,12 +10,13 @@
Sample ScyllaDB Project
1.17.6
+ true
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -37,6 +38,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
org.springframework.boot
diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml
index de1836797c..182babc6c5 100644
--- a/persistence-modules/spring-boot-mysql/pom.xml
+++ b/persistence-modules/spring-boot-mysql/pom.xml
@@ -9,9 +9,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -33,8 +33,8 @@
true
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
@@ -43,7 +43,6 @@
org.springframework.boot
spring-boot-maven-plugin
- 2.1.5.RELEASE
@@ -56,7 +55,7 @@
- 8.0.23
+ 8.2.0
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java
index d69f66fc7a..e3df121b24 100644
--- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java
+++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java
@@ -1,9 +1,9 @@
package com.baeldung.boot;
+import jakarta.annotation.PostConstruct;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import javax.annotation.PostConstruct;
import java.util.TimeZone;
@SpringBootApplication
diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java
index 55cb97dec2..f20fdc46e8 100644
--- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java
+++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java
@@ -1,9 +1,10 @@
package com.baeldung.boot;
+
import org.springframework.data.annotation.CreatedDate;
-import javax.persistence.*;
+import jakarta.persistence.*;
import java.util.Date;
@Entity
diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java
index 28869d0ac1..d397b0b7e9 100644
--- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java
+++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java
@@ -1,7 +1,7 @@
package com.baeldung.boot.jpa;
-import javax.persistence.*;
+import jakarta.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;
diff --git a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml
index d70c21aad2..b1586f91d5 100644
--- a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml
+++ b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml
@@ -1,6 +1,7 @@
spring:
- profiles:
- active: "dev2"
+ config:
+ activate:
+ on-profile: "dev2"
main:
banner-mode: "off"
jpa:
@@ -14,7 +15,9 @@ spring:
---
spring:
- profiles: "dev1"
+ config:
+ activate:
+ on-profile: "dev1"
datasource:
url: jdbc:mysql://localhost:3306/test?
username: root
@@ -23,7 +26,9 @@ spring:
---
spring:
- profiles: "dev2"
+ config:
+ activate:
+ on-profile: "dev2"
datasource:
url: >-
jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_CA&
diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index 6bca6df2b9..9b22e6902c 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -74,6 +74,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
org.springframework.boot
@@ -94,8 +95,8 @@
tomcat-jdbc
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -135,7 +136,7 @@
2.0.7
1.4.6
- 8.0.33
+ 8.2.0
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-3/pom.xml b/persistence-modules/spring-boot-persistence-3/pom.xml
index 5e8ad64a7a..eb0507ca56 100644
--- a/persistence-modules/spring-boot-persistence-3/pom.xml
+++ b/persistence-modules/spring-boot-persistence-3/pom.xml
@@ -59,8 +59,11 @@
+
- 2.1.8.RELEASE
+ 3.2.0
+ 2.0.9
+ 1.4.14
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java
index d422c30a0e..2d3bdc6f9a 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java
@@ -1,11 +1,16 @@
package com.baeldung.countrows.entity;
-import javax.persistence.*;
-
-import java.security.PrivateKey;
import java.sql.Timestamp;
-import java.time.Instant;
-import java.util.Date;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
@Entity
@Table(name = "ACCOUNTS")
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java
index 9acedf0558..4f45fb47a6 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java
@@ -1,6 +1,11 @@
package com.baeldung.countrows.entity;
-import javax.persistence.*;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
@Entity
@Table(name = "PERMISSIONS")
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java
index 422962ce45..b293cecce7 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java
@@ -4,13 +4,9 @@ import com.baeldung.countrows.entity.Account;
import com.baeldung.countrows.entity.Permission;
import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.sql.Timestamp;
-import java.util.Date;
-import java.util.List;
@Repository
public interface AccountRepository extends JpaRepository {
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java
index e4e716b4ce..cc5d69f848 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java
@@ -2,16 +2,10 @@ package com.baeldung.countrows.service;
import java.sql.Timestamp;
import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.criteria.*;
-
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -20,6 +14,14 @@ import com.baeldung.countrows.entity.Permission;
import com.baeldung.countrows.repository.AccountRepository;
import com.baeldung.countrows.repository.PermissionRepository;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+
@Service
public class AccountStatsLogic {
@Autowired
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java
index d8d178a4d5..e5bef58d8d 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java
@@ -1,7 +1,5 @@
package com.baeldung.dsrouting;
public enum ClientDatabase {
-
CLIENT_A, CLIENT_B
-
}
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java
index d592894226..c2a94b8fce 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java
@@ -5,7 +5,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LargeResultSetApplication {
-
public static void main(String[] args) {
SpringApplication.run(LargeResultSetApplication.class, args);
}
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java
index 283d0f032d..753cff02cb 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java
@@ -1,8 +1,9 @@
package com.baeldung.largeresultset;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
@Entity
public class Student {
diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java
index e65fc34849..403054f6bd 100644
--- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java
+++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java
@@ -3,8 +3,6 @@ package com.baeldung.largeresultset.service;
import java.util.List;
import java.util.stream.Stream;
-import javax.persistence.EntityManager;
-
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
@@ -14,6 +12,8 @@ import org.springframework.transaction.annotation.Transactional;
import com.baeldung.largeresultset.Student;
import com.baeldung.largeresultset.StudentRepository;
+import jakarta.persistence.EntityManager;
+
@Service
public class StudentService {
private static final int BATCH_SIZE = 5;
diff --git a/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java b/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java
index af825601aa..e3a4cbf816 100644
--- a/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java
+++ b/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java
@@ -4,9 +4,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import java.sql.Timestamp;
import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.time.Instant;
-import java.util.Date;
import java.util.UUID;
import org.junit.jupiter.api.AfterEach;
diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index 3c77386ddd..123e21ce59 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -47,8 +47,8 @@
tomcat-jdbc
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -72,7 +72,7 @@
2.23.0
2.0.1.Final
- 8.0.31
+ 8.2.0
com.baeldung.boot.Application
diff --git a/persistence-modules/spring-data-cassandra-2/pom.xml b/persistence-modules/spring-data-cassandra-2/pom.xml
index 01b5ce5ed6..6532da7f95 100644
--- a/persistence-modules/spring-data-cassandra-2/pom.xml
+++ b/persistence-modules/spring-data-cassandra-2/pom.xml
@@ -99,7 +99,6 @@
- 11
3.4.15
1.19.0
1.1.0
diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml
index cddb62186b..41f184e233 100644
--- a/persistence-modules/spring-data-cassandra-reactive/pom.xml
+++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml
@@ -23,6 +23,7 @@
io.projectreactor
reactor-core
+ ${reactor.version}
org.springframework.boot
@@ -45,6 +46,7 @@
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -57,6 +59,7 @@
4.3.1.0
+ 3.6.0
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cosmosdb/pom.xml b/persistence-modules/spring-data-cosmosdb/pom.xml
index 30dc4f999c..fbd4af9456 100644
--- a/persistence-modules/spring-data-cosmosdb/pom.xml
+++ b/persistence-modules/spring-data-cosmosdb/pom.xml
@@ -32,6 +32,7 @@
org.projectlombok
lombok
+ ${lombok.version}
diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml
index 6535b9ac4b..b8edae68d3 100644
--- a/persistence-modules/spring-data-elasticsearch/pom.xml
+++ b/persistence-modules/spring-data-elasticsearch/pom.xml
@@ -40,7 +40,7 @@
org.projectlombok
lombok
- 1.18.28
+ ${lombok.version}
org.springframework.boot
@@ -60,7 +60,7 @@
5.1.2
8.9.0
- 2.15.2
+ 2.16.0
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-enterprise-2/README.md b/persistence-modules/spring-data-jpa-enterprise-2/README.md
index 8e154f6b75..0c1e9968bc 100644
--- a/persistence-modules/spring-data-jpa-enterprise-2/README.md
+++ b/persistence-modules/spring-data-jpa-enterprise-2/README.md
@@ -3,7 +3,8 @@
This module contains articles about Spring Data JPA used in enterprise applications such as transactions, sessions, naming conventions and more
### Relevant Articles:
-
+- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
+- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
### Eclipse Config
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java
similarity index 87%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java
index 8b98164d63..9bc0663016 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java
@@ -1,9 +1,14 @@
package com.baeldung.elementcollection.model;
-import javax.persistence.*;
import java.util.List;
import java.util.Objects;
+import javax.persistence.CollectionTable;
+import javax.persistence.ElementCollection;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+
@Entity
public class Employee {
@Id
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java
index d73d30c47a..15d05aea98 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java
@@ -1,8 +1,9 @@
package com.baeldung.elementcollection.model;
-import javax.persistence.Embeddable;
import java.util.Objects;
+import javax.persistence.Embeddable;
+
@Embeddable
public class Phone {
private String type;
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java
index 49180c35eb..996cac7cd9 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java
@@ -1,14 +1,16 @@
package com.baeldung.elementcollection.repository;
-import com.baeldung.elementcollection.model.Employee;
-import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
+import java.util.HashMap;
+import java.util.Map;
import javax.persistence.EntityGraph;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
-import java.util.HashMap;
-import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baeldung.elementcollection.model.Employee;
@Repository
public class EmployeeRepository {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java
similarity index 94%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java
index cfb6e67c2c..35dd2dc226 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java
@@ -1,6 +1,5 @@
package com.baeldung.namingstrategy;
-import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/PersonRepository.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/PersonRepository.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/PersonRepository.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/PersonRepository.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java
index 306798aa68..ed2bb97252 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java
@@ -1,8 +1,10 @@
package com.baeldung.elementcollection;
-import com.baeldung.elementcollection.model.Employee;
-import com.baeldung.elementcollection.model.Phone;
-import com.baeldung.elementcollection.repository.EmployeeRepository;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -12,10 +14,9 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
-import java.util.Arrays;
-
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
+import com.baeldung.elementcollection.model.Employee;
+import com.baeldung.elementcollection.model.Phone;
+import com.baeldung.elementcollection.repository.EmployeeRepository;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ElementCollectionApplication.class)
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java
index 71a4dbda3f..b3225175ca 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("quoted-lower-case-naming-strategy.properties")
class QuotedLowerCaseNamingStrategyH2IntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java
index 6b1c984600..b21fdf9edd 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("quoted-lower-case-naming-strategy-on-postgres.properties")
class QuotedLowerCaseNamingStrategyPostgresLiveTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java
index f819327a5c..74f82f0d39 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("quoted-upper-case-naming-strategy.properties")
class QuotedUpperCaseNamingStrategyH2IntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java
index bd23b81b4b..6741b09366 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("quoted-upper-case-naming-strategy-on-postgres.properties")
class QuotedUpperCaseNamingStrategyPostgresLiveTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java
index 1850fea173..dbbccdd61d 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("spring-physical-naming-strategy.properties")
class SpringPhysicalNamingStrategyH2IntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java
index e26ebb148d..760dacdaa2 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("spring-physical-naming-strategy-on-postgres.properties")
class SpringPhysicalNamingStrategyPostgresLiveTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java
similarity index 98%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java
index 6311c42e93..d0e86384b8 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,18 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("unquoted-lower-case-naming-strategy.properties")
class UnquotedLowerCaseNamingStrategyH2IntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java
index 033a213cf5..121b184a3c 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("unquoted-lower-case-naming-strategy-on-postgres.properties")
class UnquotedLowerCaseNamingStrategyPostgresLiveTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java
index 7af8001854..b4f25605bd 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("unquoted-upper-case-naming-strategy.properties")
class UnquotedUpperCaseNamingStrategyH2IntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java
similarity index 99%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java
index 0151e7ece4..7ecd4cc80e 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java
+++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java
@@ -1,5 +1,17 @@
package com.baeldung.namingstrategy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
import org.hibernate.exception.SQLGrammarException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class)
@TestPropertySource("unquoted-upper-case-naming-strategy-on-postgres.properties")
class UnquotedUpperCaseNamingStrategyPostgresLiveTest {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties
rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties
diff --git a/persistence-modules/spring-data-jpa-enterprise/README.md b/persistence-modules/spring-data-jpa-enterprise/README.md
index b563fa46d4..c48a519a87 100644
--- a/persistence-modules/spring-data-jpa-enterprise/README.md
+++ b/persistence-modules/spring-data-jpa-enterprise/README.md
@@ -7,8 +7,6 @@ This module contains articles about Spring Data JPA used in enterprise applicati
- [Spring Data Java 8 Support](https://www.baeldung.com/spring-data-java-8)
- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
- [A Guide to Spring’s Open Session in View](https://www.baeldung.com/spring-open-session-in-view)
-- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
-- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
- [Partial Data Update With Spring Data](https://www.baeldung.com/spring-data-partial-update)
- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
- [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases)
diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml
index 1282d1d8a0..62bf7f0314 100644
--- a/persistence-modules/spring-data-jpa-query-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-query-2/pom.xml
@@ -36,9 +36,9 @@
${jta.version}
- mysql
- mysql-connector-java
- 3.1.12
+ com.mysql
+ mysql-connector-j
+ ${mysql.version}
com.google.guava
@@ -85,6 +85,7 @@
9.0.0.M26
1.1
+ 8.2.0
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-query-3/pom.xml b/persistence-modules/spring-data-jpa-query-3/pom.xml
index 1dff3024f6..5ea69791af 100644
--- a/persistence-modules/spring-data-jpa-query-3/pom.xml
+++ b/persistence-modules/spring-data-jpa-query-3/pom.xml
@@ -8,8 +8,20 @@
0.15
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 9
+
+
+
+
-
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
@@ -34,12 +46,16 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+ test
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java
index 73affeb1a1..2fc29e097b 100644
--- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java
@@ -1,5 +1,6 @@
package com.baeldung.spring.data.jpa.paging;
+import java.util.Collections;
import java.util.List;
import org.springframework.data.domain.Page;
@@ -29,6 +30,13 @@ public class CustomerService {
return new PageImpl<>(pageContent, pageRequest, allCustomers.size());
}
+ public List getCustomerListFromPage(int page, int size) {
+ Pageable pageRequest = createPageRequestUsing(page, size);
+ Page allCustomers = customerRepository.findAll(pageRequest);
+
+ return allCustomers.hasContent() ? allCustomers.getContent() : Collections.emptyList();
+ }
+
private Pageable createPageRequestUsing(int page, int size) {
return PageRequest.of(page, size);
}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java
new file mode 100644
index 0000000000..04dca159c7
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java
@@ -0,0 +1,23 @@
+package com.baeldung.spring.data.jpa.spel;
+
+import java.util.Locale;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.i18n.SessionLocaleResolver;
+
+@SpringBootApplication
+public class NewsApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(NewsApplication.class, args);
+ }
+
+ @Bean
+ public LocaleResolver localeResolver() {
+ SessionLocaleResolver slr = new SessionLocaleResolver();
+ slr.setDefaultLocale(Locale.US);
+ return slr;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java
new file mode 100644
index 0000000000..6569e31af4
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java
@@ -0,0 +1,17 @@
+package com.baeldung.spring.data.jpa.spel.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
+ localeChangeInterceptor.setParamName("locale");
+ registry.addInterceptor(localeChangeInterceptor);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java
new file mode 100644
index 0000000000..4e092fe150
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java
@@ -0,0 +1,26 @@
+package com.baeldung.spring.data.jpa.spel.controller;
+
+import com.baeldung.spring.data.jpa.spel.entity.Article;
+import com.baeldung.spring.data.jpa.spel.repository.ArticleRepository;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/articles")
+public class ArticleController {
+
+ private final ArticleRepository articleRepository;
+
+ @Autowired
+ public ArticleController(final ArticleRepository articleRepository) {
+ this.articleRepository = articleRepository;
+ }
+
+ @GetMapping
+ List getAllArticlesWithNativeQuery() {
+ return articleRepository.findAllArticlesUsingLocaleWithNativeQuery();
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java
new file mode 100644
index 0000000000..93a0e3b9a9
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java
@@ -0,0 +1,111 @@
+package com.baeldung.spring.data.jpa.spel.entity;
+
+import java.util.Objects;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+
+@Entity(name = "articles")
+@Table(name = "articles")
+public class Article {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+ private String title;
+ private String content;
+ private String language;
+
+ public Article() {
+ }
+
+ public Article(final String title, final String content, final String language) {
+ this.title = title;
+ this.content = content;
+ this.language = language;
+ }
+
+ public Article(final Long id, final String title, final String content, final String language) {
+ this.id = id;
+ this.title = title;
+ this.content = content;
+ this.language = language;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(final String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(final String content) {
+ this.content = content;
+ }
+
+ public String getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(final String language) {
+ this.language = language;
+ }
+
+ @Override
+ public String toString() {
+ return "News{" +
+ "id=" + id +
+ ", title='" + title + '\'' +
+ ", content='" + content + '\'' +
+ ", language=" + language +
+ '}';
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ final Article article = (Article) o;
+
+ if (!Objects.equals(id, article.id)) {
+ return false;
+ }
+ if (!Objects.equals(title, article.title)) {
+ return false;
+ }
+ if (!Objects.equals(content, article.content)) {
+ return false;
+ }
+ return Objects.equals(language, article.language);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id != null ? id.hashCode() : 0;
+ result = 31 * result + (title != null ? title.hashCode() : 0);
+ result = 31 * result + (content != null ? content.hashCode() : 0);
+ result = 31 * result + (language != null ? language.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java
new file mode 100644
index 0000000000..046a9c558a
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java
@@ -0,0 +1,14 @@
+package com.baeldung.spring.data.jpa.spel.entity;
+
+public class ArticleWrapper {
+
+ private final Article article;
+
+ public ArticleWrapper(Article article) {
+ this.article = article;
+ }
+
+ public Article getArticle() {
+ return article;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java
new file mode 100644
index 0000000000..6fea0e06f4
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java
@@ -0,0 +1,56 @@
+package com.baeldung.spring.data.jpa.spel.entity;
+
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class Language {
+
+ @Id
+ @Column(name = "iso_code")
+ private String isoCode;
+
+ public Language() {
+ }
+
+ public Language(final String isoCode) {
+ this.isoCode = isoCode;
+ }
+
+ public String getIsoCode() {
+ return isoCode;
+ }
+
+ public void setIsoCode(final String isoCode) {
+ this.isoCode = isoCode;
+ }
+
+ @Override
+ public String toString() {
+ return "Language{" +
+ "isoCode='" + isoCode + '\'' +
+ '}';
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ final Language language = (Language) o;
+
+ return Objects.equals(isoCode, language.isoCode);
+ }
+
+ @Override
+ public int hashCode() {
+ return isoCode != null ? isoCode.hashCode() : 0;
+ }
+}
+
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java
new file mode 100644
index 0000000000..c0a334440f
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.data.jpa.spel.extension;
+
+import java.util.Locale;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.data.spel.spi.EvaluationContextExtension;
+import org.springframework.stereotype.Component;
+
+@Component
+public class LocaleContextHolderExtension implements EvaluationContextExtension {
+
+ @Override
+ public String getExtensionId() {
+ return "locale";
+ }
+
+ @Override
+ public Locale getRootObject() {
+ return LocaleContextHolder.getLocale();
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java
new file mode 100644
index 0000000000..26549f67f5
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java
@@ -0,0 +1,78 @@
+package com.baeldung.spring.data.jpa.spel.repository;
+
+import com.baeldung.spring.data.jpa.spel.entity.Article;
+import com.baeldung.spring.data.jpa.spel.entity.ArticleWrapper;
+import java.util.List;
+import javax.transaction.Transactional;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+public interface ArticleRepository extends BaseNewsApplicationRepository {
+
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (?1, ?2, ?3, ?4)",
+ nativeQuery = true)
+ void saveWithPositionalArguments(Long id, String title, String content, String language);
+
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (?#{[0]}, ?#{[1]}, ?#{[2]}, ?#{[3]})",
+ nativeQuery = true)
+ void saveWithPositionalSpELArguments(long id, String title, String content, String language);
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (?#{[0]}, ?#{[1]}, ?#{[2] ?: 'Empty Article'}, ?#{[3]})",
+ nativeQuery = true)
+ void saveWithPositionalSpELArgumentsWithEmptyCheck(long id, String title, String content, String language);
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (:id, :title, :content, :language)",
+ nativeQuery = true)
+ void saveWithNamedArguments(@Param("id") long id, @Param("title") String title,
+ @Param("content") String content, @Param("language") String language);
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (:#{#id}, :#{#title}, :#{#content}, :#{#language})",
+ nativeQuery = true)
+ void saveWithNamedSpELArguments(@Param("id") long id, @Param("title") String title,
+ @Param("content") String content, @Param("language") String language);
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (:#{#id}, :#{#title}, :#{#content}, :#{#language.toLowerCase()})",
+ nativeQuery = true)
+ void saveWithNamedSpELArgumentsAndLowerCaseLanguage(@Param("id") long id, @Param("title") String title,
+ @Param("content") String content, @Param("language") String language);
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (:#{#article.id}, :#{#article.title}, :#{#article.content}, :#{#article.language})",
+ nativeQuery = true)
+ void saveWithSingleObjectSpELArgument(@Param("article") Article article);
+
+ @Modifying
+ @Transactional
+ @Query(value = "INSERT INTO articles (id, title, content, language) "
+ + "VALUES (:#{#wrapper.article.id}, :#{#wrapper.article.title}, :#{#wrapper.article.content}, :#{#wrapper.article.language})",
+ nativeQuery = true)
+ void saveWithSingleWrappedObjectSpELArgument(@Param("wrapper") ArticleWrapper articleWrapper);
+
+
+ @Query(value = "SELECT * FROM articles WHERE language = :#{locale.language}",
+ nativeQuery = true)
+ List findAllArticlesUsingLocaleWithNativeQuery();
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java
new file mode 100644
index 0000000000..e76995eaa3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java
@@ -0,0 +1,17 @@
+package com.baeldung.spring.data.jpa.spel.repository;
+
+import com.baeldung.spring.data.jpa.spel.entity.Article;
+import java.util.List;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.NoRepositoryBean;
+
+@NoRepositoryBean
+public interface BaseNewsApplicationRepository extends JpaRepository {
+
+ @Query(value = "select e from #{#entityName} e")
+ List findAllEntitiesUsingEntityPlaceholder();
+
+ @Query(value = "SELECT * FROM #{#entityName}", nativeQuery = true)
+ List findAllEntitiesUsingEntityPlaceholderWithNativeQuery();
+}
diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java
index 1a34822527..cd5cbdcd60 100644
--- a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java
+++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java
@@ -1,14 +1,17 @@
package com.baeldung.spring.data.jpa.paging;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
@@ -16,6 +19,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
@ExtendWith(MockitoExtension.class)
public class CustomerServiceUnitTest {
@@ -46,12 +51,7 @@ public class CustomerServiceUnitTest {
private static final List PAGE_4_CONTENTS = Arrays.asList("Penny", "Queen", "Rob", "Sue", "Tammy");
- private static final List EMPTY_PAGE = Arrays.asList();
-
- @BeforeEach
- void setup() {
- when(customerRepository.findAll()).thenReturn(ALL_CUSTOMERS);
- }
+ private static final List EMPTY_PAGE = Collections.emptyList();
private static Collection
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
org.postgresql
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java
new file mode 100644
index 0000000000..9275d9f449
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java
@@ -0,0 +1,21 @@
+package com.baeldung.boot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+import com.baeldung.jpa.JpaApplication;
+import com.baeldung.boot.daos.impl.ExtendedRepositoryImpl;
+
+@SpringBootApplication
+@EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class, basePackages = "com.baeldung.boot.daos")
+@EntityScan({"com.baeldung.boot.domain"})
+@ComponentScan("com.baeldung.boot.daos")
+public class BootApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(JpaApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/JpaApplication.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/JpaApplication.java
new file mode 100644
index 0000000000..eab5a741a3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/JpaApplication.java
@@ -0,0 +1,17 @@
+package com.baeldung.jpa;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@SpringBootApplication
+@ComponentScan("com.baeldung.jpa")
+@EnableJpaRepositories("com.baeldung.jpa.repository")
+public class JpaApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(JpaApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/config/JpaPopulators.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/JpaPopulators.java
similarity index 93%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/config/JpaPopulators.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/JpaPopulators.java
index 24348d31c5..c21bb48c83 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/config/JpaPopulators.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/JpaPopulators.java
@@ -1,35 +1,35 @@
-package com.baeldung.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
-import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean;
-import org.springframework.data.repository.init.UnmarshallerRepositoryPopulatorFactoryBean;
-import org.springframework.oxm.jaxb.Jaxb2Marshaller;
-
-import com.baeldung.entity.Fruit;
-
-@Configuration
-public class JpaPopulators {
-
- @Bean
- public Jackson2RepositoryPopulatorFactoryBean getRespositoryPopulator() throws Exception {
- Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean();
- factory.setResources(new Resource[] { new ClassPathResource("fruit-data.json") });
- return factory;
- }
-
- @Bean
- public UnmarshallerRepositoryPopulatorFactoryBean repositoryPopulator() {
-
- Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
- unmarshaller.setClassesToBeBound(Fruit.class);
-
- UnmarshallerRepositoryPopulatorFactoryBean factory = new UnmarshallerRepositoryPopulatorFactoryBean();
- factory.setUnmarshaller(unmarshaller);
- factory.setResources(new Resource[] { new ClassPathResource("apple-fruit-data.xml"), new ClassPathResource("guava-fruit-data.xml") });
- return factory;
- }
-
-}
+package com.baeldung.jpa.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean;
+import org.springframework.data.repository.init.UnmarshallerRepositoryPopulatorFactoryBean;
+import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+
+import com.baeldung.jpa.domain.Fruit;
+
+@Configuration
+public class JpaPopulators {
+
+ @Bean
+ public Jackson2RepositoryPopulatorFactoryBean getRespositoryPopulator() throws Exception {
+ Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean();
+ factory.setResources(new Resource[] { new ClassPathResource("fruit-data.json") });
+ return factory;
+ }
+
+ @Bean
+ public UnmarshallerRepositoryPopulatorFactoryBean repositoryPopulator() {
+
+ Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
+ unmarshaller.setClassesToBeBound(Fruit.class);
+
+ UnmarshallerRepositoryPopulatorFactoryBean factory = new UnmarshallerRepositoryPopulatorFactoryBean();
+ factory.setUnmarshaller(unmarshaller);
+ factory.setResources(new Resource[] { new ClassPathResource("apple-fruit-data.xml"), new ClassPathResource("guava-fruit-data.xml") });
+ return factory;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/PersistenceConfig.java
similarity index 87%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/PersistenceConfig.java
index f3c9301bcf..0c47351104 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/PersistenceConfig.java
@@ -1,4 +1,4 @@
-package com.baeldung.repository;
+package com.baeldung.jpa.config;
import java.util.Properties;
@@ -6,12 +6,10 @@ import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@@ -23,24 +21,18 @@ import com.google.common.base.Preconditions;
@Configuration
@PropertySource("classpath:persistence.properties")
-@ComponentScan("com.baeldung.repository")
-//@ImportResource("classpath*:*springDataConfig.xml")
@EnableTransactionManagement
-@EnableJpaRepositories(basePackages = "com.baeldung.repository")
+//@ImportResource("classpath*:*springDataConfig.xml")
public class PersistenceConfig {
@Autowired
private Environment env;
- public PersistenceConfig() {
- super();
- }
-
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
- em.setPackagesToScan("com.baeldung.spring.data.persistence.repository");
+ em.setPackagesToScan("com.baeldung.jpa.domain");
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Foo.java
similarity index 98%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Foo.java
index 27ebcf5875..f799635eae 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Foo.java
@@ -1,4 +1,4 @@
-package com.baeldung.repository;
+package com.baeldung.jpa.domain;
import java.io.Serializable;
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Fruit.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Fruit.java
similarity index 90%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Fruit.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Fruit.java
index d45ac33db8..6314c58da3 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Fruit.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Fruit.java
@@ -1,40 +1,40 @@
-package com.baeldung.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.xml.bind.annotation.XmlRootElement;
-
-@XmlRootElement
-@Entity
-public class Fruit {
-
- @Id
- private long id;
- private String name;
- private String color;
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getColor() {
- return color;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
-}
+package com.baeldung.jpa.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+@Entity
+public class Fruit {
+
+ @Id
+ private long id;
+ private String name;
+ private String color;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Passenger.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Passenger.java
similarity index 98%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Passenger.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Passenger.java
index 3aafbe9afa..acfb7947c0 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Passenger.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Passenger.java
@@ -1,4 +1,4 @@
-package com.baeldung.entity;
+package com.baeldung.jpa.domain;
import javax.persistence.Basic;
import javax.persistence.Column;
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Song.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Song.java
similarity index 97%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Song.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Song.java
index 395527c1eb..9dcde0bea4 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Song.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Song.java
@@ -1,4 +1,4 @@
-package com.baeldung.entity;
+package com.baeldung.jpa.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FruitRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/FruitRepository.java
similarity index 88%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FruitRepository.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/FruitRepository.java
index 5055252adf..dfbb4a5102 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FruitRepository.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/FruitRepository.java
@@ -1,27 +1,27 @@
-package com.baeldung.repository;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.stereotype.Repository;
-
-import com.baeldung.entity.Fruit;
-
-@Repository
-public interface FruitRepository extends JpaRepository {
-
- Long deleteByName(String name);
-
- List deleteByColor(String color);
-
- Long removeByName(String name);
-
- List removeByColor(String color);
-
- @Modifying
- @Query("delete from Fruit f where f.name=:name or f.color=:color")
- int deleteFruits(@Param("name") String name, @Param("color") String color);
-}
+package com.baeldung.jpa.repository;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import com.baeldung.jpa.domain.Fruit;
+
+@Repository
+public interface FruitRepository extends JpaRepository {
+
+ Long deleteByName(String name);
+
+ List deleteByColor(String color);
+
+ Long removeByName(String name);
+
+ List removeByColor(String color);
+
+ @Modifying
+ @Query("delete from Fruit f where f.name=:name or f.color=:color")
+ int deleteFruits(@Param("name") String name, @Param("color") String color);
+}
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/IFooDAO.java
similarity index 82%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/IFooDAO.java
index 6ee74fe26c..4834e2f68c 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/IFooDAO.java
@@ -1,9 +1,10 @@
-package com.baeldung.repository;
+package com.baeldung.jpa.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
-import org.springframework.stereotype.Repository;
+
+import com.baeldung.jpa.domain.Foo;
public interface IFooDAO extends JpaRepository {
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PassengerRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/PassengerRepository.java
similarity index 58%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PassengerRepository.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/PassengerRepository.java
index a295a74f1b..c7aa56f830 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PassengerRepository.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/PassengerRepository.java
@@ -1,13 +1,13 @@
-package com.baeldung.repository;
+package com.baeldung.jpa.repository;
-import com.baeldung.entity.Passenger;
+import com.baeldung.jpa.domain.Passenger;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
-interface PassengerRepository extends JpaRepository {
+public interface PassengerRepository extends JpaRepository {
List findByFirstNameIgnoreCase(String firstName);
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/SongRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/SongRepository.java
similarity index 86%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/SongRepository.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/SongRepository.java
index 6faed411d3..c7a8647f5a 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/SongRepository.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/SongRepository.java
@@ -1,11 +1,11 @@
-package com.baeldung.repository;
+package com.baeldung.jpa.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
-import com.baeldung.entity.Song;
+import com.baeldung.jpa.domain.Song;
@Repository
public interface SongRepository extends JpaRepository {
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/FooService.java
similarity index 71%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java
rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/FooService.java
index 98084240ac..d449bc11a8 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/FooService.java
@@ -1,10 +1,14 @@
-package com.baeldung.repository;
+package com.baeldung.jpa.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import com.baeldung.jpa.domain.Foo;
+import com.baeldung.jpa.repository.IFooDAO;
+
@Service
public class FooService implements IFooService {
+
@Autowired
private IFooDAO dao;
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java
new file mode 100644
index 0000000000..f75f33ba38
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java
@@ -0,0 +1,7 @@
+package com.baeldung.jpa.service;
+
+import com.baeldung.jpa.domain.Foo;
+
+public interface IFooService {
+ Foo create(Foo foo);
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java
deleted file mode 100644
index 6c4d36710c..0000000000
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baeldung.repository;
-
-public interface IFooService {
- Foo create(Foo foo);
-}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json b/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json
index 6dc44e2586..b605352dc9 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json
+++ b/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json
@@ -1,12 +1,12 @@
[
{
- "_class": "com.baeldung.entity.Fruit",
+ "_class": "com.baeldung.jpa.domain.Fruit",
"name": "apple",
"color": "red",
"id": 1
},
{
- "_class": "com.baeldung.entity.Fruit",
+ "_class": "com.baeldung.jpa.domain.Fruit",
"name": "guava",
"color": "green",
"id": 2
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml b/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml
index e581d514a4..7746814290 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml
+++ b/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml
@@ -7,5 +7,5 @@
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
>
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java
index b367b5fdca..51874e2bbe 100644
--- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java
@@ -13,11 +13,11 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.Application;
+import com.baeldung.boot.BootApplication;
import com.baeldung.boot.domain.Student;
@RunWith(SpringRunner.class)
-@ContextConfiguration(classes = {Application.class})
+@ContextConfiguration(classes = { BootApplication.class})
@DirtiesContext
public class ExtendedStudentRepositoryIntegrationTest {
@Resource
diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java
index e4bd3dabff..af454379c8 100644
--- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java
@@ -15,11 +15,11 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
-import com.baeldung.Application;
+import com.baeldung.boot.BootApplication;
import com.baeldung.boot.domain.MerchandiseEntity;
@RunWith(SpringRunner.class)
-@SpringBootTest(classes = Application.class)
+@SpringBootTest(classes = BootApplication.class)
public class InventoryRepositoryIntegrationTest {
private static final String ORIGINAL_TITLE = "Pair of Pants";
diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FooServiceIntegrationTest.java
similarity index 73%
rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java
rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FooServiceIntegrationTest.java
index 9362b4c338..4c0fc99eb5 100644
--- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FooServiceIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.repository;
+package com.baeldung.jpa;
import javax.sql.DataSource;
@@ -6,11 +6,16 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
+import com.baeldung.jpa.domain.Foo;
+import com.baeldung.jpa.service.IFooService;
+
@RunWith(SpringRunner.class)
-@ContextConfiguration(classes = PersistenceConfig.class)
+@ContextConfiguration(classes = { JpaApplication.class})
+@DirtiesContext
public class FooServiceIntegrationTest {
@Autowired
diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FruitPopulatorIntegrationTest.java
similarity index 86%
rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java
rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FruitPopulatorIntegrationTest.java
index 4d3661e717..e321b1271e 100644
--- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FruitPopulatorIntegrationTest.java
@@ -1,38 +1,39 @@
-package com.baeldung.repository;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.List;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import com.baeldung.entity.Fruit;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class FruitPopulatorIntegrationTest {
-
- @Autowired
- private FruitRepository fruitRepository;
-
- @Test
- public void givenFruitJsonPopulatorThenShouldInsertRecordOnStart() {
-
- List fruits = fruitRepository.findAll();
- assertEquals("record count is not matching", 2, fruits.size());
-
- fruits.forEach(fruit -> {
- if (1 == fruit.getId()) {
- assertEquals("apple", fruit.getName());
- assertEquals("red", fruit.getColor());
- } else if (2 == fruit.getId()) {
- assertEquals("guava", fruit.getName());
- assertEquals("green", fruit.getColor());
- }
- });
- }
-}
+package com.baeldung.jpa;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.jpa.domain.Fruit;
+import com.baeldung.jpa.repository.FruitRepository;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = JpaApplication.class)
+public class FruitPopulatorIntegrationTest {
+
+ @Autowired
+ private FruitRepository fruitRepository;
+
+ @Test
+ public void givenFruitJsonPopulatorThenShouldInsertRecordOnStart() {
+
+ List fruits = fruitRepository.findAll();
+ assertEquals("record count is not matching", 2, fruits.size());
+
+ fruits.forEach(fruit -> {
+ if (1 == fruit.getId()) {
+ assertEquals("apple", fruit.getName());
+ assertEquals("red", fruit.getColor());
+ } else if (2 == fruit.getId()) {
+ assertEquals("guava", fruit.getName());
+ assertEquals("green", fruit.getColor());
+ }
+ });
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/PassengerRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/PassengerRepositoryIntegrationTest.java
similarity index 81%
rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/PassengerRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/PassengerRepositoryIntegrationTest.java
index fd06710084..1676cd6406 100644
--- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/PassengerRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/PassengerRepositoryIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.repository;
+package com.baeldung.jpa;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
@@ -8,18 +8,22 @@ import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.entity.Passenger;
+import com.baeldung.jpa.domain.Passenger;
+import com.baeldung.jpa.repository.PassengerRepository;
-@DataJpaTest(showSql = false)
@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = { JpaApplication.class})
+@DirtiesContext
public class PassengerRepositoryIntegrationTest {
@PersistenceContext
@@ -28,6 +32,7 @@ public class PassengerRepositoryIntegrationTest {
private PassengerRepository repository;
@Before
+ @Transactional
public void before() {
entityManager.persist(Passenger.from("Jill", "Smith"));
entityManager.persist(Passenger.from("Eve", "Jackson"));
@@ -36,6 +41,7 @@ public class PassengerRepositoryIntegrationTest {
entityManager.persist(Passenger.from("Siya", "Kolisi"));
}
+ @Transactional
@Test
public void givenPassengers_whenMatchingIgnoreCase_thenExpectedReturned() {
Passenger jill = Passenger.from("Jill", "Smith");
diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/SongRepositoryIntegrationTest.java
similarity index 84%
rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/SongRepositoryIntegrationTest.java
index 19362acd44..f5861ec120 100644
--- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/SongRepositoryIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.repository;
+package com.baeldung.jpa;
import static org.junit.Assert.assertEquals;
@@ -7,17 +7,19 @@ import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
-import com.baeldung.entity.Song;
-import com.baeldung.repository.SongRepository;
+import com.baeldung.jpa.domain.Song;
+import com.baeldung.jpa.repository.SongRepository;
@RunWith(SpringRunner.class)
-@SpringBootTest
+@ContextConfiguration(classes = { JpaApplication.class })
@Sql(scripts = { "/test-song-data.sql" })
+@DirtiesContext
public class SongRepositoryIntegrationTest {
@Autowired private SongRepository songRepository;
diff --git a/persistence-modules/spring-data-mongodb-reactive/pom.xml b/persistence-modules/spring-data-mongodb-reactive/pom.xml
index 85c9a4c4b6..ca45d4a758 100644
--- a/persistence-modules/spring-data-mongodb-reactive/pom.xml
+++ b/persistence-modules/spring-data-mongodb-reactive/pom.xml
@@ -18,7 +18,7 @@
io.projectreactor
reactor-core
- ${reactor-core.version}
+ ${reactor.version}
org.springframework.boot
@@ -35,10 +35,12 @@
org.projectlombok
lombok
+ ${lombok.version}
io.projectreactor
reactor-test
+ ${reactor.version}
test
@@ -125,7 +127,7 @@
5.3.15
4.5.2
- 3.3.1.RELEASE
+ 3.6.0
\ No newline at end of file
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index 052935e215..382cdf83f5 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -27,6 +27,7 @@
org.projectlombok
lombok
+ ${lombok.version}
io.projectreactor
diff --git a/persistence-modules/spring-data-rest-querydsl/pom.xml b/persistence-modules/spring-data-rest-querydsl/pom.xml
index dc1cf64006..0fe9d381cf 100644
--- a/persistence-modules/spring-data-rest-querydsl/pom.xml
+++ b/persistence-modules/spring-data-rest-querydsl/pom.xml
@@ -28,8 +28,8 @@
spring-boot-starter-data-jpa
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
com.querydsl
diff --git a/persistence-modules/spring-data-shardingsphere/pom.xml b/persistence-modules/spring-data-shardingsphere/pom.xml
index c1ca313038..117a3ae7fe 100644
--- a/persistence-modules/spring-data-shardingsphere/pom.xml
+++ b/persistence-modules/spring-data-shardingsphere/pom.xml
@@ -17,7 +17,7 @@
5.3.2
- 8.0.33
+ 8.2.0
@@ -43,8 +43,8 @@
test
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.version}
diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml
index 306c4995d2..61b253d0d2 100644
--- a/persistence-modules/spring-hibernate-3/pom.xml
+++ b/persistence-modules/spring-hibernate-3/pom.xml
@@ -37,8 +37,8 @@
${javassist.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
runtime
@@ -79,7 +79,7 @@
3.21.0-GA
3.6.10.Final
- 5.1.40
+ 8.2.0
8.5.8
diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml
index d3ba647af2..3ad8f791df 100644
--- a/persistence-modules/spring-hibernate-5/pom.xml
+++ b/persistence-modules/spring-hibernate-5/pom.xml
@@ -99,8 +99,8 @@
${hsqldb.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -133,7 +133,7 @@
5.6.15.Final
5.8.2.Final
- 8.0.7-dmr
+ 8.2.0
9.0.0.M26
1.1
2.3.0.1
diff --git a/persistence-modules/spring-hibernate-6/pom.xml b/persistence-modules/spring-hibernate-6/pom.xml
index a13117e68c..3cd69a963e 100644
--- a/persistence-modules/spring-hibernate-6/pom.xml
+++ b/persistence-modules/spring-hibernate-6/pom.xml
@@ -84,8 +84,8 @@
${hsqldb.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -102,7 +102,7 @@
6.1.3
6.2.8.Final
- 8.0.7-dmr
+ 8.2.0
9.0.80
diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml
index 08e43e8292..1cf4c141b3 100644
--- a/persistence-modules/spring-jdbc/pom.xml
+++ b/persistence-modules/spring-jdbc/pom.xml
@@ -27,8 +27,8 @@
h2
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml
index 9abf888fb2..c20c43912b 100644
--- a/persistence-modules/spring-jpa-2/pom.xml
+++ b/persistence-modules/spring-jpa-2/pom.xml
@@ -54,8 +54,8 @@
io.jsonwebtoken
- jjwt
- 0.9.1
+ jjwt-api
+ 0.12.3
diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java
index 00db7eebc4..42eab1d6de 100644
--- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java
+++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java
@@ -30,7 +30,7 @@ public class AuthenticationService {
if (token != null) {
String user = Jwts.parser()
.setSigningKey(SIGNINGKEY)
- .parseClaimsJws(token.replace(PREFIX, ""))
+ .build().parseClaimsJws(token.replace(PREFIX, ""))
.getBody()
.getSubject();
if (user != null) {
@@ -48,9 +48,11 @@ public class AuthenticationService {
}
String tenant = Jwts.parser()
.setSigningKey(SIGNINGKEY)
- .parseClaimsJws(token.replace(PREFIX, ""))
+ .build().parseClaimsJws(token.replace(PREFIX, ""))
.getBody()
- .getAudience();
+ .getAudience()
+ .iterator()
+ .next();
return tenant;
}
}
diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml
index 10e44c0ce4..61950d9c93 100644
--- a/persistence-modules/spring-jpa/pom.xml
+++ b/persistence-modules/spring-jpa/pom.xml
@@ -54,8 +54,8 @@
${javassist.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
runtime
@@ -117,7 +117,7 @@
6.0.6
3.29.2-GA
- 8.0.33
+ 8.2.0
3.1.0
6.0.0
diff --git a/pom.xml b/pom.xml
index 95a6c951ce..dcc929bd14 100644
--- a/pom.xml
+++ b/pom.xml
@@ -709,7 +709,6 @@
apache-tika
apache-velocity
asciidoctor
- asm
atomix
aws-modules
azure
@@ -756,7 +755,7 @@
jersey
jetbrains
jgit
- jhipster-6
+
jib
jmeter
jmh
@@ -772,13 +771,17 @@
libraries-4
libraries-5
libraries-6
+ libraries-7
libraries-ai
libraries-apache-commons-2
libraries-apache-commons-collections
libraries-apache-commons-io
libraries-apache-commons
+ libraries-bytecode
+ libraries-cli
libraries-concurrency
libraries-data-2
+ libraries-data-3
libraries-data-db
libraries-data-io
libraries-data
@@ -788,11 +791,14 @@
libraries-io
libraries-llms
libraries-primitive
+ libraries-reporting
libraries-rpc
libraries-security
libraries-server-2
libraries-server
+ libraries-stream
libraries-testing
+ libraries-testing-2
libraries-transform
libraries
lightrun
@@ -800,7 +806,7 @@
lombok-modules
lucene
mapstruct
- maven-modules
+
mesos-marathon
messaging-modules
metrics
@@ -817,6 +823,7 @@
pdf
performance-tests
persistence-modules
+
persistence-modules/spring-data-neo4j
protobuffer
quarkus-modules
@@ -836,19 +843,19 @@
spring-actuator
spring-ai
spring-aop-2
- spring-aop
+
spring-batch-2
spring-batch
spring-boot-modules
spring-boot-rest
spring-cloud-modules/spring-cloud-azure
spring-cloud-modules/spring-cloud-circuit-breaker
- spring-cloud-modules/spring-cloud-contract
- spring-cloud-modules/spring-cloud-data-flow
+
+
spring-cloud-modules/spring-cloud-eureka
spring-cloud-modules/spring-cloud-netflix-feign
spring-cloud-modules/spring-cloud-security
- spring-cloud-modules/spring-cloud-stream-starters
+
spring-cloud-modules/spring-cloud-zuul-eureka-integration
spring-core-2
spring-core-3
@@ -856,18 +863,19 @@
spring-core
spring-credhub
spring-cucumber
- spring-di-2
+
spring-di-3
spring-di-4
spring-di
spring-drools
spring-ejb-modules
spring-exceptions
- spring-integration
+
spring-jenkins-pipeline
spring-jersey
spring-jinq
spring-kafka-2
+ spring-kafka-3
spring-kafka
spring-katharsis
spring-mobile
@@ -890,10 +898,11 @@
spring-web-modules
spring-websockets
- tablesaw
+
tensorflow-java
testing-modules
testing-modules/mockito-simple
+ timefold-solver
vaadin
vavr-modules
vertx-modules
@@ -906,9 +915,9 @@
UTF-8
- 11
- 11
- 11
+ 17
+ 17
+ 17
@@ -954,7 +963,6 @@
apache-tika
apache-velocity
asciidoctor
- asm
atomix
aws-modules
azure
@@ -1001,7 +1009,7 @@
jersey
jetbrains
jgit
- jhipster-6
+
jib
jmeter
jmh
@@ -1017,13 +1025,17 @@
libraries-4
libraries-5
libraries-6
+ libraries-7
libraries-ai
libraries-apache-commons-2
libraries-apache-commons-collections
libraries-apache-commons-io
libraries-apache-commons
+ libraries-bytecode
+ libraries-cli
libraries-concurrency
libraries-data-2
+ libraries-data-3
libraries-data-db
libraries-data-io
libraries-data
@@ -1033,11 +1045,14 @@
libraries-io
libraries-llms
libraries-primitive
+ libraries-reporting
libraries-rpc
libraries-security
libraries-server-2
libraries-server
+ libraries-stream
libraries-testing
+ libraries-testing-2
libraries-transform
libraries
lightrun
@@ -1045,7 +1060,7 @@
lombok-modules
lucene
mapstruct
- maven-modules
+
mesos-marathon
messaging-modules
metrics
@@ -1081,19 +1096,19 @@
spring-actuator
spring-ai
spring-aop-2
- spring-aop
+
spring-batch-2
spring-batch
spring-boot-modules
spring-boot-rest
spring-cloud-modules/spring-cloud-azure
spring-cloud-modules/spring-cloud-circuit-breaker
- spring-cloud-modules/spring-cloud-contract
- spring-cloud-modules/spring-cloud-data-flow
+
+
spring-cloud-modules/spring-cloud-eureka
spring-cloud-modules/spring-cloud-netflix-feign
spring-cloud-modules/spring-cloud-security
- spring-cloud-modules/spring-cloud-stream-starters
+
spring-cloud-modules/spring-cloud-zuul-eureka-integration
spring-core-2
spring-core-3
@@ -1101,14 +1116,14 @@
spring-core
spring-credhub
spring-cucumber
- spring-di-2
+
spring-di-3
spring-di-4
spring-di
spring-drools
spring-ejb-modules
spring-exceptions
- spring-integration
+
spring-jenkins-pipeline
spring-jersey
spring-jinq
@@ -1135,10 +1150,11 @@
spring-web-modules
spring-websockets
- tablesaw
+
tensorflow-java
testing-modules
testing-modules/mockito-simple
+ timefold-solver
vaadin
vavr-modules
vertx-modules
@@ -1151,9 +1167,9 @@
UTF-8
- 11
- 11
- 11
+ 17
+ 17
+ 17
@@ -1223,7 +1239,7 @@
1.2
2.3.3
1.2
- 2.15.2
+ 2.16.0
1.5
1.9.2
5.9.2
@@ -1234,7 +1250,7 @@
3.12.2
3.3.0
3.21.0
- 1.18.28
+ 1.18.30
2.1.214
32.1.3-jre
3.3.0
diff --git a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml
index 74deab3558..c3ee41223f 100644
--- a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml
+++ b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml
@@ -253,10 +253,7 @@
1.17.2
- 11
0.12.1
- 11
- 11
3.1.0
0.9.11
2.0.8
diff --git a/reactive-systems/inventory-service/pom.xml b/reactive-systems/inventory-service/pom.xml
index 4aeec24922..baf5151fdc 100644
--- a/reactive-systems/inventory-service/pom.xml
+++ b/reactive-systems/inventory-service/pom.xml
@@ -31,6 +31,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
org.springframework.boot
diff --git a/reactive-systems/order-service/pom.xml b/reactive-systems/order-service/pom.xml
index b9e5d36d3a..b6cfb70678 100644
--- a/reactive-systems/order-service/pom.xml
+++ b/reactive-systems/order-service/pom.xml
@@ -31,6 +31,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
org.springframework.boot
diff --git a/reactive-systems/shipping-service/pom.xml b/reactive-systems/shipping-service/pom.xml
index 5fac674bbc..8f94dabdea 100644
--- a/reactive-systems/shipping-service/pom.xml
+++ b/reactive-systems/shipping-service/pom.xml
@@ -31,6 +31,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
org.springframework.boot
diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml
index dd7533fe73..7bf34c93ad 100644
--- a/reactor-core/pom.xml
+++ b/reactor-core/pom.xml
@@ -29,7 +29,7 @@
io.projectreactor.addons
reactor-extra
- ${reactor.version}
+ ${reactor-extra.version}
org.projectlombok
@@ -40,7 +40,8 @@
- 3.5.1
+ 3.6.0
+ 3.5.1
\ No newline at end of file
diff --git a/saas-modules/stripe/pom.xml b/saas-modules/stripe/pom.xml
index 44bc5be4a8..77bb912b7b 100644
--- a/saas-modules/stripe/pom.xml
+++ b/saas-modules/stripe/pom.xml
@@ -27,6 +27,7 @@
org.projectlombok
lombok
+ ${lombok.version}
com.stripe
diff --git a/security-modules/cas/cas-secured-app/pom.xml b/security-modules/cas/cas-secured-app/pom.xml
index 7c4864b1c0..b5ac123b21 100644
--- a/security-modules/cas/cas-secured-app/pom.xml
+++ b/security-modules/cas/cas-secured-app/pom.xml
@@ -41,8 +41,8 @@
spring-boot-starter-data-jpa
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/security-modules/jjwt/pom.xml b/security-modules/jjwt/pom.xml
index 3ea4a46b8a..3693eaf9c4 100644
--- a/security-modules/jjwt/pom.xml
+++ b/security-modules/jjwt/pom.xml
@@ -35,13 +35,23 @@
io.jsonwebtoken
- jjwt
+ jjwt-api
+ ${jjwt.version}
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ ${jjwt.version}
+
+
+ io.jsonwebtoken
+ jjwt-jackson
${jjwt.version}
- 0.7.0
+ 0.12.3
\ No newline at end of file
diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java
index e453f33d5e..c0f176034e 100644
--- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java
+++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java
@@ -66,7 +66,7 @@ public class WebSecurityConfig {
// CsrfFilter already made sure the token matched. Here, we'll make sure it's not expired
try {
Jwts.parser()
- .setSigningKeyResolver(secretService.getSigningKeyResolver())
+ .setSigningKeyResolver(secretService.getSigningKeyResolver()).build()
.parseClaimsJws(token.getToken());
} catch (JwtException e) {
// most likely an ExpiredJwtException, but this will handle any
diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java
index 3d157827d1..1c29a753b6 100644
--- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java
+++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java
@@ -4,7 +4,7 @@ import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
-import io.jsonwebtoken.impl.compression.CompressionCodecs;
+import io.jsonwebtoken.impl.compression.DeflateCompressionAlgorithm;
import io.jsonwebtoken.jjwtfun.model.JwtResponse;
import io.jsonwebtoken.jjwtfun.service.SecretService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -38,7 +38,7 @@ public class DynamicJWTController extends BaseController {
public JwtResponse dynamicBuildercompress(@RequestBody Map claims) throws UnsupportedEncodingException {
String jws = Jwts.builder()
.setClaims(claims)
- .compressWith(CompressionCodecs.DEFLATE)
+ .compressWith(new DeflateCompressionAlgorithm())
.signWith(SignatureAlgorithm.HS256, secretService.getHS256SecretBytes())
.compact();
return new JwtResponse(jws);
diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java
index 1ca0973c33..4975385398 100644
--- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java
+++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java
@@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.security.NoSuchAlgorithmException;
import java.util.Map;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
@@ -23,7 +24,7 @@ public class SecretsController extends BaseController {
}
@RequestMapping(value = "/refresh-secrets", method = GET)
- public Map refreshSecrets() {
+ public Map refreshSecrets() throws NoSuchAlgorithmException {
return secretService.refreshSecrets();
}
diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java
index efafa4b1b7..4ff71a620e 100644
--- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java
+++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java
@@ -42,7 +42,7 @@ public class StaticJWTController extends BaseController {
public JwtResponse parser(@RequestParam String jwt) throws UnsupportedEncodingException {
Jws jws = Jwts.parser()
- .setSigningKeyResolver(secretService.getSigningKeyResolver())
+ .setSigningKeyResolver(secretService.getSigningKeyResolver()).build()
.parseClaimsJws(jwt);
return new JwtResponse(jws);
@@ -53,7 +53,7 @@ public class StaticJWTController extends BaseController {
Jws jws = Jwts.parser()
.requireIssuer("Stormpath")
.require("hasMotorcycle", true)
- .setSigningKeyResolver(secretService.getSigningKeyResolver())
+ .setSigningKeyResolver(secretService.getSigningKeyResolver()).build()
.parseClaimsJws(jwt);
return new JwtResponse(jws);
diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java
index 4426a4b9b0..958d6fb48f 100644
--- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java
+++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java
@@ -6,12 +6,14 @@ import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SigningKeyResolver;
import io.jsonwebtoken.SigningKeyResolverAdapter;
import io.jsonwebtoken.impl.TextCodec;
-import io.jsonwebtoken.impl.crypto.MacProvider;
import io.jsonwebtoken.lang.Assert;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
+import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
+
+import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
@@ -28,7 +30,7 @@ public class SecretService {
};
@PostConstruct
- public void setup() {
+ public void setup() throws NoSuchAlgorithmException {
refreshSecrets();
}
@@ -42,32 +44,34 @@ public class SecretService {
public void setSecrets(Map secrets) {
Assert.notNull(secrets);
- Assert.hasText(secrets.get(SignatureAlgorithm.HS256.getValue()));
- Assert.hasText(secrets.get(SignatureAlgorithm.HS384.getValue()));
- Assert.hasText(secrets.get(SignatureAlgorithm.HS512.getValue()));
+ Assert.hasText(secrets.get(SignatureAlgorithm.HS256.getJcaName()));
+ Assert.hasText(secrets.get(SignatureAlgorithm.HS384.getJcaName()));
+ Assert.hasText(secrets.get(SignatureAlgorithm.HS512.getJcaName()));
this.secrets = secrets;
}
public byte[] getHS256SecretBytes() {
- return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS256.getValue()));
+ return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS256.getJcaName()));
}
public byte[] getHS384SecretBytes() {
- return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS384.getValue()));
+ return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS384.getJcaName()));
}
public byte[] getHS512SecretBytes() {
- return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS512.getValue()));
+ return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS512.getJcaName()));
}
- public Map refreshSecrets() {
- SecretKey key = MacProvider.generateKey(SignatureAlgorithm.HS256);
- secrets.put(SignatureAlgorithm.HS256.getValue(), TextCodec.BASE64.encode(key.getEncoded()));
- key = MacProvider.generateKey(SignatureAlgorithm.HS384);
- secrets.put(SignatureAlgorithm.HS384.getValue(), TextCodec.BASE64.encode(key.getEncoded()));
- key = MacProvider.generateKey(SignatureAlgorithm.HS512);
- secrets.put(SignatureAlgorithm.HS512.getValue(), TextCodec.BASE64.encode(key.getEncoded()));
+ public Map refreshSecrets() throws NoSuchAlgorithmException {
+ SecretKey key = KeyGenerator.getInstance(SignatureAlgorithm.HS256.getJcaName()).generateKey();
+ secrets.put(SignatureAlgorithm.HS256.getJcaName(), TextCodec.BASE64.encode(key.getEncoded()));
+
+ key = KeyGenerator.getInstance(SignatureAlgorithm.HS384.getJcaName()).generateKey();
+ secrets.put(SignatureAlgorithm.HS384.getJcaName(), TextCodec.BASE64.encode(key.getEncoded()));
+
+ key = KeyGenerator.getInstance(SignatureAlgorithm.HS512.getJcaName()).generateKey();
+ secrets.put(SignatureAlgorithm.HS512.getJcaName(), TextCodec.BASE64.encode(key.getEncoded()));
return secrets;
}
}
diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java
index 0fbf7637dd..2fc97b0b51 100644
--- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java
+++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java
@@ -1,12 +1,14 @@
package io.jsonwebtoken.jjwtfun.util;
+import io.jsonwebtoken.Jwt;
+import io.jsonwebtoken.JwtParser;
+import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
-import io.jsonwebtoken.impl.crypto.DefaultJwtSignatureValidator;
import javax.crypto.spec.SecretKeySpec;
+
import java.util.Base64;
-import static io.jsonwebtoken.SignatureAlgorithm.HS256;
public class JWTDecoderUtil {
@@ -21,26 +23,19 @@ public class JWTDecoderUtil {
return header + " " + payload;
}
- public static String decodeJWTToken(String token, String secretKey) throws Exception {
- Base64.Decoder decoder = Base64.getUrlDecoder();
+ public static boolean isTokenValid(String token, String secretKey) throws Exception {
+ SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), SignatureAlgorithm.HS256.getJcaName());
- String[] chunks = token.split("\\.");
+ JwtParser jwtParser = Jwts.parser()
+ .verifyWith(secretKeySpec)
+ .build();
- String header = new String(decoder.decode(chunks[0]));
- String payload = new String(decoder.decode(chunks[1]));
-
- String tokenWithoutSignature = chunks[0] + "." + chunks[1];
- String signature = chunks[2];
-
- SignatureAlgorithm sa = HS256;
- SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName());
-
- DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec);
-
- if (!validator.isValid(tokenWithoutSignature, signature)) {
- throw new Exception("Could not verify JWT token integrity!");
+ try {
+ jwtParser.parse(token);
+ } catch (Exception e) {
+ throw new Exception("Could not verify JWT token integrity!", e);
}
- return header + " " + payload;
+ return true;
}
}
diff --git a/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java b/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java
index 3103a6c8a3..4cdfdc59ba 100644
--- a/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java
+++ b/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java
@@ -1,16 +1,16 @@
package io.jsonwebtoken.jjwtfun.util;
import io.jsonwebtoken.SignatureAlgorithm;
-import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class JWTDecoderUtilUnitTest {
private final static String SIMPLE_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9";
- private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.qH7Zj_m3kY69kxhaQXTa-ivIpytKXXjZc1ZSmapZnGE";
+ private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.6h_QYBTbyKxfMq3TGiAhVI416rctV0c0SpzWxVm-0-Y";
@Test
void givenSimpleToken_whenDecoding_thenStringOfHeaderPayloadAreReturned() {
@@ -20,13 +20,13 @@ class JWTDecoderUtilUnitTest {
@Test
void givenSignedToken_whenDecodingWithInvalidSecret_thenIntegrityIsNotValidated() {
- assertThatThrownBy(() -> JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "BAD_SECRET"))
+ assertThatThrownBy(() -> JWTDecoderUtil.
+ isTokenValid(SIGNED_TOKEN, "BAD_SECRET"))
.hasMessage("Could not verify JWT token integrity!");
}
@Test
void givenSignedToken_whenDecodingWithValidSecret_thenIntegrityIsValidated() throws Exception {
- assertThat(JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "MySecretKey"))
- .contains("Baeldung User");
+ assertTrue(JWTDecoderUtil.isTokenValid(SIGNED_TOKEN, "randomSecretWithSome!!CharacterS!"));
}
}
diff --git a/security-modules/sql-injection-samples/pom.xml b/security-modules/sql-injection-samples/pom.xml
index 7953e43ebe..37779e0d14 100644
--- a/security-modules/sql-injection-samples/pom.xml
+++ b/security-modules/sql-injection-samples/pom.xml
@@ -38,6 +38,7 @@
org.projectlombok
lombok
+ ${lombok.version}
provided
diff --git a/spring-4/pom.xml b/spring-4/pom.xml
index 681747c1f6..9a50319d13 100644
--- a/spring-4/pom.xml
+++ b/spring-4/pom.xml
@@ -57,6 +57,7 @@
org.projectlombok
lombok
+ ${lombok.version}
provided
@@ -120,7 +121,7 @@
1.0.1
3.6
2.4.0
- 4.0.3
+ 5.1.0
2.17.1
diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml
index fe6dbe5292..8a381b250a 100644
--- a/spring-5-webflux/pom.xml
+++ b/spring-5-webflux/pom.xml
@@ -46,6 +46,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.springframework.boot
diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index 1ac696e7bd..65f1b77520 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -143,7 +143,7 @@
1.0
1.5.6
${project.build.directory}/generated-snippets
- 4.0.3
+ 5.1.0
\ No newline at end of file
diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml
index 20b0ef6d1c..bca0030729 100644
--- a/spring-batch/pom.xml
+++ b/spring-batch/pom.xml
@@ -77,7 +77,7 @@
5.8
4.0.0
4.0.2
- 2.14.2
+ 2.16.0
4.5.14
1.5.3
com.baeldung.batchtesting.SpringBatchApplication
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 433f23f4ba..890edd6cc5 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -42,7 +42,7 @@
spring-boot-exceptions
spring-boot-flowable
spring-boot-graphql
- spring-boot-groovy
+
spring-boot-jasypt
spring-boot-jsp
@@ -95,7 +95,7 @@
spring-boot-3-observation
spring-boot-3-test-pitfalls
spring-boot-3-testcontainers
- spring-boot-3-2
+
spring-boot-resilience4j
spring-boot-properties
spring-boot-properties-2
diff --git a/spring-boot-modules/spring-boot-3-2/README.md b/spring-boot-modules/spring-boot-3-2/README.md
index 27f9281725..b461cd9913 100644
--- a/spring-boot-modules/spring-boot-3-2/README.md
+++ b/spring-boot-modules/spring-boot-3-2/README.md
@@ -1,3 +1,5 @@
## Relevant Articles
- [Spring Boot 3.1’s ConnectionDetails Abstraction](https://www.baeldung.com/spring-boot-3-1-connectiondetails-abstraction)
- [@ConditionalOnThreading Annotation Spring](https://www.baeldung.com/spring-conditionalonthreading)
+- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient)
+- More articles: [[<-- prev]](/spring-boot-modules/spring-boot-3)
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml
index c85488d44b..8878060a97 100644
--- a/spring-boot-modules/spring-boot-3-2/pom.xml
+++ b/spring-boot-modules/spring-boot-3-2/pom.xml
@@ -79,6 +79,7 @@
org.projectlombok
lombok
+ ${lombok.version}
true
@@ -281,6 +282,7 @@
+ com.baeldung.restclient.RestClientApplication
1.6.0.Beta1
2.0.0
3.0.0-M7
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/Article.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/Article.java
similarity index 100%
rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/Article.java
rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/Article.java
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java
similarity index 75%
rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java
rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java
index 5e1dff6fd7..c2d87a558c 100644
--- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java
+++ b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java
@@ -1,13 +1,20 @@
package com.baeldung.restclient;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
@RestController
@RequestMapping("/articles")
public class ArticleController {
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java
similarity index 100%
rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java
rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java
similarity index 100%
rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java
rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/RestClientApplication.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/RestClientApplication.java
similarity index 100%
rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/RestClientApplication.java
rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/RestClientApplication.java
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java
similarity index 80%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java
index 4130b6cb6b..9198cc1f68 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration;
@@ -22,8 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"})
@ActiveProfiles("cassandra")
-public class CassandraConnectionDetailsIntegrationTest {
- private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class);
+public class CassandraConnectionDetailsLiveTest {
+ private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsLiveTest.class);
@Autowired
private CassandraTemplate cassandraTemplate;
@Test
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java
similarity index 77%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java
index 454aad4c6c..6f19382950 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.CustomCouchBaseConnectionDetailsConfiguration;
@@ -20,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-couch.properties"})
@ActiveProfiles("couch")
-public class CouchbaseConnectionDetailsIntegrationTest {
+public class CouchbaseConnectionDetailsLiveTest {
@Autowired
private Cluster cluster;
@Test
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java
similarity index 81%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java
index ee698cd6ea..10d0e9d019 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration;
@@ -24,8 +29,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"})
@ActiveProfiles("elastic")
-public class ElasticsearchConnectionDetailsIntegrationTest {
- private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class);
+public class ElasticsearchConnectionDetailsLiveTest {
+ private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsLiveTest.class);
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java
similarity index 79%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java
index 748bc27b0b..b074eb9bfd 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration;
@@ -25,8 +30,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"})
@ActiveProfiles("jdbc")
-public class JdbcConnectionDetailsIntegrationTest {
- private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class);
+public class JdbcConnectionDetailsLiveTest {
+ private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsLiveTest.class);
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java
similarity index 78%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java
index bc0e174b3f..f23e610d3a 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.CustomKafkaConnectionDetailsConfiguration;
@@ -21,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-kafka.properties"})
@ActiveProfiles("kafka")
-public class KafkaConnectionDetailsIntegrationTest {
+public class KafkaConnectionDetailsLiveTest {
@Autowired
private KafkaTemplate kafkaTemplate;
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java
similarity index 85%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java
index 868ebfea98..e2dceff9ec 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration;
@@ -26,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"})
@ActiveProfiles("mongo")
-public class MongoDBConnectionDetailsIntegrationTest {
+public class MongoDBConnectionDetailsLiveTest {
@Autowired
private MongoTemplate mongoTemplate;
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java
similarity index 81%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java
index 943ed7bdea..8eb9ec44d2 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration;
@@ -22,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
@ComponentScan(basePackages = "com.baeldung.connectiondetails")
@TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"})
@ActiveProfiles("neo4j")
-public class Neo4jConnectionDetailsIntegrationTest {
+public class Neo4jConnectionDetailsLiveTest {
@Autowired
private Neo4jTemplate neo4jTemplate;
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java
similarity index 80%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java
index 5f8c8349fb..460a48e7ff 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration;
@@ -20,8 +25,8 @@ import java.util.List;
@Import(R2dbcPostgresConnectionDetailsConfiguration.class)
@TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"})
@ActiveProfiles("r2dbc")
-public class R2dbcConnectionDetailsIntegrationTest {
- Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class);
+public class R2dbcConnectionDetailsLiveTest {
+ Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsLiveTest.class);
@Autowired
private R2dbcEntityTemplate r2dbcEntityTemplate;
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java
similarity index 85%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java
index 9e10973ed7..5f7eb055eb 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration;
@@ -25,9 +30,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
@Import(RabbitMQConnectionDetailsConfiguration.class)
@TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"})
@ActiveProfiles("rabbitmq")
-public class RabbitmqConnectionDetailsIntegrationTest {
+public class RabbitmqConnectionDetailsLiveTest {
- private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class);
+ private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsLiveTest.class);
@Autowired
private RabbitTemplate rabbitTemplate;
diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java
similarity index 76%
rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java
index 5dbd2d6c03..919f968323 100644
--- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java
@@ -1,3 +1,8 @@
+/**
+ * These test cases have dependency with docker because they pull the docker images from docker hub
+ * and run the container. So, please make sure to install docker before running the tests.
+ * For the image details please look into the docker-compose files under resources/connectiondetails/docker
+ **/
package com.baeldung.connectiondetails;
import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration;
@@ -20,8 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
@Import(RedisConnectionDetailsConfiguration.class)
@TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"})
@ActiveProfiles("redis")
-public class RedisCacheConnnectionDetailsIntegrationTest {
- private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class);
+public class RedisCacheConnnectionDetailsLiveTest {
+ private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsLiveTest.class);
@Autowired
RedisTemplate redisTemplate;
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java
similarity index 100%
rename from spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java
rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java
index 1a615faf4e..3e12215bcb 100644
--- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java
@@ -1,7 +1,10 @@
package com.baeldung.restclient;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.List;
+
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -14,11 +17,8 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClient;
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RestClientIntegrationTest {
diff --git a/spring-boot-modules/spring-boot-3-url-matching/pom.xml b/spring-boot-modules/spring-boot-3-url-matching/pom.xml
index 43f89eab47..42bd8583b3 100644
--- a/spring-boot-modules/spring-boot-3-url-matching/pom.xml
+++ b/spring-boot-modules/spring-boot-3-url-matching/pom.xml
@@ -96,8 +96,8 @@
6.0.6
3.1.0
- 3.5.4
- 3.5.4>
+ 3.6.0
+ 3.6.0>
3.0.0-M7
diff --git a/spring-boot-modules/spring-boot-3/README.md b/spring-boot-modules/spring-boot-3/README.md
index ded5db30e4..ff00a506cf 100644
--- a/spring-boot-modules/spring-boot-3/README.md
+++ b/spring-boot-modules/spring-boot-3/README.md
@@ -8,4 +8,5 @@
- [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface)
- [Working with Virtual Threads in Spring 6](https://www.baeldung.com/spring-6-virtual-threads)
- [Docker Compose Support in Spring Boot 3](https://www.baeldung.com/ops/docker-compose-support-spring-boot)
-- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient)
+
+- More articles: [[next -->]](/spring-boot-modules/spring-boot-3-2)
diff --git a/spring-boot-modules/spring-boot-cassandre/pom.xml b/spring-boot-modules/spring-boot-cassandre/pom.xml
index e2964183d2..3834d7b88c 100644
--- a/spring-boot-modules/spring-boot-cassandre/pom.xml
+++ b/spring-boot-modules/spring-boot-cassandre/pom.xml
@@ -40,7 +40,6 @@
- 11
4.2.1
5.0.7
2.5.1
diff --git a/spring-boot-modules/spring-boot-crud/README.md b/spring-boot-modules/spring-boot-crud/README.md
index 6b0032deb3..09c5d9ba3a 100644
--- a/spring-boot-modules/spring-boot-crud/README.md
+++ b/spring-boot-modules/spring-boot-crud/README.md
@@ -5,3 +5,4 @@ This module contains articles about Spring Boot CRUD Operations
### Relevant Articles:
- [Spring Boot CRUD Application with Thymeleaf](https://www.baeldung.com/spring-boot-crud-thymeleaf)
- [Using a Spring Boot Application as a Dependency](https://www.baeldung.com/spring-boot-dependency)
+- [Differences Between Entities and DTOs](https://www.baeldung.com/java-entity-vs-dto)
diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java
similarity index 54%
rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java
rename to spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java
index 47a18b557f..4a780ac17a 100644
--- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java
@@ -1,17 +1,12 @@
-package com.baeldung;
+package com.baeldung.entitydtodifferences;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-
-import com.baeldung.boot.daos.impl.ExtendedRepositoryImpl;
@SpringBootApplication
-@EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
-
}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java
new file mode 100644
index 0000000000..66cecacd9b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java
@@ -0,0 +1,39 @@
+package com.baeldung.entitydtodifferences.controller;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.entitydtodifferences.dto.UserCreationDto;
+import com.baeldung.entitydtodifferences.dto.UserResponseDto;
+import com.baeldung.entitydtodifferences.mapper.UserMapper;
+import com.baeldung.entitydtodifferences.repository.UserRepository;
+
+@RestController
+@RequestMapping("/users")
+public class UserController {
+
+ private final UserRepository userRepository;
+
+ public UserController(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
+
+ @GetMapping
+ public List getUsers() {
+ return userRepository.findAll()
+ .stream()
+ .map(UserMapper::toDto)
+ .collect(Collectors.toList());
+ }
+
+ @PostMapping
+ public UserResponseDto createUser(@RequestBody UserCreationDto userCreationDto) {
+ return UserMapper.toDto(userRepository.save(UserMapper.toEntity(userCreationDto)));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java
new file mode 100644
index 0000000000..a5ee25f105
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java
@@ -0,0 +1,30 @@
+package com.baeldung.entitydtodifferences.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class BookDto {
+
+ @JsonProperty("NAME")
+ private final String name;
+
+ @JsonProperty("AUTHOR")
+ private final String author;
+
+ // Default constructor for Jackson deserialization
+ public BookDto() {
+ this(null, null);
+ }
+
+ public BookDto(String name, String author) {
+ this.name = name;
+ this.author = author;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java
new file mode 100644
index 0000000000..0859c042cf
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java
@@ -0,0 +1,48 @@
+package com.baeldung.entitydtodifferences.dto;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class UserCreationDto {
+
+ @JsonProperty("FIRST_NAME")
+ private final String firstName;
+
+ @JsonProperty("LAST_NAME")
+ private final String lastName;
+
+ @JsonProperty("ADDRESS")
+ private final String address;
+
+ @JsonProperty("BOOKS")
+ private final List books;
+
+ // Default constructor for Jackson deserialization
+ public UserCreationDto() {
+ this(null, null, null, null);
+ }
+
+ public UserCreationDto(String firstName, String lastName, String address, List books) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.address = address;
+ this.books = books;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public List getBooks() {
+ return books;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java
new file mode 100644
index 0000000000..910689dd41
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java
@@ -0,0 +1,48 @@
+package com.baeldung.entitydtodifferences.dto;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class UserResponseDto {
+
+ @JsonProperty("ID")
+ private final Long id;
+
+ @JsonProperty("FIRST_NAME")
+ private final String firstName;
+
+ @JsonProperty("LAST_NAME")
+ private final String lastName;
+
+ @JsonProperty("BOOKS")
+ private final List books;
+
+ // Default constructor for Jackson deserialization
+ public UserResponseDto() {
+ this(null, null, null, null);
+ }
+
+ public UserResponseDto(Long id, String firstName, String lastName, List books) {
+ this.id = id;
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.books = books;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public List getBooks() {
+ return books;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java
new file mode 100644
index 0000000000..88e895467a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java
@@ -0,0 +1,39 @@
+package com.baeldung.entitydtodifferences.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "books")
+public class Book {
+
+ @Id
+ private String name;
+ private String author;
+
+ // Default constructor for JPA deserialization
+ public Book() {
+ }
+
+ public Book(String name, String author) {
+ this.name = name;
+ this.author = author;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java
new file mode 100644
index 0000000000..6a404e9f1f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java
@@ -0,0 +1,90 @@
+package com.baeldung.entitydtodifferences.entity;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "users")
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String firstName;
+ private String lastName;
+ private String address;
+
+ @OneToMany(cascade = CascadeType.ALL)
+ private List books;
+
+ // Default constructor for JPA deserialization
+ public User() {
+ }
+
+ public User(String firstName, String lastName, String address, List books) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.address = address;
+ this.books = books;
+ }
+
+ public String getNameOfMostOwnedBook() {
+ Map bookOwnershipCount = books.stream()
+ .collect(Collectors.groupingBy(Book::getName, Collectors.counting()));
+ return bookOwnershipCount.entrySet()
+ .stream()
+ .max(Map.Entry.comparingByValue())
+ .map(Map.Entry::getKey)
+ .orElse(null);
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public List getBooks() {
+ return books;
+ }
+
+ public void setBooks(List books) {
+ this.books = books;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java
new file mode 100644
index 0000000000..0c6899f98b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java
@@ -0,0 +1,34 @@
+package com.baeldung.entitydtodifferences.mapper;
+
+import java.util.stream.Collectors;
+
+import com.baeldung.entitydtodifferences.dto.BookDto;
+import com.baeldung.entitydtodifferences.dto.UserCreationDto;
+import com.baeldung.entitydtodifferences.dto.UserResponseDto;
+import com.baeldung.entitydtodifferences.entity.Book;
+import com.baeldung.entitydtodifferences.entity.User;
+
+public class UserMapper {
+
+ public static UserResponseDto toDto(User entity) {
+ return new UserResponseDto(entity.getId(), entity.getFirstName(), entity.getLastName(), entity.getBooks()
+ .stream()
+ .map(UserMapper::toDto)
+ .collect(Collectors.toList()));
+ }
+
+ public static User toEntity(UserCreationDto dto) {
+ return new User(dto.getFirstName(), dto.getLastName(), dto.getAddress(), dto.getBooks()
+ .stream()
+ .map(UserMapper::toEntity)
+ .collect(Collectors.toList()));
+ }
+
+ public static BookDto toDto(Book entity) {
+ return new BookDto(entity.getName(), entity.getAuthor());
+ }
+
+ public static Book toEntity(BookDto dto) {
+ return new Book(dto.getName(), dto.getAuthor());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java
new file mode 100644
index 0000000000..4529de698e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.entitydtodifferences.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import com.baeldung.entitydtodifferences.entity.User;
+
+@Repository
+public interface UserRepository extends JpaRepository {
+
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java
new file mode 100644
index 0000000000..839bb381ec
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.entitydtodifferences;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class ApplicationIntegrationTest {
+
+ @Test
+ public void contextLoads() {
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java
new file mode 100644
index 0000000000..83e359e378
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.entitydtodifferences.controller;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import com.baeldung.entitydtodifferences.entity.Book;
+import com.baeldung.entitydtodifferences.entity.User;
+import com.baeldung.entitydtodifferences.repository.UserRepository;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+public class UserControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @BeforeEach
+ public void beforeEach() {
+ userRepository.deleteAll();
+ }
+
+ @Test
+ public void givenUsersAreExisting_whenGetUsers_thenUsersAreReturned() throws Exception {
+ //given
+ Book book1 = new Book("Book1", "Author1");
+ Book book2 = new Book("Book2", "Author2");
+ User savedUser = userRepository.save(new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2)));
+ String expectedJson = String.format(
+ "[{\"ID\":%s,\"FIRST_NAME\":\"John\",\"LAST_NAME\":\"Doe\",\"BOOKS\":[{\"NAME\":\"Book1\",\"AUTHOR\":\"Author1\"},{\"NAME\":\"Book2\",\"AUTHOR\":\"Author2\"}]}]",
+ savedUser.getId());
+ //when
+ MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/users")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andReturn();
+ //then
+ assertEquals(expectedJson, result.getResponse()
+ .getContentAsString());
+ }
+
+ @Test
+ public void givenValidUser_whenPostUser_thenUserIsCreated() throws Exception {
+ //given
+ String user = "{\"FIRST_NAME\":\"John\",\"LAST_NAME\":\"Doe\",\"BOOKS\":[{\"NAME\":\"Book1\",\"AUTHOR\":\"Author1\"},{\"NAME\":\"Book2\",\"AUTHOR\":\"Author2\"}]}";
+ //when
+ MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/users")
+ .content(user)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andReturn();
+ JsonNode responseJson = objectMapper.readTree(result.getResponse()
+ .getContentAsString());
+ //then
+ assertEquals("John", responseJson.get("FIRST_NAME")
+ .asText());
+ assertEquals("Doe", responseJson.get("LAST_NAME")
+ .asText());
+ assertTrue(responseJson.has("BOOKS"));
+ JsonNode booksArray = responseJson.get("BOOKS");
+ assertEquals(2, booksArray.size());
+ assertEquals("Book1", booksArray.get(0)
+ .get("NAME")
+ .asText());
+ assertEquals("Author1", booksArray.get(0)
+ .get("AUTHOR")
+ .asText());
+ assertEquals("Book2", booksArray.get(1)
+ .get("NAME")
+ .asText());
+ assertEquals("Author2", booksArray.get(1)
+ .get("AUTHOR")
+ .asText());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java
new file mode 100644
index 0000000000..60e229b7c9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.entitydtodifferences.entity;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.junit.Test;
+
+public class BookUnitTest {
+
+ @Test
+ public void whenBookInitialized_thenInitializedCorrectly() {
+ //when
+ Book book = new Book("Book1", "Author1");
+ //then
+ assertNotNull(book);
+ assertEquals("Book1", book.getName());
+ assertEquals("Author1", book.getAuthor());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java
new file mode 100644
index 0000000000..0d1efe7129
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.entitydtodifferences.entity;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.junit.Test;
+
+public class UserUnitTest {
+
+ @Test
+ public void whenUserInitialized_thenInitializedCorrectly() {
+ //when
+ Book book1 = new Book("Book1", "Author1");
+ Book book2 = new Book("Book2", "Author2");
+ User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2));
+ //then
+ assertNotNull(user);
+ assertEquals("John", user.getFirstName());
+ assertEquals("Doe", user.getLastName());
+ assertEquals("123 Main St", user.getAddress());
+ assertEquals(2, user.getBooks()
+ .size());
+ }
+
+ @Test
+ public void givenUserOwningMultipleBooks_whenGetNameOfMostOwnedBook_thenComputedCorrectly() {
+ //given
+ Book book1 = new Book("Book1", "Author1");
+ Book book2 = new Book("Book2", "Author2");
+ Book book3 = new Book("Book2", "Author3");
+ User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2, book3));
+ //when
+ String mostOwnedBook = user.getNameOfMostOwnedBook();
+ //then
+ assertEquals("Book2", mostOwnedBook);
+ }
+
+ @Test
+ public void givenUserWithNoBooks_henGetNameOfMostOwnedBook_thenReturnedNull() {
+ //given
+ User user = new User("John", "Doe", "123 Main St", Collections.emptyList());
+ //when
+ String mostOwnedBook = user.getNameOfMostOwnedBook();
+ //then
+ assertNull(mostOwnedBook);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java
new file mode 100644
index 0000000000..5154898877
--- /dev/null
+++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.entitydtodifferences.mapper;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.baeldung.entitydtodifferences.dto.BookDto;
+import com.baeldung.entitydtodifferences.dto.UserCreationDto;
+import com.baeldung.entitydtodifferences.dto.UserResponseDto;
+import com.baeldung.entitydtodifferences.entity.Book;
+import com.baeldung.entitydtodifferences.entity.User;
+
+public class UserMapperUnitTest {
+
+ @Test
+ public void givenUserEntity_whenMappedToDto_thenMappedCorrectly() {
+ //given
+ Book book1 = new Book("Book1", "Author1");
+ Book book2 = new Book("Book2", "Author2");
+ User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2));
+ //when
+ UserResponseDto userDto = UserMapper.toDto(user);
+ //then
+ assertEquals(user.getId(), userDto.getId());
+ assertEquals(user.getFirstName(), userDto.getFirstName());
+ assertEquals(user.getLastName(), userDto.getLastName());
+ List bookDtos = userDto.getBooks();
+ assertEquals(2, bookDtos.size());
+ assertEquals(book1.getName(), bookDtos.get(0)
+ .getName());
+ assertEquals(book1.getAuthor(), bookDtos.get(0)
+ .getAuthor());
+ assertEquals(book2.getName(), bookDtos.get(1)
+ .getName());
+ assertEquals(book2.getAuthor(), bookDtos.get(1)
+ .getAuthor());
+ }
+
+ @Test
+ public void givenUserDto_whenMappedToEntity_thenMappedCorrectly() {
+ //given
+ BookDto bookDto1 = new BookDto("Book3", "Author3");
+ BookDto bookDto2 = new BookDto("Book4", "Author4");
+ UserCreationDto userDto = new UserCreationDto("Jane", "Doe", "456 Oak St", Arrays.asList(bookDto1, bookDto2));
+ //when
+ User user = UserMapper.toEntity(userDto);
+ //then
+ assertEquals(user.getFirstName(), userDto.getFirstName());
+ assertEquals(user.getLastName(), userDto.getLastName());
+ assertEquals(user.getAddress(), userDto.getAddress());
+ List books = user.getBooks();
+ assertEquals(2, books.size());
+ assertEquals(bookDto1.getName(), books.get(0)
+ .getName());
+ assertEquals(bookDto1.getAuthor(), books.get(0)
+ .getAuthor());
+ assertEquals(bookDto2.getName(), books.get(1)
+ .getName());
+ assertEquals(bookDto2.getAuthor(), books.get(1)
+ .getAuthor());
+ }
+
+ @Test
+ public void givenBookEntity_whenMappedToDto_thenMappedCorrectly() {
+ //given
+ Book book = new Book("Book5", "Author5");
+ //when
+ BookDto bookDto = UserMapper.toDto(book);
+ //then
+ assertEquals(book.getName(), bookDto.getName());
+ assertEquals(book.getAuthor(), bookDto.getAuthor());
+ }
+
+ @Test
+ public void givenBookDto_whenMappedToEntity_thenMappedCorrectly() {
+ //given
+ BookDto bookDto = new BookDto("Book6", "Author6");
+ //when
+ Book book = UserMapper.toEntity(bookDto);
+ //then
+ assertEquals(bookDto.getName(), book.getName());
+ assertEquals(bookDto.getAuthor(), book.getAuthor());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md
index 8e6619dce4..b8f0347453 100644
--- a/spring-boot-modules/spring-boot-data-2/README.md
+++ b/spring-boot-modules/spring-boot-data-2/README.md
@@ -6,4 +6,4 @@
- [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit)
- [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)
-
+- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor)
diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java
rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java
diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java
rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java
diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java
rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java
diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java
rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java
diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java
rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java
diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java
rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java
diff --git a/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java
similarity index 100%
rename from spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java
rename to spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java
diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml
index 6c2edbb864..4afafe3c19 100644
--- a/spring-boot-modules/spring-boot-data-3/pom.xml
+++ b/spring-boot-modules/spring-boot-data-3/pom.xml
@@ -30,8 +30,8 @@
${aws-secretsmanager-jdbc.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/spring-boot-modules/spring-boot-data/README.md b/spring-boot-modules/spring-boot-data/README.md
index aa745b77a2..49a6eedbed 100644
--- a/spring-boot-modules/spring-boot-data/README.md
+++ b/spring-boot-modules/spring-boot-data/README.md
@@ -8,7 +8,6 @@ This module contains articles about Spring Boot with Spring Data
- [Rendering Exceptions in JSON with Spring](https://www.baeldung.com/spring-exceptions-json)
- [Disable Spring Data Auto Configuration](https://www.baeldung.com/spring-data-disable-auto-config)
- [Repositories with Multiple Spring Data Modules](https://www.baeldung.com/spring-multiple-data-modules)
-- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor)
- [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent)
- [Guide To Running Logic on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
- [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper)
diff --git a/spring-boot-modules/spring-boot-documentation/pom.xml b/spring-boot-modules/spring-boot-documentation/pom.xml
index 3ac2799258..30a82660af 100644
--- a/spring-boot-modules/spring-boot-documentation/pom.xml
+++ b/spring-boot-modules/spring-boot-documentation/pom.xml
@@ -95,7 +95,7 @@
2.2.11
0.14.0
0.14.0
- 1.18.3
+ 1.19.3
diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml
index d3c122709d..b3f27f1b84 100644
--- a/spring-boot-modules/spring-boot-graphql/pom.xml
+++ b/spring-boot-modules/spring-boot-graphql/pom.xml
@@ -59,6 +59,7 @@
org.projectlombok
lombok
+ ${lombok.version}
com.h2database
diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java
index 87bebf644c..a2e63a96f8 100644
--- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java
@@ -1,6 +1,5 @@
package com.baeldung.graphql.intro;
-import com.baeldung.graphql.intro.GraphqlApplication;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml
index b0f0c780aa..fd3daa1a79 100644
--- a/spring-boot-modules/spring-boot-libraries/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries/pom.xml
@@ -225,7 +225,7 @@
2.2.4
3.2.0
0.23.0
- 2.1.0
+ 5.10.0
1.5-beta1
2.1
2.6.0
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java
index cd5f63e962..c03d351c20 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java
@@ -1,13 +1,13 @@
package com.baeldung.scheduling.shedlock;
-import net.javacrumbs.shedlock.core.SchedulerLock;
+import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
class BaeldungTaskScheduler {
@Scheduled(cron = "0 0/15 * * * ?")
- @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
+ @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastFor = "PT5M", lockAtMostFor = "PT14M")
public void scheduledTask() {
System.out.println("Running ShedLock task");
}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml
index 3477520208..03c24f7778 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml
@@ -1,6 +1,6 @@
spring:
datasource:
driverClassName: org.h2.Driver
- url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+ url: jdbc:h2:mem:shedlock_db;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql
new file mode 100644
index 0000000000..d5a5d51b74
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql
@@ -0,0 +1,7 @@
+CREATE TABLE IF NOT EXISTS shedlock(
+ name VARCHAR(64) NOT NULL,
+ lock_until TIMESTAMP NOT NULL,
+ locked_at TIMESTAMP NOT NULL,
+ locked_by VARCHAR(255) NOT NULL,
+ PRIMARY KEY (name)
+);
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
index 31c0f4bd02..de21a99ab3 100644
--- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
+++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
@@ -40,6 +40,7 @@
org.projectlombok
lombok
+ ${lombok.version}
provided
diff --git a/spring-boot-modules/spring-boot-mvc-5/README.md b/spring-boot-modules/spring-boot-mvc-5/README.md
index 782adb7b34..c72d72c84f 100644
--- a/spring-boot-modules/spring-boot-mvc-5/README.md
+++ b/spring-boot-modules/spring-boot-mvc-5/README.md
@@ -5,3 +5,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects.
### Relevant Articles:
- [Enable and Disable Endpoints at Runtime With Spring Boot](https://www.baeldung.com/spring-boot-enable-disable-endpoints-at-runtime)
- [Extracting a Custom Header From the Request](https://www.baeldung.com/spring-extract-custom-header-request)
+- [Modify Request Body Before Reaching Controller in Spring Boot](https://www.baeldung.com/spring-boot-change-request-body-before-controller)
diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml
index cc4b7f8283..b2cda67974 100644
--- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml
@@ -48,6 +48,7 @@
org.projectlombok
lombok
+ ${lombok.version}
provided
diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml
index 963cda61b9..ab1c867d66 100644
--- a/spring-boot-modules/spring-boot-mvc/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc/pom.xml
@@ -92,6 +92,7 @@
org.projectlombok
lombok
+ ${lombok.version}
diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml
index fa6b5a59c1..57a894e2fc 100644
--- a/spring-boot-modules/spring-boot-redis/pom.xml
+++ b/spring-boot-modules/spring-boot-redis/pom.xml
@@ -73,7 +73,6 @@
- 15
6.0.3
0.7.3
diff --git a/spring-boot-modules/spring-boot-resilience4j/pom.xml b/spring-boot-modules/spring-boot-resilience4j/pom.xml
index 355ef8f92d..2f3af8f9d2 100644
--- a/spring-boot-modules/spring-boot-resilience4j/pom.xml
+++ b/spring-boot-modules/spring-boot-resilience4j/pom.xml
@@ -53,7 +53,7 @@
2.35.0
2.0.2
- 2.15.2
+ 2.16.0
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-runtime-2/README.md b/spring-boot-modules/spring-boot-runtime-2/README.md
index 3ee05ccc83..c22f7cbc18 100644
--- a/spring-boot-modules/spring-boot-runtime-2/README.md
+++ b/spring-boot-modules/spring-boot-runtime-2/README.md
@@ -5,3 +5,6 @@ This module contains articles about administering a Spring Boot runtime
### Relevant Articles:
- [Configure the Heap Size When Starting a Spring Boot Application](https://www.baeldung.com/spring-boot-heap-size)
- [Max-HTTP-Header-Size in Spring Boot 2](https://www.baeldung.com/spring-boot-max-http-header-size)
+ - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app)
+
+ - More articles: [[<-- prev]](../spring-boot-runtime)
diff --git a/spring-boot-modules/spring-boot-runtime-2/pom.xml b/spring-boot-modules/spring-boot-runtime-2/pom.xml
index 5174900c79..356880975a 100644
--- a/spring-boot-modules/spring-boot-runtime-2/pom.xml
+++ b/spring-boot-modules/spring-boot-runtime-2/pom.xml
@@ -28,6 +28,15 @@
org.springframework.security
spring-security-test
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.cloud
+ spring-cloud-starter
+ ${springcloud.version}
+
@@ -64,4 +73,7 @@
+
+ 3.1.3
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/Application.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java
rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/Application.java
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java
rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartController.java
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java
rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java
index 9883ec653b..f197efb067 100644
--- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java
+++ b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java
@@ -1,8 +1,8 @@
package com.baeldung.restart;
-import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.restart.RestartEndpoint;
+import org.springframework.stereotype.Service;
@Service
public class RestartService {
diff --git a/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..f6bd08e5dd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties
@@ -0,0 +1,7 @@
+management.endpoints.web.exposure.include=*
+management.metrics.enable.root=true
+management.metrics.enable.jvm=true
+management.endpoint.restart.enabled=true
+spring.datasource.jmx-enabled=false
+spring.jmx.enabled=true
+management.endpoint.shutdown.enabled=true
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java b/spring-boot-modules/spring-boot-runtime-2/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java
rename to spring-boot-modules/spring-boot-runtime-2/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java
diff --git a/spring-boot-modules/spring-boot-runtime/README.md b/spring-boot-modules/spring-boot-runtime/README.md
index 6463aaa6c3..44b217ae77 100644
--- a/spring-boot-modules/spring-boot-runtime/README.md
+++ b/spring-boot-modules/spring-boot-runtime/README.md
@@ -4,10 +4,11 @@ This module contains articles about administering a Spring Boot runtime
### Relevant Articles:
- [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown)
- - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app)
- [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http)
- [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs)
- [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring)
- [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging)
- [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat)
- [CORS with Spring](https://www.baeldung.com/spring-cors)
+
+ - More articles: [[more -->]](../spring-boot-runtime-2)
diff --git a/spring-boot-modules/spring-boot-telegram/pom.xml b/spring-boot-modules/spring-boot-telegram/pom.xml
index 9077e90400..a26566819a 100644
--- a/spring-boot-modules/spring-boot-telegram/pom.xml
+++ b/spring-boot-modules/spring-boot-telegram/pom.xml
@@ -39,7 +39,6 @@
- 17
6.7.0
diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml
index 600fedc774..371b5c2976 100644
--- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml
+++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml
@@ -44,7 +44,6 @@
1.11.407
5.0.3
0.7.6
- 1.18.26
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml
index 2871f129b5..1ef57d4be3 100644
--- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml
+++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml
@@ -34,8 +34,4 @@
-
- 1.18.26
-
-
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-aws/pom.xml b/spring-cloud-modules/spring-cloud-aws/pom.xml
index ff376b02cb..3de0c7146a 100644
--- a/spring-cloud-modules/spring-cloud-aws/pom.xml
+++ b/spring-cloud-modules/spring-cloud-aws/pom.xml
@@ -69,8 +69,8 @@
postgresql
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml
index 08a85d191a..e540645f30 100644
--- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml
+++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml
@@ -74,6 +74,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.testcontainers
diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml
index f8552aba93..60b68fc4bd 100644
--- a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml
+++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml
@@ -26,6 +26,7 @@
io.projectreactor
reactor-core
+ ${reactor-core.version}
org.springframework.boot
@@ -53,4 +54,7 @@
+
+ 3.6.0
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml
index 7dbbb27a77..53bc37212c 100644
--- a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml
+++ b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml
@@ -23,8 +23,8 @@
spring-boot-starter-data-jpa
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
org.springframework.cloud
diff --git a/spring-cloud-modules/spring-cloud-vault/pom.xml b/spring-cloud-modules/spring-cloud-vault/pom.xml
index e4cf020986..1698b1f357 100644
--- a/spring-cloud-modules/spring-cloud-vault/pom.xml
+++ b/spring-cloud-modules/spring-cloud-vault/pom.xml
@@ -42,8 +42,8 @@
test
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
org.springframework.boot
diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml
index f27b16acc3..d22178004c 100644
--- a/spring-core-2/pom.xml
+++ b/spring-core-2/pom.xml
@@ -119,20 +119,10 @@
spring-boot-starter-test
test
-
-
- net.javacrumbs.shedlock
- shedlock-spring
- ${shedlock.version}
-
-
- net.javacrumbs.shedlock
- shedlock-provider-jdbc-template
- ${shedlock.version}
-
org.projectlombok
lombok
+ ${lombok.version}
@@ -161,7 +151,6 @@
1.3.2
3.6
- 2.1.0
3.22.0-GA
3.2.2
diff --git a/spring-credhub/pom.xml b/spring-credhub/pom.xml
index defe378b6b..f257d549bf 100644
--- a/spring-credhub/pom.xml
+++ b/spring-credhub/pom.xml
@@ -23,6 +23,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.springframework.credhub
diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml
index 898dd182f1..6b4ecc6039 100644
--- a/spring-di-2/pom.xml
+++ b/spring-di-2/pom.xml
@@ -9,46 +9,21 @@
com.baeldung
- parent-spring-6
+ parent-boot-3
0.0.1-SNAPSHOT
- ../parent-spring-6
+ ../parent-boot-3
-
-
-
- org.apache.logging.log4j
- log4j-bom
- ${log4j2.version}
- import
- pom
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${spring-boot.version}
- pom
- import
-
-
-
-
org.springframework.boot
spring-boot-starter-web
+ ${spring-boot.version}
org.springframework.boot
spring-boot-starter-data-jpa
-
-
- org.springframework
- spring-aspects
-
-
- org.springframework.boot
- spring-boot-starter-test
+ ${spring-boot.version}
@@ -79,7 +54,6 @@
- 3.1.2
1.13.1
2.17.1
diff --git a/spring-di-3/pom.xml b/spring-di-3/pom.xml
index ba1a18ae8c..818ecc509c 100644
--- a/spring-di-3/pom.xml
+++ b/spring-di-3/pom.xml
@@ -9,44 +9,20 @@
com.baeldung
- parent-spring-6
+ parent-boot-3
0.0.1-SNAPSHOT
- ../parent-spring-6
+ ../parent-boot-3
-
-
-
- org.apache.logging.log4j
- log4j-bom
- ${log4j2.version}
- import
- pom
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${spring-boot.version}
- pom
- import
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
+ ${spring-boot.version}
- 3.1.2
- 2.17.1
2.0.9
1.4.11
diff --git a/spring-di-3/src/main/java/com/baeldung/autowiring/App.java b/spring-di-3/src/main/java/com/baeldung/autowiring/App.java
index d2d0db7a60..873b152da1 100644
--- a/spring-di-3/src/main/java/com/baeldung/autowiring/App.java
+++ b/spring-di-3/src/main/java/com/baeldung/autowiring/App.java
@@ -2,7 +2,6 @@ package com.baeldung.autowiring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
public class App {
diff --git a/spring-di/pom.xml b/spring-di/pom.xml
index d073f5359d..a1be835af7 100644
--- a/spring-di/pom.xml
+++ b/spring-di/pom.xml
@@ -10,44 +10,12 @@
com.baeldung
- parent-spring-6
+ parent-boot-3
0.0.1-SNAPSHOT
- ../parent-spring-6
+ ../parent-boot-3
-
-
-
- org.springframework
- spring-framework-bom
- ${spring.version}
- pom
- import
-
-
- org.springframework
- spring-core
- ${spring.version}
-
-
-
-
-
- org.springframework
- spring-test
- ${spring.version}
-
-
- org.springframework
- spring-beans
- ${spring.version}
-
-
- org.springframework
- spring-context
- ${spring.version}
-
com.google.guava
guava
@@ -63,12 +31,6 @@
spring-boot-starter
${spring-boot.version}
-
- org.springframework.boot
- spring-boot-test
- ${spring-boot.version}
- test
-
commons-io
commons-io
@@ -79,17 +41,6 @@
aspectjweaver
${aspectjweaver.version}
-
-
-
-
-
-
-
-
-
-
-
@@ -132,8 +83,6 @@
org.baeldung.org.baeldung.sample.App
-
- 3.1.2
1.9.20.1
diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml
index e0071a4206..02a531fe18 100644
--- a/spring-exceptions/pom.xml
+++ b/spring-exceptions/pom.xml
@@ -60,8 +60,8 @@
${javassist.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
runtime
@@ -162,7 +162,7 @@
3.21.0-GA
5.2.5.Final
- 5.1.40
+ 8.2.0
7.0.73
10.13.1.1
diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml
index abf5cfb3d6..315f549c12 100644
--- a/spring-integration/pom.xml
+++ b/spring-integration/pom.xml
@@ -17,7 +17,6 @@
-
org.springframework.integration
spring-integration-core
@@ -29,11 +28,6 @@
${javax-activation.version}
true
-
- javax.mail
- mail
- ${javax-mail.version}
-
org.springframework.integration
spring-integration-twitter
@@ -85,16 +79,21 @@
h2
${h2.version}
-
- javax.xml.bind
- jaxb-api
- ${jaxb-api.version}
-
org.postgresql
postgresql
${postgresql.version}
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+ com.sun.mail
+ jakarta.mail
+ ${jakarta.mail.version}
+
@@ -124,14 +123,13 @@
- 5.1.13.RELEASE
+ 6.0.0
1.1.4.RELEASE
5.0.13.RELEASE
- 1.4.7
1.1.1
2.10
- 2.3.0
42.3.8
+ 2.0.1
\ No newline at end of file
diff --git a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java
index adaeac5386..8afd39e9ab 100644
--- a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java
+++ b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java
@@ -1,6 +1,7 @@
package com.baeldung.dsl;
import java.io.File;
+import java.time.Duration;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
@@ -14,7 +15,6 @@ import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.core.GenericSelector;
import org.springframework.integration.core.MessageSource;
import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.Pollers;
import org.springframework.integration.dsl.MessageChannels;
import org.springframework.integration.file.FileReadingMessageSource;
@@ -69,7 +69,7 @@ public class JavaDSLFileCopyConfig {
@Bean
public IntegrationFlow fileMover() {
- return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
+ return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
.filter(onlyJpgs())
.handle(targetDirectory())
.get();
@@ -77,7 +77,7 @@ public class JavaDSLFileCopyConfig {
// @Bean
public IntegrationFlow fileMoverWithLambda() {
- return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
+ return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
.filter(message -> ((File) message).getName()
.endsWith(".jpg"))
.handle(targetDirectory())
@@ -92,7 +92,7 @@ public class JavaDSLFileCopyConfig {
// @Bean
public IntegrationFlow fileMoverWithPriorityChannel() {
- return IntegrationFlows.from(sourceDirectory())
+ return IntegrationFlow.from(sourceDirectory())
.filter(onlyJpgs())
.channel("alphabetically")
.handle(targetDirectory())
@@ -113,7 +113,7 @@ public class JavaDSLFileCopyConfig {
// @Bean
public IntegrationFlow fileReader() {
- return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10)))
+ return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10)))
.filter(onlyJpgs())
.channel("holdingTank")
.get();
@@ -121,16 +121,16 @@ public class JavaDSLFileCopyConfig {
// @Bean
public IntegrationFlow fileWriter() {
- return IntegrationFlows.from("holdingTank")
- .bridge(e -> e.poller(Pollers.fixedRate(1, TimeUnit.SECONDS, 20)))
+ return IntegrationFlow.from("holdingTank")
+ .bridge(e -> e.poller(Pollers.fixedRate(Duration.of(1, TimeUnit.SECONDS.toChronoUnit()), Duration.of(20, TimeUnit.SECONDS.toChronoUnit()))))
.handle(targetDirectory())
.get();
}
// @Bean
public IntegrationFlow anotherFileWriter() {
- return IntegrationFlows.from("holdingTank")
- .bridge(e -> e.poller(Pollers.fixedRate(2, TimeUnit.SECONDS, 10)))
+ return IntegrationFlow.from("holdingTank")
+ .bridge(e -> e.poller(Pollers.fixedRate(Duration.of(2, TimeUnit.SECONDS.toChronoUnit()), Duration.of(10, TimeUnit.SECONDS.toChronoUnit()))))
.handle(anotherTargetDirectory())
.get();
}
diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml
index fdf7da7438..7a4d5a5fea 100644
--- a/spring-kafka-2/pom.xml
+++ b/spring-kafka-2/pom.xml
@@ -38,6 +38,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.springframework.kafka
@@ -64,7 +65,7 @@
- 1.16.2
+ 1.19.3
3.0.12
3.6.0
1.16.2
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java
new file mode 100644
index 0000000000..557fa11ed3
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java
@@ -0,0 +1,36 @@
+package com.baeldung.spring.kafka.dlt;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.common.serialization.StringDeserializer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
+import org.springframework.kafka.core.ConsumerFactory;
+import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
+import org.springframework.kafka.support.serializer.JsonDeserializer;
+
+@Configuration
+public class KafkaConsumerConfig {
+
+ @Value(value = "${spring.kafka.bootstrap-servers}")
+ private String bootstrapServers;
+
+ @Bean
+ public ConsumerFactory consumerFactory() {
+ Map config = new HashMap<>();
+ config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
+
+ return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(), new JsonDeserializer<>(Payment.class));
+ }
+
+ @Bean
+ public ConcurrentKafkaListenerContainerFactory containerFactory() {
+ ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>();
+ factory.setConsumerFactory(consumerFactory());
+ return factory;
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java
new file mode 100644
index 0000000000..7aa2e3cdb8
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.kafka.dlt;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.kafka.annotation.EnableKafka;
+
+@EnableKafka
+@SpringBootApplication
+public class KafkaDltApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(KafkaDltApplication.class, args);
+ }
+}
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java
new file mode 100644
index 0000000000..35a2b31168
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java
@@ -0,0 +1,34 @@
+package com.baeldung.spring.kafka.dlt;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.common.serialization.StringSerializer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.core.DefaultKafkaProducerFactory;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.core.ProducerFactory;
+import org.springframework.kafka.support.serializer.JsonSerializer;
+
+@Configuration
+public class KafkaRetryConfig {
+
+ @Value(value = "${spring.kafka.bootstrap-servers}")
+ private String bootstrapServers;
+
+ @Bean
+ public ProducerFactory producerFactory() {
+ Map config = new HashMap<>();
+ config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
+
+ return new DefaultKafkaProducerFactory<>(config, new StringSerializer(), new JsonSerializer<>());
+ }
+
+ @Bean
+ public KafkaTemplate retryableTopicKafkaTemplate() {
+ return new KafkaTemplate<>(producerFactory());
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java
new file mode 100644
index 0000000000..1554c1671b
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java
@@ -0,0 +1,43 @@
+package com.baeldung.spring.kafka.dlt;
+
+import java.math.BigDecimal;
+import java.util.Currency;
+import java.util.StringJoiner;
+
+public class Payment {
+ private String reference;
+ private BigDecimal amount;
+ private Currency currency;
+
+ public String getReference() {
+ return reference;
+ }
+
+ public void setReference(String reference) {
+ this.reference = reference;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(", ", Payment.class.getSimpleName() + "[", "]").add("reference='" + reference + "'")
+ .add("amount=" + amount)
+ .add("currency=" + currency)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java
new file mode 100644
index 0000000000..c407310074
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.kafka.dlt.listener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.kafka.annotation.DltHandler;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.annotation.RetryableTopic;
+import org.springframework.kafka.retrytopic.DltStrategy;
+import org.springframework.kafka.support.KafkaHeaders;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.spring.kafka.dlt.Payment;
+
+@Service
+public class PaymentListenerDltFailOnError {
+ private final Logger log = LoggerFactory.getLogger(PaymentListenerDltFailOnError.class);
+
+ @RetryableTopic(attempts = "1", kafkaTemplate = "retryableTopicKafkaTemplate", dltStrategy = DltStrategy.FAIL_ON_ERROR)
+ @KafkaListener(topics = { "payments-fail-on-error-dlt" }, groupId = "payments")
+ public void handlePayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
+ log.info("Event on main topic={}, payload={}", topic, payment);
+ }
+
+ @DltHandler
+ public void handleDltPayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
+ log.info("Event on dlt topic={}, payload={}", topic, payment);
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java
new file mode 100644
index 0000000000..9c6666c938
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.kafka.dlt.listener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.kafka.annotation.DltHandler;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.annotation.RetryableTopic;
+import org.springframework.kafka.retrytopic.DltStrategy;
+import org.springframework.kafka.support.KafkaHeaders;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.spring.kafka.dlt.Payment;
+
+@Service
+public class PaymentListenerDltRetryOnError {
+ private final Logger log = LoggerFactory.getLogger(PaymentListenerDltRetryOnError.class);
+
+ @RetryableTopic(attempts = "1", kafkaTemplate = "retryableTopicKafkaTemplate", dltStrategy = DltStrategy.ALWAYS_RETRY_ON_ERROR)
+ @KafkaListener(topics = { "payments-retry-on-error-dlt" }, groupId = "payments")
+ public void handlePayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
+ log.info("Event on main topic={}, payload={}", topic, payment);
+ }
+
+ @DltHandler
+ public void handleDltPayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
+ log.info("Event on dlt topic={}, payload={}", topic, payment);
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java
new file mode 100644
index 0000000000..a12d423b30
--- /dev/null
+++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.kafka.dlt.listener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.kafka.annotation.DltHandler;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.annotation.RetryableTopic;
+import org.springframework.kafka.retrytopic.DltStrategy;
+import org.springframework.kafka.support.KafkaHeaders;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.spring.kafka.dlt.Payment;
+
+@Service
+public class PaymentListenerNoDlt {
+ private final Logger log = LoggerFactory.getLogger(PaymentListenerNoDlt.class);
+
+ @RetryableTopic(attempts = "1", kafkaTemplate = "retryableTopicKafkaTemplate", dltStrategy = DltStrategy.NO_DLT)
+ @KafkaListener(topics = { "payments-no-dlt" }, groupId = "payments")
+ public void handlePayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
+ log.info("Event on main topic={}, payload={}", topic, payment);
+ }
+
+ @DltHandler
+ public void handleDltPayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
+ log.info("Event on dlt topic={}, payload={}", topic, payment);
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java
new file mode 100644
index 0000000000..b20ee2ea12
--- /dev/null
+++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.spring.kafka.dlt;
+
+import static com.baeldung.spring.kafka.dlt.PaymentTestUtils.createPayment;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.SpyBean;
+import org.springframework.kafka.config.KafkaListenerEndpointRegistry;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.listener.MessageListenerContainer;
+import org.springframework.kafka.test.context.EmbeddedKafka;
+import org.springframework.kafka.test.utils.ContainerTestUtils;
+
+import com.baeldung.spring.kafka.dlt.listener.PaymentListenerDltFailOnError;
+
+@SpringBootTest(classes = KafkaDltApplication.class)
+@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" })
+public class KafkaDltFailOnErrorIntegrationTest {
+ private static final String TOPIC = "payments-fail-on-error-dlt";
+
+ @Autowired
+ private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;
+
+ @Autowired
+ private KafkaTemplate kafkaProducer;
+
+ @SpyBean
+ private PaymentListenerDltFailOnError paymentsConsumer;
+
+ @BeforeEach
+ void setUp() {
+ // wait for embedded Kafka
+ for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) {
+ ContainerTestUtils.waitForAssignment(messageListenerContainer, 1);
+ }
+ }
+
+ @Test
+ public void whenMainConsumerSucceeds_thenNoDltMessage() throws Exception {
+ CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1);
+
+ doAnswer(invocation -> {
+ mainTopicCountDownLatch.countDown();
+ return null;
+ }).when(paymentsConsumer)
+ .handlePayment(any(), any());
+
+ kafkaProducer.send(TOPIC, createPayment("dlt-fail-main"));
+
+ assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ verify(paymentsConsumer, never()).handleDltPayment(any(), any());
+ }
+
+ @Test
+ public void whenDltConsumerFails_thenDltProcessingStops() throws Exception {
+ CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1);
+ CountDownLatch dlTTopicCountDownLatch = new CountDownLatch(2);
+
+ doAnswer(invocation -> {
+ mainTopicCountDownLatch.countDown();
+ throw new Exception("Simulating error in main consumer");
+ }).when(paymentsConsumer)
+ .handlePayment(any(), any());
+
+ doAnswer(invocation -> {
+ dlTTopicCountDownLatch.countDown();
+ throw new Exception("Simulating error in dlt consumer");
+ }).when(paymentsConsumer)
+ .handleDltPayment(any(), any());
+
+ kafkaProducer.send(TOPIC, createPayment("dlt-fail"));
+
+ assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isFalse();
+ assertThat(dlTTopicCountDownLatch.getCount()).isEqualTo(1);
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java
new file mode 100644
index 0000000000..393eb2ae46
--- /dev/null
+++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java
@@ -0,0 +1,88 @@
+package com.baeldung.spring.kafka.dlt;
+
+import static com.baeldung.spring.kafka.dlt.PaymentTestUtils.createPayment;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.SpyBean;
+import org.springframework.kafka.config.KafkaListenerEndpointRegistry;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.listener.MessageListenerContainer;
+import org.springframework.kafka.test.context.EmbeddedKafka;
+import org.springframework.kafka.test.utils.ContainerTestUtils;
+
+import com.baeldung.spring.kafka.dlt.listener.PaymentListenerDltRetryOnError;
+
+@SpringBootTest(classes = KafkaDltApplication.class)
+@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" })
+public class KafkaDltRetryOnErrorIntegrationTest {
+ private static final String TOPIC = "payments-retry-on-error-dlt";
+
+ @Autowired
+ private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;
+
+ @Autowired
+ private KafkaTemplate kafkaProducer;
+
+ @SpyBean
+ private PaymentListenerDltRetryOnError paymentsConsumer;
+
+ @BeforeEach
+ void setUp() {
+ // wait for embedded Kafka
+ for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) {
+ ContainerTestUtils.waitForAssignment(messageListenerContainer, 1);
+ }
+ }
+
+ @Test
+ public void whenMainConsumerSucceeds_thenNoDltMessage() throws Exception {
+ CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1);
+
+ doAnswer(invocation -> {
+ mainTopicCountDownLatch.countDown();
+ return null;
+ }).when(paymentsConsumer)
+ .handlePayment(any(), any());
+
+ kafkaProducer.send(TOPIC, createPayment("dlt-retry-main"));
+
+ assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ verify(paymentsConsumer, never()).handleDltPayment(any(), any());
+ }
+
+ @Test
+ public void whenDltConsumerFails_thenDltConsumerRetriesMessage() throws Exception {
+ CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1);
+ CountDownLatch dlTTopicCountDownLatch = new CountDownLatch(3);
+
+ doAnswer(invocation -> {
+ mainTopicCountDownLatch.countDown();
+ throw new Exception("Simulating error in main consumer");
+ }).when(paymentsConsumer)
+ .handlePayment(any(), any());
+
+ doAnswer(invocation -> {
+ dlTTopicCountDownLatch.countDown();
+ throw new Exception("Simulating error in dlt consumer");
+ }).when(paymentsConsumer)
+ .handleDltPayment(any(), any());
+
+ kafkaProducer.send(TOPIC, createPayment("dlt-retry"));
+
+ assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ assertThat(dlTTopicCountDownLatch.getCount()).isEqualTo(0);
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java
new file mode 100644
index 0000000000..81cca9fec3
--- /dev/null
+++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.spring.kafka.dlt;
+
+import static com.baeldung.spring.kafka.dlt.PaymentTestUtils.createPayment;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.SpyBean;
+import org.springframework.kafka.config.KafkaListenerEndpointRegistry;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.listener.MessageListenerContainer;
+import org.springframework.kafka.test.context.EmbeddedKafka;
+import org.springframework.kafka.test.utils.ContainerTestUtils;
+
+import com.baeldung.spring.kafka.dlt.listener.PaymentListenerNoDlt;
+
+@SpringBootTest(classes = KafkaDltApplication.class)
+@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" })
+public class KafkaNoDltIntegrationTest {
+ private static final String TOPIC = "payments-no-dlt";
+
+ @Autowired
+ private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;
+
+ @Autowired
+ private KafkaTemplate kafkaProducer;
+
+ @SpyBean
+ private PaymentListenerNoDlt paymentsConsumer;
+
+ @BeforeEach
+ void setUp() {
+ // wait for embedded Kafka
+ for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) {
+ ContainerTestUtils.waitForAssignment(messageListenerContainer, 1);
+ }
+ }
+
+ @Test
+ public void whenMainConsumerSucceeds_thenNoDltMessage() throws Exception {
+ CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1);
+
+ doAnswer(invocation -> {
+ mainTopicCountDownLatch.countDown();
+ return null;
+ }).when(paymentsConsumer)
+ .handlePayment(any(), any());
+
+ kafkaProducer.send(TOPIC, createPayment("no-dlt-main"));
+
+ assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ verify(paymentsConsumer, never()).handleDltPayment(any(), any());
+ }
+
+ @Test
+ public void whenMainConsumerFails_thenDltConsumerDoesNotReceiveMessage() throws Exception {
+ CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1);
+ CountDownLatch dlTTopicCountDownLatch = new CountDownLatch(1);
+
+ doAnswer(invocation -> {
+ mainTopicCountDownLatch.countDown();
+ throw new Exception("Simulating error in main consumer");
+ }).when(paymentsConsumer)
+ .handlePayment(any(), any());
+
+ doAnswer(invocation -> {
+ dlTTopicCountDownLatch.countDown();
+ return null;
+ }).when(paymentsConsumer)
+ .handleDltPayment(any(), any());
+
+ kafkaProducer.send(TOPIC, createPayment("no-dlt"));
+
+ assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue();
+ assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isFalse();
+ assertThat(dlTTopicCountDownLatch.getCount()).isEqualTo(1);
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java
new file mode 100644
index 0000000000..7b8a574779
--- /dev/null
+++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.kafka.dlt;
+
+import java.math.BigDecimal;
+import java.util.Currency;
+
+class PaymentTestUtils {
+
+ static Payment createPayment(String reference) {
+ Payment payment = new Payment();
+ payment.setAmount(BigDecimal.valueOf(71));
+ payment.setCurrency(Currency.getInstance("GBP"));
+ payment.setReference(reference);
+ return payment;
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java
index 1620add9ca..ddbb105a67 100644
--- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java
+++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java
@@ -14,7 +14,7 @@ import java.util.Objects;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest(classes = ManagingConsumerGroupsApplicationKafkaApp.class)
-@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9092", "port=9092"})
+@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9098", "port=9098"})
public class ManagingConsumerGroupsIntegrationTest {
private static final String CONSUMER_1_IDENTIFIER = "org.springframework.kafka.KafkaListenerEndpointContainer#1";
diff --git a/spring-kafka-3/README.md b/spring-kafka-3/README.md
new file mode 100644
index 0000000000..f9c0036ce3
--- /dev/null
+++ b/spring-kafka-3/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+- [Spring Kafka Trusted Packages Feature](https://www.baeldung.com/spring-kafka-trusted-packages-feature)
diff --git a/spring-kafka-3/pom.xml b/spring-kafka-3/pom.xml
new file mode 100644
index 0000000000..972412d18e
--- /dev/null
+++ b/spring-kafka-3/pom.xml
@@ -0,0 +1,36 @@
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+ 4.0.0
+
+ spring-kafka-3
+ jar
+
+ spring-kafka-3
+
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ org.springframework.kafka
+ spring-kafka-test
+ test
+
+
+
+
+ 3.0.12
+
+
diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java
new file mode 100644
index 0000000000..eb2e57c33d
--- /dev/null
+++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java
@@ -0,0 +1,37 @@
+package com.baeldung.spring.kafka;
+
+import java.time.Instant;
+
+public class SomeData {
+
+ private String id;
+ private String type;
+ private String status;
+ private Instant timestamp;
+
+ public SomeData() {
+ }
+
+ public SomeData(String id, String type, String status, Instant timestamp) {
+ this.id = id;
+ this.type = type;
+ this.status = status;
+ this.timestamp = timestamp;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public Instant getTimestamp() {
+ return timestamp;
+ }
+}
diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java
new file mode 100644
index 0000000000..e35b1ee415
--- /dev/null
+++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java
@@ -0,0 +1,42 @@
+package com.baeldung.spring.kafka;
+
+import java.util.Map;
+
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.common.serialization.StringDeserializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
+import org.springframework.kafka.core.ConsumerFactory;
+import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
+import org.springframework.kafka.support.serializer.JsonDeserializer;
+
+@Configuration
+public class ListenerConfiguration {
+
+ @Bean("messageListenerContainer")
+ public ConcurrentKafkaListenerContainerFactory messageListenerContainer() {
+ ConcurrentKafkaListenerContainerFactory container = new ConcurrentKafkaListenerContainerFactory<>();
+ container.setConsumerFactory(someDataConsumerFactory());
+ return container;
+ }
+
+ @Bean
+ public ConsumerFactory someDataConsumerFactory() {
+ JsonDeserializer payloadJsonDeserializer = new JsonDeserializer<>();
+ payloadJsonDeserializer.trustedPackages("com.baeldung.spring.kafka");
+ return new DefaultKafkaConsumerFactory<>(
+ consumerConfigs(),
+ new StringDeserializer(),
+ payloadJsonDeserializer
+ );
+ }
+
+ @Bean
+ public Map consumerConfigs() {
+ return Map.of(
+ ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092",
+ ConsumerConfig.GROUP_ID_CONFIG, "some-group-id"
+ );
+ }
+}
\ No newline at end of file
diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java
new file mode 100644
index 0000000000..7373424841
--- /dev/null
+++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java
@@ -0,0 +1,40 @@
+package com.baeldung.spring.kafka;
+
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.core.DefaultKafkaProducerFactory;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.core.ProducerFactory;
+import org.springframework.kafka.support.serializer.JsonSerializer;
+import org.springframework.kafka.support.serializer.StringOrBytesSerializer;
+
+import java.time.Instant;
+import java.util.Map;
+
+@Configuration
+public class ProducerConfiguration {
+
+ @Bean
+ public KafkaTemplate
diff --git a/spring-pulsar/pom.xml b/spring-pulsar/pom.xml
index a1c834f830..b2feaddfb1 100644
--- a/spring-pulsar/pom.xml
+++ b/spring-pulsar/pom.xml
@@ -43,7 +43,6 @@
- 17
0.2.0
diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml
index e8919bfadb..ddae53f64f 100644
--- a/spring-quartz/pom.xml
+++ b/spring-quartz/pom.xml
@@ -11,9 +11,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../parent-boot-3
diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java
index ccf9fca8c1..37bd82ef3b 100644
--- a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java
+++ b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java
@@ -6,7 +6,7 @@ import static org.quartz.TriggerBuilder.newTrigger;
import java.io.IOException;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import org.baeldung.springquartz.config.AutoWiringSpringBeanJobFactory;
import org.quartz.*;
diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java
index f824765efe..c113482c76 100644
--- a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java
+++ b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java
@@ -1,6 +1,6 @@
package org.baeldung.springquartz.basics.scheduler;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import javax.sql.DataSource;
import org.baeldung.springquartz.config.AutoWiringSpringBeanJobFactory;
diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml
index 61a3c3d17d..6ab85c88b4 100644
--- a/spring-reactive-modules/pom.xml
+++ b/spring-reactive-modules/pom.xml
@@ -30,6 +30,9 @@
spring-reactive-exceptions
spring-reactor
spring-webflux-amqp
+
+
+
@@ -59,7 +62,22 @@
pom
import
+
+ io.projectreactor
+ reactor-core
+ ${reactor.version}
+
+
+ io.projectreactor
+ reactor-test
+ ${reactor.version}
+ test
+
+
+ 3.6.0
+
+
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml
index 90c5300cc8..fac93154c8 100644
--- a/spring-reactive-modules/spring-reactive-2/pom.xml
+++ b/spring-reactive-modules/spring-reactive-2/pom.xml
@@ -10,9 +10,10 @@
spring sample project about new features
- com.baeldung.spring.reactive
- spring-reactive-modules
- 1.0.0-SNAPSHOT
+ com.baeldung
+ parent-boot-3
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-3
@@ -37,6 +38,7 @@
org.projectlombok
lombok
provided
+ ${lombok.version}
org.springframework.boot
@@ -44,8 +46,8 @@
test
- com.github.tomakehurst
- wiremock-jre8
+ org.wiremock
+ wiremock
${wiremock.version}
test
@@ -63,6 +65,11 @@
org.springframework.boot
spring-boot-starter-tomcat
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
@@ -115,7 +122,7 @@
1.0.1.RELEASE
- 2.24.0
+ 3.3.1
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java
similarity index 77%
rename from spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java
rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java
index ef862dd957..f716af4a0e 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java
@@ -5,10 +5,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
@SpringBootApplication(exclude = { RedisAutoConfiguration.class })
-public class Spring5ReactiveApplication{
+public class Spring6ReactiveApplication {
public static void main(String[] args) {
- SpringApplication.run(Spring5ReactiveApplication.class, args);
+ SpringApplication.run(Spring6ReactiveApplication.class, args);
}
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java
index d8edaf7fd5..bec7dd2e0c 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java
@@ -22,9 +22,10 @@ public class ConsumerSSEApplication {
@Bean
public SecurityWebFilterChain sseConsumerSpringSecurityFilterChain(ServerHttpSecurity http) {
- http.authorizeExchange()
- .anyExchange()
- .permitAll();
+ http.authorizeExchange(auth -> auth
+ .anyExchange().permitAll()
+ )
+ .csrf(ServerHttpSecurity.CsrfSpec::disable);
return http.build();
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java
index 7b1fb06459..1652e2f25d 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java
@@ -34,7 +34,7 @@ public class FormHandler {
private AtomicLong extractData(List dataBuffers) {
AtomicLong atomicLong = new AtomicLong(0);
- dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer()
+ dataBuffers.forEach(d -> atomicLong.addAndGet(d.toByteBuffer()
.array().length));
return atomicLong;
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java
index 8d16434920..20cc162cde 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java
@@ -9,7 +9,7 @@ public class CpuUtils {
private static OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
static Double getUsage() {
- return (operatingSystemMXBean.getSystemCpuLoad() / operatingSystemMXBean.getAvailableProcessors()) * 100;
+ return (operatingSystemMXBean.getCpuLoad() / operatingSystemMXBean.getAvailableProcessors()) * 100;
}
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java
index 1fbb9958e7..456eec8f84 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java
@@ -23,7 +23,7 @@ public class StaticContentConfig {
GET("/"),
request -> ok()
.contentType(MediaType.TEXT_HTML)
- .syncBody(html)
+ .bodyValue(html)
);
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java
index 4cbb65dc60..bcbd4d55d7 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java
@@ -15,10 +15,11 @@ public class FunctionalValidationsApplication {
@Bean
public SecurityWebFilterChain functionalValidationsSpringSecurityFilterChain(ServerHttpSecurity http) {
- http.authorizeExchange()
- .anyExchange()
- .permitAll();
- http.csrf().disable();
+ http.authorizeExchange(auth -> auth
+ .anyExchange().permitAll()
+ )
+ .csrf(ServerHttpSecurity.CsrfSpec::disable);
+
return http.build();
}
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java
index 992f07481c..6ca6c369c1 100644
--- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java
+++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java
@@ -1,7 +1,7 @@
package com.baeldung.validations.functional.model;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
index a12d762fe5..c087e10b3f 100644
--- a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
+++ b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
@@ -24,49 +24,45 @@ public class BackpressureUnitTest {
);
StepVerifier.create(limit)
- .expectSubscription()
- .thenRequest(15)
- .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
- .expectNext(11, 12, 13, 14, 15)
- .thenRequest(10)
- .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
- .verifyComplete();
+ .expectSubscription()
+ .thenRequest(15)
+ .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .expectNext(11, 12, 13, 14, 15)
+ .thenRequest(10)
+ .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
+ .verifyComplete();
}
@Test
public void whenRequestingChunks10_thenMessagesAreReceived() {
Flux request = Flux.range(1, 50);
- request.subscribe(
- integer -> LOGGER.debug(String.valueOf(integer)),
- err -> err.printStackTrace(),
- () -> LOGGER.debug("All 50 items have been successfully processed!!!"),
- subscription -> {
- for (int i = 0; i < 5; i++) {
- LOGGER.debug("Requesting the next 10 elements!!!");
- subscription.request(10);
- }
- }
- );
+ request.subscribe(integer -> LOGGER.debug(String.valueOf(integer)), err -> err.printStackTrace(), () -> LOGGER.debug("All 50 items have been successfully processed!!!"), subscription -> {
+ for (int i = 0; i < 5; i++) {
+ LOGGER.debug("Requesting the next 10 elements!!!");
+ subscription.request(10);
+ }
+ });
StepVerifier.create(request)
- .expectSubscription()
- .thenRequest(10)
- .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
- .thenRequest(10)
- .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
- .thenRequest(10)
- .expectNext(21, 22, 23, 24, 25, 26, 27 , 28, 29 ,30)
- .thenRequest(10)
- .expectNext(31, 32, 33, 34, 35, 36, 37 , 38, 39 ,40)
- .thenRequest(10)
- .expectNext(41, 42, 43, 44, 45, 46, 47 , 48, 49 ,50)
- .verifyComplete();
+ .expectSubscription()
+ .thenRequest(10)
+ .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .thenRequest(10)
+ .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
+ .thenRequest(10)
+ .expectNext(21, 22, 23, 24, 25, 26, 27, 28, 29, 30)
+ .thenRequest(10)
+ .expectNext(31, 32, 33, 34, 35, 36, 37, 38, 39, 40)
+ .thenRequest(10)
+ .expectNext(41, 42, 43, 44, 45, 46, 47, 48, 49, 50)
+ .verifyComplete();
}
@Test
public void whenCancel_thenSubscriptionFinished() {
- Flux cancel = Flux.range(1, 10).log();
+ Flux cancel = Flux.range(1, 10)
+ .log();
cancel.subscribe(new BaseSubscriber() {
@Override
@@ -78,9 +74,9 @@ public class BackpressureUnitTest {
});
StepVerifier.create(cancel)
- .expectNext(1, 2, 3)
- .thenCancel()
- .verify();
+ .expectNext(1, 2, 3)
+ .thenCancel()
+ .verify();
}
}
diff --git a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java
index 0b4607b54a..4069888dcd 100644
--- a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java
+++ b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java
@@ -8,11 +8,11 @@ import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;
-import com.baeldung.reactive.Spring5ReactiveApplication;
+import com.baeldung.reactive.Spring6ReactiveApplication;
import com.baeldung.reactive.controller.PathPatternController;
@RunWith(SpringRunner.class)
-@SpringBootTest(classes = Spring5ReactiveApplication.class)
+@SpringBootTest(classes = Spring6ReactiveApplication.class)
@WithMockUser
public class PathPatternsUsingHandlerMethodIntegrationTest {
diff --git a/spring-reactive-modules/spring-reactive-3/pom.xml b/spring-reactive-modules/spring-reactive-3/pom.xml
index bf2cdbbf2d..17c9690157 100644
--- a/spring-reactive-modules/spring-reactive-3/pom.xml
+++ b/spring-reactive-modules/spring-reactive-3/pom.xml
@@ -46,6 +46,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.springframework.boot
diff --git a/spring-reactive-modules/spring-reactive-client-2/pom.xml b/spring-reactive-modules/spring-reactive-client-2/pom.xml
index 5d5f3ebc2e..f7d82053bb 100644
--- a/spring-reactive-modules/spring-reactive-client-2/pom.xml
+++ b/spring-reactive-modules/spring-reactive-client-2/pom.xml
@@ -135,7 +135,6 @@
1.0.1.RELEASE
1.1.6
- 3.2.10.RELEASE
1.7.1
diff --git a/spring-reactive-modules/spring-reactive-client/pom.xml b/spring-reactive-modules/spring-reactive-client/pom.xml
index 5736ce497f..634fef1273 100644
--- a/spring-reactive-modules/spring-reactive-client/pom.xml
+++ b/spring-reactive-modules/spring-reactive-client/pom.xml
@@ -106,6 +106,7 @@
org.projectlombok
lombok
+ ${lombok.version}
org.mockito
@@ -116,7 +117,6 @@
io.projectreactor
reactor-test
- ${reactor-test.version}
test
diff --git a/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java
index e1eefe4d61..27dde13608 100644
--- a/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java
+++ b/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java
@@ -2,6 +2,7 @@ package com.baeldung.reactive.logging;
import static com.baeldung.reactive.logging.jetty.RequestLogEnhancer.enhance;
import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -136,9 +137,7 @@ public class WebClientLoggingIntegrationTest {
public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() {
WebClient
.builder()
- .filters(exchangeFilterFunctions -> {
- exchangeFilterFunctions.addAll(LogFilters.prepareFilters());
- })
+ .filters(exchangeFilterFunctions -> exchangeFilterFunctions.addAll(LogFilters.prepareFilters()))
.build()
.post()
.uri(sampleUrl)
@@ -146,8 +145,6 @@ public class WebClientLoggingIntegrationTest {
.exchange()
.block();
- verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl)));
+ verify(mockAppender, atLeast(1)).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl)));
}
-
-
}
diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml
index 2ac8ad19ac..7dbee7d93d 100644
--- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml
+++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml
@@ -29,7 +29,6 @@
io.projectreactor
reactor-core
- ${reactor-core.version}
org.springframework.boot
@@ -136,11 +135,13 @@
5.2.2.RELEASE
4.5.2
1.5.23
- 3.3.1.RELEASE
2.2.6.RELEASE
2.17.1
- 1.18.26
+
+ 11
+ 11
+ 11
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml
index a598315d5d..d72072e419 100644
--- a/spring-reactive-modules/spring-reactive-data/pom.xml
+++ b/spring-reactive-modules/spring-reactive-data/pom.xml
@@ -13,9 +13,6 @@
1.0.0-SNAPSHOT
-
- UTF-8
-
@@ -53,6 +50,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
io.projectreactor
@@ -62,7 +60,7 @@
javax.validation
validation-api
- 2.0.1.Final
+ ${validation-api.version}
io.r2dbc
@@ -70,4 +68,9 @@
+
+ UTF-8
+ 2.0.1.Final
+
+
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/.gitignore b/spring-reactive-modules/spring-reactive-performance/.gitignore
new file mode 100644
index 0000000000..82eca336e3
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/.gitignore
@@ -0,0 +1,25 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/README.md b/spring-reactive-modules/spring-reactive-performance/README.md
new file mode 100644
index 0000000000..16aac3d419
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/README.md
@@ -0,0 +1,3 @@
+## Spring Reactive Performance
+
+This module contains articles about reactive Spring Boot.
diff --git a/spring-reactive-modules/spring-reactive-performance/pom.xml b/spring-reactive-modules/spring-reactive-performance/pom.xml
new file mode 100644
index 0000000000..d7a69560dd
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+ com.baeldung.spring
+ spring-reactive-performance
+ 1.0.0-SNAPSHOT
+ spring-reactive-performance
+ jar
+ Spring Reactive Performance
+
+
+ com.baeldung.spring.reactive
+ spring-reactive-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 21
+
+ false
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ --enable-preview
+
+
+
+
+
+
+ 21
+ 3.2.0
+
+
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java
new file mode 100644
index 0000000000..284ddfce30
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.reactive.performance;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java
new file mode 100644
index 0000000000..cf8684690e
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java
@@ -0,0 +1,14 @@
+package com.baeldung.spring.reactive.performance;
+
+import java.util.concurrent.CompletableFuture;
+
+public class KafkaTemplate {
+
+ // For simplicity in this example and article, an actual Kafka client isn't utilized.
+ // The focus remains on demonstrating the basic principles without the complexities of a full Kafka client setup.
+
+ public CompletableFuture send(String topic, K key, V value) {
+ System.out.println("Sending message to topic: " + topic + " with value: " + value);
+ return CompletableFuture.completedFuture(null);
+ }
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java
new file mode 100644
index 0000000000..08743d109c
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java
@@ -0,0 +1,6 @@
+package com.baeldung.spring.reactive.performance;
+
+import java.math.BigDecimal;
+
+public record ProductAddedToCartEvent(String productId, BigDecimal price, String currency, String cartId) {
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java
new file mode 100644
index 0000000000..271ca26c96
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java
@@ -0,0 +1,9 @@
+package com.baeldung.spring.reactive.performance.model;
+
+import java.math.BigDecimal;
+
+public record Price(BigDecimal value, String currency) {
+ public Price applyDiscount(BigDecimal discount) {
+ return new Price(value.subtract(discount), currency);
+ }
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java
new file mode 100644
index 0000000000..d4aa751089
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java
@@ -0,0 +1,43 @@
+package com.baeldung.spring.reactive.performance.model;
+
+import java.math.BigDecimal;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document(collation = "products")
+public record Product (
+ @Id
+ String id,
+ String name,
+ BigDecimal basePriceValue,
+ String currency,
+ Category category
+) {
+
+ public Price basePrice() {
+ return new Price(basePriceValue, currency);
+ }
+
+ public enum Category {
+ ELECTRONICS(false),
+ CLOTHING(true),
+ ACCESSORIES(false),
+ GARDENING(false),
+ SPORTS(true);
+
+ private final boolean eligibleForPromotion;
+
+ Category(boolean eligibleForPromotion) {
+ this.eligibleForPromotion = eligibleForPromotion;
+ }
+
+ public boolean isEligibleForDiscount() {
+ return eligibleForPromotion;
+ }
+
+ public boolean notEligibleForPromotion() {
+ return !eligibleForPromotion;
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java
new file mode 100644
index 0000000000..89554396b2
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.reactive.performance.virtualthreads;
+
+import java.math.BigDecimal;
+
+class DiscountService {
+
+ public BigDecimal discountForProduct(String productId) {
+ return BigDecimal.valueOf(10);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java
new file mode 100644
index 0000000000..f0ebff5cfd
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.spring.reactive.performance.virtualthreads;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+import com.baeldung.spring.reactive.performance.model.Product;
+
+interface ProductRepository extends MongoRepository {
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java
new file mode 100644
index 0000000000..f174e4c6fe
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java
@@ -0,0 +1,45 @@
+package com.baeldung.spring.reactive.performance.virtualthreads;
+
+import java.math.BigDecimal;
+
+import com.baeldung.spring.reactive.performance.KafkaTemplate;
+import com.baeldung.spring.reactive.performance.ProductAddedToCartEvent;
+import com.baeldung.spring.reactive.performance.model.Price;
+import com.baeldung.spring.reactive.performance.model.Product;
+
+class ProductService {
+ private final String PRODUCT_ADDED_TO_CART_TOPIC = "product-added-to-cart";
+
+ private final ProductRepository repository;
+ private final DiscountService discountService;
+ private final KafkaTemplate kafkaTemplate;
+
+ public ProductService(ProductRepository repository, DiscountService discountService) {
+ this.repository = repository;
+ this.discountService = discountService;
+ this.kafkaTemplate = new KafkaTemplate<>();
+ }
+
+ public void addProductToCart(String productId, String cartId) {
+ Thread.startVirtualThread(() -> computePriceAndPublishMessage(productId, cartId));
+ }
+
+ private void computePriceAndPublishMessage(String productId, String cartId) {
+ Product product = repository.findById(productId)
+ .orElseThrow(() -> new IllegalArgumentException("not found!"));
+
+ Price price = computePrice(productId, product);
+
+ var event = new ProductAddedToCartEvent(productId, price.value(), price.currency(), cartId);
+ kafkaTemplate.send(PRODUCT_ADDED_TO_CART_TOPIC, cartId, event);
+ }
+
+ private Price computePrice(String productId, Product product) {
+ if (product.category().isEligibleForDiscount()) {
+ BigDecimal discount = discountService.discountForProduct(productId);
+ return product.basePrice().applyDiscount(discount);
+ }
+ return product.basePrice();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java
new file mode 100644
index 0000000000..ebe6b9a8a4
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.reactive.performance.webflux;
+
+import java.math.BigDecimal;
+
+import reactor.core.publisher.Mono;
+
+class DiscountService {
+ public Mono discountForProduct(String productId) {
+ return Mono.just(BigDecimal.valueOf(10));
+ }
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java
new file mode 100644
index 0000000000..5ab4497a27
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.spring.reactive.performance.webflux;
+
+import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
+
+import com.baeldung.spring.reactive.performance.model.Product;
+
+interface ProductRepository extends ReactiveMongoRepository {
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java
new file mode 100644
index 0000000000..90519ec627
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java
@@ -0,0 +1,39 @@
+package com.baeldung.spring.reactive.performance.webflux;
+
+import com.baeldung.spring.reactive.performance.KafkaTemplate;
+import com.baeldung.spring.reactive.performance.ProductAddedToCartEvent;
+import com.baeldung.spring.reactive.performance.model.Price;
+import com.baeldung.spring.reactive.performance.model.Product;
+
+import reactor.core.publisher.Mono;
+
+class ProductService {
+ private final String PRODUCT_ADDED_TO_CART_TOPIC = "product-added-to-cart";
+
+ private final ProductRepository repository;
+ private final DiscountService discountService;
+ private final KafkaTemplate kafkaTemplate;
+
+ public ProductService(ProductRepository repository, DiscountService discountService) {
+ this.repository = repository;
+ this.discountService = discountService;
+ this.kafkaTemplate = new KafkaTemplate<>();
+ }
+
+ public void addProductToCart(String productId, String cartId) {
+ repository.findById(productId)
+ .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("not found!")))
+ .flatMap(this::computePrice)
+ .map(price -> new ProductAddedToCartEvent(productId, price.value(), price.currency(), cartId))
+ .subscribe(event -> kafkaTemplate.send(PRODUCT_ADDED_TO_CART_TOPIC, cartId, event));
+ }
+
+ private Mono computePrice(Product product) {
+ if (product.category().isEligibleForDiscount()) {
+ return discountService.discountForProduct(product.id())
+ .map(product.basePrice()::applyDiscount);
+ }
+ return Mono.just(product.basePrice());
+ }
+
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml b/spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java b/spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java
new file mode 100644
index 0000000000..df69e7eb72
--- /dev/null
+++ b/spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.reactive.performance;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class ApplicationUnitTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml
index cf34b21083..d501a03c46 100644
--- a/spring-reactive-modules/spring-reactive-security/pom.xml
+++ b/spring-reactive-modules/spring-reactive-security/pom.xml
@@ -41,6 +41,7 @@
org.projectlombok
lombok
compile
+ ${lombok.version}
org.apache.geronimo.specs
@@ -81,7 +82,7 @@
io.projectreactor
reactor-test
- ${project-reactor-test.version}
+ ${reactor-test.version}
test
@@ -114,7 +115,8 @@
1.1.3
1.0
1.0
- 3.1.6.RELEASE
+ 3.1.6.RELEASE
+ 3.4.29
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-reactive/pom.xml b/spring-reactive-modules/spring-reactive/pom.xml
index f19809e302..04bd32d632 100644
--- a/spring-reactive-modules/spring-reactive/pom.xml
+++ b/spring-reactive-modules/spring-reactive/pom.xml
@@ -104,7 +104,7 @@
- 3.4.16
+ 3.6.0
1.3.10
2.2.21
diff --git a/spring-reactive-modules/spring-reactor/pom.xml b/spring-reactive-modules/spring-reactor/pom.xml
index c2635765f0..54a97b92de 100644
--- a/spring-reactive-modules/spring-reactor/pom.xml
+++ b/spring-reactive-modules/spring-reactor/pom.xml
@@ -27,17 +27,18 @@
io.projectreactor
reactor-bus
- ${reactor.version}
+ ${reactor-bus.version}
io.projectreactor
reactor-core
- ${reactor.version}
+ ${reactor-core.version}
- 2.0.8.RELEASE
+ 2.0.8.RELEASE
+ 2.0.8.RELEASE
\ No newline at end of file
diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md
index 4ee306c0e0..4c42c60c37 100644
--- a/spring-scheduling/README.md
+++ b/spring-scheduling/README.md
@@ -5,3 +5,4 @@
- [How To Do @Async in Spring](https://www.baeldung.com/spring-async)
- [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally)
- [Remote Debugging with IntelliJ IDEA](https://www.baeldung.com/intellij-remote-debugging)
+- [Setup Asynchronous Retry Mechanism in Spring](https://www.baeldung.com/spring-async-retry)
diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml
index 7e67a7e635..b32a1eb16a 100644
--- a/spring-security-modules/spring-security-azuread/pom.xml
+++ b/spring-security-modules/spring-security-azuread/pom.xml
@@ -11,10 +11,6 @@
spring-security-azuread
-
- 1.8
-
-
org.springframework.boot
@@ -48,6 +44,7 @@
org.projectlombok
lombok
true
+ ${lombok.version}
org.springframework.boot
diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java
new file mode 100644
index 0000000000..5c0853e6f3
--- /dev/null
+++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java
@@ -0,0 +1,78 @@
+package com.baeldung.httpsecurityvswebsecurity;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.firewall.HttpFirewall;
+import org.springframework.security.web.firewall.StrictHttpFirewall;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.springframework.security.config.Customizer.withDefaults;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfiguration {
+
+ @Bean
+ public HttpFirewall allowHttpMethod() {
+ List allowedMethods = new ArrayList();
+ allowedMethods.add("GET");
+ allowedMethods.add("POST");
+ StrictHttpFirewall firewall = new StrictHttpFirewall();
+ firewall.setAllowedHttpMethods(allowedMethods);
+ return firewall;
+ }
+
+ @Bean
+ public WebSecurityCustomizer fireWall() {
+ return (web) -> web.httpFirewall(allowHttpMethod());
+ }
+
+ @Bean
+ public WebSecurityCustomizer ignoringCustomizer() {
+ return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**");
+ }
+
+ @Bean
+ public WebSecurityCustomizer debugSecurity() {
+ return (web) -> web.debug(true);
+ }
+
+ @Bean
+ public InMemoryUserDetailsManager userDetailsService() {
+ UserDetails user = User.withUsername("user")
+ .password(encoder().encode("userPass"))
+ .roles("ADMIN")
+ .build();
+ return new InMemoryUserDetailsManager(user);
+ }
+
+ @Bean
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**")
+ .hasRole("ADMIN")
+ .anyRequest()
+ .permitAll())
+ .httpBasic(withDefaults())
+ .formLogin(withDefaults())
+ .csrf(AbstractHttpConfigurer::disable);
+ return http.build();
+ }
+
+}
diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java
new file mode 100644
index 0000000000..cd1daee17e
--- /dev/null
+++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java
@@ -0,0 +1,15 @@
+package com.baeldung.httpsecurityvswebsecurity.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/admin")
+public class AdminController {
+
+ @RequestMapping("/greeting")
+ public String hello() {
+ return "Hello Admin";
+ }
+
+}
diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml
index 3d5ff0cb69..a5ce06f4d9 100644
--- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml
+++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml
@@ -12,9 +12,7 @@
reactive-resource-server
reactive-resource-server
Demo project for Spring Boot reactive resource-server
-
- 17
-
+
org.springframework.boot
diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml
index eb507fc3d3..44403cf341 100644
--- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml
+++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml
@@ -12,9 +12,7 @@
servlet-resource-server
servlet-resource-server
Demo project for Spring Boot servlet resource-server
-
- 17
-
+
org.springframework.boot
diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml
index a6240f6e69..81c4709124 100644
--- a/spring-security-modules/spring-security-opa/pom.xml
+++ b/spring-security-modules/spring-security-opa/pom.xml
@@ -23,6 +23,7 @@
org.projectlombok
lombok
+ ${lombok.version}
com.google.guava
diff --git a/spring-security-modules/spring-security-saml2/pom.xml b/spring-security-modules/spring-security-saml2/pom.xml
index 6de69fd201..64a4e22627 100644
--- a/spring-security-modules/spring-security-saml2/pom.xml
+++ b/spring-security-modules/spring-security-saml2/pom.xml
@@ -82,7 +82,6 @@
- 17
4.1.1
diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml
index 08adb700ec..e93b0b4f03 100644
--- a/spring-security-modules/spring-security-web-boot-1/pom.xml
+++ b/spring-security-modules/spring-security-web-boot-1/pom.xml
@@ -45,8 +45,8 @@
spring-security-data
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml
index 2255f8b035..d3684dd282 100644
--- a/spring-security-modules/spring-security-web-boot-2/pom.xml
+++ b/spring-security-modules/spring-security-web-boot-2/pom.xml
@@ -45,8 +45,8 @@
spring-security-data
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/spring-security-modules/spring-security-web-x509/pom.xml b/spring-security-modules/spring-security-web-x509/pom.xml
index ec0331fd53..6a4ca78484 100644
--- a/spring-security-modules/spring-security-web-x509/pom.xml
+++ b/spring-security-modules/spring-security-web-x509/pom.xml
@@ -10,8 +10,9 @@
com.baeldung
- spring-security-modules
+ parent-boot-3
0.0.1-SNAPSHOT
+ ../../parent-boot-3
diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml
index 24fe5b0fb6..bdd495b836 100644
--- a/spring-shell/pom.xml
+++ b/spring-shell/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../parent-boot-3
diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml
index 6c49f1f39c..c796b08e9a 100644
--- a/spring-soap/pom.xml
+++ b/spring-soap/pom.xml
@@ -102,7 +102,6 @@
- 17
4.0.0
3.1.0
0.15.3
diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml
index 95d3239b96..136f5b8907 100644
--- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml
+++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml
@@ -11,9 +11,8 @@
com.baeldung
- parent-boot-2
+ spring-swagger-codegen
0.0.1-SNAPSHOT
- ../../parent-boot-2
@@ -83,12 +82,11 @@
- 11
3.0.0
2.17.1
1.7.0
3.3.4
- 2.10.0.pr3
+ 2.16.0
5.1.0
diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml
index d4fff7eb63..ce28f28c22 100644
--- a/spring-swagger-codegen/pom.xml
+++ b/spring-swagger-codegen/pom.xml
@@ -16,6 +16,7 @@
+ custom-validations-opeanpi-codegen
spring-swagger-codegen-api-client
spring-openapi-generator-api-client
spring-swagger-codegen-app
diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml
index af12f9cef0..5ad15f6851 100644
--- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml
+++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml
@@ -33,7 +33,6 @@
com.baeldung
spring-swagger-codegen
0.0.1-SNAPSHOT
- ../../spring-swagger-codegen
diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml
index d3f57474ef..a7969df518 100644
--- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml
+++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml
@@ -10,7 +10,6 @@
com.baeldung
spring-swagger-codegen
0.0.1-SNAPSHOT
- ../../spring-swagger-codegen
diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml
index b3690c7b7f..768303cb4b 100644
--- a/spring-vault/pom.xml
+++ b/spring-vault/pom.xml
@@ -83,7 +83,6 @@
2.3.4
2.20.140
3.1.3
- 17
\ No newline at end of file
diff --git a/spring-web-modules/spring-mvc-forms-jsp/pom.xml b/spring-web-modules/spring-mvc-forms-jsp/pom.xml
index 5096c6e23d..636551b555 100644
--- a/spring-web-modules/spring-mvc-forms-jsp/pom.xml
+++ b/spring-web-modules/spring-mvc-forms-jsp/pom.xml
@@ -43,8 +43,8 @@
${jstl.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector-java.version}
@@ -104,7 +104,7 @@
8.0.1.Final
5.2.5.Final
- 6.0.6
+ 8.2.0
1.3.2
diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml
index eb31723798..9c9d6804ae 100644
--- a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml
+++ b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml
@@ -27,6 +27,7 @@
org.projectlombok
lombok
+ ${lombok.version}
diff --git a/spring-web-modules/spring-mvc-java-2/README.md b/spring-web-modules/spring-mvc-java-2/README.md
index 1f8231bada..61549b539a 100644
--- a/spring-web-modules/spring-mvc-java-2/README.md
+++ b/spring-web-modules/spring-mvc-java-2/README.md
@@ -5,3 +5,5 @@
- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables)
- [Converting a Spring MultipartFile to a File](https://www.baeldung.com/spring-multipartfile-to-file)
- [Testing a Spring Multipart POST Request](https://www.baeldung.com/spring-multipart-post-request-test)
+- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit)
+- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files)
diff --git a/spring-web-modules/spring-mvc-java-2/pom.xml b/spring-web-modules/spring-mvc-java-2/pom.xml
index b1b5a797f8..a4484ed56d 100644
--- a/spring-web-modules/spring-mvc-java-2/pom.xml
+++ b/spring-web-modules/spring-mvc-java-2/pom.xml
@@ -46,6 +46,57 @@
commons-fileupload
${commons-fileupload.version}
+
+ net.sourceforge.htmlunit
+ htmlunit
+ ${htmlunit.version}
+
+
+ commons-logging
+ commons-logging
+
+
+ commons-io
+ commons-io
+
+
+
+
+
+ org.apache.poi
+ poi-ooxml
+ ${poi.version}
+
+
+ org.glassfish
+ javax.el
+ ${javax.el.version}
+
+
+ javax.servlet.jsp
+ javax.servlet.jsp-api
+ ${javax-servlet-api.version}
+
+
+ javax.servlet
+ jstl
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-jasper
+ provided
+
+
+
+ org.thymeleaf
+ thymeleaf-spring4
+ ${thymeleaf.version}
+
+
+ org.thymeleaf
+ thymeleaf
+ ${thymeleaf.version}
+
@@ -63,6 +114,11 @@
5.2.2.RELEASE
2.3.5
1.5
+ 2.32
+ 3.16-beta1
+ 3.0.1-b09
+ 2.3.3
+ 3.0.9.RELEASE
\ No newline at end of file
diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java
similarity index 97%
rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java
rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java
index f76f7441a5..5cb5de7124 100644
--- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java
+++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java
@@ -1,18 +1,19 @@
-package com.baeldung.web.controller;
+package com.baeldung.excel;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import com.baeldung.excel.*;
-import java.util.Map;
-import java.util.List;
-import javax.annotation.Resource;
@Controller
public class ExcelController {
diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java
similarity index 100%
rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java
rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java
index 0519a8f3c7..7a213d523b 100644
--- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java
+++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java
@@ -1,13 +1,14 @@
package com.baeldung.excel;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.xssf.usermodel.XSSFCell;
-import org.apache.poi.xssf.usermodel.XSSFCellStyle;
-import org.apache.poi.xssf.usermodel.XSSFColor;
-import org.apache.poi.xssf.usermodel.XSSFFont;
-import org.apache.poi.xssf.usermodel.XSSFRow;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.IntStream;
+
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
@@ -15,16 +16,15 @@ import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.IntStream;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFColor;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelPOIHelper {
diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/MyCell.java
similarity index 100%
rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java
rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/MyCell.java
diff --git a/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java
new file mode 100644
index 0000000000..f6a4d4dba3
--- /dev/null
+++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java
@@ -0,0 +1,32 @@
+package com.baeldung.excel;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@EnableWebMvc
+@Configuration
+@ComponentScan(basePackages = { "com.baeldung.excel" })
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addViewControllers(final ViewControllerRegistry registry) {
+ registry.addViewController("/").setViewName("index");
+ }
+
+ @Override
+ public void addResourceHandlers(final ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
+ }
+
+
+ @Bean
+ public ExcelPOIHelper excelPOIHelper() {
+ return new ExcelPOIHelper();
+ }
+}
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java
similarity index 100%
rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java
rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java
similarity index 100%
rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java
rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java
similarity index 100%
rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java
rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java
similarity index 99%
rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java
rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java
index 75efd57ae4..6e55f01454 100644
--- a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java
+++ b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java
@@ -20,7 +20,7 @@ public class TestConfig implements WebMvcConfigurer {
@Autowired
private ServletContext ctx;
-
+
@Bean
public ViewResolver thymeleafViewResolver() {
final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
@@ -44,4 +44,4 @@ public class TestConfig implements WebMvcConfigurer {
templateEngine.setTemplateResolver(templateResolver());
return templateEngine;
}
-}
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-mvc-java/README.md b/spring-web-modules/spring-mvc-java/README.md
index 656e415f6a..d89f33fdc1 100644
--- a/spring-web-modules/spring-mvc-java/README.md
+++ b/spring-web-modules/spring-mvc-java/README.md
@@ -9,8 +9,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring
### Relevant Articles:
- [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring)
- [File Upload with Spring MVC](https://www.baeldung.com/spring-file-upload)
-- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit)
-- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files)
- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config)
- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
- [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)
diff --git a/spring-web-modules/spring-mvc-java/pom.xml b/spring-web-modules/spring-mvc-java/pom.xml
index 395b12a278..d4c8f24431 100644
--- a/spring-web-modules/spring-mvc-java/pom.xml
+++ b/spring-web-modules/spring-mvc-java/pom.xml
@@ -44,21 +44,7 @@
provided
-
- net.sourceforge.htmlunit
- htmlunit
- ${htmlunit.version}
-
-
- commons-logging
- commons-logging
-
-
- commons-io
- commons-io
-
-
-
+
commons-io
commons-io
@@ -91,12 +77,7 @@
spring-boot-starter-test
test
-
-
- org.apache.poi
- poi-ooxml
- ${poi.version}
-
+
org.hibernate.validator
@@ -221,19 +202,15 @@
4.4.5
4.5.2
- 2.23
2.7
1.6.1
3.1.0
1.9.1
-
- 3.16-beta1
3.0.1-b09
4.0.1
2.3.3
- 2.32
2.8.0
com.baeldung.SpringMVCApplication
diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java
index 768fda1c4a..c135164a95 100644
--- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java
+++ b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java
@@ -27,7 +27,6 @@ import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
-import com.baeldung.excel.ExcelPOIHelper;
@EnableWebMvc
@Configuration
@@ -118,11 +117,6 @@ public class WebConfig implements WebMvcConfigurer {
configurer.setUrlPathHelper(urlPathHelper);
}
- @Bean
- public ExcelPOIHelper excelPOIHelper() {
- return new ExcelPOIHelper();
- }
-
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
diff --git a/spring-web-modules/spring-rest-query-language/pom.xml b/spring-web-modules/spring-rest-query-language/pom.xml
index 987d678439..b44972603d 100644
--- a/spring-web-modules/spring-rest-query-language/pom.xml
+++ b/spring-web-modules/spring-rest-query-language/pom.xml
@@ -140,8 +140,8 @@
${javassist.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/spring-web-modules/spring-rest-testing/pom.xml b/spring-web-modules/spring-rest-testing/pom.xml
index 67b3115a6f..db1ec6c165 100644
--- a/spring-web-modules/spring-rest-testing/pom.xml
+++ b/spring-web-modules/spring-rest-testing/pom.xml
@@ -103,8 +103,8 @@
${javassist.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
runtime
diff --git a/spring-web-modules/spring-resttemplate-3/pom.xml b/spring-web-modules/spring-resttemplate-3/pom.xml
index 5ce7d348a2..7353ed38d7 100644
--- a/spring-web-modules/spring-resttemplate-3/pom.xml
+++ b/spring-web-modules/spring-resttemplate-3/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -24,6 +24,16 @@
org.springframework.boot
spring-boot-starter-test
+
+ org.apache.httpcomponents.client5
+ httpclient5
+ ${httpclient5.version}
+
+
+ com.baeldung.resttemplate.methods.RestTemplateMethodsApplication
+ 5.2.1
+
+
diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java
index 9383b584c4..d29960789e 100644
--- a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java
+++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java
@@ -9,10 +9,12 @@ import java.security.cert.CertificateException;
import javax.net.ssl.SSLContext;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
+import org.apache.hc.client5.http.io.HttpClientConnectionManager;
+import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -38,7 +40,11 @@ public class CustomRestTemplateConfiguration {
.loadTrustMaterial(trustStore.getURL(), trustStorePassword.toCharArray()).build();
SSLConnectionSocketFactory sslConFactory = new SSLConnectionSocketFactory(sslContext);
- CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslConFactory).build();
+ final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
+ .setSSLSocketFactory(sslConFactory)
+ .build();
+
+ CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
diff --git a/spring-web-modules/spring-session/spring-session-jdbc/pom.xml b/spring-web-modules/spring-session/spring-session-jdbc/pom.xml
index 3cc2b8d18e..24194f5426 100644
--- a/spring-web-modules/spring-session/spring-session-jdbc/pom.xml
+++ b/spring-web-modules/spring-session/spring-session-jdbc/pom.xml
@@ -11,9 +11,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../../parent-boot-2
+ ../../../parent-boot-3
diff --git a/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java b/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java
index 509a5f292b..a173636ed8 100644
--- a/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java
+++ b/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java
@@ -7,11 +7,12 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
+
@Controller
public class SpringSessionJdbcController {
diff --git a/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java b/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java
index 2dcc0b3af8..7133111e4c 100644
--- a/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java
+++ b/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java
@@ -9,7 +9,7 @@ import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
diff --git a/spring-websockets/pom.xml b/spring-websockets/pom.xml
index a28ef8749a..d6c5fbe561 100644
--- a/spring-websockets/pom.xml
+++ b/spring-websockets/pom.xml
@@ -22,11 +22,12 @@
io.projectreactor
reactor-core
+ ${reactor-core.version}
com.github.javafaker
javafaker
- 1.0.2
+ ${javafaker.version}
com.google.code.gson
@@ -44,4 +45,9 @@
+
+ 3.6.0
+ 1.0.2
+
+
\ No newline at end of file
diff --git a/static-analysis/README.md b/static-analysis/README.md
index 235b79853b..ea0d797407 100644
--- a/static-analysis/README.md
+++ b/static-analysis/README.md
@@ -6,3 +6,4 @@ This module contains articles about static program analysis
- [Introduction to PMD](https://www.baeldung.com/pmd)
- [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](https://www.baeldung.com/java-static-analysis-tools)
+- [Catch Common Mistakes with Error Prone Library in Java](https://www.baeldung.com/java-error-prone-library)
diff --git a/static-analysis/error-prone-project/pom.xml b/static-analysis/error-prone-project/pom.xml
index 59f7bb7270..2d5706d0d2 100644
--- a/static-analysis/error-prone-project/pom.xml
+++ b/static-analysis/error-prone-project/pom.xml
@@ -3,14 +3,14 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ error-prone-project
+
com.baeldung
static-analysis
1.0-SNAPSHOT
- error-prone-project
-
@@ -19,7 +19,6 @@
${maven-compiler-plugin.version}
17
- UTF-8
true
-XDcompilePolicy=simple
@@ -44,7 +43,7 @@
com.baeldung
my-bugchecker-plugin
- 1.0-SNAPSHOT
+ ${my-bugchecker-plugin.version}
@@ -53,9 +52,7 @@
- 17
- 17
- UTF-8
+ 1.0-SNAPSHOT
diff --git a/static-analysis/my-bugchecker-plugin/pom.xml b/static-analysis/my-bugchecker-plugin/pom.xml
index cbe16b0a14..eb11f07b4e 100644
--- a/static-analysis/my-bugchecker-plugin/pom.xml
+++ b/static-analysis/my-bugchecker-plugin/pom.xml
@@ -3,13 +3,14 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ my-bugchecker-plugin
+ jar
+
com.baeldung
static-analysis
1.0-SNAPSHOT
- jar
- my-bugchecker-plugin
@@ -47,10 +48,4 @@
-
- 17
- 17
- UTF-8
-
-
diff --git a/static-analysis/pmd/pom.xml b/static-analysis/pmd/pom.xml
index 31914fe9f0..372c122776 100644
--- a/static-analysis/pmd/pom.xml
+++ b/static-analysis/pmd/pom.xml
@@ -3,18 +3,12 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ pmd
+
com.baeldung
static-analysis
1.0-SNAPSHOT
- pmd
-
-
- 17
- 17
- UTF-8
-
-
diff --git a/tablesaw/pom.xml b/tablesaw/pom.xml
index f38e4cb8b4..c45931a9e2 100644
--- a/tablesaw/pom.xml
+++ b/tablesaw/pom.xml
@@ -25,11 +25,6 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
-
-
- 17
-
diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml
index 6d178b86a3..088a75a941 100644
--- a/testing-modules/cucumber/pom.xml
+++ b/testing-modules/cucumber/pom.xml
@@ -42,6 +42,7 @@
org.projectlombok
lombok
provided
+ ${lombok.version}
io.cucumber
@@ -120,8 +121,6 @@
- 14
- 14
6.10.3
5.4.0
3.141.59
diff --git a/testing-modules/gatling-java/pom.xml b/testing-modules/gatling-java/pom.xml
index abe033f298..54dee1fd88 100644
--- a/testing-modules/gatling-java/pom.xml
+++ b/testing-modules/gatling-java/pom.xml
@@ -72,9 +72,6 @@
- 1.8
- 1.8
- UTF-8
3.9.5
4.3.0
1.0.2
diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml
index 82ce988bac..e5b1db2bfb 100644
--- a/testing-modules/gatling/pom.xml
+++ b/testing-modules/gatling/pom.xml
@@ -105,9 +105,6 @@
- 1.8
- 1.8
- UTF-8
2.12.6
3.3.1
4.3.0
diff --git a/testing-modules/jqwik/pom.xml b/testing-modules/jqwik/pom.xml
index 6ef9b61a6a..85c4ba571a 100644
--- a/testing-modules/jqwik/pom.xml
+++ b/testing-modules/jqwik/pom.xml
@@ -17,7 +17,7 @@
net.jqwik
jqwik
- 1.7.4
+ ${jqwik.version}
test
@@ -53,5 +53,9 @@
+
+ 1.7.4
+
+
diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml
index 411f189638..fc0349ff8e 100644
--- a/testing-modules/junit-5-advanced/pom.xml
+++ b/testing-modules/junit-5-advanced/pom.xml
@@ -18,7 +18,7 @@
com.github.stefanbirkner
system-lambda
- 1.2.1
+ ${system-lambda.version}
test
@@ -79,6 +79,7 @@
+ 1.2.1
1.49
3.24.2
1.10.1
diff --git a/testing-modules/junit-5-basics-2/pom.xml b/testing-modules/junit-5-basics-2/pom.xml
index b430161380..f03b74f47a 100644
--- a/testing-modules/junit-5-basics-2/pom.xml
+++ b/testing-modules/junit-5-basics-2/pom.xml
@@ -36,18 +36,11 @@
org.apache.maven.plugins
maven-compiler-plugin
-
-
- 11
-
- 11
- 11
- UTF-8
1.5.0
5.10.0
5.5.0
diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml
index 8afaa085b1..cdddf90855 100644
--- a/testing-modules/junit-5/pom.xml
+++ b/testing-modules/junit-5/pom.xml
@@ -107,7 +107,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java
new file mode 100644
index 0000000000..de7651ece6
--- /dev/null
+++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.junit5.failurethreshold;
+
+import org.junit.jupiter.api.RepeatedTest;
+import java.util.Random;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class FailureThresholdUnitTest {
+ Random random = new Random();
+
+ @RepeatedTest(value = 10, failureThreshold = 2)
+ void givenRandomNumberGenerator_whenGeneratingRandomNumber_thenNumberShouldBeWithinRange() {
+ int number = random.nextInt(10);
+ assertTrue(number <= 9);
+ }
+}
diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml
index d5a389d311..af42523ca9 100644
--- a/testing-modules/load-testing-comparison/pom.xml
+++ b/testing-modules/load-testing-comparison/pom.xml
@@ -66,9 +66,6 @@
- 1.8
- 1.8
- UTF-8
2.12.12
3.4.0
4.4.0
diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md
index da8f339e56..5eb4395fa9 100644
--- a/testing-modules/mockito-2/README.md
+++ b/testing-modules/mockito-2/README.md
@@ -9,3 +9,4 @@ This module contains articles about Mockito
- [Mock Same Method with Different Parameters](https://www.baeldung.com/java-mock-same-method-other-parameters)
- [How to Mock Constructors for Unit Testing using Mockito](https://www.baeldung.com/java-mockito-constructors-unit-testing)
- [Overview of Mockito MockedConstruction](https://www.baeldung.com/java-mockito-mockedconstruction)
+- [Verify That Lambda Expression Was Called Using Mockito](https://www.baeldung.com/java-mockito-verify-lambda-expression)
diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml
index 0e0f19b6b3..100c9d7015 100644
--- a/testing-modules/mockito-2/pom.xml
+++ b/testing-modules/mockito-2/pom.xml
@@ -21,9 +21,6 @@
- 8
- 8
- UTF-8
4.8.1
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java b/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java
new file mode 100644
index 0000000000..bc6274eb18
--- /dev/null
+++ b/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java
@@ -0,0 +1,26 @@
+package com.baeldung.lambdacalls;
+
+import java.util.ArrayList;
+
+public class LambdaExample {
+
+ private BrickLayer brickLayer = new BrickLayer();
+
+ static ArrayList bricksList = new ArrayList<>();
+
+ public void createWall(String bricks){
+ Runnable build = () -> brickLayer.layBricks(bricks);
+ build.run();
+ }
+
+ public ArrayList getBricksList(){
+ return bricksList;
+ }
+
+ static class BrickLayer {
+ void layBricks(String bricks){
+ bricksList.add(bricks);
+ }
+ }
+
+}
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java
new file mode 100644
index 0000000000..67127c641c
--- /dev/null
+++ b/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.lambdacalls;
+
+import static com.baeldung.lambdacalls.LambdaExample.*;
+import static junit.framework.TestCase.assertEquals;
+import static org.mockito.Mockito.verify;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LambdaCallsUnitTest {
+
+ @Mock
+ private/**/ BrickLayer brickLayer;
+ @InjectMocks
+ private LambdaExample lambdaExample;
+
+ @Test
+ public void whenCallingALambda_thenTheInvocationCanBeConfirmedWithCorrectArguments(){
+ String bricks = "red bricks";
+ lambdaExample.createWall(bricks);
+ verify(brickLayer).layBricks(bricks);
+ }
+
+ @Test
+ public void whenCallingALambda_thenCorrectBehaviourIsPerformed(){
+ LambdaExample lambdaExample = new LambdaExample();
+ String bricks = "red bricks";
+
+ lambdaExample.createWall(bricks);
+ ArrayList bricksList = lambdaExample.getBricksList();
+
+ assertEquals(bricks, bricksList.get(0));
+ }
+
+}
diff --git a/testing-modules/mocks-2/pom.xml b/testing-modules/mocks-2/pom.xml
index 22a5198b8c..2ef1a03dff 100644
--- a/testing-modules/mocks-2/pom.xml
+++ b/testing-modules/mocks-2/pom.xml
@@ -33,7 +33,7 @@
1.6.0
- 2.13.4
+ 2.16.0
5.3.25
diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml
index fa72b1e696..b2e73570d5 100644
--- a/testing-modules/pom.xml
+++ b/testing-modules/pom.xml
@@ -34,8 +34,8 @@
load-testing-comparison
mockito
- mocks
- mocks-2
+
+
mockserver
parallel-tests-junit
powermock
diff --git a/testing-modules/spring-mockito/pom.xml b/testing-modules/spring-mockito/pom.xml
index 6283ea2d1f..8e13f511d2 100644
--- a/testing-modules/spring-mockito/pom.xml
+++ b/testing-modules/spring-mockito/pom.xml
@@ -29,6 +29,7 @@
org.projectlombok
lombok
+ ${lombok.version}
diff --git a/timefold-solver/README.md b/timefold-solver/README.md
new file mode 100644
index 0000000000..1abc4d4ca0
--- /dev/null
+++ b/timefold-solver/README.md
@@ -0,0 +1,6 @@
+## Timefold Solver
+
+This module contains articles about (Timefold Solver)[https://timefold.ai].
+
+### Relevant articles
+
diff --git a/timefold-solver/pom.xml b/timefold-solver/pom.xml
new file mode 100644
index 0000000000..a16afb9e54
--- /dev/null
+++ b/timefold-solver/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+ timefold-solver
+ timefold-solver
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ ai.timefold.solver
+ timefold-solver-bom
+ ${version.ai.timefold.solver}
+ pom
+ import
+
+
+
+
+
+ ai.timefold.solver
+ timefold-solver-core
+
+
+ ai.timefold.solver
+ timefold-solver-test
+ test
+
+
+
+
+ 17
+ 17
+ 1.4.0
+
+
+
diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java
new file mode 100644
index 0000000000..ef4752a8c6
--- /dev/null
+++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java
@@ -0,0 +1,28 @@
+package com.baeldung.timefoldsolver;
+
+import java.util.Set;
+
+public class Employee {
+
+ private String name;
+ private Set skills;
+
+ public Employee(String name, Set skills) {
+ this.name = name;
+ this.skills = skills;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Set getSkills() {
+ return skills;
+ }
+
+}
diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java
new file mode 100644
index 0000000000..2ef2f2a1b9
--- /dev/null
+++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java
@@ -0,0 +1,54 @@
+package com.baeldung.timefoldsolver;
+
+import java.time.LocalDateTime;
+
+import ai.timefold.solver.core.api.domain.entity.PlanningEntity;
+import ai.timefold.solver.core.api.domain.variable.PlanningVariable;
+
+@PlanningEntity
+public class Shift {
+
+ private LocalDateTime start;
+ private LocalDateTime end;
+ private String requiredSkill;
+
+ @PlanningVariable
+ private Employee employee;
+
+ // A no-arg constructor is required for @PlanningEntity annotated classes
+ public Shift() {
+ }
+
+ public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill) {
+ this(start, end, requiredSkill, null);
+ }
+
+ public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill, Employee employee) {
+ this.start = start;
+ this.end = end;
+ this.requiredSkill = requiredSkill;
+ this.employee = employee;
+ }
+
+ @Override
+ public String toString() {
+ return start + " - " + end;
+ }
+
+ public LocalDateTime getStart() {
+ return start;
+ }
+
+ public LocalDateTime getEnd() {
+ return end;
+ }
+
+ public String getRequiredSkill() {
+ return requiredSkill;
+ }
+
+ public Employee getEmployee() {
+ return employee;
+ }
+
+}
diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java
new file mode 100644
index 0000000000..794c31e5b7
--- /dev/null
+++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java
@@ -0,0 +1,43 @@
+package com.baeldung.timefoldsolver;
+
+import java.util.List;
+
+import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty;
+import ai.timefold.solver.core.api.domain.solution.PlanningScore;
+import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
+import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
+import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
+
+@PlanningSolution
+public class ShiftSchedule {
+
+ @ValueRangeProvider
+ private List employees;
+ @PlanningEntityCollectionProperty
+ private List shifts;
+
+ @PlanningScore
+ private HardSoftScore score;
+
+ // A no-arg constructor is required for @PlanningSolution annotated classes
+ public ShiftSchedule() {
+ }
+
+ public ShiftSchedule(List employees, List shifts) {
+ this.employees = employees;
+ this.shifts = shifts;
+ }
+
+ public List getEmployees() {
+ return employees;
+ }
+
+ public List getShifts() {
+ return shifts;
+ }
+
+ public HardSoftScore getScore() {
+ return score;
+ }
+
+}
diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java
new file mode 100644
index 0000000000..bd308dacbf
--- /dev/null
+++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java
@@ -0,0 +1,35 @@
+package com.baeldung.timefoldsolver;
+
+import static ai.timefold.solver.core.api.score.stream.Joiners.equal;
+
+import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
+import ai.timefold.solver.core.api.score.stream.Constraint;
+import ai.timefold.solver.core.api.score.stream.ConstraintFactory;
+import ai.timefold.solver.core.api.score.stream.ConstraintProvider;
+
+public class ShiftScheduleConstraintProvider implements ConstraintProvider {
+
+ @Override
+ public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
+ return new Constraint[] { atMostOneShiftPerDay(constraintFactory), requiredSkill(constraintFactory) };
+ }
+
+ public Constraint atMostOneShiftPerDay(ConstraintFactory constraintFactory) {
+ return constraintFactory.forEach(Shift.class)
+ .join(Shift.class, equal(shift -> shift.getStart()
+ .toLocalDate()), equal(Shift::getEmployee))
+ .filter((shift1, shift2) -> shift1 != shift2)
+ .penalize(HardSoftScore.ONE_HARD)
+ .asConstraint("At most one shift per day");
+ }
+
+ public Constraint requiredSkill(ConstraintFactory constraintFactory) {
+ return constraintFactory.forEach(Shift.class)
+ .filter(shift -> !shift.getEmployee()
+ .getSkills()
+ .contains(shift.getRequiredSkill()))
+ .penalize(HardSoftScore.ONE_HARD)
+ .asConstraint("Required skill");
+ }
+
+}
diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java
new file mode 100644
index 0000000000..c8ec5b53c4
--- /dev/null
+++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.timefoldsolver;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+import org.junit.jupiter.api.Test;
+
+import ai.timefold.solver.test.api.score.stream.ConstraintVerifier;
+
+class ShiftScheduleConstraintProviderUnitTest {
+
+ private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1);
+ private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2);
+
+ ConstraintVerifier constraintVerifier = ConstraintVerifier.build(new ShiftScheduleConstraintProvider(),
+ ShiftSchedule.class, Shift.class);
+
+ @Test
+ void givenTwoShiftsOnOneDay_whenApplyingAtMostOneShiftPerDayConstraint_thenPenalize() {
+ Employee ann = new Employee("Ann", null);
+ constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay)
+ .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann))
+ // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match.
+ // To avoid that, use forEachUniquePair(Shift) instead of forEach(Shift).join(Shift) in ShiftScheduleConstraintProvider.atMostOneShiftPerDay().
+ .penalizesBy(2);
+ }
+
+ @Test
+ void givenTwoShiftsOnDifferentDays_whenApplyingAtMostOneShiftPerDayConstraint_thenDoNotPenalize() {
+ Employee ann = new Employee("Ann", null);
+ constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay)
+ .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann))
+ .penalizesBy(0);
+ }
+
+ @Test
+ void givenEmployeeLacksRequiredSkill_whenApplyingRequiredSkillConstraint_thenPenalize() {
+ Employee ann = new Employee("Ann", Set.of("Waiter"));
+ constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill)
+ .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann))
+ .penalizesBy(1);
+ }
+
+ @Test
+ void givenEmployeeHasRequiredSkill_whenApplyingRequiredSkillConstraint_thenDoNotPenalize() {
+ Employee ann = new Employee("Ann", Set.of("Waiter"));
+ constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill)
+ .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann))
+ .penalizesBy(0);
+ }
+
+}
diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java
new file mode 100644
index 0000000000..873ce1a853
--- /dev/null
+++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.timefoldsolver;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+import java.time.Duration;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
+import ai.timefold.solver.core.api.solver.Solver;
+import ai.timefold.solver.core.api.solver.SolverFactory;
+import ai.timefold.solver.core.config.solver.SolverConfig;
+import ai.timefold.solver.core.config.solver.termination.TerminationConfig;
+
+public class ShiftScheduleSolverUnitTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class);
+
+ @Test
+ public void given3Employees5Shifts_whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() {
+ SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class)
+ .withEntityClasses(Shift.class)
+ .withConstraintProviderClass(ShiftScheduleConstraintProvider.class)
+ // For this dataset, we know the optimal score in advance (which is normally not the case).
+ // So we can use .withBestScoreLimit() instead of .withTerminationSpentLimit().
+ .withTerminationConfig(new TerminationConfig().withBestScoreLimit("0hard/0soft")));
+ Solver solver = solverFactory.buildSolver();
+
+ ShiftSchedule problem = loadProblem();
+ ShiftSchedule solution = solver.solve(problem);
+ assertThat(solution.getScore()).isEqualTo(HardSoftScore.ZERO);
+ assertThat(solution.getShifts().size()).isNotZero();
+ for (Shift shift : solution.getShifts()) {
+ assertThat(shift.getEmployee()).isNotNull();
+ }
+ printSolution(solution);
+ }
+
+ private ShiftSchedule loadProblem() {
+ LocalDate monday = LocalDate.of(2030, 4, 1);
+ LocalDate tuesday = LocalDate.of(2030, 4, 2);
+ return new ShiftSchedule(
+ List.of(new Employee("Ann", Set.of("Bartender")), new Employee("Beth", Set.of("Waiter", "Bartender")), new Employee("Carl", Set.of("Waiter"))),
+ List.of(new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"),
+ new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"),
+ new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender")));
+ }
+
+ private void printSolution(ShiftSchedule solution) {
+ logger.info("Shift assignments");
+ for (Shift shift : solution.getShifts()) {
+ logger.info(" " + shift.getStart()
+ .toLocalDate() + " " + shift.getStart()
+ .toLocalTime() + " - " + shift.getEnd()
+ .toLocalTime() + ": " + shift.getEmployee()
+ .getName());
+ }
+ }
+
+}
diff --git a/vavr-modules/java-vavr-stream/pom.xml b/vavr-modules/java-vavr-stream/pom.xml
index cda9d1f734..e369fa7cf3 100644
--- a/vavr-modules/java-vavr-stream/pom.xml
+++ b/vavr-modules/java-vavr-stream/pom.xml
@@ -19,12 +19,8 @@
io.vavr
vavr
- ${io.vavr.version}
+ ${vavr.version}
-
- 0.9.2
-
-
\ No newline at end of file
diff --git a/vavr-modules/pom.xml b/vavr-modules/pom.xml
index 416c689511..e9a3b121aa 100644
--- a/vavr-modules/pom.xml
+++ b/vavr-modules/pom.xml
@@ -30,4 +30,8 @@
+
+ 0.9.2
+
+
\ No newline at end of file
diff --git a/vavr-modules/vavr-2/pom.xml b/vavr-modules/vavr-2/pom.xml
index 0063daa518..54f3cb4d71 100644
--- a/vavr-modules/vavr-2/pom.xml
+++ b/vavr-modules/vavr-2/pom.xml
@@ -21,8 +21,4 @@
-
- 0.9.1
-
-
\ No newline at end of file
diff --git a/vertx-modules/pom.xml b/vertx-modules/pom.xml
index 7d9614ad61..00f0bc46f5 100644
--- a/vertx-modules/pom.xml
+++ b/vertx-modules/pom.xml
@@ -30,4 +30,8 @@
+
+ 3.9.15
+
+
\ No newline at end of file
diff --git a/vertx-modules/vertx-and-rxjava/pom.xml b/vertx-modules/vertx-and-rxjava/pom.xml
index 16eaf8ebaa..b68117ddeb 100644
--- a/vertx-modules/vertx-and-rxjava/pom.xml
+++ b/vertx-modules/vertx-and-rxjava/pom.xml
@@ -40,8 +40,4 @@
-
- 3.9.15
-
-
\ No newline at end of file
diff --git a/vertx-modules/vertx/pom.xml b/vertx-modules/vertx/pom.xml
index 75df2fae69..d34deca9d8 100644
--- a/vertx-modules/vertx/pom.xml
+++ b/vertx-modules/vertx/pom.xml
@@ -65,7 +65,6 @@
- 3.9.15
3.2.1
diff --git a/web-modules/apache-tapestry/pom.xml b/web-modules/apache-tapestry/pom.xml
index 562cdff00c..bfc7c22415 100644
--- a/web-modules/apache-tapestry/pom.xml
+++ b/web-modules/apache-tapestry/pom.xml
@@ -78,17 +78,13 @@
org.apache.maven.plugins
maven-compiler-plugin
- ${compiler.plugin.version}
-
- ${target.version}
true
org.apache.maven.plugins
maven-surefire-plugin
- ${compiler.surefire.version}
Qa
@@ -118,7 +114,6 @@
org.apache.maven.plugins
maven-war-plugin
- 3.3.1
@@ -140,9 +135,6 @@
6.1.16
3.0.0-M5
- 3.8.1
- 11
- 11
5.8.2
2.5
6.8.21
diff --git a/web-modules/blade/pom.xml b/web-modules/blade/pom.xml
index 2748c05663..fb0ca13dbe 100644
--- a/web-modules/blade/pom.xml
+++ b/web-modules/blade/pom.xml
@@ -62,7 +62,6 @@
org.apache.maven.plugins
maven-failsafe-plugin
- ${maven-failsafe-plugin.version}
true
diff --git a/web-modules/jakarta-ee/pom.xml b/web-modules/jakarta-ee/pom.xml
index 066bc14766..d90e848323 100644
--- a/web-modules/jakarta-ee/pom.xml
+++ b/web-modules/jakarta-ee/pom.xml
@@ -2,7 +2,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
jakarta-ee
1.0-SNAPSHOT
jakarta-ee
@@ -51,7 +50,7 @@
org.glassfish.maven.plugin
maven-glassfish-plugin
- 2.1
+ ${maven-glassfish-plugin.version}
${local.glassfish.home}
admin
@@ -76,11 +75,6 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
-
-
- 11
-
org.apache.maven.plugins
@@ -104,6 +98,7 @@
${local.glassfish.home}\\domains\\${local.glassfish.domain}\\config\\domain-passwords
+ 2.1
\ No newline at end of file
diff --git a/web-modules/java-lite/pom.xml b/web-modules/java-lite/pom.xml
index 7f1c9182f7..be079d484e 100644
--- a/web-modules/java-lite/pom.xml
+++ b/web-modules/java-lite/pom.xml
@@ -22,8 +22,8 @@
${activeweb.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql.connector.java.version}
@@ -88,7 +88,7 @@
9.4.8.v20171121
1.4.13
1.15
- 5.1.45
+ 8.2.0
1.7.0
1.15
diff --git a/web-modules/java-takes/README.md b/web-modules/java-takes/README.md
new file mode 100644
index 0000000000..0db4361d6f
--- /dev/null
+++ b/web-modules/java-takes/README.md
@@ -0,0 +1,7 @@
+## Java takes
+
+This module contains articles about Takes.
+
+### Relevant Articles:
+- [Introduction to Takes](https://www.baeldung.com/java-takes)
+
diff --git a/web-modules/java-takes/pom.xml b/web-modules/java-takes/pom.xml
new file mode 100644
index 0000000000..e28f75b536
--- /dev/null
+++ b/web-modules/java-takes/pom.xml
@@ -0,0 +1,81 @@
+
+
+ 4.0.0
+ com.baeldung.spring-boot-modules
+ java-takes
+
+
+ com.baeldung
+ web-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+
+ org.takes
+ takes
+ ${takes.version}
+
+
+ org.apache.httpcomponents
+ httpcore
+ ${httpcore.version}
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+
+
+
+ reload
+
+
+
+ src/main/resources
+ true
+
+
+ src/main/webapp
+ true
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ start-server
+ pre-integration-test
+
+ java
+
+
+
+
+ com.baeldung.com.baeldung.takes.TakesApp
+ false
+
+ --port=${port}
+
+
+
+
+
+
+
+
+
+ 1.19
+ 4.4.13
+ 4.5.12
+
+
+
\ No newline at end of file
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesApp.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesApp.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/takes/TakesApp.java
rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesApp.java
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesContact.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesContact.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/takes/TakesContact.java
rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesContact.java
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesHelloWorld.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java
rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesHelloWorld.java
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesIndex.java
similarity index 100%
rename from libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java
rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesIndex.java
diff --git a/web-modules/java-takes/src/main/resources/logback.xml b/web-modules/java-takes/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/web-modules/java-takes/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-3/src/main/webapp/templates/index.vm b/web-modules/java-takes/src/main/webapp/templates/index.vm
similarity index 100%
rename from libraries-3/src/main/webapp/templates/index.vm
rename to web-modules/java-takes/src/main/webapp/templates/index.vm
diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java b/web-modules/java-takes/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
rename to web-modules/java-takes/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java b/web-modules/java-takes/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
similarity index 100%
rename from libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
rename to web-modules/java-takes/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
diff --git a/web-modules/pom.xml b/web-modules/pom.xml
index 57810f90de..b0792b3653 100644
--- a/web-modules/pom.xml
+++ b/web-modules/pom.xml
@@ -22,6 +22,7 @@
jakarta-ee
+ java-takes
javax-servlets
javax-servlets-2
jee-7
@@ -33,10 +34,12 @@
ratpack
resteasy
restx
+ rome
spark-java
struts-2
vraptor
wicket
+
diff --git a/web-modules/rome/README.md b/web-modules/rome/README.md
new file mode 100644
index 0000000000..e5cbbbb373
--- /dev/null
+++ b/web-modules/rome/README.md
@@ -0,0 +1,8 @@
+## RSS ROME
+
+This module contains articles about Rss with Rome.
+
+### Relevant Articles
+
+- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
+
diff --git a/web-modules/rome/pom.xml b/web-modules/rome/pom.xml
new file mode 100644
index 0000000000..cfcdf4721c
--- /dev/null
+++ b/web-modules/rome/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+ rome
+ 0.1-SNAPSHOT
+ rome
+
+
+ com.baeldung
+ web-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+
+ rome
+ rome
+ ${rome.version}
+
+
+
+
+
+ 1.0
+
+
+
\ No newline at end of file
diff --git a/libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java b/web-modules/rome/src/main/java/com/baeldung/rome/RSSRomeExample.java
similarity index 85%
rename from libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java
rename to web-modules/rome/src/main/java/com/baeldung/rome/RSSRomeExample.java
index 66a9e0ebce..b5e4569270 100644
--- a/libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java
+++ b/web-modules/rome/src/main/java/com/baeldung/rome/RSSRomeExample.java
@@ -1,11 +1,5 @@
package com.baeldung.rome;
-import com.sun.syndication.feed.synd.*;
-import com.sun.syndication.io.FeedException;
-import com.sun.syndication.io.SyndFeedInput;
-import com.sun.syndication.io.SyndFeedOutput;
-import com.sun.syndication.io.XmlReader;
-
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
@@ -14,6 +8,19 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import com.sun.syndication.feed.synd.SyndCategory;
+import com.sun.syndication.feed.synd.SyndCategoryImpl;
+import com.sun.syndication.feed.synd.SyndContent;
+import com.sun.syndication.feed.synd.SyndContentImpl;
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.feed.synd.SyndEntryImpl;
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.feed.synd.SyndFeedImpl;
+import com.sun.syndication.io.FeedException;
+import com.sun.syndication.io.SyndFeedInput;
+import com.sun.syndication.io.SyndFeedOutput;
+import com.sun.syndication.io.XmlReader;
+
public class RSSRomeExample {
public static void main(String[] args) throws IOException, FeedException {
diff --git a/web-modules/rome/src/main/resources/logback.xml b/web-modules/rome/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/web-modules/rome/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web-modules/vraptor/pom.xml b/web-modules/vraptor/pom.xml
index 25f8b5d5e5..d952cd71e5 100644
--- a/web-modules/vraptor/pom.xml
+++ b/web-modules/vraptor/pom.xml
@@ -80,8 +80,8 @@
${vraptor-hibernate.version}
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
${mysql-connector.version}
@@ -118,7 +118,7 @@
8.0.1.Final
4.1.0-RC3
4.0.4
- 8.0.8-dmr
+ 8.2.0
0.4
2.3.27-incubating
2.1
diff --git a/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java
index 6c8486f14b..275a734b28 100644
--- a/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java
+++ b/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java
@@ -41,15 +41,15 @@ public class JsonToXmlUnitTest {
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_1_1, true);
String xmlString = xmlMapper.writer().withRootName("root").withDefaultPrettyPrinter().writeValueAsString(jsonNode);
- Assertions.assertEquals("\n" +
- "\n" +
- " John\n" +
- " 20\n" +
- " \n" +
- " Wall Street\n" +
- " New York\n" +
- " \n" +
- "\n", xmlString);
+ Assertions.assertEquals("" + System.lineSeparator() +
+ "" + System.lineSeparator() +
+ " John" + System.lineSeparator() +
+ " 20" + System.lineSeparator() +
+ " " + System.lineSeparator() +
+ " Wall Street" + System.lineSeparator() +
+ " New York" + System.lineSeparator() +
+ " " + System.lineSeparator() +
+ "" + System.lineSeparator(), xmlString);
}
@Test
diff --git a/xml/README.md b/xml/README.md
index 16942c6836..596ddc14aa 100644
--- a/xml/README.md
+++ b/xml/README.md
@@ -13,3 +13,4 @@ This module contains articles about eXtensible Markup Language (XML)
- [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax)
- [Parsing an XML File Using SAX Parser](https://www.baeldung.com/java-sax-parser)
- [Remove HTML Tags Using Java](https://www.baeldung.com/java-remove-html-tags)
+- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv)
diff --git a/xml/src/main/java/com/baeldung/xml/DefaultParser.java b/xml/src/main/java/com/baeldung/xml/DefaultParser.java
index 83280aa0f2..63e4a453c3 100644
--- a/xml/src/main/java/com/baeldung/xml/DefaultParser.java
+++ b/xml/src/main/java/com/baeldung/xml/DefaultParser.java
@@ -163,10 +163,10 @@ public class DefaultParser {
private void clean(Node node) {
- NodeList childs = node.getChildNodes();
+ NodeList childNodes = node.getChildNodes();
- for (int n = childs.getLength() - 1; n >= 0; n--) {
- Node child = childs.item(n);
+ for (int n = childNodes.getLength() - 1; n >= 0; n--) {
+ Node child = childNodes.item(n);
short nodeType = child.getNodeType();
if (nodeType == Node.ELEMENT_NODE)