diff --git a/core-java-modules/core-java-9-new-features/README.md b/core-java-modules/core-java-9-new-features/README.md
index d547b9a221..c2ef63a530 100644
--- a/core-java-modules/core-java-9-new-features/README.md
+++ b/core-java-modules/core-java-9-new-features/README.md
@@ -12,3 +12,4 @@ This module contains articles about core Java features that have been introduced
- [Introduction to Java 9 StackWalking API](https://www.baeldung.com/java-9-stackwalking-api)
- [Java 9 Platform Logging API](https://www.baeldung.com/java-9-logging-api)
- [Java 9 Reactive Streams](https://www.baeldung.com/java-9-reactive-streams)
+- [Multi-Release JAR Files with Maven](https://www.baeldung.com/maven-multi-release-jars)
diff --git a/core-java-modules/core-java-9-new-features/pom.xml b/core-java-modules/core-java-9-new-features/pom.xml
index b0fb6ab7f9..70fae73bd5 100644
--- a/core-java-modules/core-java-9-new-features/pom.xml
+++ b/core-java-modules/core-java-9-new-features/pom.xml
@@ -28,8 +28,104 @@
${junit.platform.version}
test
+
+ org.awaitility
+ awaitility
+ ${awaitility.version}
+ test
+
-
+
+
+ incubator-features
+
+ core-java-9-new-features
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ --add-modules=jdk.incubator.httpclient
+
+
+
+ maven-surefire-plugin
+
+ --add-modules=jdk.incubator.httpclient
+
+
+
+
+
+
+ mrjar-generation
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ compile-java-8
+
+ compile
+
+
+ 1.8
+ 1.8
+
+ ${project.basedir}/src/main/java8
+
+
+
+
+ compile-java-9
+ compile
+
+ compile
+
+
+ 9
+
+ ${project.basedir}/src/main/java9
+
+ ${project.build.outputDirectory}/META-INF/versions/9
+
+
+
+ default-testCompile
+ test-compile
+
+ testCompile
+
+
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+
+
+ com.baeldung.multireleaseapp.App
+
+
+
+
+
+
+
+
core-java-9-new-features
@@ -56,8 +152,10 @@
3.10.0
1.2.0
+ 4.0.2
1.9
1.9
+ 3.2.0
diff --git a/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/App.java b/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/App.java
new file mode 100644
index 0000000000..cc00223e05
--- /dev/null
+++ b/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/App.java
@@ -0,0 +1,14 @@
+package com.baeldung.multireleaseapp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class App {
+
+ private static final Logger logger = LoggerFactory.getLogger(App.class);
+
+ public static void main(String[] args) {
+ logger.info(String.format("Running on %s", new DefaultVersion().version()));
+ }
+
+}
diff --git a/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/DefaultVersion.java b/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/DefaultVersion.java
new file mode 100644
index 0000000000..b24be606de
--- /dev/null
+++ b/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/DefaultVersion.java
@@ -0,0 +1,9 @@
+package com.baeldung.multireleaseapp;
+
+public class DefaultVersion implements Version {
+
+ @Override
+ public String version() {
+ return System.getProperty("java.version");
+ }
+}
diff --git a/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/Version.java b/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/Version.java
new file mode 100644
index 0000000000..ef95f08205
--- /dev/null
+++ b/core-java-modules/core-java-9-new-features/src/main/java8/com/baeldung/multireleaseapp/Version.java
@@ -0,0 +1,5 @@
+package com.baeldung.multireleaseapp;
+
+interface Version {
+ public String version();
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-new-features/src/main/java9/com/baeldung/multireleaseapp/DefaultVersion.java b/core-java-modules/core-java-9-new-features/src/main/java9/com/baeldung/multireleaseapp/DefaultVersion.java
new file mode 100644
index 0000000000..0842f578dd
--- /dev/null
+++ b/core-java-modules/core-java-9-new-features/src/main/java9/com/baeldung/multireleaseapp/DefaultVersion.java
@@ -0,0 +1,9 @@
+package com.baeldung.multireleaseapp;
+
+public class DefaultVersion implements Version {
+
+ @Override
+ public String version() {
+ return Runtime.version().toString();
+ }
+}
diff --git a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpClientTest.java b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpClientIntegrationTest.java
similarity index 98%
rename from core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpClientTest.java
rename to core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpClientIntegrationTest.java
index 5cf3b9098f..fc59ae8d8d 100644
--- a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpClientTest.java
+++ b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpClientIntegrationTest.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.assertThat;
/**
* Created by adam.
*/
-public class HttpClientTest {
+public class HttpClientIntegrationTest {
@Test
public void shouldReturnSampleDataContentWhenConnectViaSystemProxy() throws IOException, InterruptedException, URISyntaxException {
@@ -55,7 +55,7 @@ public class HttpClientTest {
.send(request, HttpResponse.BodyHandler.asString());
assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_MOVED_PERM));
- assertThat(response.body(), containsString("https://stackoverflow.com/"));
+ assertThat(response.body(), containsString(""));
}
@Test
diff --git a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpRequestTest.java b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpRequestIntegrationTest.java
similarity index 99%
rename from core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpRequestTest.java
rename to core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpRequestIntegrationTest.java
index 7c0e9a90e0..17af7bd8ba 100644
--- a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpRequestTest.java
+++ b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpRequestIntegrationTest.java
@@ -22,7 +22,7 @@ import static org.junit.Assert.assertThat;
/**
* Created by adam.
*/
-public class HttpRequestTest {
+public class HttpRequestIntegrationTest {
@Test
public void shouldReturnStatusOKWhenSendGetRequest() throws IOException, InterruptedException, URISyntaxException {
diff --git a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpResponseTest.java b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpResponseIntegrationTest.java
similarity index 97%
rename from core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpResponseTest.java
rename to core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpResponseIntegrationTest.java
index 80295ff34c..5c6f9c8a52 100644
--- a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpResponseTest.java
+++ b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/httpclient/HttpResponseIntegrationTest.java
@@ -18,7 +18,7 @@ import static org.junit.Assert.assertThat;
/**
* Created by adam.
*/
-public class HttpResponseTest {
+public class HttpResponseIntegrationTest {
@Test
public void shouldReturnStatusOKWhenSendGetRequest() throws IOException, InterruptedException, URISyntaxException {
diff --git a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/streams.reactive/ReactiveStreamsTest.java b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/streams/reactive/ReactiveStreamsUnitTest.java
similarity index 86%
rename from core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/streams.reactive/ReactiveStreamsTest.java
rename to core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/streams/reactive/ReactiveStreamsUnitTest.java
index 647557532d..92cdc1c074 100644
--- a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/streams.reactive/ReactiveStreamsTest.java
+++ b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/streams/reactive/ReactiveStreamsUnitTest.java
@@ -5,10 +5,12 @@ import org.junit.Test;
import java.util.List;
import java.util.concurrent.SubmissionPublisher;
+import java.util.concurrent.TimeUnit;
-import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
-public class ReactiveStreamsTest {
+public class ReactiveStreamsUnitTest {
@Test
public void givenPublisher_whenSubscribeToIt_thenShouldConsumeAllElements() throws InterruptedException {
@@ -25,7 +27,7 @@ public class ReactiveStreamsTest {
//then
- await().atMost(1000, TimeUnit.MILLISECONDS).until(
+ await().atMost(1000, TimeUnit.MILLISECONDS).untilAsserted(
() -> assertThat(subscriber.consumedElements).containsExactlyElementsOf(items)
);
}
@@ -46,7 +48,7 @@ public class ReactiveStreamsTest {
publisher.close();
//then
- await().atMost(1000, TimeUnit.MILLISECONDS).until(
+ await().atMost(1000, TimeUnit.MILLISECONDS).untilAsserted(
() -> assertThat(subscriber.consumedElements).containsExactlyElementsOf(expectedResult)
);
}
@@ -66,7 +68,7 @@ public class ReactiveStreamsTest {
publisher.close();
//then
- await().atMost(1000, TimeUnit.MILLISECONDS).until(
+ await().atMost(1000, TimeUnit.MILLISECONDS).untilAsserted(
() -> assertThat(subscriber.consumedElements).containsExactlyElementsOf(expected)
);
}
diff --git a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java
deleted file mode 100644
index 50766502ec..0000000000
--- a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package com.baeldung.java9.varhandles;
-
-import org.junit.Test;
-
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.VarHandle;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class VariableHandlesTest {
-
- public int publicTestVariable = 1;
- private int privateTestVariable = 1;
- public int variableToSet = 1;
- public int variableToCompareAndSet = 1;
- public int variableToGetAndAdd = 0;
- public byte variableToBitwiseOr = 0;
-
- @Test
- public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
- VarHandle publicIntHandle = MethodHandles
- .lookup()
- .in(VariableHandlesTest.class)
- .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class);
-
- assertThat(publicIntHandle.coordinateTypes().size() == 1);
- assertThat(publicIntHandle.coordinateTypes().get(0) == VariableHandles.class);
-
- }
-
- @Test
- public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
- VarHandle privateIntHandle = MethodHandles
- .privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup())
- .findVarHandle(VariableHandlesTest.class, "privateTestVariable", int.class);
-
- assertThat(privateIntHandle.coordinateTypes().size() == 1);
- assertThat(privateIntHandle.coordinateTypes().get(0) == VariableHandlesTest.class);
-
- }
-
- @Test
- public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
- VarHandle arrayVarHandle = MethodHandles
- .arrayElementVarHandle(int[].class);
-
- assertThat(arrayVarHandle.coordinateTypes().size() == 2);
- assertThat(arrayVarHandle.coordinateTypes().get(0) == int[].class);
- }
-
- @Test
- public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException {
- VarHandle publicIntHandle = MethodHandles
- .lookup()
- .in(VariableHandlesTest.class)
- .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class);
-
- assertThat((int) publicIntHandle.get(this) == 1);
- }
-
- @Test
- public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
- VarHandle publicIntHandle = MethodHandles
- .lookup()
- .in(VariableHandlesTest.class)
- .findVarHandle(VariableHandlesTest.class, "variableToSet", int.class);
- publicIntHandle.set(this, 15);
-
- assertThat((int) publicIntHandle.get(this) == 15);
- }
-
- @Test
- public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
- VarHandle publicIntHandle = MethodHandles
- .lookup()
- .in(VariableHandlesTest.class)
- .findVarHandle(VariableHandlesTest.class, "variableToCompareAndSet", int.class);
- publicIntHandle.compareAndSet(this, 1, 100);
-
- assertThat((int) publicIntHandle.get(this) == 100);
- }
-
- @Test
- public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
- VarHandle publicIntHandle = MethodHandles
- .lookup()
- .in(VariableHandlesTest.class)
- .findVarHandle(VariableHandlesTest.class, "variableToGetAndAdd", int.class);
- int before = (int) publicIntHandle.getAndAdd(this, 200);
-
- assertThat(before == 0);
- assertThat((int) publicIntHandle.get(this) == 200);
- }
-
- @Test
- public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
- VarHandle publicIntHandle = MethodHandles
- .lookup()
- .in(VariableHandlesTest.class)
- .findVarHandle(VariableHandlesTest.class, "variableToBitwiseOr", byte.class);
- byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127);
-
- assertThat(before == 0);
- assertThat(variableToBitwiseOr == 127);
- }
-}
diff --git a/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/varhandles/VariableHandlesUnitTest.java b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/varhandles/VariableHandlesUnitTest.java
new file mode 100644
index 0000000000..a7263f0bb2
--- /dev/null
+++ b/core-java-modules/core-java-9-new-features/src/test/java/com/baeldung/java9/varhandles/VariableHandlesUnitTest.java
@@ -0,0 +1,105 @@
+package com.baeldung.java9.varhandles;
+
+import org.junit.Test;
+
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+
+import static org.junit.Assert.assertEquals;
+
+public class VariableHandlesUnitTest {
+
+ public int publicTestVariable = 1;
+ private int privateTestVariable = 1;
+ public int variableToSet = 1;
+ public int variableToCompareAndSet = 1;
+ public int variableToGetAndAdd = 0;
+ public byte variableToBitwiseOr = 0;
+
+ @Test
+ public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle PUBLIC_TEST_VARIABLE = MethodHandles
+ .lookup()
+ .in(VariableHandlesUnitTest.class)
+ .findVarHandle(VariableHandlesUnitTest.class, "publicTestVariable", int.class);
+
+ assertEquals(1, PUBLIC_TEST_VARIABLE.coordinateTypes().size());
+ assertEquals(VariableHandlesUnitTest.class, PUBLIC_TEST_VARIABLE.coordinateTypes().get(0));
+ }
+
+ @Test
+ public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle PRIVATE_TEST_VARIABLE = MethodHandles
+ .privateLookupIn(VariableHandlesUnitTest.class, MethodHandles.lookup())
+ .findVarHandle(VariableHandlesUnitTest.class, "privateTestVariable", int.class);
+
+ assertEquals(1, PRIVATE_TEST_VARIABLE.coordinateTypes().size());
+ assertEquals(VariableHandlesUnitTest.class, PRIVATE_TEST_VARIABLE.coordinateTypes().get(0));
+ }
+
+ @Test
+ public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle arrayVarHandle = MethodHandles
+ .arrayElementVarHandle(int[].class);
+
+ assertEquals(2, arrayVarHandle.coordinateTypes().size());
+ assertEquals(int[].class, arrayVarHandle.coordinateTypes().get(0));
+ }
+
+ @Test
+ public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle PUBLIC_TEST_VARIABLE = MethodHandles
+ .lookup()
+ .in(VariableHandlesUnitTest.class)
+ .findVarHandle(VariableHandlesUnitTest.class, "publicTestVariable", int.class);
+
+ assertEquals(1, (int) PUBLIC_TEST_VARIABLE.get(this));
+ }
+
+ @Test
+ public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle VARIABLE_TO_SET = MethodHandles
+ .lookup()
+ .in(VariableHandlesUnitTest.class)
+ .findVarHandle(VariableHandlesUnitTest.class, "variableToSet", int.class);
+
+ VARIABLE_TO_SET.set(this, 15);
+ assertEquals(15, (int) VARIABLE_TO_SET.get(this));
+ }
+
+ @Test
+ public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle VARIABLE_TO_COMPARE_AND_SET = MethodHandles
+ .lookup()
+ .in(VariableHandlesUnitTest.class)
+ .findVarHandle(VariableHandlesUnitTest.class, "variableToCompareAndSet", int.class);
+
+ VARIABLE_TO_COMPARE_AND_SET.compareAndSet(this, 1, 100);
+ assertEquals(100, (int) VARIABLE_TO_COMPARE_AND_SET.get(this));
+ }
+
+ @Test
+ public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle VARIABLE_TO_GET_AND_ADD = MethodHandles
+ .lookup()
+ .in(VariableHandlesUnitTest.class)
+ .findVarHandle(VariableHandlesUnitTest.class, "variableToGetAndAdd", int.class);
+
+ int before = (int) VARIABLE_TO_GET_AND_ADD.getAndAdd(this, 200);
+
+ assertEquals(0, before);
+ assertEquals(200, (int) VARIABLE_TO_GET_AND_ADD.get(this));
+ }
+
+ @Test
+ public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
+ VarHandle VARIABLE_TO_BITWISE_OR = MethodHandles
+ .lookup()
+ .in(VariableHandlesUnitTest.class)
+ .findVarHandle(VariableHandlesUnitTest.class, "variableToBitwiseOr", byte.class);
+ byte before = (byte) VARIABLE_TO_BITWISE_OR.getAndBitwiseOr(this, (byte) 127);
+
+ assertEquals(0, before);
+ assertEquals(127, (byte) VARIABLE_TO_BITWISE_OR.get(this));
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java
index 1a46e1ba52..415b24738a 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java
@@ -9,13 +9,11 @@ public class StampedAccount {
private AtomicStampedReference account = new AtomicStampedReference<>(0, 0);
public int getBalance() {
- return this.account.get(new int[1]);
+ return account.getReference();
}
public int getStamp() {
- int[] stamps = new int[1];
- this.account.get(stamps);
- return stamps[0];
+ return account.getStamp();
}
public boolean deposit(int funds) {
diff --git a/core-java-modules/core-java-io-conversions-2/README.md b/core-java-modules/core-java-io-conversions-2/README.md
index 5cb9c21c54..9ce36e7437 100644
--- a/core-java-modules/core-java-io-conversions-2/README.md
+++ b/core-java-modules/core-java-io-conversions-2/README.md
@@ -5,4 +5,5 @@ This module contains articles about core Java input/output(IO) conversions.
### Relevant Articles:
- [Java InputStream to String](https://www.baeldung.com/convert-input-stream-to-string)
- [Java – Write an InputStream to a File](https://www.baeldung.com/convert-input-stream-to-a-file)
+- [Converting a BufferedReader to a JSONObject](https://www.baeldung.com/java-bufferedreader-to-jsonobject)
- More articles: [[<-- prev]](/core-java-modules/core-java-io-conversions)
diff --git a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/error/oom/ExecutorServiceUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/error/oom/ExecutorServiceUnitTest.java
new file mode 100644
index 0000000000..47bb668727
--- /dev/null
+++ b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/error/oom/ExecutorServiceUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.error.oom;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import org.junit.jupiter.api.Test;
+
+public class ExecutorServiceUnitTest {
+
+ @Test
+ public void givenAnExecutorService_WhenMoreTasksSubmitted_ThenAdditionalTasksWait() {
+
+ // Given
+ int noOfThreads = 5;
+ ExecutorService executorService = Executors.newFixedThreadPool(noOfThreads);
+
+ Runnable runnableTask = () -> {
+ try {
+ TimeUnit.HOURS.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ };
+
+ // When
+ IntStream.rangeClosed(1, 10)
+ .forEach(i -> executorService.submit(runnableTask));
+
+ // Then
+ assertThat(((ThreadPoolExecutor) executorService).getQueue()
+ .size(), is(equalTo(5)));
+ }
+}
diff --git a/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/nullassertion/NotNullAssertionUnitTest.kt b/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/nullassertion/NotNullAssertionUnitTest.kt
new file mode 100644
index 0000000000..434f177927
--- /dev/null
+++ b/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/nullassertion/NotNullAssertionUnitTest.kt
@@ -0,0 +1,20 @@
+package com.baeldung.nullassertion
+
+import org.junit.Test
+import kotlin.test.assertEquals
+
+class NotNullAssertionUnitTest {
+
+ @Test
+ fun givenNullableValue_WhenNotNull_ShouldExtractTheValue() {
+ val answer: String? = "42"
+
+ assertEquals(42, answer!!.toInt())
+ }
+
+ @Test(expected = KotlinNullPointerException::class)
+ fun givenNullableValue_WhenIsNull_ThenShouldThrow() {
+ val noAnswer: String? = null
+ noAnswer!!
+ }
+}
diff --git a/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/ternary/TernaryOperatorTest.kt b/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/ternary/TernaryOperatorTest.kt
index 21dfdd2ae0..347290de72 100644
--- a/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/ternary/TernaryOperatorTest.kt
+++ b/core-kotlin-modules/core-kotlin-2/src/test/kotlin/com/baeldung/ternary/TernaryOperatorTest.kt
@@ -21,4 +21,12 @@ class TernaryOperatorTest {
}
assertEquals("yes", result)
}
+
+ @Test
+ fun `using elvis`() {
+ val a: String? = null
+ val result = a ?: "Default"
+
+ assertEquals("Default", result)
+ }
}
\ No newline at end of file
diff --git a/ddd-modules/infrastructure/pom.xml b/ddd-modules/infrastructure/pom.xml
index c301eaa92a..abf90935c3 100644
--- a/ddd-modules/infrastructure/pom.xml
+++ b/ddd-modules/infrastructure/pom.xml
@@ -12,8 +12,9 @@
com.baeldung.dddmodules
- dddmodules
+ ddd-modules
1.0
+ ../
diff --git a/ddd-modules/mainapp/pom.xml b/ddd-modules/mainapp/pom.xml
index a048263d37..59d2ad7d3a 100644
--- a/ddd-modules/mainapp/pom.xml
+++ b/ddd-modules/mainapp/pom.xml
@@ -11,8 +11,9 @@
com.baeldung.dddmodules
- dddmodules
+ ddd-modules
1.0
+ ../
diff --git a/ddd-modules/ordercontext/pom.xml b/ddd-modules/ordercontext/pom.xml
index abd166fb69..8dee3a5148 100644
--- a/ddd-modules/ordercontext/pom.xml
+++ b/ddd-modules/ordercontext/pom.xml
@@ -11,8 +11,9 @@
com.baeldung.dddmodules
- dddmodules
+ ddd-modules
1.0
+ ../
diff --git a/ddd-modules/pom.xml b/ddd-modules/pom.xml
index c6dd6e1f25..6ab1829198 100644
--- a/ddd-modules/pom.xml
+++ b/ddd-modules/pom.xml
@@ -28,9 +28,15 @@
- junit
- junit
- ${junit.version}
+ org.junit.jupiter
+ junit-jupiter
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ ${junit-jupiter.version}
test
@@ -56,15 +62,31 @@
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 0
+
+
+
- 3.8.1
+ UTF-8
+
9
9
- UTF-8
- 3.12.2
+
+ 3.8.1
+ 2.22.2
+
1.0
+
+ 5.6.2
+ 3.12.2
diff --git a/ddd-modules/sharedkernel/pom.xml b/ddd-modules/sharedkernel/pom.xml
index a61f03a494..1afddf1e22 100644
--- a/ddd-modules/sharedkernel/pom.xml
+++ b/ddd-modules/sharedkernel/pom.xml
@@ -11,8 +11,9 @@
com.baeldung.dddmodules
- dddmodules
+ ddd-modules
1.0
+ ../
diff --git a/ddd-modules/shippingcontext/pom.xml b/ddd-modules/shippingcontext/pom.xml
index 2096923f90..25b5882ef1 100644
--- a/ddd-modules/shippingcontext/pom.xml
+++ b/ddd-modules/shippingcontext/pom.xml
@@ -11,8 +11,9 @@
com.baeldung.dddmodules
- dddmodules
+ ddd-modules
1.0
+ ../
diff --git a/ddd/pom.xml b/ddd/pom.xml
index 1253f2ac48..422f9ccd15 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -17,6 +17,35 @@
../parent-boot-2
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+
+
+
+
+
+ org.junit
+ junit-bom
+ ${junit-jupiter.version}
+ pom
+ import
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
org.springframework.boot
@@ -26,24 +55,6 @@
org.springframework.boot
spring-boot-starter-data-cassandra
-
- org.junit.jupiter
- junit-jupiter-api
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- test
-
-
-
-
- org.junit.platform
- junit-platform-launcher
- ${junit-platform.version}
- test
-
org.joda
joda-money
@@ -95,7 +106,10 @@
- 1.0.1
-
+ 2.22.2
+ 1.0.1
+
+ 5.6.2
+
diff --git a/jhipster/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/web/rest/errors/ExceptionTranslator.java b/jhipster/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/web/rest/errors/ExceptionTranslator.java
index d5c9e577a6..fd6e04dadc 100644
--- a/jhipster/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/web/rest/errors/ExceptionTranslator.java
+++ b/jhipster/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/web/rest/errors/ExceptionTranslator.java
@@ -14,6 +14,7 @@ import org.zalando.problem.Problem;
import org.zalando.problem.ProblemBuilder;
import org.zalando.problem.Status;
import org.zalando.problem.spring.web.advice.ProblemHandling;
+import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait;
import org.zalando.problem.violations.ConstraintViolationProblem;
import javax.annotation.Nonnull;
@@ -28,7 +29,7 @@ import java.util.stream.Collectors;
* The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807)
*/
@ControllerAdvice
-public class ExceptionTranslator implements ProblemHandling {
+public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait {
/**
* Post-process the Problem payload to add the message key for the front-end if needed
diff --git a/jhipster/jhipster-uaa/quotes/src/main/java/com/baeldung/jhipster/quotes/web/rest/errors/ExceptionTranslator.java b/jhipster/jhipster-uaa/quotes/src/main/java/com/baeldung/jhipster/quotes/web/rest/errors/ExceptionTranslator.java
index 18baa42736..3bf4995405 100644
--- a/jhipster/jhipster-uaa/quotes/src/main/java/com/baeldung/jhipster/quotes/web/rest/errors/ExceptionTranslator.java
+++ b/jhipster/jhipster-uaa/quotes/src/main/java/com/baeldung/jhipster/quotes/web/rest/errors/ExceptionTranslator.java
@@ -14,6 +14,7 @@ import org.zalando.problem.Problem;
import org.zalando.problem.ProblemBuilder;
import org.zalando.problem.Status;
import org.zalando.problem.spring.web.advice.ProblemHandling;
+import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait;
import org.zalando.problem.violations.ConstraintViolationProblem;
import javax.annotation.Nonnull;
@@ -28,7 +29,7 @@ import java.util.stream.Collectors;
* The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807)
*/
@ControllerAdvice
-public class ExceptionTranslator implements ProblemHandling {
+public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait {
/**
* Post-process the Problem payload to add the message key for the front-end if needed
diff --git a/jhipster/jhipster-uaa/uaa/src/main/java/com/baeldung/jhipster/uaa/web/rest/errors/ExceptionTranslator.java b/jhipster/jhipster-uaa/uaa/src/main/java/com/baeldung/jhipster/uaa/web/rest/errors/ExceptionTranslator.java
index 320636c51d..6af9fd126c 100644
--- a/jhipster/jhipster-uaa/uaa/src/main/java/com/baeldung/jhipster/uaa/web/rest/errors/ExceptionTranslator.java
+++ b/jhipster/jhipster-uaa/uaa/src/main/java/com/baeldung/jhipster/uaa/web/rest/errors/ExceptionTranslator.java
@@ -14,6 +14,7 @@ import org.zalando.problem.Problem;
import org.zalando.problem.ProblemBuilder;
import org.zalando.problem.Status;
import org.zalando.problem.spring.web.advice.ProblemHandling;
+import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait;
import org.zalando.problem.violations.ConstraintViolationProblem;
import javax.annotation.Nonnull;
@@ -28,7 +29,7 @@ import java.util.stream.Collectors;
* The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807)
*/
@ControllerAdvice
-public class ExceptionTranslator implements ProblemHandling {
+public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait {
/**
* Post-process the Problem payload to add the message key for the front-end if needed
diff --git a/jmh/src/main/java/com/baeldung/BenchMark.java b/jmh/src/main/java/com/baeldung/BenchMark.java
index b0e1caf4dc..3c5c840db2 100644
--- a/jmh/src/main/java/com/baeldung/BenchMark.java
+++ b/jmh/src/main/java/com/baeldung/BenchMark.java
@@ -1,14 +1,20 @@
package com.baeldung;
-import com.google.common.hash.HashFunction;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.Blackhole;
import java.nio.charset.Charset;
+import java.util.concurrent.TimeUnit;
public class BenchMark {
+ @State(Scope.Benchmark)
+ public static class Log {
+ public int x = 8;
+ }
+
@State(Scope.Benchmark)
public static class ExecutionPlan {
@@ -45,4 +51,44 @@ public class BenchMark {
// Do nothing
}
+ @Benchmark
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @BenchmarkMode(Mode.AverageTime)
+ public void doNothing() {
+
+ }
+
+ @Benchmark
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @BenchmarkMode(Mode.AverageTime)
+ public void objectCreation() {
+ new Object();
+ }
+
+ @Benchmark
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @BenchmarkMode(Mode.AverageTime)
+ public Object pillarsOfCreation() {
+ return new Object();
+ }
+
+ @Benchmark
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @BenchmarkMode(Mode.AverageTime)
+ public void blackHole(Blackhole blackhole) {
+ blackhole.consume(new Object());
+ }
+
+ @Benchmark
+ public double foldedLog() {
+ int x = 8;
+
+ return Math.log(x);
+ }
+
+ @Benchmark
+ public double log(Log input) {
+ return Math.log(input.x);
+ }
+
}
diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml
index f028ffe8c3..d51580ccbc 100644
--- a/libraries-data-db/pom.xml
+++ b/libraries-data-db/pom.xml
@@ -211,7 +211,7 @@
5.0.2
5.0.4
3.2.0-m7
- 2.7.2
+ 3.4.5
11.22.4
diff --git a/libraries-server-2/.gitignore b/libraries-server-2/.gitignore
new file mode 100644
index 0000000000..e594daf27a
--- /dev/null
+++ b/libraries-server-2/.gitignore
@@ -0,0 +1,9 @@
+*.class
+
+# Folders #
+/gensrc
+/target
+
+# Packaged files #
+*.jar
+/bin/
diff --git a/libraries-server-2/README.md b/libraries-server-2/README.md
new file mode 100644
index 0000000000..38166bcd77
--- /dev/null
+++ b/libraries-server-2/README.md
@@ -0,0 +1,8 @@
+## Server
+
+This module contains articles about server libraries.
+
+### Relevant Articles:
+
+- [HTTP/2 in Jetty](https://www.baeldung.com/jetty-http-2)
+- More articles: [[<-- prev]](../libraries-server)
diff --git a/libraries-server-2/pom.xml b/libraries-server-2/pom.xml
new file mode 100644
index 0000000000..5f500a7ced
--- /dev/null
+++ b/libraries-server-2/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+ libraries-server-2
+ 0.0.1-SNAPSHOT
+ libraries-server-2
+ war
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.eclipse.jetty
+ jetty-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-servlet
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-webapp
+ ${jetty.version}
+
+
+
+
+
+
+ org.eclipse.jetty
+ jetty-maven-plugin
+ ${jetty.version}
+
+ 8888
+ quit
+
+ -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn.version}/alpn-boot-${alpn.version}.jar
+
+ ${basedir}/src/main/config/jetty.xml
+
+ /
+
+
+
+
+ org.eclipse.jetty.http2
+ http2-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-alpn-openjdk8-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-servlets
+ ${jetty.version}
+
+
+
+
+
+
+
+ 9.4.27.v20200227
+ 8.1.11.v20170118
+
+
+
\ No newline at end of file
diff --git a/libraries-server/src/main/config/jetty.xml b/libraries-server-2/src/main/config/jetty.xml
similarity index 100%
rename from libraries-server/src/main/config/jetty.xml
rename to libraries-server-2/src/main/config/jetty.xml
diff --git a/libraries-server/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java b/libraries-server-2/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java
similarity index 100%
rename from libraries-server/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java
rename to libraries-server-2/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java
diff --git a/libraries-server/src/main/resources/keystore.jks b/libraries-server-2/src/main/resources/keystore.jks
similarity index 100%
rename from libraries-server/src/main/resources/keystore.jks
rename to libraries-server-2/src/main/resources/keystore.jks
diff --git a/libraries-server-2/src/main/resources/logback.xml b/libraries-server-2/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/libraries-server-2/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-server/src/main/resources/truststore.jks b/libraries-server-2/src/main/resources/truststore.jks
similarity index 100%
rename from libraries-server/src/main/resources/truststore.jks
rename to libraries-server-2/src/main/resources/truststore.jks
diff --git a/libraries-server/src/main/webapp/WEB-INF/web.xml b/libraries-server-2/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from libraries-server/src/main/webapp/WEB-INF/web.xml
rename to libraries-server-2/src/main/webapp/WEB-INF/web.xml
diff --git a/libraries-server/src/main/webapp/http2.html b/libraries-server-2/src/main/webapp/http2.html
similarity index 100%
rename from libraries-server/src/main/webapp/http2.html
rename to libraries-server-2/src/main/webapp/http2.html
diff --git a/libraries-server/src/main/webapp/images/homepage-latest_articles.jpg b/libraries-server-2/src/main/webapp/images/homepage-latest_articles.jpg
similarity index 100%
rename from libraries-server/src/main/webapp/images/homepage-latest_articles.jpg
rename to libraries-server-2/src/main/webapp/images/homepage-latest_articles.jpg
diff --git a/libraries-server/src/main/webapp/images/homepage-rest_with_spring.jpg b/libraries-server-2/src/main/webapp/images/homepage-rest_with_spring.jpg
similarity index 100%
rename from libraries-server/src/main/webapp/images/homepage-rest_with_spring.jpg
rename to libraries-server-2/src/main/webapp/images/homepage-rest_with_spring.jpg
diff --git a/libraries-server/src/main/webapp/images/homepage-weekly_reviews.jpg b/libraries-server-2/src/main/webapp/images/homepage-weekly_reviews.jpg
similarity index 100%
rename from libraries-server/src/main/webapp/images/homepage-weekly_reviews.jpg
rename to libraries-server-2/src/main/webapp/images/homepage-weekly_reviews.jpg
diff --git a/libraries-server/src/main/webapp/index.html b/libraries-server-2/src/main/webapp/index.html
similarity index 100%
rename from libraries-server/src/main/webapp/index.html
rename to libraries-server-2/src/main/webapp/index.html
diff --git a/libraries-server/README.md b/libraries-server/README.md
index 7e41f33a0c..570806611f 100644
--- a/libraries-server/README.md
+++ b/libraries-server/README.md
@@ -13,4 +13,4 @@ This module contains articles about server libraries.
- [MQTT Client in Java](https://www.baeldung.com/java-mqtt-client)
- [Guide to XMPP Smack Client](https://www.baeldung.com/xmpp-smack-chat-client)
- [A Guide to NanoHTTPD](https://www.baeldung.com/nanohttpd)
-- [HTTP/2 in Jetty](https://www.baeldung.com/jetty-http-2)
+- More articles: [[more -->]](../libraries-server-2)
\ No newline at end of file
diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml
index eb9cb61e56..d9546f1678 100644
--- a/libraries-server/pom.xml
+++ b/libraries-server/pom.xml
@@ -5,7 +5,6 @@
libraries-server
0.0.1-SNAPSHOT
libraries-server
- war
com.baeldung
@@ -107,50 +106,11 @@
-
-
-
- org.eclipse.jetty
- jetty-maven-plugin
- ${jetty.version}
-
- 8888
- quit
-
- -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn.version}/alpn-boot-${alpn.version}.jar
-
- ${basedir}/src/main/config/jetty.xml
-
- /
-
-
-
-
- org.eclipse.jetty.http2
- http2-server
- ${jetty.version}
-
-
- org.eclipse.jetty
- jetty-alpn-openjdk8-server
- ${jetty.version}
-
-
- org.eclipse.jetty
- jetty-servlets
- ${jetty.version}
-
-
-
-
-
-
3.6.2
4.5.3
9.4.27.v20200227
4.1.20.Final
- 8.1.11.v20170118
8.5.24
4.3.1
1.2.0
diff --git a/netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java b/netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java
new file mode 100644
index 0000000000..038f559329
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java
@@ -0,0 +1,116 @@
+package com.baeldung.http.server;
+
+import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST;
+import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE;
+import static io.netty.handler.codec.http.HttpResponseStatus.OK;
+import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
+
+import java.util.Set;
+
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http.DefaultFullHttpResponse;
+import io.netty.handler.codec.http.FullHttpResponse;
+import io.netty.handler.codec.http.HttpContent;
+import io.netty.handler.codec.http.HttpHeaderNames;
+import io.netty.handler.codec.http.HttpHeaderValues;
+import io.netty.handler.codec.http.HttpObject;
+import io.netty.handler.codec.http.HttpRequest;
+import io.netty.handler.codec.http.HttpUtil;
+import io.netty.handler.codec.http.LastHttpContent;
+import io.netty.handler.codec.http.cookie.Cookie;
+import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
+import io.netty.handler.codec.http.cookie.ServerCookieEncoder;
+import io.netty.util.CharsetUtil;
+
+public class CustomHttpServerHandler extends SimpleChannelInboundHandler