diff --git a/apache-velocity/src/main/webapp/WEB-INF/velocity.properties b/apache-velocity/src/main/webapp/WEB-INF/velocity.properties
index 00e0b7e410..97b19f4cb7 100644
--- a/apache-velocity/src/main/webapp/WEB-INF/velocity.properties
+++ b/apache-velocity/src/main/webapp/WEB-INF/velocity.properties
@@ -1,4 +1,4 @@
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader
-webapp.resource.loader.path = .
+webapp.resource.loader.path =
webapp.resource.loader.cache = true
\ No newline at end of file
diff --git a/bootique/config.yml b/bootique/config.yml
new file mode 100644
index 0000000000..269b4ab867
--- /dev/null
+++ b/bootique/config.yml
@@ -0,0 +1,11 @@
+log:
+ level: warn
+ appenders:
+ - type: file
+ logFormat: '%c{20}: %m%n'
+ file: /home/logger.log
+
+jetty:
+ context: /hello
+ connector:
+ port: 10001
diff --git a/bootique/dependency-reduced-pom.xml b/bootique/dependency-reduced-pom.xml
new file mode 100644
index 0000000000..ed18f4e42a
--- /dev/null
+++ b/bootique/dependency-reduced-pom.xml
@@ -0,0 +1,50 @@
+
+
+
+ bootique-parent
+ io.bootique.parent
+ 0.12
+
+ 4.0.0
+ com.baeldung.bootique
+ bootique
+ bootique
+ 1.0-SNAPSHOT
+ http://maven.apache.org
+
+
+
+ maven-shade-plugin
+
+
+
+
+
+ io.bootique
+ bootique-test
+ 0.23
+ test
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
+
+
+ io.bootique.bom
+ bootique-bom
+ 0.23
+ pom
+ import
+
+
+
+
+ com.baeldung.bootique.App
+
+
+
diff --git a/bootique/pom.xml b/bootique/pom.xml
new file mode 100644
index 0000000000..28b716e104
--- /dev/null
+++ b/bootique/pom.xml
@@ -0,0 +1,66 @@
+
+ 4.0.0
+ com.baeldung.bootique
+ bootique
+ jar
+ 1.0-SNAPSHOT
+ bootique
+ http://maven.apache.org
+
+
+ com.baeldung.bootique.App
+
+
+
+ io.bootique.parent
+ bootique-parent
+ 0.12
+
+
+
+
+
+ io.bootique.bom
+ bootique-bom
+ 0.23
+ pom
+ import
+
+
+
+
+
+
+ io.bootique.jersey
+ bootique-jersey
+ compile
+
+
+ io.bootique.logback
+ bootique-logback
+ compile
+
+
+ io.bootique
+ bootique-test
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/bootique/src/main/java/com/baeldung/bootique/App.java b/bootique/src/main/java/com/baeldung/bootique/App.java
new file mode 100644
index 0000000000..cc1b90ce7d
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/App.java
@@ -0,0 +1,41 @@
+package com.baeldung.bootique;
+
+import com.baeldung.bootique.module.ModuleBinder;
+import com.baeldung.bootique.router.IndexController;
+import com.baeldung.bootique.router.SaveController;
+import com.google.inject.Module;
+import io.bootique.Bootique;
+import io.bootique.jersey.JerseyModule;
+import io.bootique.log.BootLogger;
+
+import java.util.function.Supplier;
+
+public class App {
+
+ public static void main(String[] args) {
+ Module module = binder -> JerseyModule.extend(binder).addResource(IndexController.class)
+ .addResource(SaveController.class);
+ Bootique.app(args).module(module).module(ModuleBinder.class).bootLogger(new BootLogger() {
+ @Override
+ public void trace(Supplier arg0) {
+ // ...
+ }
+
+ @Override
+ public void stdout(String arg0) {
+ // ...
+ }
+
+ @Override
+ public void stderr(String arg0, Throwable arg1) {
+ // ...
+ }
+
+ @Override
+ public void stderr(String arg0) {
+ // ...
+ }
+ }).autoLoadModules().exec();
+ }
+
+}
diff --git a/bootique/src/main/java/com/baeldung/bootique/module/ModuleBinder.java b/bootique/src/main/java/com/baeldung/bootique/module/ModuleBinder.java
new file mode 100644
index 0000000000..8811d48652
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/module/ModuleBinder.java
@@ -0,0 +1,15 @@
+package com.baeldung.bootique.module;
+
+import com.baeldung.bootique.service.HelloService;
+import com.baeldung.bootique.service.impl.HelloServiceImpl;
+import com.google.inject.Binder;
+import com.google.inject.Module;
+
+public class ModuleBinder implements Module {
+
+ @Override
+ public void configure(Binder binder) {
+ binder.bind(HelloService.class).to(HelloServiceImpl.class);
+ }
+
+}
diff --git a/bootique/src/main/java/com/baeldung/bootique/module/ModuleProvider.java b/bootique/src/main/java/com/baeldung/bootique/module/ModuleProvider.java
new file mode 100644
index 0000000000..cf78177e6d
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/module/ModuleProvider.java
@@ -0,0 +1,13 @@
+package com.baeldung.bootique.module;
+
+import com.google.inject.Module;
+import io.bootique.BQModuleProvider;
+
+public class ModuleProvider implements BQModuleProvider {
+
+ @Override
+ public Module module() {
+ return new ModuleBinder();
+ }
+
+}
diff --git a/bootique/src/main/java/com/baeldung/bootique/router/IndexController.java b/bootique/src/main/java/com/baeldung/bootique/router/IndexController.java
new file mode 100644
index 0000000000..6e3b31df41
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/router/IndexController.java
@@ -0,0 +1,14 @@
+package com.baeldung.bootique.router;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+@Path("/")
+public class IndexController {
+
+ @GET
+ public String index() {
+ return "Hello, baeldung!";
+ }
+
+}
diff --git a/bootique/src/main/java/com/baeldung/bootique/router/SaveController.java b/bootique/src/main/java/com/baeldung/bootique/router/SaveController.java
new file mode 100644
index 0000000000..f38f59708c
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/router/SaveController.java
@@ -0,0 +1,20 @@
+package com.baeldung.bootique.router;
+
+import com.baeldung.bootique.service.HelloService;
+import com.google.inject.Inject;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+@Path("/save")
+public class SaveController {
+
+ @Inject
+ HelloService helloService;
+
+ @POST
+ public String save() {
+ return "Data Saved!";
+ }
+
+}
diff --git a/bootique/src/main/java/com/baeldung/bootique/service/HelloService.java b/bootique/src/main/java/com/baeldung/bootique/service/HelloService.java
new file mode 100644
index 0000000000..74c0401cc3
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/service/HelloService.java
@@ -0,0 +1,7 @@
+package com.baeldung.bootique.service;
+
+public interface HelloService {
+
+ boolean save();
+
+}
diff --git a/bootique/src/main/java/com/baeldung/bootique/service/impl/HelloServiceImpl.java b/bootique/src/main/java/com/baeldung/bootique/service/impl/HelloServiceImpl.java
new file mode 100644
index 0000000000..d2c0b5b838
--- /dev/null
+++ b/bootique/src/main/java/com/baeldung/bootique/service/impl/HelloServiceImpl.java
@@ -0,0 +1,12 @@
+package com.baeldung.bootique.service.impl;
+
+import com.baeldung.bootique.service.HelloService;
+
+public class HelloServiceImpl implements HelloService {
+
+ @Override
+ public boolean save() {
+ return true;
+ }
+
+}
diff --git a/bootique/src/main/resources/META-INF/services/io.bootique.BQModuleProvider b/bootique/src/main/resources/META-INF/services/io.bootique.BQModuleProvider
new file mode 100644
index 0000000000..714cf3a2df
--- /dev/null
+++ b/bootique/src/main/resources/META-INF/services/io.bootique.BQModuleProvider
@@ -0,0 +1 @@
+com.baeldung.bootique.module.ModuleProvider
\ No newline at end of file
diff --git a/bootique/src/test/java/com/baeldung/bootique/AppTest.java b/bootique/src/test/java/com/baeldung/bootique/AppTest.java
new file mode 100644
index 0000000000..8856780ed4
--- /dev/null
+++ b/bootique/src/test/java/com/baeldung/bootique/AppTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.bootique;
+
+import com.baeldung.bootique.service.HelloService;
+import io.bootique.BQRuntime;
+import io.bootique.test.junit.BQDaemonTestFactory;
+import io.bootique.test.junit.BQTestFactory;
+import org.junit.Rule;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class AppTest {
+
+ @Rule
+ public BQTestFactory bqTestFactory = new BQTestFactory();
+
+ @Rule
+ public BQDaemonTestFactory bqDaemonTestFactory = new BQDaemonTestFactory();
+
+ @Test
+ public void givenService_expectBoolen() {
+ BQRuntime runtime = bqTestFactory.app("--server").autoLoadModules().createRuntime();
+ HelloService service = runtime.getInstance(HelloService.class);
+ assertEquals(true, service.save());
+ }
+
+}
diff --git a/core-java-9/src/main/java/com/baeldung/java9/process/ServiceMain.java b/core-java-9/src/main/java/com/baeldung/java9/process/ServiceMain.java
index 299f74e877..5dc00dba25 100644
--- a/core-java-9/src/main/java/com/baeldung/java9/process/ServiceMain.java
+++ b/core-java-9/src/main/java/com/baeldung/java9/process/ServiceMain.java
@@ -6,7 +6,7 @@ public class ServiceMain {
public static void main(String[] args) throws InterruptedException {
ProcessHandle thisProcess = ProcessHandle.current();
- long pid = thisProcess.getPid();
+ long pid = thisProcess.pid();
Optional opArgs = Optional.ofNullable(args);
String procName = opArgs.map(str -> str.length > 0 ? str[0] : null).orElse(System.getProperty("sun.java.command"));
diff --git a/core-java-9/src/test/java/com/baeldung/java9/language/Java9ObjectsAPIUnitTest.java b/core-java-9/src/test/java/com/baeldung/java9/language/Java9ObjectsAPIUnitTest.java
new file mode 100644
index 0000000000..93579019a1
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/java9/language/Java9ObjectsAPIUnitTest.java
@@ -0,0 +1,86 @@
+package com.baeldung.java9.language;
+
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+import static org.hamcrest.Matchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class Java9ObjectsAPIUnitTest {
+
+ private List aMethodReturningNullList(){
+ return null;
+ }
+
+ @Test
+ public void givenNullObject_whenRequireNonNullElse_thenElse(){
+ List aList = Objects.requireNonNullElse(
+ aMethodReturningNullList(), Collections.EMPTY_LIST);
+ assertThat(aList, is(Collections.EMPTY_LIST));
+ }
+
+ private List aMethodReturningNonNullList(){
+ return List.of("item1", "item2");
+ }
+
+ @Test
+ public void givenObject_whenRequireNonNullElse_thenObject(){
+ List aList = Objects.requireNonNullElse(
+ aMethodReturningNonNullList(), Collections.EMPTY_LIST);
+ assertThat(aList, is(List.of("item1", "item2")));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNull_whenRequireNonNullElse_thenException(){
+ Objects.requireNonNullElse(null, null);
+ }
+
+ @Test
+ public void givenObject_whenRequireNonNullElseGet_thenObject(){
+ List aList = Objects.requireNonNullElseGet(null, List::of);
+ assertThat(aList, is(List.of()));
+ }
+
+ @Test
+ public void givenNumber_whenInvokeCheckIndex_thenNumber(){
+ int length = 5;
+ assertThat(Objects.checkIndex(4, length), is(4));
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void givenOutOfRangeNumber_whenInvokeCheckIndex_thenException(){
+ int length = 5;
+ Objects.checkIndex(5, length);
+ }
+
+
+ @Test
+ public void givenSubRange_whenCheckFromToIndex_thenNumber(){
+ int length = 6;
+ assertThat(Objects.checkFromToIndex(2,length,length), is(2));
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void givenInvalidSubRange_whenCheckFromToIndex_thenException(){
+ int length = 6;
+ Objects.checkFromToIndex(2,7,length);
+ }
+
+
+ @Test
+ public void givenSubRange_whenCheckFromIndexSize_thenNumber(){
+ int length = 6;
+ assertThat(Objects.checkFromIndexSize(2,3,length), is(2));
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void givenInvalidSubRange_whenCheckFromIndexSize_thenException(){
+ int length = 6;
+ Objects.checkFromIndexSize(2, 6, length);
+ }
+
+
+}
diff --git a/core-java/hashcode/pom.xml b/core-java/hashcode/pom.xml
deleted file mode 100644
index 393aa69153..0000000000
--- a/core-java/hashcode/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
- 4.0.0
- com.baeldung.hashcode
- hashcode
- 1.0
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 1.8
- 1.8
-
-
-
-
-
-
- junit
- junit
- 4.12
- test
-
-
- org.slf4j
- slf4j-api
- 1.7.25
-
-
- org.slf4j
- slf4j-simple
- 1.7.25
-
-
-
\ No newline at end of file
diff --git a/core-java/hashcode/src/main/java/com/baeldung/application/Application.java b/core-java/hashcode/src/main/java/com/baeldung/application/Application.java
deleted file mode 100644
index 08c670c82f..0000000000
--- a/core-java/hashcode/src/main/java/com/baeldung/application/Application.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.application;
-
-import com.baeldung.entities.User;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Application {
-
- public static void main(String[] args) {
- Map users = new HashMap<>();
- User user1 = new User(1L, "John", "john@domain.com");
- User user2 = new User(2L, "Jennifer", "jennifer@domain.com");
- User user3 = new User(3L, "Mary", "mary@domain.com");
-
- users.put(user1, user1);
- users.put(user2, user2);
- users.put(user3, user3);
-
- if (users.containsKey(user1)) {
- System.out.print("User found in the collection");
- }
- }
-}
diff --git a/core-java/hashcode/src/main/java/com/baeldung/entities/User.java b/core-java/hashcode/src/main/java/com/baeldung/entities/User.java
deleted file mode 100644
index a976233562..0000000000
--- a/core-java/hashcode/src/main/java/com/baeldung/entities/User.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.baeldung.entities;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class User {
-
- private final Logger logger = LoggerFactory.getLogger(User.class);
- private long id;
- private String name;
- private String email;
-
- public User(long id, String name, String email) {
- this.id = id;
- this.name = name;
- this.email = email;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null) return false;
- if (this.getClass() != o.getClass()) return false;
- User user = (User) o;
- return id != user.id && (!name.equals(user.name) && !email.equals(user.email));
- }
-
- @Override
- public int hashCode() {
- int hash = 7;
- hash = 31 * hash + (int) id;
- hash = 31 * hash + (name == null ? 0 : name.hashCode());
- hash = 31 * hash + (email == null ? 0 : email.hashCode());
- logger.info("hashCode() method called - Computed hash: " + hash);
- return hash;
- }
- // getters and setters here
-}
diff --git a/core-java/hashcode/src/test/java/com/baeldung/application/ApplicationTest.java b/core-java/hashcode/src/test/java/com/baeldung/application/ApplicationTest.java
deleted file mode 100644
index dcd853f451..0000000000
--- a/core-java/hashcode/src/test/java/com/baeldung/application/ApplicationTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.application;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import static org.junit.Assert.assertEquals;
-
-public class ApplicationTest {
-
- private ByteArrayOutputStream outContent;
-
- @Before
- public void setUpPrintStreamInstance() throws Exception {
- this.outContent = new ByteArrayOutputStream();
- System.setOut(new PrintStream(outContent));
- }
-
- @After
- public void tearDownByteArrayOutputStream() throws Exception {
- outContent = null;
- }
-
- @Test
- public void main_NoInputState_TextPrintedToConsole() throws Exception {
- Application.main(new String[]{});
- assertEquals("User found in the collection", outContent.toString());
- }
-}
\ No newline at end of file
diff --git a/core-java/hashcode/src/test/java/com/baeldung/entities/UserTest.java b/core-java/hashcode/src/test/java/com/baeldung/entities/UserTest.java
deleted file mode 100644
index 01f6085d7e..0000000000
--- a/core-java/hashcode/src/test/java/com/baeldung/entities/UserTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.baeldung.entities;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class UserTest {
-
- private User user;
- private User comparisonUser;
-
- @Before
- public void setUpUserInstances() {
- this.user = new User(1L, "test", "test@domain.com");
- this.comparisonUser = this.user;
- }
-
- @After
- public void tearDownUserInstances() {
- user = null;
- comparisonUser = null;
- }
-
- @Test
- public void equals_EqualUserInstance_TrueAssertion(){
- Assert.assertTrue(user.equals(comparisonUser));
- }
-
- @Test
- public void hashCode_UserHash_TrueAssertion() {
- Assert.assertEquals(1792276941, user.hashCode());
- }
-}
\ No newline at end of file
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 73b1c22ed8..422965a0ed 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -80,7 +80,11 @@
-
+
+ log4j
+ log4j
+ 1.2.17
+
org.slf4j
slf4j-api
diff --git a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
index 977dae4fdb..758bdecd0c 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
+++ b/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
@@ -15,14 +15,12 @@ public class CyclicBarrierDemo {
private int NUM_PARTIAL_RESULTS;
private int NUM_WORKERS;
-
private void runSimulation(int numWorkers, int numberOfPartialResults) {
NUM_PARTIAL_RESULTS = numberOfPartialResults;
NUM_WORKERS = numWorkers;
cyclicBarrier = new CyclicBarrier(NUM_WORKERS, new AggregatorThread());
- System.out.println("Spawning " + NUM_WORKERS + " worker threads to compute "
- + NUM_PARTIAL_RESULTS + " partial results each");
+ System.out.println("Spawning " + NUM_WORKERS + " worker threads to compute " + NUM_PARTIAL_RESULTS + " partial results each");
for (int i = 0; i < NUM_WORKERS; i++) {
Thread worker = new Thread(new NumberCruncherThread());
worker.setName("Thread " + i);
@@ -38,8 +36,7 @@ public class CyclicBarrierDemo {
List partialResult = new ArrayList<>();
for (int i = 0; i < NUM_PARTIAL_RESULTS; i++) {
Integer num = random.nextInt(10);
- System.out.println(thisThreadName
- + ": Crunching some numbers! Final result - " + num);
+ System.out.println(thisThreadName + ": Crunching some numbers! Final result - " + num);
partialResult.add(num);
}
partialResults.add(partialResult);
@@ -57,13 +54,12 @@ public class CyclicBarrierDemo {
@Override
public void run() {
String thisThreadName = Thread.currentThread().getName();
- System.out.println(thisThreadName + ": Computing final sum of " + NUM_WORKERS
- + " workers, having " + NUM_PARTIAL_RESULTS + " results each.");
+ System.out.println(thisThreadName + ": Computing final sum of " + NUM_WORKERS + " workers, having " + NUM_PARTIAL_RESULTS + " results each.");
int sum = 0;
for (List threadResult : partialResults) {
System.out.print("Adding ");
for (Integer partialResult : threadResult) {
- System.out.print(partialResult+" ");
+ System.out.print(partialResult + " ");
sum += partialResult;
}
System.out.println();
diff --git a/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java b/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
index c5672706ad..4de420900a 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
+++ b/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
@@ -15,7 +15,8 @@ public class Philosopher implements Runnable {
Thread.sleep(((int) (Math.random() * 100)));
}
- @Override public void run() {
+ @Override
+ public void run() {
try {
while (true) {
doAction(System.nanoTime() + ": Thinking"); // thinking
diff --git a/core-java/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java b/core-java/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
index ae2b279d9a..83a9fb6692 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
+++ b/core-java/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
@@ -6,22 +6,22 @@ import java.util.concurrent.TimeUnit;
public class ExecutorServiceDemo {
- ExecutorService executor = Executors.newFixedThreadPool(10);
+ ExecutorService executor = Executors.newFixedThreadPool(10);
- public void execute() {
+ public void execute() {
- executor.submit(() -> {
- new Task();
- });
+ executor.submit(() -> {
+ new Task();
+ });
- executor.shutdown();
- executor.shutdownNow();
- try {
- executor.awaitTermination(20l, TimeUnit.NANOSECONDS);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
+ executor.shutdown();
+ executor.shutdownNow();
+ try {
+ executor.awaitTermination(20l, TimeUnit.NANOSECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
- }
+ }
}
diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/FutureDemo.java b/core-java/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
index 7cb611be0f..4794d5cb61 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
+++ b/core-java/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
@@ -9,36 +9,36 @@ import java.util.concurrent.TimeoutException;
public class FutureDemo {
- public String invoke() {
+ public String invoke() {
- String str = null;
+ String str = null;
- ExecutorService executorService = Executors.newFixedThreadPool(10);
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
- Future future = executorService.submit(() -> {
- // Task
- Thread.sleep(10000l);
- return "Hellow world";
- });
+ Future future = executorService.submit(() -> {
+ // Task
+ Thread.sleep(10000l);
+ return "Hellow world";
+ });
- future.cancel(false);
+ future.cancel(false);
- try {
- future.get(20, TimeUnit.SECONDS);
- } catch (InterruptedException | ExecutionException | TimeoutException e1) {
- e1.printStackTrace();
- }
+ try {
+ future.get(20, TimeUnit.SECONDS);
+ } catch (InterruptedException | ExecutionException | TimeoutException e1) {
+ e1.printStackTrace();
+ }
- if (future.isDone() && !future.isCancelled()) {
- try {
- str = future.get();
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
- }
+ if (future.isDone() && !future.isCancelled()) {
+ try {
+ str = future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
- return str;
+ return str;
- }
+ }
}
diff --git a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java b/core-java/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
index 8744027e40..f708804cae 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
+++ b/core-java/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
@@ -4,20 +4,20 @@ import java.util.concurrent.ThreadFactory;
public class BaeldungThreadFactory implements ThreadFactory {
- private int threadId;
- private String name;
+ private int threadId;
+ private String name;
- public BaeldungThreadFactory(String name) {
- threadId = 1;
- this.name = name;
- }
+ public BaeldungThreadFactory(String name) {
+ threadId = 1;
+ this.name = name;
+ }
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r, name + "-Thread_" + threadId);
- System.out.println("created new thread with id : " + threadId + " and name : " + t.getName());
- threadId++;
- return t;
- }
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r, name + "-Thread_" + threadId);
+ System.out.println("created new thread with id : " + threadId + " and name : " + t.getName());
+ threadId++;
+ return t;
+ }
}
diff --git a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/Task.java b/core-java/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
index 04ba62d457..a69623c667 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
+++ b/core-java/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
@@ -2,9 +2,9 @@ package com.baeldung.concurrent.threadfactory;
public class Task implements Runnable {
- @Override
- public void run() {
- // task details
- }
-
+ @Override
+ public void run() {
+ // task details
+ }
+
}
diff --git a/core-java/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java b/core-java/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
new file mode 100644
index 0000000000..3f24df5059
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
@@ -0,0 +1,13 @@
+package com.baeldung.concurrent.volatilekeyword;
+
+
+public class SharedObject {
+ private volatile int count=0;
+
+ public void increamentCount(){
+ count++;
+ }
+ public int getCount(){
+ return count;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
new file mode 100644
index 0000000000..0d69d0e7ec
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
@@ -0,0 +1,13 @@
+package com.baeldung.designpatterns.adapter;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+
+public class AdapterPatternDriver {
+
+ public static void main(String args[]) {
+ LuxuryCarsSpeedAdapter luxuryCars = new LuxuryCarsSpeedAdapterImpl();
+ LOG.info("Bugatti Veyron Super Sport's top speed is " + luxuryCars.bugattiVeyronInKMPH() + " Kmph.");
+ LOG.info("McLaren F1 top speed is " + luxuryCars.mcLarenInKMPH() + " Kmph.");
+ LOG.info("Aston Martin One-77 top speed is " + luxuryCars.astonMartinInKMPH() + " Kmph.");
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeed.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeed.java
new file mode 100644
index 0000000000..278329b994
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeed.java
@@ -0,0 +1,15 @@
+package com.baeldung.designpatterns.adapter;
+
+public class LuxuryCarsSpeed {
+ public double bugattiVeyronInMPH() {
+ return 268;
+ }
+
+ public double mcLarenInMPH() {
+ return 241;
+ }
+
+ public double astonMartinInMPH() {
+ return 220;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapter.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapter.java
new file mode 100644
index 0000000000..84f7be2729
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapter.java
@@ -0,0 +1,7 @@
+package com.baeldung.designpatterns.adapter;
+
+public interface LuxuryCarsSpeedAdapter {
+ public double bugattiVeyronInKMPH();
+ public double mcLarenInKMPH();
+ public double astonMartinInKMPH();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapterImpl.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapterImpl.java
new file mode 100644
index 0000000000..2767b78e38
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapterImpl.java
@@ -0,0 +1,26 @@
+package com.baeldung.designpatterns.adapter;
+
+public class LuxuryCarsSpeedAdapterImpl extends LuxuryCarsSpeed implements LuxuryCarsSpeedAdapter {
+
+ @Override
+ public double bugattiVeyronInKMPH() {
+ double mph = super.bugattiVeyronInMPH();
+ return convertMPHtoKMPH(mph);
+ }
+
+ @Override
+ public double mcLarenInKMPH() {
+ double mph = super.mcLarenInMPH();
+ return convertMPHtoKMPH(mph);
+ }
+
+ @Override
+ public double astonMartinInKMPH() {
+ double mph = super.astonMartinInMPH();
+ return convertMPHtoKMPH(mph);
+ }
+
+ private double convertMPHtoKMPH(double mph) {
+ return mph * 1.60934;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java
new file mode 100644
index 0000000000..97a4a9508c
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java
@@ -0,0 +1,12 @@
+package com.baeldung.designpatterns.bridge;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+
+public class Blue implements Color {
+
+ @Override
+ public void fillColor() {
+ LOG.info("Color : Blue");
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java
new file mode 100644
index 0000000000..921deadcac
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java
@@ -0,0 +1,14 @@
+package com.baeldung.designpatterns.bridge;
+
+public class BridgePatternDriver {
+
+ public static void main(String[] args) {
+ //a square with red color
+ Shape square = new Square(new Red());
+ square.drawShape();
+
+ //a triangle with blue color
+ Shape triangle = new Triangle(new Blue());
+ triangle.drawShape();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java
new file mode 100644
index 0000000000..91d2b01609
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.bridge;
+
+public interface Color {
+ public void fillColor();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java
new file mode 100644
index 0000000000..8c22a94f00
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java
@@ -0,0 +1,12 @@
+package com.baeldung.designpatterns.bridge;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+
+public class Red implements Color {
+
+ @Override
+ public void fillColor() {
+ LOG.info("Color : Red");
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java
new file mode 100644
index 0000000000..c4daf7a821
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java
@@ -0,0 +1,11 @@
+package com.baeldung.designpatterns.bridge;
+
+public abstract class Shape {
+ protected Color color;
+
+ public Shape(Color color) {
+ this.color = color;
+ }
+
+ abstract public void drawShape();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java
new file mode 100644
index 0000000000..6b377197eb
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java
@@ -0,0 +1,16 @@
+package com.baeldung.designpatterns.bridge;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+
+public class Square extends Shape {
+
+ public Square(Color color) {
+ super(color);
+ }
+
+ @Override
+ public void drawShape() {
+ LOG.info("Square drawn. ");
+ color.fillColor();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java
new file mode 100644
index 0000000000..900e78cf2b
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java
@@ -0,0 +1,16 @@
+package com.baeldung.designpatterns.bridge;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+
+public class Triangle extends Shape {
+
+ public Triangle(Color color) {
+ super(color);
+ }
+
+ @Override
+ public void drawShape() {
+ LOG.info("Triangle drawn. ");
+ color.fillColor();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/BubbleLights.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/BubbleLights.java
new file mode 100644
index 0000000000..881add8b21
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/BubbleLights.java
@@ -0,0 +1,16 @@
+package com.baeldung.designpatterns.decorator;
+
+public class BubbleLights extends TreeDecorator {
+
+ public BubbleLights(ChristmasTree tree) {
+ super(tree);
+ }
+
+ public String decorate() {
+ return super.decorate() + decorateWithBubbleLights();
+ }
+
+ private String decorateWithBubbleLights() {
+ return " with Bubble Lights";
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java
new file mode 100644
index 0000000000..80a0865567
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.decorator;
+
+public interface ChristmasTree {
+ public String decorate();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTreeImpl.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTreeImpl.java
new file mode 100644
index 0000000000..9241fd59db
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTreeImpl.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.decorator;
+
+public class ChristmasTreeImpl implements ChristmasTree {
+
+ @Override
+ public String decorate() {
+ return "Christmas tree";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/DecoratorPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/DecoratorPatternDriver.java
new file mode 100644
index 0000000000..f70991da6b
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/DecoratorPatternDriver.java
@@ -0,0 +1,20 @@
+package com.baeldung.designpatterns.decorator;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+
+public class DecoratorPatternDriver {
+
+ public static void main(String[] args) {
+ //christmas tree with just one Garland
+ ChristmasTree tree1 = new Garland(new ChristmasTreeImpl());
+ LOG.info(tree1.decorate());
+
+ //christmas tree with two Garlands and one Bubble lights
+ ChristmasTree tree2 = new BubbleLights(new Garland(
+ new Garland(new ChristmasTreeImpl()))
+ );
+ LOG.info(tree2.decorate());
+
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/Garland.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/Garland.java
new file mode 100644
index 0000000000..d2efd6e451
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/Garland.java
@@ -0,0 +1,16 @@
+package com.baeldung.designpatterns.decorator;
+
+public class Garland extends TreeDecorator {
+
+ public Garland(ChristmasTree tree) {
+ super(tree);
+ }
+
+ public String decorate() {
+ return super.decorate() + decorateWithGarland();
+ }
+
+ private String decorateWithGarland() {
+ return " with Garland";
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/TreeDecorator.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/TreeDecorator.java
new file mode 100644
index 0000000000..5427d2ac7e
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/TreeDecorator.java
@@ -0,0 +1,15 @@
+package com.baeldung.designpatterns.decorator;
+
+public abstract class TreeDecorator implements ChristmasTree {
+ private ChristmasTree tree;
+
+ public TreeDecorator(ChristmasTree tree) {
+ this.tree = tree;
+ }
+
+ @Override
+ public String decorate() {
+ return tree.decorate();
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java
new file mode 100644
index 0000000000..96a6bfb878
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.proxy;
+
+public interface ExpensiveObject {
+ public void process();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObjectImpl.java b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObjectImpl.java
new file mode 100644
index 0000000000..7014d3811c
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObjectImpl.java
@@ -0,0 +1,20 @@
+package com.baeldung.designpatterns.proxy;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;;
+
+public class ExpensiveObjectImpl implements ExpensiveObject {
+
+ public ExpensiveObjectImpl() {
+ heavyInitialConfiguration();
+ }
+
+ @Override
+ public void process() {
+ LOG.info("processing complete.");
+ }
+
+ private void heavyInitialConfiguration() {
+ LOG.info("Loading initial configuration...");
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObjectProxy.java b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObjectProxy.java
new file mode 100644
index 0000000000..f36e688c90
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObjectProxy.java
@@ -0,0 +1,13 @@
+package com.baeldung.designpatterns.proxy;
+
+public class ExpensiveObjectProxy implements ExpensiveObject{
+ private static ExpensiveObject object;
+
+ @Override
+ public void process() {
+ if(object == null) {
+ object = new ExpensiveObjectImpl();
+ }
+ object.process();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/proxy/ProxyPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ProxyPatternDriver.java
new file mode 100644
index 0000000000..088b069e28
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ProxyPatternDriver.java
@@ -0,0 +1,9 @@
+package com.baeldung.designpatterns.proxy;
+
+public class ProxyPatternDriver {
+ public static void main(String[] args) {
+ ExpensiveObject object = new ExpensiveObjectProxy();
+ object.process();
+ object.process();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/singleton/ClassSingleton.java b/core-java/src/main/java/com/baeldung/designpatterns/singleton/ClassSingleton.java
new file mode 100644
index 0000000000..0fc86e30a7
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/singleton/ClassSingleton.java
@@ -0,0 +1,28 @@
+package com.baeldung.designpatterns.singleton;
+
+public class ClassSingleton {
+
+ private static ClassSingleton INSTANCE;
+ private String info = "Initial class info";
+
+ private ClassSingleton(){
+ }
+
+ public static ClassSingleton getInstance(){
+ if(INSTANCE == null){
+ INSTANCE = new ClassSingleton();
+ }
+
+ return INSTANCE;
+ }
+
+ // getters and setters
+
+ public String getInfo() {
+ return info;
+ }
+
+ public void setInfo(String info) {
+ this.info = info;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/singleton/EnumSingleton.java b/core-java/src/main/java/com/baeldung/designpatterns/singleton/EnumSingleton.java
new file mode 100644
index 0000000000..f75484477b
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/singleton/EnumSingleton.java
@@ -0,0 +1,26 @@
+package com.baeldung.designpatterns.singleton;
+
+public enum EnumSingleton {
+
+ INSTANCE("Initial enum info"); //Name of the single instance
+
+ private String info;
+
+ private EnumSingleton(String info) {
+ this.info = info;
+ }
+
+ public EnumSingleton getInstance(){
+ return INSTANCE;
+ }
+
+ //getters and setters
+
+ public String getInfo() {
+ return info;
+ }
+
+ public void setInfo(String info) {
+ this.info = info;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/singleton/Sandbox.java b/core-java/src/main/java/com/baeldung/designpatterns/singleton/Sandbox.java
new file mode 100644
index 0000000000..f8ca2ffa78
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/singleton/Sandbox.java
@@ -0,0 +1,32 @@
+package com.baeldung.designpatterns.singleton;
+
+public class Sandbox {
+
+ public static void main(String[] args) {
+
+ //Class singleton
+
+ ClassSingleton classSingleton1 = ClassSingleton.getInstance();
+ //OurSingleton object1 = new OurSingleton(); // The constructor OurSingleton() is not visible
+
+ System.out.println(classSingleton1.getInfo()); //Initial class info
+
+ ClassSingleton classSingleton2 = ClassSingleton.getInstance();
+ classSingleton2.setInfo("New class info");
+
+ System.out.println(classSingleton1.getInfo()); //New class info
+ System.out.println(classSingleton2.getInfo()); //New class info
+
+ //Enum singleton
+
+ EnumSingleton enumSingleton1 = EnumSingleton.INSTANCE.getInstance();
+
+ System.out.println(enumSingleton1.getInfo()); //Initial enum info
+
+ EnumSingleton enumSingleton2 = EnumSingleton.INSTANCE.getInstance();
+ enumSingleton2.setInfo("New enum info");
+
+ System.out.println(enumSingleton1.getInfo()); //New enum info
+ System.out.println(enumSingleton2.getInfo()); //New enum info
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/util/LogerUtil.java b/core-java/src/main/java/com/baeldung/designpatterns/util/LogerUtil.java
new file mode 100644
index 0000000000..f7b6e4f3e9
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/util/LogerUtil.java
@@ -0,0 +1,35 @@
+package com.baeldung.designpatterns.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+public class LogerUtil {
+
+ public final static Logger LOG = Logger.getLogger("GLOBAL");
+
+ static {
+ configuration();
+ }
+
+ private static void configuration() {
+ Properties props = new Properties();
+ try {
+ props.load(
+ new BufferedReader(
+ new InputStreamReader(
+ LogerUtil.class.getResourceAsStream("/log4jstructuraldp.properties")
+ )
+ )
+ );
+ } catch (IOException e) {
+ System.out.println("log4jstructuraldp.properties file not configured properly");
+ System.exit(0);
+ }
+ PropertyConfigurator.configure(props);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java b/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java
index 4afce56e39..7e6bb5d3b2 100644
--- a/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java
+++ b/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java
@@ -14,26 +14,25 @@ public class LookupFSJNDI {
super();
init();
}
-
+
private void init() throws NamingException {
Hashtable env = new Hashtable();
-
- env.put (Context.INITIAL_CONTEXT_FACTORY,
- "com.sun.jndi.fscontext.RefFSContextFactory");
+
+ env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
// URI to namespace (actual directory)
env.put(Context.PROVIDER_URL, "file:./src/test/resources");
-
+
ctx = new InitialContext(env);
}
public InitialContext getCtx() {
return ctx;
}
-
+
public File getFile(String fileName) {
File file;
try {
- file = (File)getCtx().lookup(fileName);
+ file = (File) getCtx().lookup(fileName);
} catch (NamingException e) {
file = null;
}
diff --git a/core-java/src/main/java/com/baeldung/hashcode/application/Application.java b/core-java/src/main/java/com/baeldung/hashcode/application/Application.java
deleted file mode 100644
index 08c670c82f..0000000000
--- a/core-java/src/main/java/com/baeldung/hashcode/application/Application.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.application;
-
-import com.baeldung.entities.User;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Application {
-
- public static void main(String[] args) {
- Map users = new HashMap<>();
- User user1 = new User(1L, "John", "john@domain.com");
- User user2 = new User(2L, "Jennifer", "jennifer@domain.com");
- User user3 = new User(3L, "Mary", "mary@domain.com");
-
- users.put(user1, user1);
- users.put(user2, user2);
- users.put(user3, user3);
-
- if (users.containsKey(user1)) {
- System.out.print("User found in the collection");
- }
- }
-}
diff --git a/core-java/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java/src/main/java/com/baeldung/hashcode/entities/User.java
index a976233562..c46c3de65a 100644
--- a/core-java/src/main/java/com/baeldung/hashcode/entities/User.java
+++ b/core-java/src/main/java/com/baeldung/hashcode/entities/User.java
@@ -1,4 +1,4 @@
-package com.baeldung.entities;
+package com.baeldung.hashcode.entities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -18,13 +18,16 @@ public class User {
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null) return false;
- if (this.getClass() != o.getClass()) return false;
+ if (this == o)
+ return true;
+ if (o == null)
+ return false;
+ if (this.getClass() != o.getClass())
+ return false;
User user = (User) o;
return id != user.id && (!name.equals(user.name) && !email.equals(user.email));
}
-
+
@Override
public int hashCode() {
int hash = 7;
diff --git a/core-java/src/main/java/com/baeldung/java/networking/udp/broadcast/BroadcastingClient.java b/core-java/src/main/java/com/baeldung/java/networking/udp/broadcast/BroadcastingClient.java
new file mode 100644
index 0000000000..3162ff0b1e
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/networking/udp/broadcast/BroadcastingClient.java
@@ -0,0 +1,85 @@
+package com.baeldung.java.networking.udp.broadcast;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class BroadcastingClient {
+ private DatagramSocket socket;
+ private InetAddress address;
+ private int expectedServerCount;
+ private byte[] buf;
+
+ public BroadcastingClient(int expectedServerCount) throws Exception {
+ this.expectedServerCount = expectedServerCount;
+ this.address = InetAddress.getByName("255.255.255.255");
+ }
+
+ public int discoverServers(String msg) throws IOException {
+ initializeSocketForBroadcasting();
+ copyMessageOnBuffer(msg);
+
+ // When we want to broadcast not just to local network, call listAllBroadcastAddresses() and execute broadcastPacket for each value.
+ broadcastPacket(address);
+
+ return receivePackets();
+ }
+
+ List listAllBroadcastAddresses() throws SocketException {
+ List broadcastList = new ArrayList<>();
+ Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
+ while (interfaces.hasMoreElements()) {
+ NetworkInterface networkInterface = interfaces.nextElement();
+
+ if (networkInterface.isLoopback() || !networkInterface.isUp()) {
+ continue;
+ }
+
+ broadcastList.addAll(networkInterface.getInterfaceAddresses()
+ .stream()
+ .filter(address -> address.getBroadcast() != null)
+ .map(address -> address.getBroadcast())
+ .collect(Collectors.toList()));
+ }
+ return broadcastList;
+ }
+
+ private void initializeSocketForBroadcasting() throws SocketException {
+ socket = new DatagramSocket();
+ socket.setBroadcast(true);
+ }
+
+ private void copyMessageOnBuffer(String msg) {
+ buf = msg.getBytes();
+ }
+
+ private void broadcastPacket(InetAddress address) throws IOException {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
+ socket.send(packet);
+ }
+
+ private int receivePackets() throws IOException {
+ int serversDiscovered = 0;
+ while (serversDiscovered != expectedServerCount) {
+ receivePacket();
+ serversDiscovered++;
+ }
+ return serversDiscovered;
+ }
+
+ private void receivePacket() throws IOException {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length);
+ socket.receive(packet);
+ }
+
+ public void close() {
+ socket.close();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/java/networking/udp/broadcast/BroadcastingEchoServer.java b/core-java/src/main/java/com/baeldung/java/networking/udp/broadcast/BroadcastingEchoServer.java
new file mode 100644
index 0000000000..afc50e1f40
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/networking/udp/broadcast/BroadcastingEchoServer.java
@@ -0,0 +1,44 @@
+package com.baeldung.java.networking.udp.broadcast;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+
+public class BroadcastingEchoServer extends Thread {
+
+ protected DatagramSocket socket = null;
+ protected boolean running;
+ protected byte[] buf = new byte[256];
+
+ public BroadcastingEchoServer() throws IOException {
+ socket = new DatagramSocket(null);
+ socket.setReuseAddress(true);
+ socket.bind(new InetSocketAddress(4445));
+ }
+
+ public void run() {
+ running = true;
+
+ while (running) {
+ try {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length);
+ socket.receive(packet);
+ InetAddress address = packet.getAddress();
+ int port = packet.getPort();
+ packet = new DatagramPacket(buf, buf.length, address, port);
+ String received = new String(packet.getData(), 0, packet.getLength());
+ if (received.equals("end")) {
+ running = false;
+ continue;
+ }
+ socket.send(packet);
+ } catch (IOException e) {
+ e.printStackTrace();
+ running = false;
+ }
+ }
+ socket.close();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/java/networking/udp/multicast/MulticastEchoServer.java b/core-java/src/main/java/com/baeldung/java/networking/udp/multicast/MulticastEchoServer.java
new file mode 100644
index 0000000000..cae5c27d95
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/networking/udp/multicast/MulticastEchoServer.java
@@ -0,0 +1,41 @@
+package com.baeldung.java.networking.udp.multicast;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+
+public class MulticastEchoServer extends Thread {
+
+ protected MulticastSocket socket = null;
+ protected byte[] buf = new byte[256];
+ protected InetAddress group = null;
+
+ public MulticastEchoServer() throws IOException {
+ socket = new MulticastSocket(4446);
+ socket.setReuseAddress(true);
+ group = InetAddress.getByName("230.0.0.0");
+ socket.joinGroup(group);
+ }
+
+ public void run() {
+ try {
+ while (true) {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length);
+ socket.receive(packet);
+ InetAddress address = packet.getAddress();
+ int port = packet.getPort();
+ packet = new DatagramPacket(buf, buf.length, address, port);
+ String received = new String(packet.getData(), 0, packet.getLength());
+ if (received.equals("end")) {
+ break;
+ }
+ socket.send(packet);
+ }
+ socket.leaveGroup(group);
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/java/networking/udp/multicast/MulticastingClient.java b/core-java/src/main/java/com/baeldung/java/networking/udp/multicast/MulticastingClient.java
new file mode 100644
index 0000000000..4e425055fe
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/networking/udp/multicast/MulticastingClient.java
@@ -0,0 +1,53 @@
+package com.baeldung.java.networking.udp.multicast;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+
+public class MulticastingClient {
+ private DatagramSocket socket;
+ private InetAddress group;
+ private int expectedServerCount;
+ private byte[] buf;
+
+ public MulticastingClient(int expectedServerCount) throws Exception {
+ this.expectedServerCount = expectedServerCount;
+ this.socket = new DatagramSocket();
+ this.group = InetAddress.getByName("230.0.0.0");
+ }
+
+ public int discoverServers(String msg) throws IOException {
+ copyMessageOnBuffer(msg);
+ multicastPacket();
+
+ return receivePackets();
+ }
+
+ private void copyMessageOnBuffer(String msg) {
+ buf = msg.getBytes();
+ }
+
+ private void multicastPacket() throws IOException {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446);
+ socket.send(packet);
+ }
+
+ private int receivePackets() throws IOException {
+ int serversDiscovered = 0;
+ while (serversDiscovered != expectedServerCount) {
+ receivePacket();
+ serversDiscovered++;
+ }
+ return serversDiscovered;
+ }
+
+ private void receivePacket() throws IOException {
+ DatagramPacket packet = new DatagramPacket(buf, buf.length);
+ socket.receive(packet);
+ }
+
+ public void close() {
+ socket.close();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java b/core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java
index 220b9a8ec6..21044f82c4 100644
--- a/core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java
+++ b/core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java
@@ -10,7 +10,6 @@ public class JMXTutorialMainlauncher {
private static final Logger LOG = LoggerFactory.getLogger(JMXTutorialMainlauncher.class);
-
public static void main(String[] args) {
// TODO Auto-generated method stub
diff --git a/core-java/src/main/java/com/baeldung/socket/EchoClient.java b/core-java/src/main/java/com/baeldung/socket/EchoClient.java
index cf5c253276..fa3901d5da 100644
--- a/core-java/src/main/java/com/baeldung/socket/EchoClient.java
+++ b/core-java/src/main/java/com/baeldung/socket/EchoClient.java
@@ -8,9 +8,8 @@ import java.net.*;
public class EchoClient {
-
private static final Logger LOG = LoggerFactory.getLogger(EchoClient.class);
-
+
private Socket clientSocket;
private PrintWriter out;
private BufferedReader in;
diff --git a/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java b/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java
index ae00fc7cb4..d79a7c3ecb 100644
--- a/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java
+++ b/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java
@@ -1,6 +1,5 @@
package com.baeldung.stream;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/core-java/src/main/java/com/baeldung/string/StringHelper.java b/core-java/src/main/java/com/baeldung/string/StringHelper.java
index dac0d1272e..a9cc71d36a 100644
--- a/core-java/src/main/java/com/baeldung/string/StringHelper.java
+++ b/core-java/src/main/java/com/baeldung/string/StringHelper.java
@@ -12,15 +12,10 @@ class StringHelper {
}
static String removeLastCharOptional(String s) {
- return Optional.ofNullable(s)
- .filter(str -> str.length() != 0)
- .map(str -> str.substring(0, str.length() - 1))
- .orElse(s);
+ return Optional.ofNullable(s).filter(str -> str.length() != 0).map(str -> str.substring(0, str.length() - 1)).orElse(s);
}
static String removeLastCharRegexOptional(String s) {
- return Optional.ofNullable(s)
- .map(str -> str.replaceAll(".$", ""))
- .orElse(s);
+ return Optional.ofNullable(s).map(str -> str.replaceAll(".$", "")).orElse(s);
}
}
diff --git a/core-java/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java b/core-java/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
index 130218acc2..21164a976c 100644
--- a/core-java/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
+++ b/core-java/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
@@ -25,11 +25,7 @@ public class MyTokenizer {
}
public List getTokensWithCollection(String str) {
- return Collections
- .list(new StringTokenizer(str, ","))
- .stream()
- .map(token -> (String) token)
- .collect(Collectors.toList());
+ return Collections.list(new StringTokenizer(str, ",")).stream().map(token -> (String) token).collect(Collectors.toList());
}
public List getTokensFromFile(String path, String delim) {
diff --git a/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java b/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
index bfb6681f7c..5631616ea8 100644
--- a/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
+++ b/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
@@ -11,12 +11,12 @@ public class CustomTemporalAdjuster implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
switch (DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK))) {
- case FRIDAY:
- return temporal.plus(3, ChronoUnit.DAYS);
- case SATURDAY:
- return temporal.plus(2, ChronoUnit.DAYS);
- default:
- return temporal.plus(1, ChronoUnit.DAYS);
+ case FRIDAY:
+ return temporal.plus(3, ChronoUnit.DAYS);
+ case SATURDAY:
+ return temporal.plus(2, ChronoUnit.DAYS);
+ default:
+ return temporal.plus(1, ChronoUnit.DAYS);
}
}
}
diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java b/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java
index 69d7ff2390..a5f70d9df5 100644
--- a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java
+++ b/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java
@@ -9,7 +9,6 @@ import java.util.concurrent.atomic.AtomicInteger;
public class Consumer implements Runnable {
private static final Logger LOG = LoggerFactory.getLogger(Consumer.class);
-
private final TransferQueue transferQueue;
private final String name;
private final int numberOfMessagesToConsume;
diff --git a/core-java/src/main/resources/log4jstructuraldp.properties b/core-java/src/main/resources/log4jstructuraldp.properties
new file mode 100644
index 0000000000..5bc2bfe4b9
--- /dev/null
+++ b/core-java/src/main/resources/log4jstructuraldp.properties
@@ -0,0 +1,9 @@
+
+# Root logger
+log4j.rootLogger=INFO, file, stdout
+
+# Write to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java b/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
index 2f1abef64e..8cddf31245 100644
--- a/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
@@ -15,28 +15,24 @@ public class LongAccumulatorUnitTest {
@Test
public void givenLongAccumulator_whenApplyActionOnItFromMultipleThrads_thenShouldProduceProperResult() throws InterruptedException {
- //given
+ // given
ExecutorService executorService = Executors.newFixedThreadPool(8);
LongBinaryOperator sum = Long::sum;
LongAccumulator accumulator = new LongAccumulator(sum, 0L);
int numberOfThreads = 4;
int numberOfIncrements = 100;
- //when
- Runnable accumulateAction = () -> IntStream
- .rangeClosed(0, numberOfIncrements)
- .forEach(accumulator::accumulate);
+ // when
+ Runnable accumulateAction = () -> IntStream.rangeClosed(0, numberOfIncrements).forEach(accumulator::accumulate);
for (int i = 0; i < numberOfThreads; i++) {
executorService.execute(accumulateAction);
}
-
- //then
+ // then
executorService.awaitTermination(500, TimeUnit.MILLISECONDS);
executorService.shutdown();
assertEquals(accumulator.get(), 20200);
-
}
}
diff --git a/core-java/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java b/core-java/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
new file mode 100644
index 0000000000..260a7c060b
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
@@ -0,0 +1,99 @@
+package com.baeldung.concurrent.volatilekeyword;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+public class SharedObjectManualTest {
+
+ SharedObject sharedObject;
+ int valueReadByThread2;
+ int valueReadByThread3;
+
+ @Before
+ public void setUp(){
+ sharedObject = new SharedObject();
+ }
+
+ @Test
+ public void whenOneThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException {
+ Thread writer = new Thread(){
+ public void run(){
+ sharedObject.increamentCount();
+ }
+ };
+ writer.start();
+
+
+ Thread readerOne = new Thread(){
+ public void run(){
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ valueReadByThread2= sharedObject.getCount();
+ }
+ };
+ readerOne.start();
+
+ Thread readerTwo = new Thread(){
+ public void run(){
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ valueReadByThread3=sharedObject.getCount();
+ }
+ };
+ readerTwo.start();
+
+ assertEquals(1,valueReadByThread2);
+ assertEquals(1,valueReadByThread3);
+
+ }
+
+ @Test
+ public void whenTwoThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException {
+ Thread writerOne = new Thread(){
+ public void run(){
+ sharedObject.increamentCount();
+ }
+ };
+ writerOne.start();
+ Thread.sleep(100);
+
+ Thread writerTwo = new Thread(){
+ public void run(){
+ sharedObject.increamentCount();
+ }
+ };
+ writerTwo.start();
+ Thread.sleep(100);
+
+ Thread readerOne = new Thread(){
+ public void run(){
+ valueReadByThread2= sharedObject.getCount();
+ }
+ };
+ readerOne.start();
+
+ Thread readerTwo = new Thread(){
+ public void run(){
+ valueReadByThread3=sharedObject.getCount();
+ }
+ };
+ readerTwo.start();
+
+ assertEquals(2,valueReadByThread2);
+ assertEquals(2,valueReadByThread3);
+
+ }
+ @After
+ public void cleanup(){
+ sharedObject = null;
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
new file mode 100644
index 0000000000..fb483a8a68
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.designpatterns;
+
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import com.baeldung.designpatterns.adapter.LuxuryCarsSpeedAdapter;
+import com.baeldung.designpatterns.adapter.LuxuryCarsSpeedAdapterImpl;
+
+public class AdapterPatternIntegrationTest {
+ @Test
+ public void givenLuxuryCarsAdapter_WhenConvertingMPHToKMPH_thenSuccessfullyConverted() {
+ LuxuryCarsSpeedAdapter luxuryCars = new LuxuryCarsSpeedAdapterImpl();
+ assertEquals(luxuryCars.bugattiVeyronInKMPH(), 431.30312, 0.00001);
+ assertEquals(luxuryCars.mcLarenInKMPH(), 387.85094, 0.00001);
+ assertEquals(luxuryCars.astonMartinInKMPH(), 354.0548, 0.00001);
+ }
+}
+
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java
new file mode 100644
index 0000000000..56a7a704f2
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.designpatterns;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.apache.log4j.spi.LoggingEvent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.designpatterns.bridge.Blue;
+import com.baeldung.designpatterns.bridge.Red;
+import com.baeldung.designpatterns.bridge.Shape;
+import com.baeldung.designpatterns.bridge.Square;
+import com.baeldung.designpatterns.bridge.Triangle;
+
+public class BridgePatternIntegrationTest {
+ public static TestAppenderDP appender;
+
+ @Before
+ public void setUp() {
+ appender = new TestAppenderDP();
+ LOG.addAppender(appender);
+ }
+
+ @Test
+ public void whenBridgePatternInvoked_thenConfigSuccess() {
+ //a square with red color
+ Shape square = new Square(new Red());
+ square.drawShape();
+
+ //a triangle with blue color
+ Shape triangle = new Triangle(new Blue());
+ triangle.drawShape();
+
+ final List log = appender.getLog();
+
+ assertThat((String) log.get(0).getMessage(), is("Square drawn. "));
+ assertThat((String) log.get(1).getMessage(), is("Color : Red"));
+ assertThat((String) log.get(2).getMessage(), is("Triangle drawn. "));
+ assertThat((String) log.get(3).getMessage(), is("Color : Blue"));
+ }
+
+ @After
+ public void tearDown() {
+ LOG.removeAppender(appender);
+ }
+}
+
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java
new file mode 100644
index 0000000000..b3b3f988f1
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.designpatterns;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.baeldung.designpatterns.decorator.BubbleLights;
+import com.baeldung.designpatterns.decorator.ChristmasTree;
+import com.baeldung.designpatterns.decorator.ChristmasTreeImpl;
+import com.baeldung.designpatterns.decorator.Garland;
+
+public class DecoratorPatternIntegrationTest {
+ private ChristmasTree tree;
+
+ @Test
+ public void givenDecoratorPattern_WhenDecoratorsInjectedAtRuntime_thenConfigSuccess() {
+ //christmas tree with just one Garland
+ tree = new Garland(new ChristmasTreeImpl());
+ assertEquals(tree.decorate(), "Christmas tree with Garland");
+
+ //christmas tree with two Garlands and one Bubble lights
+ tree = new BubbleLights(new Garland(
+ new Garland(new ChristmasTreeImpl()))
+ );
+ assertEquals(tree.decorate(), "Christmas tree with Garland with Garland with Bubble Lights");
+ }
+}
+
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/ProxyPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/ProxyPatternIntegrationTest.java
new file mode 100644
index 0000000000..7fa95b31d7
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/ProxyPatternIntegrationTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.designpatterns;
+
+import static com.baeldung.designpatterns.util.LogerUtil.LOG;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.apache.log4j.spi.LoggingEvent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.designpatterns.proxy.ExpensiveObject;
+import com.baeldung.designpatterns.proxy.ExpensiveObjectProxy;
+
+public class ProxyPatternIntegrationTest {
+ public static TestAppenderDP appender;
+
+ @Before
+ public void setUp() {
+ appender = new TestAppenderDP();
+ LOG.addAppender(appender);
+ }
+
+ @Test
+ public void givenExpensiveObjectProxy_WhenObjectInitialized_thenInitializedOnlyOnce() {
+ ExpensiveObject object = new ExpensiveObjectProxy();
+ object.process();
+ object.process();
+
+ final List log = appender.getLog();
+
+ assertThat((String) log.get(0).getMessage(), is("Loading initial configuration..."));
+ assertThat((String) log.get(1).getMessage(), is("processing complete."));
+ assertThat((String) log.get(2).getMessage(), is("processing complete."));
+ }
+
+ @After
+ public void tearDown() {
+ LOG.removeAppender(appender);
+ }
+}
+
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/TestAppenderDP.java b/core-java/src/test/java/com/baeldung/designpatterns/TestAppenderDP.java
new file mode 100644
index 0000000000..613c26fa13
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/TestAppenderDP.java
@@ -0,0 +1,29 @@
+package com.baeldung.designpatterns;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.spi.LoggingEvent;
+
+public class TestAppenderDP extends AppenderSkeleton {
+ private final List log = new ArrayList();
+
+ @Override
+ public boolean requiresLayout() {
+ return false;
+ }
+
+ @Override
+ protected void append(final LoggingEvent loggingEvent) {
+ log.add(loggingEvent);
+ }
+
+ @Override
+ public void close() {
+ }
+
+ public List getLog() {
+ return new ArrayList(log);
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/hashcode/application/ApplicationTest.java b/core-java/src/test/java/com/baeldung/hashcode/application/ApplicationTest.java
index dcd853f451..60950fae7a 100644
--- a/core-java/src/test/java/com/baeldung/hashcode/application/ApplicationTest.java
+++ b/core-java/src/test/java/com/baeldung/hashcode/application/ApplicationTest.java
@@ -1,30 +1,26 @@
-package com.baeldung.application;
+package com.baeldung.hashcode.application;
-import org.junit.After;
-import org.junit.Before;
+import com.baeldung.hashcode.entities.User;
import org.junit.Test;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import static org.junit.Assert.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertTrue;
public class ApplicationTest {
- private ByteArrayOutputStream outContent;
-
- @Before
- public void setUpPrintStreamInstance() throws Exception {
- this.outContent = new ByteArrayOutputStream();
- System.setOut(new PrintStream(outContent));
- }
-
- @After
- public void tearDownByteArrayOutputStream() throws Exception {
- outContent = null;
- }
-
@Test
public void main_NoInputState_TextPrintedToConsole() throws Exception {
- Application.main(new String[]{});
- assertEquals("User found in the collection", outContent.toString());
+ Map users = new HashMap<>();
+ User user1 = new User(1L, "John", "john@domain.com");
+ User user2 = new User(2L, "Jennifer", "jennifer@domain.com");
+ User user3 = new User(3L, "Mary", "mary@domain.com");
+
+ users.put(user1, user1);
+ users.put(user2, user2);
+ users.put(user3, user3);
+
+ assertTrue(users.containsKey(user1));
}
}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/hashcode/entities/UserTest.java b/core-java/src/test/java/com/baeldung/hashcode/entities/UserTest.java
index 01f6085d7e..e356b4beef 100644
--- a/core-java/src/test/java/com/baeldung/hashcode/entities/UserTest.java
+++ b/core-java/src/test/java/com/baeldung/hashcode/entities/UserTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.entities;
+package com.baeldung.hashcode.entities;
import org.junit.After;
import org.junit.Assert;
@@ -23,7 +23,7 @@ public class UserTest {
}
@Test
- public void equals_EqualUserInstance_TrueAssertion(){
+ public void equals_EqualUserInstance_TrueAssertion() {
Assert.assertTrue(user.equals(comparisonUser));
}
diff --git a/core-java/src/test/java/com/baeldung/java/networking/udp/broadcast/BroadcastIntegrationTest.java b/core-java/src/test/java/com/baeldung/java/networking/udp/broadcast/BroadcastIntegrationTest.java
new file mode 100644
index 0000000000..e3ffbcc052
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/networking/udp/broadcast/BroadcastIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.java.networking.udp.broadcast;
+
+import org.junit.After;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class BroadcastIntegrationTest {
+ private BroadcastingClient client;
+
+ @Test
+ public void whenBroadcasting_thenDiscoverExpectedServers() throws Exception {
+ int expectedServers = 4;
+ initializeForExpectedServers(expectedServers);
+
+ int serversDiscovered = client.discoverServers("hello server");
+ assertEquals(expectedServers, serversDiscovered);
+ }
+
+ private void initializeForExpectedServers(int expectedServers) throws Exception {
+ for (int i = 0; i < expectedServers; i++) {
+ new BroadcastingEchoServer().start();
+ }
+
+ client = new BroadcastingClient(expectedServers);
+ }
+
+ @After
+ public void tearDown() throws IOException {
+ stopEchoServer();
+ client.close();
+ }
+
+ private void stopEchoServer() throws IOException {
+ client.discoverServers("end");
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/java/networking/udp/multicast/MulticastIntegrationTest.java b/core-java/src/test/java/com/baeldung/java/networking/udp/multicast/MulticastIntegrationTest.java
new file mode 100644
index 0000000000..26c0704b01
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/networking/udp/multicast/MulticastIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.java.networking.udp.multicast;
+
+import org.junit.After;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class MulticastIntegrationTest {
+ private MulticastingClient client;
+
+ @Test
+ public void whenBroadcasting_thenDiscoverExpectedServers() throws Exception {
+ int expectedServers = 4;
+ initializeForExpectedServers(expectedServers);
+
+ int serversDiscovered = client.discoverServers("hello server");
+ assertEquals(expectedServers, serversDiscovered);
+ }
+
+ private void initializeForExpectedServers(int expectedServers) throws Exception {
+ for (int i = 0; i < expectedServers; i++) {
+ new MulticastEchoServer().start();
+ }
+
+ client = new MulticastingClient(expectedServers);
+ }
+
+ @After
+ public void tearDown() throws IOException {
+ stopEchoServer();
+ client.close();
+ }
+
+ private void stopEchoServer() throws IOException {
+ client.discoverServers("end");
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
index 0fd6f7dfe8..fe10266043 100644
--- a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
@@ -15,7 +15,6 @@ public class LambdaExceptionWrappersUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(LambdaExceptionWrappersUnitTest.class);
-
private List integers;
@Before
diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java b/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java
new file mode 100644
index 0000000000..ed36951f73
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java
@@ -0,0 +1,78 @@
+package com.baeldung.javanetworking.uriurl;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import org.apache.commons.io.IOUtils;
+import static org.junit.Assert.*;
+import org.junit.Test;
+
+public class URIvsURLUnitTest {
+
+ @Test
+ public void whenCreatingURIs_thenSameInfo() throws URISyntaxException {
+ URI firstURI = new URI("somescheme://theuser:thepassword@someauthority:80/some/path?thequery#somefragment");
+ URI secondURI = new URI("somescheme", "theuser:thepassword", "someuthority", 80, "/some/path", "thequery", "somefragment");
+
+ assertEquals(firstURI.getScheme(), secondURI.getScheme());
+ assertEquals(firstURI.getPath(), secondURI.getPath());
+ }
+
+ @Test
+ public void whenCreatingURLs_thenSameInfo() throws MalformedURLException {
+ URL firstURL = new URL("http://theuser:thepassword@somehost:80/path/to/file?thequery#somefragment");
+ URL secondURL = new URL("http", "somehost", 80, "/path/to/file");
+
+ assertEquals(firstURL.getHost(), secondURL.getHost());
+ assertEquals(firstURL.getPath(), secondURL.getPath());
+ }
+
+ @Test
+ public void whenCreatingURI_thenCorrect() {
+ URI uri = URI.create("urn:isbn:1234567890");
+
+ assertNotNull(uri);
+ }
+
+ @Test(expected = MalformedURLException.class)
+ public void whenCreatingURLs_thenException() throws MalformedURLException {
+ URL theURL = new URL("otherprotocol://somehost/path/to/file");
+
+ assertNotNull(theURL);
+ }
+
+ @Test
+ public void givenObjects_whenConverting_thenCorrect() throws MalformedURLException, URISyntaxException {
+ String aURIString = "http://somehost:80/path?thequery";
+ URI uri = new URI(aURIString);
+ URL url = new URL(aURIString);
+
+ URL toURL = uri.toURL();
+ URI toURI = url.toURI();
+
+ assertNotNull(url);
+ assertNotNull(uri);
+ assertEquals(toURL.toString(), toURI.toString());
+ }
+
+ @Test(expected = MalformedURLException.class)
+ public void givenURI_whenConvertingToURL_thenException() throws MalformedURLException, URISyntaxException {
+ URI uri = new URI("somescheme://someauthority/path?thequery");
+
+ URL url = uri.toURL();
+
+ assertNotNull(url);
+ }
+
+ @Test
+ public void givenURL_whenGettingContents_thenCorrect() throws MalformedURLException, IOException {
+ URL url = new URL("http://courses.baeldung.com");
+
+ String contents = IOUtils.toString(url.openStream());
+
+ assertTrue(contents.contains(""));
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java b/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java
index 7a23afa12f..5327e5f4f0 100644
--- a/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java
@@ -29,12 +29,9 @@ public class ListOfListsUnitTest {
@Test
public void givenListOfLists_thenCheckNames() {
- assertEquals("Pen 1", ((Pen) listOfLists.get(0)
- .get(0)).getName());
- assertEquals("Pencil 1", ((Pencil) listOfLists.get(1)
- .get(0)).getName());
- assertEquals("Rubber 1", ((Rubber) listOfLists.get(2)
- .get(0)).getName());
+ assertEquals("Pen 1", ((Pen) listOfLists.get(0).get(0)).getName());
+ assertEquals("Pencil 1", ((Pencil) listOfLists.get(1).get(0)).getName());
+ assertEquals("Rubber 1", ((Rubber) listOfLists.get(2).get(0)).getName());
}
@SuppressWarnings("unchecked")
@@ -43,11 +40,9 @@ public class ListOfListsUnitTest {
((ArrayList) listOfLists.get(1)).remove(0);
listOfLists.remove(1);
- assertEquals("Rubber 1", ((Rubber) listOfLists.get(1)
- .get(0)).getName());
+ assertEquals("Rubber 1", ((Rubber) listOfLists.get(1).get(0)).getName());
listOfLists.remove(0);
- assertEquals("Rubber 1", ((Rubber) listOfLists.get(0)
- .get(0)).getName());
+ assertEquals("Rubber 1", ((Rubber) listOfLists.get(0).get(0)).getName());
}
@Test
@@ -67,11 +62,8 @@ public class ListOfListsUnitTest {
list.add(pencils);
list.add(rubbers);
- assertEquals("Pen 1", ((Pen) list.get(0)
- .get(0)).getName());
- assertEquals("Pencil 1", ((Pencil) list.get(1)
- .get(0)).getName());
- assertEquals("Rubber 1", ((Rubber) list.get(2)
- .get(0)).getName());
+ assertEquals("Pen 1", ((Pen) list.get(0).get(0)).getName());
+ assertEquals("Pencil 1", ((Pencil) list.get(1).get(0)).getName());
+ assertEquals("Rubber 1", ((Rubber) list.get(2).get(0)).getName());
}
}
diff --git a/core-java/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java b/core-java/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java
index 9d8d3c884b..5fb85bb2c4 100644
--- a/core-java/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java
+++ b/core-java/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java
@@ -13,7 +13,6 @@ public class CoreThreadPoolIntegrationTest {
private static final Logger LOG = LoggerFactory.getLogger(CoreThreadPoolIntegrationTest.class);
-
@Test(timeout = 1000)
public void whenCallingExecuteWithRunnable_thenRunnableIsExecuted() throws InterruptedException {
diff --git a/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties b/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
index a01a675e44..67533b7825 100755
--- a/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
+++ b/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
@@ -1,8 +1,8 @@
+endpoint.name=client-endpoint
+remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
-remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
-remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=${host.auth:JBOSS-LOCAL-USER}
-remote.connection.default.username=testUser
-remote.connection.default.password=admin1234!
+remote.connection.default.username=myusername
+remote.connection.default.password=mypassword
\ No newline at end of file
diff --git a/ejb/ejbclient/src/main/java/com/baeldung/ejbclient/application/TextApplication.java b/ejb/ejbclient/src/main/java/com/baeldung/ejbclient/application/TextApplication.java
new file mode 100644
index 0000000000..b65c21100d
--- /dev/null
+++ b/ejb/ejbclient/src/main/java/com/baeldung/ejbclient/application/TextApplication.java
@@ -0,0 +1,42 @@
+package com.baeldung.ejbclient.application;
+
+import com.baeldung.ejbmodule.TextProcessorBean;
+import com.baeldung.ejbmodule.TextProcessorRemote;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import java.util.Properties;
+
+public class TextApplication {
+
+ public static void main(String[] args) throws NamingException {
+ TextProcessorRemote textProcessor = EJBFactory.createTextProcessorBeanFromJNDI("ejb:");
+ System.out.print(textProcessor.processText("sample text"));
+ }
+
+ private static class EJBFactory {
+
+ private static TextProcessorRemote createTextProcessorBeanFromJNDI(String namespace) throws NamingException {
+ return lookupTextProcessorBean(namespace);
+ }
+
+ private static TextProcessorRemote lookupTextProcessorBean(String namespace) throws NamingException {
+ Context ctx = createInitialContext();
+ final String appName = "";
+ final String moduleName = "EJBModule";
+ final String distinctName = "";
+ final String beanName = TextProcessorBean.class.getSimpleName();
+ final String viewClassName = TextProcessorRemote.class.getName();
+ return (TextProcessorRemote) ctx.lookup(namespace + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
+ }
+
+ private static Context createInitialContext() throws NamingException {
+ Properties jndiProperties = new Properties();
+ jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
+ jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
+ jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
+ jndiProperties.put("jboss.naming.client.ejb.context", true);
+ return new InitialContext(jndiProperties);
+ }
+ }
+}
diff --git a/ejb/ejbclient/src/main/resources/jboss-ejb-client.properties b/ejb/ejbclient/src/main/resources/jboss-ejb-client.properties
new file mode 100644
index 0000000000..67533b7825
--- /dev/null
+++ b/ejb/ejbclient/src/main/resources/jboss-ejb-client.properties
@@ -0,0 +1,8 @@
+endpoint.name=client-endpoint
+remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
+remote.connections=default
+remote.connection.default.host=127.0.0.1
+remote.connection.default.port=8080
+remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
+remote.connection.default.username=myusername
+remote.connection.default.password=mypassword
\ No newline at end of file
diff --git a/ejb/ejbclient/src/test/java/com/baeldung/ejbclient/application/TextApplicationTest.java b/ejb/ejbclient/src/test/java/com/baeldung/ejbclient/application/TextApplicationTest.java
new file mode 100644
index 0000000000..947c72d0b0
--- /dev/null
+++ b/ejb/ejbclient/src/test/java/com/baeldung/ejbclient/application/TextApplicationTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.ejbclient.application;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import javax.naming.NamingException;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import static org.junit.Assert.*;
+
+public class TextApplicationTest {
+
+ private static ByteArrayOutputStream outContent;
+
+ @BeforeClass
+ public static void setUpPrintStreamInstance() {
+ outContent = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outContent));
+ }
+
+ @AfterClass
+ public static void tearDownByteArrayOutputStream() {
+ outContent = null;
+ }
+
+ @Test
+ public void givenInputString_whenCompareTtoStringPrintedToConsole_thenSuccessful() throws NamingException {
+ TextApplication.main(new String[]{});
+ assertEquals("SAMPLE TEXT", outContent.toString());
+ }
+}
\ No newline at end of file
diff --git a/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorBean.java b/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorBean.java
new file mode 100644
index 0000000000..dc0db5fc53
--- /dev/null
+++ b/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorBean.java
@@ -0,0 +1,10 @@
+package com.baeldung.ejbmodule;
+
+import javax.ejb.Stateless;
+
+@Stateless
+public class TextProcessorBean implements TextProcessorRemote {
+ public String processText(String text) {
+ return text.toUpperCase();
+ }
+}
diff --git a/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorRemote.java b/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorRemote.java
new file mode 100644
index 0000000000..680d8f4e10
--- /dev/null
+++ b/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorRemote.java
@@ -0,0 +1,9 @@
+package com.baeldung.ejbmodule;
+
+import javax.ejb.Remote;
+
+@Remote
+public interface TextProcessorRemote {
+
+ String processText(String text);
+}
\ No newline at end of file
diff --git a/ejb/ejbmodule/src/test/java/com/baeldung/ejbmodule/TextProcessorBeanTest.java b/ejb/ejbmodule/src/test/java/com/baeldung/ejbmodule/TextProcessorBeanTest.java
new file mode 100644
index 0000000000..d8693420d4
--- /dev/null
+++ b/ejb/ejbmodule/src/test/java/com/baeldung/ejbmodule/TextProcessorBeanTest.java
@@ -0,0 +1,12 @@
+package com.baeldung.ejbmodule;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+public class TextProcessorBeanTest {
+ @Test
+ public void givenInputString_whenComparedToStringParsedByBean_thenSuccessful() {
+ TextProcessorBean textProcessor = new TextProcessorBean();
+ assertEquals("TEST", textProcessor.processText("test"));
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java
index 45d957b90b..035ff8ca9c 100644
--- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDeserializationUnitTest.java
@@ -1,19 +1,23 @@
package com.baeldung.jackson.test;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import java.io.IOException;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import org.junit.Test;
import com.baeldung.jackson.deserialization.ItemDeserializer;
import com.baeldung.jackson.dtos.Item;
import com.baeldung.jackson.dtos.ItemWithSerializer;
import com.baeldung.jackson.dtos.MyDto;
import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreUnknown;
-import org.junit.Test;
-
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
@@ -21,6 +25,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -165,4 +170,35 @@ public class JacksonDeserializationUnitTest {
assertThat(readValue, notNullValue());
}
+ @Test
+ public void whenDeserialisingZonedDateTimeWithDefaults_thenTimeZoneIsNotPreserved() throws IOException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.findAndRegisterModules();
+ objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ // construct a new instance of ZonedDateTime
+ ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
+ String converted = objectMapper.writeValueAsString(now);
+ // restore an instance of ZonedDateTime from String
+ ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class);
+ System.out.println("serialized: " + now);
+ System.out.println("restored: " + restored);
+ assertThat(now, is(not(restored)));
+ }
+
+ @Test
+ public void whenDeserialisingZonedDateTimeWithFeaturesDisabled_thenTimeZoneIsPreserved() throws IOException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.findAndRegisterModules();
+ objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
+ // construct a new instance of ZonedDateTime
+ ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
+ String converted = objectMapper.writeValueAsString(now);
+ // restore an instance of ZonedDateTime from String
+ ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class);
+ System.out.println("serialized: " + now);
+ System.out.println("restored: " + restored);
+ assertThat(now, is(restored));
+ }
+
}
diff --git a/jooq/README.md b/jooq/README.md
deleted file mode 100644
index 2f09cab46b..0000000000
--- a/jooq/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant articles
-
-- [Introduction to jOOL](http://www.baeldung.com/jool)
diff --git a/junit5/pom.xml b/junit5/pom.xml
index 2316b034e9..1fa4818447 100644
--- a/junit5/pom.xml
+++ b/junit5/pom.xml
@@ -3,7 +3,7 @@
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
+
junit5
1.0-SNAPSHOT
@@ -19,9 +19,9 @@
UTF-8
1.8
- 5.0.0-M5
- 1.0.0-M5
- 4.12.0-M5
+ 5.0.0-RC2
+ 1.0.0-RC2
+ 4.12.0-RC2
2.8.2
1.4.196
diff --git a/junit5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java b/junit5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java
new file mode 100644
index 0000000000..67bd47a44a
--- /dev/null
+++ b/junit5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java
@@ -0,0 +1,50 @@
+package com.baeldung.param;
+
+import java.util.Random;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ParameterContext;
+import org.junit.jupiter.api.extension.ParameterResolutionException;
+import org.junit.jupiter.api.extension.ParameterResolver;
+
+public class InvalidPersonParameterResolver implements ParameterResolver {
+
+ /**
+ * The "bad" (invalid) data for testing purposes has to go somewhere, right?
+ */
+ public static Person[] INVALID_PERSONS = {
+ new Person().setId(1L).setLastName("Ad_ams").setFirstName("Jill,"),
+ new Person().setId(2L).setLastName(",Baker").setFirstName(""),
+ new Person().setId(3L).setLastName(null).setFirstName(null),
+ new Person().setId(4L).setLastName("Daniel&").setFirstName("{Joseph}"),
+ new Person().setId(5L).setLastName("").setFirstName("English, Jane"),
+ new Person()/* .setId(6L).setLastName("Fontana").setFirstName("Enrique") */,
+ // TODO: ADD MORE DATA HERE
+ };
+
+ @Override
+ public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
+ throws ParameterResolutionException {
+ Object ret = null;
+ //
+ // Return a random, valid Person object if Person.class is the type of Parameter
+ /// to be resolved. Otherwise return null.
+ if (parameterContext.getParameter().getType() == Person.class) {
+ ret = INVALID_PERSONS[new Random().nextInt(INVALID_PERSONS.length)];
+ }
+ return ret;
+ }
+
+ @Override
+ public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
+ throws ParameterResolutionException {
+ boolean ret = false;
+ //
+ // If the Parameter.type == Person.class, then we support it, otherwise, get outta here!
+ if (parameterContext.getParameter().getType() == Person.class) {
+ ret = true;
+ }
+ return ret;
+ }
+
+}
diff --git a/junit5/src/test/java/com/baeldung/param/Person.java b/junit5/src/test/java/com/baeldung/param/Person.java
new file mode 100644
index 0000000000..65333b5e56
--- /dev/null
+++ b/junit5/src/test/java/com/baeldung/param/Person.java
@@ -0,0 +1,43 @@
+package com.baeldung.param;
+
+/**
+ * Very simple Person entity.
+ * Use the Fluent-style interface to set properties.
+ *
+ * @author J Steven Perry
+ *
+ */
+public class Person {
+
+ private Long id;
+ private String lastName;
+ private String firstName;
+
+ public Long getId() {
+ return id;
+ }
+
+ public Person setId(Long id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public Person setLastName(String lastName) {
+ this.lastName = lastName;
+ return this;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public Person setFirstName(String firstName) {
+ this.firstName = firstName;
+ return this;
+ }
+
+}
diff --git a/junit5/src/test/java/com/baeldung/param/PersonValidator.java b/junit5/src/test/java/com/baeldung/param/PersonValidator.java
new file mode 100644
index 0000000000..0219169aab
--- /dev/null
+++ b/junit5/src/test/java/com/baeldung/param/PersonValidator.java
@@ -0,0 +1,142 @@
+package com.baeldung.param;
+
+import java.util.Arrays;
+
+/**
+ * Somewhat contrived validation class to illustrate unit test
+ * concepts.
+ *
+ * @author J Steven Perry
+ *
+ */
+public class PersonValidator {
+
+ /**
+ * Contrived checked exception to illustrate one possible
+ * way to handle validation errors (via a checked exception).
+ *
+ * @author J Steven Perry
+ *
+ */
+ public static class ValidationException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -134518049431883102L;
+
+ // Probably should implement some more constructors, but don't want
+ /// to tarnish the lesson...
+
+ /**
+ * The one and only way to create this checked exception.
+ *
+ * @param message
+ * The message accompanying the exception. Should be meaningful.
+ */
+ public ValidationException(String message) {
+ super(message);
+
+ }
+
+ }
+
+ private static final String[] ILLEGAL_NAME_CHARACTERS = {
+ ",",
+ "_",
+ "{",
+ "}",
+ "!"
+ };
+
+ /**
+ * Validate the first name of the specified Person object.
+ *
+ * @param person
+ * The Person object to validate.
+ *
+ * @return - returns true if the specified Person is valid
+ *
+ * @throws ValidationException
+ * - this Exception is thrown if any kind of validation error occurs.
+ */
+ public static boolean validateFirstName(Person person) throws ValidationException {
+ boolean ret = true;
+ // The validation rules go here.
+ // Naive: use simple ifs
+ if (person == null) {
+ throw new ValidationException("Person is null (not allowed)!");
+ }
+ if (person.getFirstName() == null) {
+ throw new ValidationException("Person FirstName is null (not allowed)!");
+ }
+ if (person.getFirstName().isEmpty()) {
+ throw new ValidationException("Person FirstName is an empty String (not allowed)!");
+ }
+ if (!isStringValid(person.getFirstName(), ILLEGAL_NAME_CHARACTERS)) {
+ throw new ValidationException(
+ "Person FirstName (" + person.getFirstName() + ") may not contain any of the following characters: "
+ + Arrays.toString(ILLEGAL_NAME_CHARACTERS)
+ + "!");
+ }
+ return ret;
+ }
+
+ /**
+ * Validate the last name of the specified Person object. Looks the same as first
+ * name? Look closer. Just kidding. It's the same. But real world code can (and will) diverge.
+ *
+ * @param person
+ * The Person object to validate.
+ *
+ * @return - returns true if the specified Person is valid
+ *
+ * @throws ValidationException
+ * - this Exception is thrown if any kind of validation error occurs.
+ */
+ public static boolean validateLastName(Person person) throws ValidationException {
+ boolean ret = true;
+ // The validation rules go here.
+ // Naive: use simple ifs
+ if (person == null) {
+ throw new ValidationException("Person is null (not allowed)!");
+ }
+ if (person.getFirstName() == null) {
+ throw new ValidationException("Person FirstName is null (not allowed)!");
+ }
+ if (person.getFirstName().isEmpty()) {
+ throw new ValidationException("Person FirstName is an empty String (not allowed)!");
+ }
+ if (!isStringValid(person.getFirstName(), ILLEGAL_NAME_CHARACTERS)) {
+ throw new ValidationException(
+ "Person LastName (" + person.getLastName() + ") may not contain any of the following characters: "
+ + Arrays.toString(ILLEGAL_NAME_CHARACTERS)
+ + "!");
+ }
+ return ret;
+ }
+
+ /**
+ * Validates the specified name. If it contains any of the illegalCharacters,
+ * this method returns false (indicating the name is illegal). Otherwise it returns true.
+ *
+ * @param candidate
+ * The candidate String to validate
+ *
+ * @param illegalCharacters
+ * The characters the String is not allowed to have
+ *
+ * @return - boolean - true if the name is valid, false otherwise.
+ */
+ private static boolean isStringValid(String candidate, String[] illegalCharacters) {
+ boolean ret = true;
+ for (String illegalChar : illegalCharacters) {
+ if (candidate.contains(illegalChar)) {
+ ret = false;
+ break;
+ }
+ }
+ return ret;
+ }
+
+}
diff --git a/junit5/src/test/java/com/baeldung/param/PersonValidatorTest.java b/junit5/src/test/java/com/baeldung/param/PersonValidatorTest.java
new file mode 100644
index 0000000000..09ab03b811
--- /dev/null
+++ b/junit5/src/test/java/com/baeldung/param/PersonValidatorTest.java
@@ -0,0 +1,102 @@
+package com.baeldung.param;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.RepeatedTest;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+
+@RunWith(JUnitPlatform.class)
+@DisplayName("Testing PersonValidator")
+public class PersonValidatorTest {
+
+ /**
+ * Nested class, uses ExtendWith
+ * {@link com.baeldung.param.ValidPersonParameterResolver ValidPersonParameterResolver}
+ * to feed Test methods with "good" data.
+ */
+ @Nested
+ @DisplayName("When using Valid data")
+ @ExtendWith(ValidPersonParameterResolver.class)
+ public class ValidData {
+
+ /**
+ * Repeat the test ten times, that way we have a good shot at
+ * running all of the data through at least once.
+ *
+ * @param person
+ * A valid Person object to validate.
+ */
+ @RepeatedTest(value = 10)
+ @DisplayName("All first names are valid")
+ public void validateFirstName(Person person) {
+ try {
+ assertTrue(PersonValidator.validateFirstName(person));
+ } catch (PersonValidator.ValidationException e) {
+ fail("Exception not expected: " + e.getLocalizedMessage());
+ }
+ }
+
+ /**
+ * Repeat the test ten times, that way we have a good shot at
+ * running all of the data through at least once.
+ *
+ * @param person
+ * A valid Person object to validate.
+ */
+ @RepeatedTest(value = 10)
+ @DisplayName("All last names are valid")
+ public void validateLastName(Person person) {
+ try {
+ assertTrue(PersonValidator.validateLastName(person));
+ } catch (PersonValidator.ValidationException e) {
+ fail("Exception not expected: " + e.getLocalizedMessage());
+ }
+ }
+
+ }
+
+ /**
+ * Nested class, uses ExtendWith
+ * {@link com.baeldung.param.InvalidPersonParameterResolver InvalidPersonParameterResolver}
+ * to feed Test methods with "bad" data.
+ */
+ @Nested
+ @DisplayName("When using Invalid data")
+ @ExtendWith(InvalidPersonParameterResolver.class)
+ public class InvalidData {
+
+ /**
+ * Repeat the test ten times, that way we have a good shot at
+ * running all of the data through at least once.
+ *
+ * @param person
+ * An invalid Person object to validate.
+ */
+ @RepeatedTest(value = 10)
+ @DisplayName("All first names are invalid")
+ public void validateFirstName(Person person) {
+ assertThrows(PersonValidator.ValidationException.class, () -> PersonValidator.validateFirstName(person));
+ }
+
+ /**
+ * Repeat the test ten times, that way we have a good shot at
+ * running all of the data through at least once.
+ *
+ * @param person
+ * An invalid Person object to validate.
+ */
+ @RepeatedTest(value = 10)
+ @DisplayName("All first names are invalid")
+ public void validateLastName(Person person) {
+ assertThrows(PersonValidator.ValidationException.class, () -> PersonValidator.validateLastName(person));
+ }
+
+ }
+
+}
diff --git a/junit5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java b/junit5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java
new file mode 100644
index 0000000000..abb97586eb
--- /dev/null
+++ b/junit5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java
@@ -0,0 +1,50 @@
+package com.baeldung.param;
+
+import java.util.Random;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ParameterContext;
+import org.junit.jupiter.api.extension.ParameterResolutionException;
+import org.junit.jupiter.api.extension.ParameterResolver;
+
+public class ValidPersonParameterResolver implements ParameterResolver {
+
+ /**
+ * The "good" (valid) data for testing purposes has to go somewhere, right?
+ */
+ public static Person[] VALID_PERSONS = {
+ new Person().setId(1L).setLastName("Adams").setFirstName("Jill"),
+ new Person().setId(2L).setLastName("Baker").setFirstName("James"),
+ new Person().setId(3L).setLastName("Carter").setFirstName("Samanta"),
+ new Person().setId(4L).setLastName("Daniels").setFirstName("Joseph"),
+ new Person().setId(5L).setLastName("English").setFirstName("Jane"),
+ new Person().setId(6L).setLastName("Fontana").setFirstName("Enrique"),
+ // TODO: ADD MORE DATA HERE
+ };
+
+ @Override
+ public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
+ throws ParameterResolutionException {
+ Object ret = null;
+ //
+ // Return a random, valid Person object if Person.class is the type of Parameter
+ /// to be resolved. Otherwise return null.
+ if (parameterContext.getParameter().getType() == Person.class) {
+ ret = VALID_PERSONS[new Random().nextInt(VALID_PERSONS.length)];
+ }
+ return ret;
+ }
+
+ @Override
+ public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
+ throws ParameterResolutionException {
+ boolean ret = false;
+ //
+ // If the Parameter.type == Person.class, then we support it, otherwise, get outta here!
+ if (parameterContext.getParameter().getType() == Person.class) {
+ ret = true;
+ }
+ return ret;
+ }
+
+}
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt
new file mode 100644
index 0000000000..96e54716b3
--- /dev/null
+++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt
@@ -0,0 +1,19 @@
+package com.baeldung.kotlin
+
+sealed class Result {
+ abstract fun map(func: (S) -> R) : Result
+ abstract fun mapFailure(func: (F) -> R) : Result
+ abstract fun get() : S?
+}
+
+data class Success(val success: S) : Result() {
+ override fun map(func: (S) -> R) : Result = Success(func(success))
+ override fun mapFailure(func: (F) -> R): Result = Success(success)
+ override fun get(): S? = success
+}
+
+data class Failure(val failure: F) : Result() {
+ override fun map(func: (S) -> R) : Result = Failure(failure)
+ override fun mapFailure(func: (F) -> R): Result = Failure(func(failure))
+ override fun get(): S? = null
+}
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt
new file mode 100644
index 0000000000..8c7509f653
--- /dev/null
+++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt
@@ -0,0 +1,84 @@
+package com.baeldung.kotlin
+
+import org.junit.Assert
+import org.junit.Test
+
+class SealedTest {
+ fun divide(a: Int, b: Int) : Result = when (b) {
+ 0 -> Failure("Division by zero")
+ else -> Success(a.toFloat() / b)
+ }
+
+ @Test
+ fun testSuccess() {
+ val result = divide(10, 5)
+ Assert.assertEquals(Success(2.0f), result)
+ }
+
+ @Test
+ fun testError() {
+ val result = divide(10, 0)
+ Assert.assertEquals(Failure("Division by zero"), result)
+ }
+
+ @Test
+ fun testMatchOnSuccess() {
+ val result = divide(10, 5)
+ when (result) {
+ is Success -> {
+ // Expected
+ }
+ is Failure -> Assert.fail("Expected Success")
+ }
+ }
+
+ @Test
+ fun testMatchOnError() {
+ val result = divide(10, 0)
+ when (result) {
+ is Failure -> {
+ // Expected
+ }
+ }
+ }
+
+ @Test
+ fun testGetSuccess() {
+ val result = divide(10, 5)
+ Assert.assertEquals(2.0f, result.get())
+ }
+
+ @Test
+ fun testGetError() {
+ val result = divide(10, 0)
+ Assert.assertNull(result.get())
+ }
+
+ @Test
+ fun testMapOnSuccess() {
+ val result = divide(10, 5)
+ .map { "Result: $it" }
+ Assert.assertEquals(Success("Result: 2.0"), result)
+ }
+
+ @Test
+ fun testMapOnError() {
+ val result = divide(10, 0)
+ .map { "Result: $it" }
+ Assert.assertEquals(Failure("Division by zero"), result)
+ }
+
+ @Test
+ fun testMapFailureOnSuccess() {
+ val result = divide(10, 5)
+ .mapFailure { "Failure: $it" }
+ Assert.assertEquals(Success(2.0f), result)
+ }
+
+ @Test
+ fun testMapFailureOnError() {
+ val result = divide(10, 0)
+ .mapFailure { "Failure: $it" }
+ Assert.assertEquals(Failure("Failure: Division by zero"), result)
+ }
+}
diff --git a/libraries/README.md b/libraries/README.md
index 86baa39045..88075af390 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -28,6 +28,9 @@
- [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog)
- [Introduction to Neuroph](http://www.baeldung.com/intro-to-neuroph)
- [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue)
+- [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss)
+- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception)
+
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/libraries/pom.xml b/libraries/pom.xml
index efdf20423a..a16a4de59d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -181,6 +181,11 @@
jetty-servlet
${jetty.version}
+
+ rome
+ rome
+ ${rome.version}
+
io.specto
hoverfly-java
@@ -457,6 +462,16 @@
pcollections
${pcollections.version}
+
+ com.machinezoo.noexception
+ noexception
+ 1.1.0
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse-collections.version}
+
0.7.0
@@ -497,5 +512,7 @@
1.6.0
1.7.1
2.1.2
+ 1.0
+ 8.2.0
-
+
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
new file mode 100644
index 0000000000..069baeab9f
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
@@ -0,0 +1,20 @@
+package com.baeldung.eclipsecollections;
+
+import java.util.List;
+
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.set.mutable.UnifiedSet;
+
+public class ConvertContainerToAnother {
+
+ @SuppressWarnings("rawtypes")
+ public static List convertToList() {
+ UnifiedSet cars = new UnifiedSet<>();
+
+ cars.add("Toyota");
+ cars.add("Mercedes");
+ cars.add("Volkswagen");
+
+ return cars.toList();
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java
new file mode 100644
index 0000000000..cf6c06cec0
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java
@@ -0,0 +1,46 @@
+package com.baeldung.eclipsecollections;
+
+import java.util.List;
+
+public class Student {
+
+ private String firstName;
+ private String lastName;
+ private List addresses;
+
+ public Student(String firstName, String lastName) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ public Student(String firstName, String lastName, List addresses) {
+ super();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.addresses = addresses;
+ }
+
+ public String getFirstName() {
+ return this.firstName;
+ }
+
+ public String getLastName() {
+ return this.lastName;
+ }
+
+ public List getAddresses() {
+ return addresses;
+ }
+
+ public void setAddresses(List addresses) {
+ this.addresses = addresses;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+}
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java b/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
new file mode 100644
index 0000000000..59e13efaa0
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
@@ -0,0 +1,24 @@
+package com.baeldung.noexception;
+
+import com.machinezoo.noexception.ExceptionHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CustomExceptionHandler extends ExceptionHandler {
+
+ private Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);
+
+ @Override
+ public boolean handle(Throwable throwable) {
+
+ if (throwable.getClass()
+ .isAssignableFrom(RuntimeException.class)
+ || throwable.getClass()
+ .isAssignableFrom(Error.class)) {
+ return false;
+ } else {
+ logger.error("Caught Exception ", throwable);
+ return true;
+ }
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java b/libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java
new file mode 100644
index 0000000000..66a9e0ebce
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java
@@ -0,0 +1,76 @@
+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;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class RSSRomeExample {
+
+ public static void main(String[] args) throws IOException, FeedException {
+ SyndFeed feed = createFeed();
+ addEntryToFeed(feed);
+ publishFeed(feed);
+ readFeed();
+ }
+
+ private static SyndFeed createFeed() {
+ SyndFeed feed = new SyndFeedImpl();
+ feed.setFeedType("rss_1.0");
+ feed.setTitle("Test title");
+ feed.setLink("http://www.somelink.com");
+ feed.setDescription("Basic description");
+
+ return feed;
+ }
+
+ private static void addEntryToFeed(SyndFeed feed) {
+ SyndEntry entry = new SyndEntryImpl();
+ entry.setTitle("Entry title");
+ entry.setLink("http://www.somelink.com/entry1");
+
+ addDescriptionToEntry(entry);
+ addCategoryToEntry(entry);
+
+ feed.setEntries(Arrays.asList(entry));
+ }
+
+ private static void addDescriptionToEntry(SyndEntry entry) {
+ SyndContent description = new SyndContentImpl();
+ description.setType("text/html");
+ description.setValue("First entry");
+
+ entry.setDescription(description);
+ }
+
+ private static void addCategoryToEntry(SyndEntry entry) {
+ List categories = new ArrayList<>();
+ SyndCategory category = new SyndCategoryImpl();
+ category.setName("Sophisticated category");
+ categories.add(category);
+
+ entry.setCategories(categories);
+ }
+
+ private static void publishFeed(SyndFeed feed) throws IOException, FeedException {
+ Writer writer = new FileWriter("xyz.txt");
+ SyndFeedOutput syndFeedOutput = new SyndFeedOutput();
+ syndFeedOutput.output(feed, writer);
+ writer.close();
+ }
+
+ private static SyndFeed readFeed() throws IOException, FeedException {
+ URL feedSource = new URL("http://rssblog.whatisrss.com/feed/");
+ SyndFeedInput input = new SyndFeedInput();
+ return input.build(new XmlReader(feedSource));
+ }
+}
\ No newline at end of file
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java
new file mode 100644
index 0000000000..ee369fc75b
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.eclipsecollections;
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.block.factory.Predicates;
+import org.eclipse.collections.impl.list.mutable.FastList;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AllSatisfyPatternTest {
+
+ MutableList list;
+
+ @Before
+ public void getList() {
+ this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38);
+ }
+
+ @Test
+ public void whenAnySatisfiesCondition_thenCorrect() {
+ boolean result = list.allSatisfy(Predicates.greaterThan(0));
+
+ assertTrue(result);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java
new file mode 100644
index 0000000000..a3314ebee6
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.eclipsecollections;
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.block.factory.Predicates;
+import org.eclipse.collections.impl.list.mutable.FastList;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AnySatisfyPatternTest {
+
+ MutableList list;
+
+ @Before
+ public void getList() {
+ this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38);
+ }
+
+ @Test
+ public void whenAnySatisfiesCondition_thenCorrect() {
+ boolean result = list.anySatisfy(Predicates.greaterThan(30));
+
+ assertTrue(result);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java
new file mode 100644
index 0000000000..ee384c2f9d
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.eclipsecollections;
+
+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 CollectPatternTest {
+
+ @Test
+ public void whenCollect_thenCorrect() {
+ Student student1 = new Student("John", "Hopkins");
+ Student student2 = new Student("George", "Adams");
+
+ MutableList students = FastList.newListWith(student1, student2);
+
+ MutableList lastNames = students.collect(Student::getLastName);
+
+ Assertions.assertThat(lastNames)
+ .containsExactly("Hopkins", "Adams");
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java
new file mode 100644
index 0000000000..4655431872
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java
@@ -0,0 +1,18 @@
+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.junit.Test;
+
+public class ConvertContainerToAnotherTest {
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Test
+ public void whenConvertContainerToAnother_thenCorrect() {
+ MutableList cars = (MutableList) ConvertContainerToAnother.convertToList();
+
+ Assertions.assertThat(cars)
+ .containsExactlyElementsOf(FastList.newListWith("Volkswagen", "Toyota", "Mercedes"));
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java
new file mode 100644
index 0000000000..c5b5e1c412
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.eclipsecollections;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.block.factory.Predicates;
+import org.eclipse.collections.impl.list.mutable.FastList;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DetectPatternTest {
+
+ MutableList list;
+
+ @Before
+ public void getList() {
+ this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38);
+ }
+
+ @Test
+ public void whenDetect_thenCorrect() {
+ Integer result = list.detect(Predicates.greaterThan(30));
+
+ Assertions.assertThat(result)
+ .isEqualTo(41);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java
new file mode 100644
index 0000000000..021c72e91e
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java
@@ -0,0 +1,50 @@
+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.junit.Before;
+import org.junit.Test;
+
+public class FlatCollectTest {
+
+ MutableList addresses1;
+ MutableList addresses2;
+ MutableList addresses3;
+ MutableList addresses4;
+
+ List expectedAddresses;
+ MutableList students;
+
+ @Before
+ public void setup() {
+ String address1 = "73 Pacific St., Forest Hills, NY 11375";
+ String address2 = "93 Bayport Ave., South Richmond Hill, NY 11419";
+ String address3 = "548 Market St, San Francisco, CA 94104";
+ String address4 = "8605 Santa Monica Blvd, West Hollywood, CA 90069";
+
+ this.addresses1 = FastList.newListWith(address1, address2);
+ this.addresses2 = FastList.newListWith(address3, address4);
+ Student student1 = new Student("John", "Hopkins", addresses1);
+ Student student2 = new Student("George", "Adams", addresses2);
+ this.addresses2 = FastList.newListWith(address3, address4);
+ this.students = FastList.newListWith(student1, student2);
+ this.expectedAddresses = new ArrayList<>();
+ this.expectedAddresses.add("73 Pacific St., Forest Hills, NY 11375");
+ this.expectedAddresses.add("93 Bayport Ave., South Richmond Hill, NY 11419");
+ this.expectedAddresses.add("548 Market St, San Francisco, CA 94104");
+ this.expectedAddresses.add("8605 Santa Monica Blvd, West Hollywood, CA 90069");
+ }
+
+ @Test
+ public void whenFlatCollect_thenCorrect() {
+ MutableList addresses = students.flatCollect(Student::getAddresses);
+
+ Assertions.assertThat(addresses)
+ .containsExactlyElementsOf(this.expectedAddresses);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java
new file mode 100644
index 0000000000..8cea575222
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternTest.java
@@ -0,0 +1,29 @@
+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;
+import org.junit.Test;
+
+public class ForEachPatternTest {
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void whenInstantiateAndChangeValues_thenCorrect() {
+ Pair pair1 = Tuples.pair(1, "One");
+ Pair pair2 = Tuples.pair(2, "Two");
+ Pair pair3 = Tuples.pair(3, "Three");
+
+ UnifiedMap map = UnifiedMap.newMapWith(pair1, pair2, pair3);
+
+ for (int i = 0; i < map.size(); i++) {
+ map.put(i + 1, "New Value");
+ }
+
+ for (int i = 0; i < map.size(); i++) {
+ assertEquals("New Value", map.get(i + 1));
+ }
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java
new file mode 100644
index 0000000000..bcd34021b1
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.eclipsecollections;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.eclipse.collections.impl.factory.Lists;
+import org.junit.Test;
+
+public class InjectIntoPatternTest {
+
+ @Test
+ public void whenInjectInto_thenCorrect() {
+ List list = Lists.mutable.of(1, 2, 3, 4);
+ int result = 5;
+ for (int i = 0; i < list.size(); i++) {
+ Integer v = list.get(i);
+ result = result + v.intValue();
+ }
+
+ assertEquals(15, result);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java
new file mode 100644
index 0000000000..9c216ecc87
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.eclipsecollections;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.collections.api.LazyIterable;
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.factory.Lists;
+import org.junit.Test;
+
+public class LazyIterationTest {
+
+ @Test
+ public void whenLazyIteration_thenCorrect() {
+ Student student1 = new Student("John", "Hopkins");
+ Student student2 = new Student("George", "Adams");
+ Student student3 = new Student("Jennifer", "Rodriguez");
+
+ MutableList students = Lists.mutable.with(student1, student2, student3);
+ LazyIterable lazyStudents = students.asLazy();
+ LazyIterable lastNames = lazyStudents.collect(Student::getLastName);
+
+ Assertions.assertThat(lastNames)
+ .containsAll(Lists.mutable.with("Hopkins", "Adams", "Rodriguez"));
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java
new file mode 100644
index 0000000000..c055413cd9
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.eclipsecollections;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.collections.api.block.predicate.Predicate;
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.api.partition.list.PartitionMutableList;
+import org.eclipse.collections.impl.list.mutable.FastList;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PartitionPatternTest {
+
+ MutableList list;
+
+ @Before
+ public void getList() {
+ this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38);
+ }
+
+ @Test
+ public void whenAnySatisfiesCondition_thenCorrect() {
+ MutableList numbers = list;
+ PartitionMutableList partitionedFolks = numbers.partition(new Predicate() {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -1551138743683678406L;
+
+ public boolean accept(Integer each) {
+ return each > 30;
+ }
+ });
+ MutableList greaterThanThirty = partitionedFolks.getSelected()
+ .sortThis();
+ MutableList smallerThanThirty = partitionedFolks.getRejected()
+ .sortThis();
+
+ Assertions.assertThat(smallerThanThirty)
+ .containsExactly(1, 5, 8, 17, 23);
+ Assertions.assertThat(greaterThanThirty)
+ .containsExactly(31, 38, 41);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java
new file mode 100644
index 0000000000..1666c86333
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.eclipsecollections;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.block.factory.Predicates;
+import org.eclipse.collections.impl.list.mutable.FastList;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RejectPatternTest {
+
+ MutableList list;
+ MutableList expectedList;
+
+ @Before
+ public void setup() {
+ this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38);
+ this.expectedList = FastList.newListWith(1, 5, 8, 17, 23);
+ }
+
+ @Test
+ public void whenReject_thenCorrect() {
+ MutableList notGreaterThanThirty = list.reject(Predicates.greaterThan(30))
+ .sortThis();
+
+ Assertions.assertThat(notGreaterThanThirty)
+ .containsExactlyElementsOf(this.expectedList);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java
new file mode 100644
index 0000000000..d79c864fc5
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.eclipsecollections;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.collections.api.list.MutableList;
+import org.eclipse.collections.impl.block.factory.Predicates;
+import org.eclipse.collections.impl.list.mutable.FastList;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SelectPatternTest {
+
+ MutableList list;
+
+ @Before
+ public void getList() {
+ this.list = FastList.newListWith(1, 8, 5, 41, 31, 17, 23, 38);
+ }
+
+ @Test
+ public void givenListwhenSelect_thenCorrect() {
+ MutableList greaterThanThirty = list.select(Predicates.greaterThan(30))
+ .sortThis();
+
+ Assertions.assertThat(greaterThanThirty)
+ .containsExactly(31, 38, 41);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public MutableList selectUsingLambda() {
+ return list.select(each -> each > 30)
+ .sortThis();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void givenListwhenSelectUsingLambda_thenCorrect() {
+ MutableList greaterThanThirty = selectUsingLambda();
+
+ Assertions.assertThat(greaterThanThirty)
+ .containsExactly(31, 38, 41);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java
new file mode 100644
index 0000000000..29f0c23954
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.eclipsecollections;
+
+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;
+
+public class ZipTest {
+
+ MutableList> expectedPairs;
+
+ @SuppressWarnings("unchecked")
+ @Before
+ public void setup() {
+ Pair pair1 = Tuples.pair("1", "Porsche");
+ Pair pair2 = Tuples.pair("2", "Volvo");
+ Pair pair3 = Tuples.pair("3", "Toyota");
+ expectedPairs = Lists.mutable.of(pair1, pair2, pair3);
+ }
+
+ @Test
+ public void whenZip_thenCorrect() {
+ MutableList numbers = Lists.mutable.with("1", "2", "3", "Ignored");
+ MutableList cars = Lists.mutable.with("Porsche", "Volvo", "Toyota");
+ MutableList> pairs = numbers.zip(cars);
+
+ Assertions.assertThat(pairs)
+ .containsExactlyElementsOf(this.expectedPairs);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java
new file mode 100644
index 0000000000..a2d8be44ec
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java
@@ -0,0 +1,33 @@
+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.list.mutable.FastList;
+import org.eclipse.collections.impl.tuple.Tuples;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ZipWithIndexTest {
+
+ MutableList> expectedPairs;
+
+ @SuppressWarnings("unchecked")
+ @Before
+ public void setup() {
+ Pair pair1 = Tuples.pair("Porsche", 0);
+ Pair pair2 = Tuples.pair("Volvo", 1);
+ Pair pair3 = Tuples.pair("Toyota", 2);
+ expectedPairs = Lists.mutable.of(pair1, pair2, pair3);
+ }
+
+ @Test
+ public void whenZip_thenCorrect() {
+ MutableList cars = FastList.newListWith("Porsche", "Volvo", "Toyota");
+ MutableList> pairs = cars.zipWithIndex();
+
+ Assertions.assertThat(pairs)
+ .containsExactlyElementsOf(this.expectedPairs);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/hll/HLLUnitTest.java b/libraries/src/test/java/com/baeldung/hll/HLLUnitTest.java
index 8d09c99f0f..e208add3c8 100644
--- a/libraries/src/test/java/com/baeldung/hll/HLLUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/hll/HLLUnitTest.java
@@ -23,9 +23,9 @@ public class HLLUnitTest {
//when
LongStream.range(0, numberOfElements).forEach(element -> {
- long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong();
- hll.addRaw(hashedValue);
- }
+ long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong();
+ hll.addRaw(hashedValue);
+ }
);
//then
@@ -44,15 +44,15 @@ public class HLLUnitTest {
//when
LongStream.range(0, numberOfElements).forEach(element -> {
- long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong();
- firstHll.addRaw(hashedValue);
- }
+ long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong();
+ firstHll.addRaw(hashedValue);
+ }
);
LongStream.range(numberOfElements, numberOfElements * 2).forEach(element -> {
- long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong();
- secondHLL.addRaw(hashedValue);
- }
+ long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong();
+ secondHLL.addRaw(hashedValue);
+ }
);
//then
diff --git a/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiTest.java b/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiTest.java
rename to libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java
index bdaf4d7bd9..167aef5ec6 100644
--- a/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiTest.java
+++ b/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java
@@ -31,7 +31,7 @@ import org.springframework.web.client.RestTemplate;
import io.specto.hoverfly.junit.core.SimulationSource;
import io.specto.hoverfly.junit.rule.HoverflyRule;
-public class HoverflyApiTest {
+public class HoverflyApiIntegrationTest {
private static final SimulationSource source = dsl(
service("http://www.baeldung.com")
diff --git a/jooq/src/test/java/com/baeldung/JOOLUnitTest.java b/libraries/src/test/java/com/baeldung/jool/JOOLTest.java
similarity index 64%
rename from jooq/src/test/java/com/baeldung/JOOLUnitTest.java
rename to libraries/src/test/java/com/baeldung/jool/JOOLTest.java
index 17873db50a..ba20e153fd 100644
--- a/jooq/src/test/java/com/baeldung/JOOLUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/jool/JOOLTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.jool;
import org.jooq.lambda.Seq;
import org.jooq.lambda.Unchecked;
@@ -13,6 +13,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -20,7 +21,7 @@ import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.assertEquals;
import static org.jooq.lambda.tuple.Tuple.tuple;
-public class JOOLUnitTest {
+public class JOOLTest {
@Test
public void givenSeq_whenCheckContains_shouldReturnTrue() {
List concat = Seq.of(1, 2, 3).concat(Seq.of(4, 5, 6)).toList();
@@ -54,58 +55,58 @@ public class JOOLUnitTest {
@Test
public void givenSeq_whenJoin_shouldHaveElementsFromBothSeq() {
assertEquals(
- Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(),
- Arrays.asList(tuple(1, 1), tuple(2, 2))
+ Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), Objects::equals).toList(),
+ Arrays.asList(tuple(1, 1), tuple(2, 2))
);
assertEquals(
- Seq.of(1, 2, 4).leftOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(),
- Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(4, null))
+ Seq.of(1, 2, 4).leftOuterJoin(Seq.of(1, 2, 3), Objects::equals).toList(),
+ Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(4, null))
);
assertEquals(
- Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b).toList(),
- Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(null, 3))
+ Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), Objects::equals).toList(),
+ Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(null, 3))
);
assertEquals(
- Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(),
- Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B"))
+ Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(),
+ Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B"))
);
}
@Test
public void givenSeq_whenManipulateSeq_seqShouldHaveNewElementsInIt() {
assertEquals(
- Seq.of(1, 2, 3).cycle().limit(9).toList(),
- Arrays.asList(1, 2, 3, 1, 2, 3, 1, 2, 3)
+ Seq.of(1, 2, 3).cycle().limit(9).toList(),
+ Arrays.asList(1, 2, 3, 1, 2, 3, 1, 2, 3)
);
assertEquals(
- Seq.of(1, 2, 3).duplicate().map((first, second) -> tuple(first.toList(), second.toList())),
- tuple(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3))
+ Seq.of(1, 2, 3).duplicate().map((first, second) -> tuple(first.toList(), second.toList())),
+ tuple(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3))
);
assertEquals(
- Seq.of(1, 2, 3, 4).intersperse(0).toList(),
- Arrays.asList(1, 0, 2, 0, 3, 0, 4)
+ Seq.of(1, 2, 3, 4).intersperse(0).toList(),
+ Arrays.asList(1, 0, 2, 0, 3, 0, 4)
);
assertEquals(
- Seq.of(1, 2, 3, 4, 5).shuffle().toList().size(),
- 5
+ Seq.of(1, 2, 3, 4, 5).shuffle().toList().size(),
+ 5
);
assertEquals(
- Seq.of(1, 2, 3, 4).partition(i -> i > 2).map((first, second) -> tuple(first.toList(), second.toList())),
- tuple(Arrays.asList(3, 4), Arrays.asList(1, 2))
+ Seq.of(1, 2, 3, 4).partition(i -> i > 2).map((first, second) -> tuple(first.toList(), second.toList())),
+ tuple(Arrays.asList(3, 4), Arrays.asList(1, 2))
);
assertEquals(
- Seq.of(1, 2, 3, 4).reverse().toList(),
- Arrays.asList(4, 3, 2, 1)
+ Seq.of(1, 2, 3, 4).reverse().toList(),
+ Arrays.asList(4, 3, 2, 1)
);
}
@@ -117,20 +118,20 @@ public class JOOLUnitTest {
expectedAfterGroupBy.put(0, Arrays.asList(2, 4));
assertEquals(
- Seq.of(1, 2, 3, 4).groupBy(i -> i % 2),
- expectedAfterGroupBy
+ Seq.of(1, 2, 3, 4).groupBy(i -> i % 2),
+ expectedAfterGroupBy
);
assertEquals(
- Seq.of("a", "b", "c").foldLeft("!", (u, t) -> u + t),
- "!abc"
+ Seq.of("a", "b", "c").foldLeft("!", (u, t) -> u + t),
+ "!abc"
);
assertEquals(
- Seq.of("a", "b", "c").foldRight("!", (t, u) -> t + u),
- "abc!"
+ Seq.of("a", "b", "c").foldRight("!", (t, u) -> t + u),
+ "abc!"
);
}
@@ -138,13 +139,13 @@ public class JOOLUnitTest {
public void givenSeq_whenUsingSeqWhile_shouldBehaveAsWhileLoop() {
assertEquals(
- Seq.of(1, 2, 3, 4, 5).skipWhile(i -> i < 3).toList(),
- Arrays.asList(3, 4, 5)
+ Seq.of(1, 2, 3, 4, 5).skipWhile(i -> i < 3).toList(),
+ Arrays.asList(3, 4, 5)
);
assertEquals(
- Seq.of(1, 2, 3, 4, 5).skipUntil(i -> i == 3).toList(),
- Arrays.asList(3, 4, 5)
+ Seq.of(1, 2, 3, 4, 5).skipUntil(i -> i == 3).toList(),
+ Arrays.asList(3, 4, 5)
);
}
@@ -152,19 +153,19 @@ public class JOOLUnitTest {
public void givenSeq_whenZip_shouldHaveZippedSeq() {
assertEquals(
- Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c")).toList(),
- Arrays.asList(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
+ Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c")).toList(),
+ Arrays.asList(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
);
assertEquals(
- Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y).toList(),
- Arrays.asList("1:a", "2:b", "3:c")
+ Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y).toList(),
+ Arrays.asList("1:a", "2:b", "3:c")
);
assertEquals(
- Seq.of("a", "b", "c").zipWithIndex().toList(),
- Arrays.asList(tuple("a", 0L), tuple("b", 1L), tuple("c", 2L))
+ Seq.of("a", "b", "c").zipWithIndex().toList(),
+ Arrays.asList(tuple("a", 0L), tuple("b", 1L), tuple("c", 2L))
);
}
@@ -187,8 +188,8 @@ public class JOOLUnitTest {
//then
assertEquals(
- collect,
- Arrays.asList(1, 1, 1)
+ collect,
+ Arrays.asList(1, 1, 1)
);
}
@@ -197,13 +198,13 @@ public class JOOLUnitTest {
public void givenOperationThatThrowsCheckedException_whenExecuteUsingUncheckedFuction_shouldPass() {
//when
List collect = Stream.of("a", "b", "c")
- .map(Unchecked.function(elem -> methodThatThrowsChecked(elem)))
- .collect(Collectors.toList());
+ .map(Unchecked.function(this::methodThatThrowsChecked))
+ .collect(Collectors.toList());
//then
assertEquals(
- collect,
- Arrays.asList(1, 1, 1)
+ collect,
+ Arrays.asList(1, 1, 1)
);
}
@@ -236,5 +237,4 @@ public class JOOLUnitTest {
Arrays.asList(tuple("michael", "similar", "winter", "summer"), tuple("jodie", "variable", "winter", "summer"))
);
}
-
}
diff --git a/libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java b/libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
new file mode 100644
index 0000000000..b7619202fe
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.noexception;
+
+import com.machinezoo.noexception.Exceptions;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NoExceptionUnitTest {
+
+ private static Logger logger = LoggerFactory.getLogger(NoExceptionUnitTest.class);
+
+ @Test
+ public void whenStdExceptionHandling_thenCatchAndLog() {
+ try {
+ System.out.println("Result is " + Integer.parseInt("foobar"));
+ } catch (Throwable exception) {
+ logger.error("Caught exception:", exception);
+ }
+ }
+
+ @Test
+ public void whenDefaultNoException_thenCatchAndLog() {
+ Exceptions.log().run(() -> System.out.println("Result is " + Integer.parseInt("foobar")));
+ }
+
+ @Test
+ public void givenLogger_whenDefaultNoException_thenCatchAndLogWithClassName() {
+ Exceptions.log(logger).run(() -> System.out.println("Result is " + Integer.parseInt("foobar")));
+ }
+
+ @Test
+ public void givenLoggerAndMessage_whenDefaultNoException_thenCatchAndLogWithMessage() {
+ Exceptions.log(logger, "Something went wrong:").run(() -> System.out.println("Result is " + Integer.parseInt("foobar")));
+ }
+
+ @Test
+ public void givenDefaultValue_whenDefaultNoException_thenCatchAndLogPrintDefault() {
+ System.out.println("Result is " + Exceptions.log(logger, "Something went wrong:").get(() -> Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test(expected = Error.class)
+ public void givenCustomHandler_whenError_thenRethrowError() {
+ CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler();
+ customExceptionHandler.run(() -> throwError());
+ }
+
+ @Test
+ public void givenCustomHandler_whenException_thenCatchAndLog() {
+ CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler();
+ customExceptionHandler.run(() -> throwException());
+ }
+
+ private static void throwError() {
+ throw new Error("This is very bad.");
+ }
+
+ private static void throwException() {
+ String testString = "foo";
+ testString.charAt(5);
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java b/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
index 23f9abf2f3..acc7718ea8 100644
--- a/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
@@ -1,7 +1,12 @@
package com.baeldung.pcollections;
import org.junit.Test;
-import org.pcollections.*;
+import org.pcollections.HashPMap;
+import org.pcollections.HashTreePMap;
+import org.pcollections.HashTreePSet;
+import org.pcollections.MapPSet;
+import org.pcollections.PVector;
+import org.pcollections.TreePVector;
import java.util.Arrays;
import java.util.HashMap;
@@ -27,7 +32,7 @@ public class PCollectionsUnitTest {
@Test
public void givenExistingHashMap_whenFrom_thenCreateHashPMap() {
- Map map = new HashMap();
+ Map map = new HashMap<>();
map.put("mkey1", "mval1");
map.put("mkey2", "mval2");
@@ -41,7 +46,7 @@ public class PCollectionsUnitTest {
HashPMap pmap = HashTreePMap.empty();
HashPMap pmap0 = pmap.plus("key1", "value1");
- Map map = new HashMap();
+ Map map = new HashMap<>();
map.put("key2", "val2");
map.put("key3", "val3");
@@ -57,22 +62,24 @@ public class PCollectionsUnitTest {
@Test
public void whenTreePVectorMethods_thenPerformOperations() {
- TreePVector pVector = TreePVector.empty();
+ TreePVector pVector = TreePVector.empty();
+
+ TreePVector pV1 = pVector.plus("e1");
+ TreePVector pV2 = pV1.plusAll(Arrays.asList("e2", "e3", "e4"));
- TreePVector pV1 = pVector.plus("e1");
- TreePVector pV2 = pV1.plusAll(Arrays.asList("e2", "e3", "e4"));
assertEquals(1, pV1.size());
assertEquals(4, pV2.size());
- TreePVector pV3 = pV2.minus("e1");
- TreePVector pV4 = pV3.minusAll(Arrays.asList("e2", "e3", "e4"));
+ TreePVector pV3 = pV2.minus("e1");
+ TreePVector pV4 = pV3.minusAll(Arrays.asList("e2", "e3", "e4"));
+
assertEquals(pV3.size(), 3);
assertEquals(pV4.size(), 0);
- TreePVector pSub = pV2.subList(0, 2);
+ TreePVector pSub = pV2.subList(0, 2);
assertTrue(pSub.contains("e1") && pSub.contains("e2"));
- TreePVector pVW = (TreePVector) pV2.with(0, "e10");
+ PVector pVW = pV2.with(0, "e10");
assertEquals(pVW.get(0), "e10");
}
@@ -80,7 +87,7 @@ public class PCollectionsUnitTest {
public void whenMapPSetMethods_thenPerformOperations() {
MapPSet pSet = HashTreePSet.empty()
- .plusAll(Arrays.asList("e1","e2","e3","e4"));
+ .plusAll(Arrays.asList("e1", "e2", "e3", "e4"));
assertEquals(pSet.size(), 4);
MapPSet pSet1 = pSet.minus("e4");
diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/AtlasObserverLiveTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/AtlasObserverLiveTest.java
index cc2d3aa393..134c3c91cf 100644
--- a/metrics/src/test/java/com/baeldung/metrics/servo/AtlasObserverLiveTest.java
+++ b/metrics/src/test/java/com/baeldung/metrics/servo/AtlasObserverLiveTest.java
@@ -27,9 +27,6 @@ import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
-/**
- * @author aiet
- */
public class AtlasObserverLiveTest {
private final String atlasUri = "http://localhost:7101/api/v1";
diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationManualTest.java
similarity index 95%
rename from metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationTest.java
rename to metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationManualTest.java
index 3d6a73912f..2f908531f6 100644
--- a/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationTest.java
+++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationManualTest.java
@@ -22,10 +22,7 @@ import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-/**
- * @author aiet
- */
-public class MetricAnnotationTest extends MetricTestBase {
+public class MetricAnnotationManualTest extends MetricTestBase {
@Monitor(name = "integerCounter", type = DataSourceType.COUNTER, description = "Total number of update operations.")
private final AtomicInteger updateCount = new AtomicInteger(0);
diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverManualTest.java
similarity index 86%
rename from metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverTest.java
rename to metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverManualTest.java
index 14d3c2646f..3bb421b3ef 100644
--- a/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverTest.java
+++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverManualTest.java
@@ -13,14 +13,16 @@ import java.util.List;
import static com.netflix.servo.annotations.DataSourceType.GAUGE;
import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
-/**
- * @author aiet
- */
-public class MetricObserverTest extends MetricTestBase {
+public class MetricObserverManualTest extends MetricTestBase {
@Test
public void givenMetrics_whenRegister_thenMonitored() throws InterruptedException {
diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerManualTest.java
similarity index 74%
rename from metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerTest.java
rename to metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerManualTest.java
index 4a9a77efde..318170fb1f 100644
--- a/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerTest.java
+++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerManualTest.java
@@ -1,20 +1,23 @@
package com.baeldung.metrics.servo;
import com.netflix.servo.Metric;
-import com.netflix.servo.publish.*;
+import com.netflix.servo.publish.BasicMetricFilter;
+import com.netflix.servo.publish.JvmMetricPoller;
+import com.netflix.servo.publish.MemoryMetricObserver;
+import com.netflix.servo.publish.PollRunnable;
+import com.netflix.servo.publish.PollScheduler;
import org.junit.Test;
import java.util.List;
import static java.util.concurrent.TimeUnit.SECONDS;
import static java.util.stream.Collectors.toList;
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
-/**
- * @author aiet
- */
-public class MetricPollerTest {
+public class MetricPollerManualTest {
@Test
public void givenJvmPoller_whenMonitor_thenDataCollected() throws Exception {
diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java
index 86a9d201e8..42f3c72e97 100644
--- a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java
+++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java
@@ -1,14 +1,16 @@
package com.baeldung.metrics.servo;
-import com.netflix.servo.publish.*;
+import com.netflix.servo.publish.BasicMetricFilter;
+import com.netflix.servo.publish.MemoryMetricObserver;
+import com.netflix.servo.publish.MetricFilter;
+import com.netflix.servo.publish.MonitorRegistryMetricPoller;
+import com.netflix.servo.publish.PollRunnable;
+import com.netflix.servo.publish.PollScheduler;
import org.junit.After;
import org.junit.Before;
import static java.util.concurrent.TimeUnit.SECONDS;
-/**
- * @author aiet
- */
abstract class MetricTestBase {
MemoryMetricObserver observer;
diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java
index 68ba23244d..99009f8d84 100644
--- a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java
+++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java
@@ -1,6 +1,21 @@
package com.baeldung.metrics.servo;
-import com.netflix.servo.monitor.*;
+import com.netflix.servo.monitor.BasicCounter;
+import com.netflix.servo.monitor.BasicGauge;
+import com.netflix.servo.monitor.BasicInformational;
+import com.netflix.servo.monitor.BasicTimer;
+import com.netflix.servo.monitor.BucketConfig;
+import com.netflix.servo.monitor.BucketTimer;
+import com.netflix.servo.monitor.Counter;
+import com.netflix.servo.monitor.Gauge;
+import com.netflix.servo.monitor.MaxGauge;
+import com.netflix.servo.monitor.Monitor;
+import com.netflix.servo.monitor.MonitorConfig;
+import com.netflix.servo.monitor.Monitors;
+import com.netflix.servo.monitor.PeakRateCounter;
+import com.netflix.servo.monitor.StatsTimer;
+import com.netflix.servo.monitor.StepCounter;
+import com.netflix.servo.monitor.Stopwatch;
import com.netflix.servo.stats.StatsConfig;
import org.junit.Ignore;
import org.junit.Test;
@@ -9,13 +24,12 @@ import java.util.Map;
import static java.util.concurrent.TimeUnit.SECONDS;
import static java.util.stream.Collectors.toMap;
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
-/**
- * Unit test for simple App.
- */
public class MetricTypeTest {
@Test
@@ -113,7 +127,7 @@ public class MetricTypeTest {
BucketTimer timer = new BucketTimer(MonitorConfig
.builder("test")
.build(), new BucketConfig.Builder()
- .withBuckets(new long[] { 2L, 5L })
+ .withBuckets(new long[]{2L, 5L})
.withTimeUnit(SECONDS)
.build(), SECONDS);
timer.record(3);
@@ -150,7 +164,7 @@ public class MetricTypeTest {
.builder("test")
.build(), new StatsConfig.Builder()
.withComputeFrequencyMillis(2000)
- .withPercentiles(new double[] { 99.0, 95.0, 90.0 })
+ .withPercentiles(new double[]{99.0, 95.0, 90.0})
.withPublishMax(true)
.withPublishMin(true)
.withPublishCount(true)
diff --git a/noexception/README.md b/noexception/README.md
new file mode 100644
index 0000000000..d840191369
--- /dev/null
+++ b/noexception/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception)
diff --git a/jooq/pom.xml b/noexception/pom.xml
similarity index 57%
rename from jooq/pom.xml
rename to noexception/pom.xml
index 667640d085..64c0591fda 100644
--- a/jooq/pom.xml
+++ b/noexception/pom.xml
@@ -1,25 +1,23 @@
-
-
- parent-modules
- com.baeldung
- 1.0.0-SNAPSHOT
-
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- jooq
+ com.baeldung
+ noexception
+ 1.0
+ noexception
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
- org.jooq
- jool
- ${jool.version}
+ com.machinezoo.noexception
+ noexception
+ 1.1.0
-
-
- 0.9.12
-
-
-
\ No newline at end of file
+
diff --git a/noexception/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java b/noexception/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
new file mode 100644
index 0000000000..59e13efaa0
--- /dev/null
+++ b/noexception/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
@@ -0,0 +1,24 @@
+package com.baeldung.noexception;
+
+import com.machinezoo.noexception.ExceptionHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CustomExceptionHandler extends ExceptionHandler {
+
+ private Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);
+
+ @Override
+ public boolean handle(Throwable throwable) {
+
+ if (throwable.getClass()
+ .isAssignableFrom(RuntimeException.class)
+ || throwable.getClass()
+ .isAssignableFrom(Error.class)) {
+ return false;
+ } else {
+ logger.error("Caught Exception ", throwable);
+ return true;
+ }
+ }
+}
diff --git a/noexception/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java b/noexception/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
new file mode 100644
index 0000000000..690ea43520
--- /dev/null
+++ b/noexception/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.noexception;
+
+import com.machinezoo.noexception.Exceptions;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NoExceptionUnitTest {
+
+ private static Logger logger = LoggerFactory.getLogger(NoExceptionUnitTest.class);
+
+ @Test
+ public void whenStdExceptionHandling_thenCatchAndLog() {
+ try {
+ System.out.println("Result is " + Integer.parseInt("foobar"));
+ } catch (Throwable exception) {
+ logger.error("Caught exception:", exception);
+ }
+ }
+
+ @Test
+ public void whenDefaultNoException_thenCatchAndLog() {
+
+ Exceptions.log().run(() -> System.out.println("Result is " + Integer.parseInt("foobar")));
+ }
+
+ @Test
+ public void givenLogger_whenDefaultNoException_thenCatchAndLogWithClassName() {
+ System.out.println("Result is " + Exceptions.log(logger).get(() -> +Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test
+ public void givenLoggerAndMessage_whenDefaultNoException_thenCatchAndLogWithClassNameAndMessage() {
+ System.out.println("Result is " + Exceptions.log(logger, "Something went wrong:").get(() -> +Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test
+ public void givenDefaultValue_whenDefaultNoException_thenCatchAndLogPrintDefault() {
+ System.out.println("Result is " + Exceptions.log(logger, "Something went wrong:").get(() -> +Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test(expected = Error.class)
+ public void givenCustomHandler_whenError_thenRethrowError() {
+ CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler();
+ customExceptionHandler.run(() -> throwError());
+ }
+
+ @Test
+ public void givenCustomHandler_whenException_thenCatchAndLog() {
+ CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler();
+ customExceptionHandler.run(() -> throwException());
+ }
+
+ private static void throwError() {
+ throw new Error("This is very bad.");
+ }
+
+ private static void throwException() {
+ String testString = "foo";
+ testString.charAt(5);
+ }
+
+}
diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml
index 550409b643..5b7eb48a86 100644
--- a/patterns/intercepting-filter/pom.xml
+++ b/patterns/intercepting-filter/pom.xml
@@ -22,7 +22,6 @@
org.slf4j
slf4j-api
${slf4j.version}
- provided
diff --git a/pom.xml b/pom.xml
index 3feba96d5a..8b3df8de0d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@
apache-thrift
autovalue
axon
+ bootique
cdi
@@ -80,10 +81,9 @@
javax-servlets
javaxval
jaxb
-
+ jee7
jjwt
- jooq
jpa-storedprocedure
jsf
json-path
@@ -106,6 +106,7 @@
mockito2
mocks
mustache
+ noexception
orika
diff --git a/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java b/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java
index fd184556c4..96b551c03c 100644
--- a/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java
+++ b/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java
@@ -42,16 +42,11 @@ public class ActivitiController {
}
@GetMapping("/complete-task-A/{processInstanceId}")
- public TaskRepresentation completeTaskA(@PathVariable String processInstanceId) {
+ public void completeTaskA(@PathVariable String processInstanceId) {
Task task = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.singleResult();
taskService.complete(task.getId());
logger.info("Task completed");
- task = taskService.createTaskQuery()
- .processInstanceId(processInstanceId)
- .singleResult();
-
- return new TaskRepresentation(task.getId(), task.getName(), task.getProcessInstanceId());
}
}
diff --git a/spring-activiti/src/main/java/com/example/activitiwithspring/servicetasks/SendEmailServiceTask.java b/spring-activiti/src/main/java/com/example/activitiwithspring/servicetasks/SendEmailServiceTask.java
new file mode 100644
index 0000000000..c11b48f37a
--- /dev/null
+++ b/spring-activiti/src/main/java/com/example/activitiwithspring/servicetasks/SendEmailServiceTask.java
@@ -0,0 +1,12 @@
+package com.example.activitiwithspring.servicetasks;
+
+import org.activiti.engine.delegate.DelegateExecution;
+import org.activiti.engine.delegate.JavaDelegate;
+
+public class SendEmailServiceTask implements JavaDelegate {
+
+ public void execute(DelegateExecution execution) {
+ //logic to sent email confirmation
+ }
+
+}
diff --git a/spring-activiti/src/main/resources/processes/my-process.bpmn20.xml b/spring-activiti/src/main/resources/processes/my-process.bpmn20.xml
index 3ced8d6b7c..6f151af458 100644
--- a/spring-activiti/src/main/resources/processes/my-process.bpmn20.xml
+++ b/spring-activiti/src/main/resources/processes/my-process.bpmn20.xml
@@ -1,66 +1,35 @@
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java b/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java
index baca58f6ff..65fd33bfc6 100644
--- a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java
@@ -106,14 +106,12 @@ public class ActivitiControllerIntegrationTest {
.get(0);
logger.info("process instance = " + pi.getId());
- String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/complete-task-A/" + pi.getId()))
- .andReturn()
- .getResponse()
- .getContentAsString();
-
- ObjectMapper mapper = new ObjectMapper();
- TaskRepresentation task = mapper.readValue(responseBody, TaskRepresentation.class);
- assertEquals("B", task.getName());
+ this.mockMvc.perform(MockMvcRequestBuilders.get("/complete-task-A/" + pi.getId()))
+ .andReturn()
+ .getResponse()
+ .getContentAsString();
+ List list = runtimeService.createProcessInstanceQuery().list();
+ assertEquals(0, list.size());
}
}
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessEngineCreationIntegrationTest.java b/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessEngineCreationIntegrationTest.java
new file mode 100644
index 0000000000..00afd14590
--- /dev/null
+++ b/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessEngineCreationIntegrationTest.java
@@ -0,0 +1,65 @@
+package com.example.activitiwithspring;
+
+import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.ProcessEngineConfiguration;
+import org.activiti.engine.ProcessEngines;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class ProcessEngineCreationIntegrationTest {
+
+ @Test
+ public void givenXMLConfig_whenGetDefault_thenGotProcessEngine() {
+ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+ assertNotNull(processEngine);
+ assertEquals("root", processEngine.getProcessEngineConfiguration().getJdbcUsername());
+ }
+
+ @Test
+ public void givenXMLConfig_whenCreateDefaultConfiguration_thenGotProcessEngine() {
+ ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
+ ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
+ assertNotNull(processEngine);
+ assertEquals("root", processEngine.getProcessEngineConfiguration().getJdbcUsername());
+ }
+
+ @Test
+ public void givenDifferentNameXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
+ ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("my.activiti.cfg.xml");
+ ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
+ assertNotNull(processEngine);
+ assertEquals("baeldung", processEngine.getProcessEngineConfiguration().getJdbcUsername());
+ }
+
+ @Test
+ public void givenDifferentBeanNameInXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
+ ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
+ .createProcessEngineConfigurationFromResource("my.activiti.cfg.xml", "myProcessEngineConfiguration");
+ ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
+ assertNotNull(processEngine);
+ assertEquals("baeldung", processEngine.getProcessEngineConfiguration().getJdbcUsername());
+ }
+
+ @Test
+ public void givenNoXMLConfig_whenCreateInMemProcessEngineConfig_thenCreated() {
+ ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
+ ProcessEngine processEngine = processEngineConfiguration
+ .setJdbcUrl("jdbc:h2:mem:my-own-in-mem-db;DB_CLOSE_DELAY=1000")
+ .buildProcessEngine();
+ assertNotNull(processEngine);
+ assertEquals("sa", processEngine.getProcessEngineConfiguration().getJdbcUsername());
+ }
+
+ @Test
+ public void givenNoXMLConfig_whenCreateProcessEngineConfig_thenCreated() {
+ ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
+ ProcessEngine processEngine = processEngineConfiguration
+ .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
+ .setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
+ .buildProcessEngine();
+ assertNotNull(processEngine);
+ assertEquals("sa", processEngine.getProcessEngineConfiguration().getJdbcUsername());
+ }
+}
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessExecutionIntegrationTest.java b/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessExecutionIntegrationTest.java
new file mode 100644
index 0000000000..9c35ea413b
--- /dev/null
+++ b/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessExecutionIntegrationTest.java
@@ -0,0 +1,98 @@
+package com.example.activitiwithspring;
+
+
+import org.activiti.engine.ActivitiException;
+import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.ProcessEngines;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class ProcessExecutionIntegrationTest {
+
+ @Test
+ public void givenBPMN_whenDeployProcess_thenDeployed() {
+ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+ RepositoryService repositoryService = processEngine.getRepositoryService();
+ repositoryService.createDeployment()
+ .addClasspathResource("org/activiti/test/vacationRequest.bpmn20.xml")
+ .deploy();
+ Long count = repositoryService.createProcessDefinitionQuery().count();
+ assertTrue(count >= 1);
+ }
+
+ @Test
+ public void givenProcessDefinition_whenStartProcessInstance_thenProcessRunning() {
+ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+ RepositoryService repositoryService = processEngine.getRepositoryService();
+ repositoryService.createDeployment()
+ .addClasspathResource("org/activiti/test/vacationRequest.bpmn20.xml")
+ .deploy();
+
+ Map variables = new HashMap();
+ variables.put("employeeName", "Kermit");
+ variables.put("numberOfDays", new Integer(4));
+ variables.put("vacationMotivation", "I'm really tired!");
+
+ RuntimeService runtimeService = processEngine.getRuntimeService();
+ ProcessInstance processInstance = runtimeService
+ .startProcessInstanceByKey("vacationRequest", variables);
+
+ Long count = runtimeService.createProcessInstanceQuery().count();
+ assertTrue(count >= 1);
+ }
+
+ @Test
+ public void givenProcessInstance_whenCompleteTask_thenProcessExecutionContinues() {
+ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+ RepositoryService repositoryService = processEngine.getRepositoryService();
+ repositoryService.createDeployment()
+ .addClasspathResource("org/activiti/test/vacationRequest.bpmn20.xml")
+ .deploy();
+
+ Map variables = new HashMap();
+ variables.put("employeeName", "Kermit");
+ variables.put("numberOfDays", new Integer(4));
+ variables.put("vacationMotivation", "I'm really tired!");
+
+ RuntimeService runtimeService = processEngine.getRuntimeService();
+ ProcessInstance processInstance = runtimeService
+ .startProcessInstanceByKey("vacationRequest", variables);
+
+ TaskService taskService = processEngine.getTaskService();
+ List tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
+
+ Task task = tasks.get(0);
+
+ Map taskVariables = new HashMap();
+ taskVariables.put("vacationApproved", "false");
+ taskVariables.put("comments", "We have a tight deadline!");
+ taskService.complete(task.getId(), taskVariables);
+
+ Task currentTask = taskService.createTaskQuery().taskName("Modify vacation request").singleResult();
+ assertNotNull(currentTask);
+ }
+
+ @Test(expected = ActivitiException.class)
+ public void givenProcessDefinition_whenSuspend_thenNoProcessInstanceCreated() {
+ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+ RepositoryService repositoryService = processEngine.getRepositoryService();
+ repositoryService.createDeployment()
+ .addClasspathResource("org/activiti/test/vacationRequest.bpmn20.xml")
+ .deploy();
+
+ RuntimeService runtimeService = processEngine.getRuntimeService();
+ repositoryService.suspendProcessDefinitionByKey("vacationRequest");
+ runtimeService.startProcessInstanceByKey("vacationRequest");
+ }
+}
diff --git a/spring-activiti/src/test/resources/activiti.cfg.xml b/spring-activiti/src/test/resources/activiti.cfg.xml
new file mode 100644
index 0000000000..1ee117d936
--- /dev/null
+++ b/spring-activiti/src/test/resources/activiti.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-activiti/src/test/resources/my.activiti.cfg.xml b/spring-activiti/src/test/resources/my.activiti.cfg.xml
new file mode 100644
index 0000000000..07e4206dad
--- /dev/null
+++ b/spring-activiti/src/test/resources/my.activiti.cfg.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-activiti/src/test/resources/org/activiti/test/vacationRequest.bpmn20.xml b/spring-activiti/src/test/resources/org/activiti/test/vacationRequest.bpmn20.xml
new file mode 100644
index 0000000000..354c633385
--- /dev/null
+++ b/spring-activiti/src/test/resources/org/activiti/test/vacationRequest.bpmn20.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ${employeeName} would like to take ${numberOfDays} day(s) of vacation (Motivation: ${reason}).
+
+
+
+
+
+
+
+
+
+ management
+
+
+
+
+
+
+
+
+
+ Your manager has disapproved your vacation request for ${numberOfDays} days.
+ Reason: ${comments}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/App.java b/spring-batch/src/main/java/org/baeldung/batch/App.java
similarity index 96%
rename from spring-batch/src/main/java/org/baeldung/spring_batch_intro/App.java
rename to spring-batch/src/main/java/org/baeldung/batch/App.java
index 2ce4dae6e6..cea4e8d486 100644
--- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/App.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/App.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring_batch_intro;
+package org.baeldung.batch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/SpringBatchConfig.java b/spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java
similarity index 85%
rename from spring-batch/src/main/java/org/baeldung/spring_batch_intro/SpringBatchConfig.java
rename to spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java
index 9973005c7c..7b19935cc8 100644
--- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/SpringBatchConfig.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java
@@ -1,11 +1,8 @@
-package org.baeldung.spring_batch_intro;
+package org.baeldung.batch;
-import java.net.MalformedURLException;
-import java.text.ParseException;
-
-import org.baeldung.spring_batch_intro.model.Transaction;
-import org.baeldung.spring_batch_intro.service.CustomItemProcessor;
-import org.baeldung.spring_batch_intro.service.RecordFieldSetMapper;
+import org.baeldung.batch.model.Transaction;
+import org.baeldung.batch.service.CustomItemProcessor;
+import org.baeldung.batch.service.RecordFieldSetMapper;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
@@ -26,6 +23,9 @@ import org.springframework.core.io.Resource;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+import java.net.MalformedURLException;
+import java.text.ParseException;
+
public class SpringBatchConfig {
@Autowired
private JobBuilderFactory jobs;
@@ -43,7 +43,7 @@ public class SpringBatchConfig {
public ItemReader itemReader() throws UnexpectedInputException, ParseException {
FlatFileItemReader reader = new FlatFileItemReader();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
- String[] tokens = { "username", "userid", "transactiondate", "amount" };
+ String[] tokens = {"username", "userid", "transactiondate", "amount"};
tokenizer.setNames(tokens);
reader.setResource(inputCsv);
DefaultLineMapper lineMapper = new DefaultLineMapper();
@@ -71,13 +71,13 @@ public class SpringBatchConfig {
@Bean
public Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
- marshaller.setClassesToBeBound(new Class[] { Transaction.class });
+ marshaller.setClassesToBeBound(Transaction.class);
return marshaller;
}
@Bean
protected Step step1(ItemReader reader, ItemProcessor processor, ItemWriter writer) {
- return steps.get("step1"). chunk(10).reader(reader).processor(processor).writer(writer).build();
+ return steps.get("step1").chunk(10).reader(reader).processor(processor).writer(writer).build();
}
@Bean(name = "firstBatchJob")
diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/SpringConfig.java b/spring-batch/src/main/java/org/baeldung/batch/SpringConfig.java
similarity index 98%
rename from spring-batch/src/main/java/org/baeldung/spring_batch_intro/SpringConfig.java
rename to spring-batch/src/main/java/org/baeldung/batch/SpringConfig.java
index ed7d302047..35abcb2d16 100644
--- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/SpringConfig.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/SpringConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring_batch_intro;
+package org.baeldung.batch;
import java.net.MalformedURLException;
diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/model/Transaction.java b/spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java
similarity index 96%
rename from spring-batch/src/main/java/org/baeldung/spring_batch_intro/model/Transaction.java
rename to spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java
index 3b2b9610f2..0ce3a413ab 100644
--- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/model/Transaction.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring_batch_intro.model;
+package org.baeldung.batch.model;
import java.util.Date;
diff --git a/spring-batch/src/main/java/org/baeldung/batch/partitioner/CustomMultiResourcePartitioner.java b/spring-batch/src/main/java/org/baeldung/batch/partitioner/CustomMultiResourcePartitioner.java
new file mode 100644
index 0000000000..667e013c35
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/batch/partitioner/CustomMultiResourcePartitioner.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2006-2013 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.baeldung.batch.partitioner;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.batch.core.partition.support.Partitioner;
+import org.springframework.batch.item.ExecutionContext;
+import org.springframework.core.io.Resource;
+import org.springframework.util.Assert;
+
+public class CustomMultiResourcePartitioner implements Partitioner {
+
+ private static final String DEFAULT_KEY_NAME = "fileName";
+
+ private static final String PARTITION_KEY = "partition";
+
+ private Resource[] resources = new Resource[0];
+
+ private String keyName = DEFAULT_KEY_NAME;
+
+ /**
+ * The resources to assign to each partition. In Spring configuration you
+ * can use a pattern to select multiple resources.
+ * @param resources the resources to use
+ */
+ public void setResources(Resource[] resources) {
+ this.resources = resources;
+ }
+
+ /**
+ * The name of the key for the file name in each {@link ExecutionContext}.
+ * Defaults to "fileName".
+ * @param keyName the value of the key
+ */
+ public void setKeyName(String keyName) {
+ this.keyName = keyName;
+ }
+
+ /**
+ * Assign the filename of each of the injected resources to an
+ * {@link ExecutionContext}.
+ *
+ * @see Partitioner#partition(int)
+ */
+ @Override
+ public Map partition(int gridSize) {
+ Map map = new HashMap(gridSize);
+ int i = 0, k = 1;
+ for (Resource resource : resources) {
+ ExecutionContext context = new ExecutionContext();
+ Assert.state(resource.exists(), "Resource does not exist: " + resource);
+ context.putString(keyName, resource.getFilename());
+ context.putString("opFileName", "output" + k++ + ".xml");
+
+ map.put(PARTITION_KEY + i, context);
+ i++;
+ }
+ return map;
+ }
+
+}
diff --git a/spring-batch/src/main/java/org/baeldung/batch/partitioner/SpringbatchPartitionConfig.java b/spring-batch/src/main/java/org/baeldung/batch/partitioner/SpringbatchPartitionConfig.java
new file mode 100644
index 0000000000..ad3aee4a2e
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/batch/partitioner/SpringbatchPartitionConfig.java
@@ -0,0 +1,166 @@
+package org.baeldung.batch.partitioner;
+
+import org.baeldung.batch.model.Transaction;
+import org.baeldung.batch.service.RecordFieldSetMapper;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.Step;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
+import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepScope;
+import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.batch.core.launch.support.SimpleJobLauncher;
+import org.springframework.batch.core.repository.JobRepository;
+import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
+import org.springframework.batch.item.UnexpectedInputException;
+import org.springframework.batch.item.file.FlatFileItemReader;
+import org.springframework.batch.item.file.mapping.DefaultLineMapper;
+import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
+import org.springframework.batch.item.xml.StaxEventItemWriter;
+import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.springframework.oxm.Marshaller;
+import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.text.ParseException;
+
+@Configuration
+@EnableBatchProcessing
+public class SpringbatchPartitionConfig {
+
+ @Autowired
+ ResourcePatternResolver resoursePatternResolver;
+
+ @Autowired
+ private JobBuilderFactory jobs;
+
+ @Autowired
+ private StepBuilderFactory steps;
+
+ @Bean(name = "partitionerJob")
+ public Job partitionerJob() throws UnexpectedInputException, MalformedURLException, ParseException {
+ return jobs.get("partitionerJob")
+ .start(partitionStep())
+ .build();
+ }
+
+ @Bean
+ public Step partitionStep() throws UnexpectedInputException, MalformedURLException, ParseException {
+ return steps.get("partitionStep")
+ .partitioner("slaveStep", partitioner())
+ .step(slaveStep())
+ .taskExecutor(taskExecutor())
+ .build();
+ }
+
+ @Bean
+ public Step slaveStep() throws UnexpectedInputException, MalformedURLException, ParseException {
+ return steps.get("slaveStep")
+ .chunk(1)
+ .reader(itemReader(null))
+ .writer(itemWriter(marshaller(), null))
+ .build();
+ }
+
+ @Bean
+ public CustomMultiResourcePartitioner partitioner() {
+ CustomMultiResourcePartitioner partitioner = new CustomMultiResourcePartitioner();
+ Resource[] resources;
+ try {
+ resources = resoursePatternResolver.getResources("file:src/main/resources/input/partitioner/*.csv");
+ } catch (IOException e) {
+ throw new RuntimeException("I/O problems when resolving the input file pattern.", e);
+ }
+ partitioner.setResources(resources);
+ return partitioner;
+ }
+
+ @Bean
+ @StepScope
+ public FlatFileItemReader itemReader(@Value("#{stepExecutionContext[fileName]}") String filename) throws UnexpectedInputException, ParseException {
+ FlatFileItemReader reader = new FlatFileItemReader<>();
+ DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
+ String[] tokens = {"username", "userid", "transactiondate", "amount"};
+ tokenizer.setNames(tokens);
+ reader.setResource(new ClassPathResource("input/partitioner/" + filename));
+ DefaultLineMapper lineMapper = new DefaultLineMapper<>();
+ lineMapper.setLineTokenizer(tokenizer);
+ lineMapper.setFieldSetMapper(new RecordFieldSetMapper());
+ reader.setLinesToSkip(1);
+ reader.setLineMapper(lineMapper);
+ return reader;
+ }
+
+ @Bean(destroyMethod = "")
+ @StepScope
+ public StaxEventItemWriter itemWriter(Marshaller marshaller, @Value("#{stepExecutionContext[opFileName]}") String filename) throws MalformedURLException {
+ StaxEventItemWriter itemWriter = new StaxEventItemWriter<>();
+ itemWriter.setMarshaller(marshaller);
+ itemWriter.setRootTagName("transactionRecord");
+ itemWriter.setResource(new FileSystemResource("src/main/resources/output/" + filename));
+ return itemWriter;
+ }
+
+ @Bean
+ public Marshaller marshaller() {
+ Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
+ marshaller.setClassesToBeBound(Transaction.class);
+ return marshaller;
+ }
+
+ @Bean
+ public TaskExecutor taskExecutor() {
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setMaxPoolSize(5);
+ taskExecutor.setCorePoolSize(5);
+ taskExecutor.setQueueCapacity(5);
+ taskExecutor.afterPropertiesSet();
+ return taskExecutor;
+ }
+
+ private JobRepository getJobRepository() throws Exception {
+ JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
+ factory.setDataSource(dataSource());
+ factory.setTransactionManager(getTransactionManager());
+ // JobRepositoryFactoryBean's methods Throws Generic Exception,
+ // it would have been better to have a specific one
+ factory.afterPropertiesSet();
+ return factory.getObject();
+ }
+
+ private DataSource dataSource() {
+ EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
+ return builder.setType(EmbeddedDatabaseType.HSQL)
+ .addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
+ .addScript("classpath:org/springframework/batch/core/schema-h2.sql")
+ .build();
+ }
+
+ private PlatformTransactionManager getTransactionManager() {
+ return new ResourcelessTransactionManager();
+ }
+
+ public JobLauncher getJobLauncher() throws Exception {
+ SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
+ // SimpleJobLauncher's methods Throws Generic Exception,
+ // it would have been better to have a specific one
+ jobLauncher.setJobRepository(getJobRepository());
+ jobLauncher.afterPropertiesSet();
+ return jobLauncher;
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/batch/partitioner/SpringbatchPartitionerApp.java b/spring-batch/src/main/java/org/baeldung/batch/partitioner/SpringbatchPartitionerApp.java
new file mode 100644
index 0000000000..e56afc591c
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/batch/partitioner/SpringbatchPartitionerApp.java
@@ -0,0 +1,28 @@
+package org.baeldung.batch.partitioner;
+
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.JobParameters;
+import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+public class SpringbatchPartitionerApp {
+ public static void main(final String[] args) {
+ // Spring Java config
+ final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
+ context.register(SpringbatchPartitionConfig.class);
+ context.refresh();
+
+ final JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
+ final Job job = (Job) context.getBean("partitionerJob");
+ System.out.println("Starting the batch job");
+ try {
+ final JobExecution execution = jobLauncher.run(job, new JobParameters());
+ System.out.println("Job Status : " + execution.getStatus());
+ System.out.println("Job succeeded");
+ } catch (final Exception e) {
+ e.printStackTrace();
+ System.out.println("Job failed");
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/service/CustomItemProcessor.java b/spring-batch/src/main/java/org/baeldung/batch/service/CustomItemProcessor.java
similarity index 71%
rename from spring-batch/src/main/java/org/baeldung/spring_batch_intro/service/CustomItemProcessor.java
rename to spring-batch/src/main/java/org/baeldung/batch/service/CustomItemProcessor.java
index ebee1d2802..8ca7892fec 100644
--- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/service/CustomItemProcessor.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/service/CustomItemProcessor.java
@@ -1,6 +1,6 @@
-package org.baeldung.spring_batch_intro.service;
+package org.baeldung.batch.service;
-import org.baeldung.spring_batch_intro.model.Transaction;
+import org.baeldung.batch.model.Transaction;
import org.springframework.batch.item.ItemProcessor;
public class CustomItemProcessor implements ItemProcessor {
diff --git a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/service/RecordFieldSetMapper.java b/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java
similarity index 91%
rename from spring-batch/src/main/java/org/baeldung/spring_batch_intro/service/RecordFieldSetMapper.java
rename to spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java
index 94f9e7d94e..fa6f0870aa 100644
--- a/spring-batch/src/main/java/org/baeldung/spring_batch_intro/service/RecordFieldSetMapper.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java
@@ -1,9 +1,9 @@
-package org.baeldung.spring_batch_intro.service;
+package org.baeldung.batch.service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import org.baeldung.spring_batch_intro.model.Transaction;
+import org.baeldung.batch.model.Transaction;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.validation.BindException;
diff --git a/spring-batch/src/main/resources/input/partitioner/record1.csv b/spring-batch/src/main/resources/input/partitioner/record1.csv
new file mode 100644
index 0000000000..e554becb2a
--- /dev/null
+++ b/spring-batch/src/main/resources/input/partitioner/record1.csv
@@ -0,0 +1,4 @@
+username, user_id, transaction_date, transaction_amount
+devendra, 1234, 31/10/2015, 10000
+john, 2134, 3/12/2015, 12321
+robin, 2134, 2/02/2015, 23411
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/input/partitioner/record2.csv b/spring-batch/src/main/resources/input/partitioner/record2.csv
new file mode 100644
index 0000000000..e554becb2a
--- /dev/null
+++ b/spring-batch/src/main/resources/input/partitioner/record2.csv
@@ -0,0 +1,4 @@
+username, user_id, transaction_date, transaction_amount
+devendra, 1234, 31/10/2015, 10000
+john, 2134, 3/12/2015, 12321
+robin, 2134, 2/02/2015, 23411
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/input/partitioner/record3.csv b/spring-batch/src/main/resources/input/partitioner/record3.csv
new file mode 100644
index 0000000000..e554becb2a
--- /dev/null
+++ b/spring-batch/src/main/resources/input/partitioner/record3.csv
@@ -0,0 +1,4 @@
+username, user_id, transaction_date, transaction_amount
+devendra, 1234, 31/10/2015, 10000
+john, 2134, 3/12/2015, 12321
+robin, 2134, 2/02/2015, 23411
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/input/partitioner/record4.csv b/spring-batch/src/main/resources/input/partitioner/record4.csv
new file mode 100644
index 0000000000..e554becb2a
--- /dev/null
+++ b/spring-batch/src/main/resources/input/partitioner/record4.csv
@@ -0,0 +1,4 @@
+username, user_id, transaction_date, transaction_amount
+devendra, 1234, 31/10/2015, 10000
+john, 2134, 3/12/2015, 12321
+robin, 2134, 2/02/2015, 23411
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/input/partitioner/record5.csv b/spring-batch/src/main/resources/input/partitioner/record5.csv
new file mode 100644
index 0000000000..e554becb2a
--- /dev/null
+++ b/spring-batch/src/main/resources/input/partitioner/record5.csv
@@ -0,0 +1,4 @@
+username, user_id, transaction_date, transaction_amount
+devendra, 1234, 31/10/2015, 10000
+john, 2134, 3/12/2015, 12321
+robin, 2134, 2/02/2015, 23411
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/output/output1.xml b/spring-batch/src/main/resources/output/output1.xml
new file mode 100644
index 0000000000..194b860813
--- /dev/null
+++ b/spring-batch/src/main/resources/output/output1.xml
@@ -0,0 +1,21 @@
+
+
+
+ 10000.0
+ 2015-10-31T00:00:00+05:30
+ 1234
+ devendra
+
+
+ 12321.0
+ 2015-12-03T00:00:00+05:30
+ 2134
+ john
+
+
+ 23411.0
+ 2015-02-02T00:00:00+05:30
+ 2134
+ robin
+
+
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/output/output2.xml b/spring-batch/src/main/resources/output/output2.xml
new file mode 100644
index 0000000000..194b860813
--- /dev/null
+++ b/spring-batch/src/main/resources/output/output2.xml
@@ -0,0 +1,21 @@
+
+
+
+ 10000.0
+ 2015-10-31T00:00:00+05:30
+ 1234
+ devendra
+
+
+ 12321.0
+ 2015-12-03T00:00:00+05:30
+ 2134
+ john
+
+
+ 23411.0
+ 2015-02-02T00:00:00+05:30
+ 2134
+ robin
+
+
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/output/output3.xml b/spring-batch/src/main/resources/output/output3.xml
new file mode 100644
index 0000000000..194b860813
--- /dev/null
+++ b/spring-batch/src/main/resources/output/output3.xml
@@ -0,0 +1,21 @@
+
+
+
+ 10000.0
+ 2015-10-31T00:00:00+05:30
+ 1234
+ devendra
+
+
+ 12321.0
+ 2015-12-03T00:00:00+05:30
+ 2134
+ john
+
+
+ 23411.0
+ 2015-02-02T00:00:00+05:30
+ 2134
+ robin
+
+
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/output/output4.xml b/spring-batch/src/main/resources/output/output4.xml
new file mode 100644
index 0000000000..194b860813
--- /dev/null
+++ b/spring-batch/src/main/resources/output/output4.xml
@@ -0,0 +1,21 @@
+
+
+
+ 10000.0
+ 2015-10-31T00:00:00+05:30
+ 1234
+ devendra
+
+
+ 12321.0
+ 2015-12-03T00:00:00+05:30
+ 2134
+ john
+
+
+ 23411.0
+ 2015-02-02T00:00:00+05:30
+ 2134
+ robin
+
+
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/output/output5.xml b/spring-batch/src/main/resources/output/output5.xml
new file mode 100644
index 0000000000..194b860813
--- /dev/null
+++ b/spring-batch/src/main/resources/output/output5.xml
@@ -0,0 +1,21 @@
+
+
+
+ 10000.0
+ 2015-10-31T00:00:00+05:30
+ 1234
+ devendra
+
+
+ 12321.0
+ 2015-12-03T00:00:00+05:30
+ 2134
+ john
+
+
+ 23411.0
+ 2015-02-02T00:00:00+05:30
+ 2134
+ robin
+
+
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/spring-batch-intro.xml b/spring-batch/src/main/resources/spring-batch-intro.xml
index 93606d232f..0f76dd50ff 100644
--- a/spring-batch/src/main/resources/spring-batch-intro.xml
+++ b/spring-batch/src/main/resources/spring-batch-intro.xml
@@ -22,14 +22,14 @@
+ class="org.baeldung.batch.service.RecordFieldSetMapper" />
-
+
@@ -40,7 +40,7 @@
- org.baeldung.spring_batch_intro.model.Transaction
+ org.baeldung.batch.model.Transaction
diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml
index 697a139eb5..9da37a3261 100644
--- a/spring-boot-bootstrap/pom.xml
+++ b/spring-boot-bootstrap/pom.xml
@@ -17,6 +17,25 @@
1.5.3.RELEASE
+
+
UTF-8
diff --git a/spring-boot-property-exp/README.md b/spring-boot-property-exp/README.md
index 5b2552ade7..8a598e7a05 100644
--- a/spring-boot-property-exp/README.md
+++ b/spring-boot-property-exp/README.md
@@ -1,2 +1,18 @@
## The Module Holds Sources for the Following Articles
- - [Automatic Property Expansion with Spring Boot] (http://www.baeldung.com/property-expansion-spring-boot)
\ No newline at end of file
+ - [Automatic Property Expansion with Spring Boot](http://www.baeldung.com/property-expansion-spring-boot)
+
+### Module property-exp-default-config
+ This module contains both a standard Maven Spring Boot build and the Gradle build which is Maven compatible.
+
+ In order to execute the Maven example, run the following command:
+
+ `mvn spring-boot:run`
+
+ To execute the Gradle example:
+
+`gradle bootRun`
+
+ ### Module property-exp-custom-config
+ This project is not using the standard Spring Boot parent and is configured manually. Run the following command:
+
+ `mvn exec:java`
\ No newline at end of file
diff --git a/spring-boot-property-exp/pom.xml b/spring-boot-property-exp/pom.xml
index f554bb5b99..0c54d57db1 100644
--- a/spring-boot-property-exp/pom.xml
+++ b/spring-boot-property-exp/pom.xml
@@ -24,8 +24,8 @@
- property-exp-default
- property-exp-custom
+ property-exp-default-config
+ property-exp-custom-config
diff --git a/spring-boot-property-exp/property-exp-custom/pom.xml b/spring-boot-property-exp/property-exp-custom-config/pom.xml
similarity index 98%
rename from spring-boot-property-exp/property-exp-custom/pom.xml
rename to spring-boot-property-exp/property-exp-custom-config/pom.xml
index cfce323eab..7822b31cf2 100644
--- a/spring-boot-property-exp/property-exp-custom/pom.xml
+++ b/spring-boot-property-exp/property-exp-custom-config/pom.xml
@@ -9,7 +9,7 @@
4.0.0
com.baeldung
- property-exp-custom
+ property-exp-custom-config
0.0.1-SNAPSHOT
jar
diff --git a/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java b/spring-boot-property-exp/property-exp-custom-config/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java
similarity index 100%
rename from spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java
rename to spring-boot-property-exp/property-exp-custom-config/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java
diff --git a/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java b/spring-boot-property-exp/property-exp-custom-config/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java
similarity index 100%
rename from spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java
rename to spring-boot-property-exp/property-exp-custom-config/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java
diff --git a/spring-boot-property-exp/property-exp-custom/src/main/resources/application.properties b/spring-boot-property-exp/property-exp-custom-config/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-property-exp/property-exp-custom/src/main/resources/application.properties
rename to spring-boot-property-exp/property-exp-custom-config/src/main/resources/application.properties
diff --git a/spring-boot-property-exp/property-exp-custom/src/main/resources/banner.txt b/spring-boot-property-exp/property-exp-custom-config/src/main/resources/banner.txt
similarity index 100%
rename from spring-boot-property-exp/property-exp-custom/src/main/resources/banner.txt
rename to spring-boot-property-exp/property-exp-custom-config/src/main/resources/banner.txt
diff --git a/spring-boot-property-exp/property-exp-default/build.gradle b/spring-boot-property-exp/property-exp-default-config/build.gradle
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/build.gradle
rename to spring-boot-property-exp/property-exp-default-config/build.gradle
diff --git a/spring-boot-property-exp/property-exp-default/gradle.properties b/spring-boot-property-exp/property-exp-default-config/gradle.properties
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/gradle.properties
rename to spring-boot-property-exp/property-exp-default-config/gradle.properties
diff --git a/spring-boot-property-exp/property-exp-default/pom.xml b/spring-boot-property-exp/property-exp-default-config/pom.xml
similarity index 95%
rename from spring-boot-property-exp/property-exp-default/pom.xml
rename to spring-boot-property-exp/property-exp-default-config/pom.xml
index 2544800e6a..0625916d32 100644
--- a/spring-boot-property-exp/property-exp-default/pom.xml
+++ b/spring-boot-property-exp/property-exp-default-config/pom.xml
@@ -11,7 +11,7 @@
com.baeldung
- property-exp-default
+ property-exp-default-config
0.0.1-SNAPSHOT
jar
diff --git a/spring-boot-property-exp/property-exp-default/settings.gradle b/spring-boot-property-exp/property-exp-default-config/settings.gradle
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/settings.gradle
rename to spring-boot-property-exp/property-exp-default-config/settings.gradle
diff --git a/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java b/spring-boot-property-exp/property-exp-default-config/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java
rename to spring-boot-property-exp/property-exp-default-config/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java
diff --git a/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java b/spring-boot-property-exp/property-exp-default-config/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java
rename to spring-boot-property-exp/property-exp-default-config/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java
diff --git a/spring-boot-property-exp/property-exp-default/src/main/resources/application.properties b/spring-boot-property-exp/property-exp-default-config/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/src/main/resources/application.properties
rename to spring-boot-property-exp/property-exp-default-config/src/main/resources/application.properties
diff --git a/spring-boot-property-exp/property-exp-default/src/main/resources/banner.txt b/spring-boot-property-exp/property-exp-default-config/src/main/resources/banner.txt
similarity index 100%
rename from spring-boot-property-exp/property-exp-default/src/main/resources/banner.txt
rename to spring-boot-property-exp/property-exp-default-config/src/main/resources/banner.txt
diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml
index 2a1de00039..0cf7df86cd 100644
--- a/spring-boot/pom.xml
+++ b/spring-boot/pom.xml
@@ -52,7 +52,7 @@
test
-
+
io.dropwizard.metrics
diff --git a/spring-boot/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java b/spring-boot/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java
index 56a6751326..aa70bac777 100644
--- a/spring-boot/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java
+++ b/spring-boot/src/main/java/com/baeldung/servlets/props/PropertySourcesLoader.java
@@ -9,7 +9,7 @@ import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.ConfigurableEnvironment;
@Configuration
-@ComponentScan(basePackages = { "com.baeldung.*" })
+@ComponentScan(basePackages = { "com.baeldung.servlets.*" })
@PropertySource("classpath:custom.properties") public class PropertySourcesLoader {
private static final Logger log = LoggerFactory.getLogger(PropertySourcesLoader.class);
diff --git a/spring-boot/src/main/java/com/baeldung/utils/Application.java b/spring-boot/src/main/java/com/baeldung/utils/UtilsApplication.java
similarity index 83%
rename from spring-boot/src/main/java/com/baeldung/utils/Application.java
rename to spring-boot/src/main/java/com/baeldung/utils/UtilsApplication.java
index 9d5d75bce2..b63ada9eee 100644
--- a/spring-boot/src/main/java/com/baeldung/utils/Application.java
+++ b/spring-boot/src/main/java/com/baeldung/utils/UtilsApplication.java
@@ -10,11 +10,11 @@ import com.baeldung.autoconfiguration.MySQLAutoconfiguration;
@SpringBootApplication(exclude=MySQLAutoconfiguration.class)
@ComponentScan(basePackages="com.baeldung.utils")
-public class Application {
+public class UtilsApplication {
@RolesAllowed("*")
public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
+ SpringApplication.run(UtilsApplication.class, args);
}
}
diff --git a/spring-boot/src/main/webapp/WEB-INF/context.xml b/spring-boot/src/main/webapp/WEB-INF/context.xml
index 263bed4430..32f11f78f6 100644
--- a/spring-boot/src/main/webapp/WEB-INF/context.xml
+++ b/spring-boot/src/main/webapp/WEB-INF/context.xml
@@ -6,7 +6,7 @@
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
-
+
-
+
\ No newline at end of file
diff --git a/spring-boot/src/main/webapp/WEB-INF/dispatcher.xml b/spring-boot/src/main/webapp/WEB-INF/dispatcher.xml
index ade8e66777..54e62921be 100644
--- a/spring-boot/src/main/webapp/WEB-INF/dispatcher.xml
+++ b/spring-boot/src/main/webapp/WEB-INF/dispatcher.xml
@@ -7,7 +7,7 @@
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
+
diff --git a/spring-core/README.md b/spring-core/README.md
index 380b3138fe..b0d0b8408c 100644
--- a/spring-core/README.md
+++ b/spring-core/README.md
@@ -6,3 +6,4 @@
- [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok)
- [A Quick Guide to Spring @Value](http://www.baeldung.com/spring-value-annotation)
- [Spring YAML Configuration](http://www.baeldung.com/spring-yaml)
+- [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults)
diff --git a/spring-core/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java b/spring-core/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java
new file mode 100644
index 0000000000..d2cda19ae6
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java
@@ -0,0 +1,75 @@
+package com.baeldung.valuewithdefaults;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.util.Assert;
+
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+
+/**
+ * Demonstrates setting defaults for @Value annotation. Note that there are no properties
+ * defined in the specified property source. We also assume that the user here
+ * does not have a system property named some.key.
+ *
+ */
+@Configuration
+@PropertySource(name = "myProperties", value = "valueswithdefaults.properties")
+public class ValuesWithDefaultsApp {
+
+ @Value("${some.key:my default value}")
+ private String stringWithDefaultValue;
+
+ @Value("${some.key:}")
+ private String stringWithBlankDefaultValue;
+
+ @Value("${some.key:true}")
+ private boolean booleanWithDefaultValue;
+
+ @Value("${some.key:42}")
+ private int intWithDefaultValue;
+
+ @Value("${some.key:one,two,three}")
+ private String[] stringArrayWithDefaults;
+
+ @Value("${some.key:1,2,3}")
+ private int[] intArrayWithDefaults;
+
+ @Value("#{systemProperties['some.key'] ?: 'my default system property value'}")
+ private String spelWithDefaultValue;
+
+
+ public static void main(String[] args) {
+ ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValuesWithDefaultsApp.class);
+ }
+
+ @PostConstruct
+ public void afterInitialize() {
+ // strings
+ Assert.isTrue(stringWithDefaultValue.equals("my default value"));
+ Assert.isTrue(stringWithBlankDefaultValue.equals(""));
+
+ // other primitives
+ Assert.isTrue(booleanWithDefaultValue);
+ Assert.isTrue(intWithDefaultValue == 42);
+
+ // arrays
+ List stringListValues = Lists.newArrayList("one", "two", "three");
+ Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues));
+
+ List intListValues = Lists.newArrayList(1, 2, 3);
+ Assert.isTrue(Ints.asList(intArrayWithDefaults).containsAll(intListValues));
+
+ // SpEL
+ Assert.isTrue(spelWithDefaultValue.equals("my default system property value"));
+
+ }
+}
diff --git a/spring-core/src/main/resources/valueswithdefaults.properties b/spring-core/src/main/resources/valueswithdefaults.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-jpa/pom.xml b/spring-jpa/pom.xml
index 1a1e6b3152..6a67d44b48 100644
--- a/spring-jpa/pom.xml
+++ b/spring-jpa/pom.xml
@@ -102,6 +102,7 @@
javax.servlet
servlet-api
+ provided
${javax.servlet.servlet-api.version}
diff --git a/spring-ldap/pom.xml b/spring-ldap/pom.xml
index 16d4879f10..05baf8c66d 100644
--- a/spring-ldap/pom.xml
+++ b/spring-ldap/pom.xml
@@ -1,6 +1,6 @@
+ 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
@@ -97,6 +97,18 @@
test
+
+
+
+ org.springframework.data
+ spring-data-ldap
+ 1.0.6.RELEASE
+
+
+ org.springframework.data
+ spring-data-jpa
+ 1.11.6.RELEASE
+
diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java b/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java
new file mode 100644
index 0000000000..726fa53b02
--- /dev/null
+++ b/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java
@@ -0,0 +1,55 @@
+package com.baeldung.ldap.data.repository;
+
+import javax.naming.Name;
+
+import org.springframework.ldap.odm.annotations.Attribute;
+import org.springframework.ldap.odm.annotations.Entry;
+import org.springframework.ldap.odm.annotations.Id;
+
+@Entry(base = "ou=users", objectClasses = { "person", "inetOrgPerson", "top" })
+public class User {
+
+ @Id
+ private Name id;
+
+ private @Attribute(name = "cn") String username;
+ private @Attribute(name = "sn") String password;
+
+ public User() {
+ }
+
+ public User(String username, String password) {
+ this.username = username;
+ this.password = password;
+ }
+
+ public Name getId() {
+ return id;
+ }
+
+ public void setId(Name id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ @Override
+ public String toString() {
+ return username;
+ }
+
+}
diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java b/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java
new file mode 100644
index 0000000000..12dc0f7f14
--- /dev/null
+++ b/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java
@@ -0,0 +1,17 @@
+package com.baeldung.ldap.data.repository;
+
+import java.util.List;
+
+import org.springframework.data.ldap.repository.LdapRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository extends LdapRepository {
+
+ User findByUsername(String username);
+
+ User findByUsernameAndPassword(String username, String password);
+
+ List findByUsernameLikeIgnoreCase(String username);
+
+}
diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java b/spring-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java
new file mode 100644
index 0000000000..1b04edb35b
--- /dev/null
+++ b/spring-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java
@@ -0,0 +1,87 @@
+package com.baeldung.ldap.data.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.ldap.core.AttributesMapper;
+import org.springframework.ldap.core.ContextSource;
+import org.springframework.ldap.core.DirContextAdapter;
+import org.springframework.ldap.core.DirContextOperations;
+import org.springframework.ldap.core.LdapTemplate;
+import org.springframework.ldap.support.LdapNameBuilder;
+
+import javax.naming.Name;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.List;
+
+public class LdapClient {
+
+ @Autowired
+ private Environment env;
+
+ @Autowired
+ private ContextSource contextSource;
+
+ @Autowired
+ private LdapTemplate ldapTemplate;
+
+ public void authenticate(final String username, final String password) {
+ contextSource.getContext("cn=" + username + ",ou=users," + env.getRequiredProperty("ldap.partitionSuffix"), password);
+ }
+
+ public List search(final String username) {
+ return ldapTemplate.search(
+ "ou=users",
+ "cn=" + username,
+ (AttributesMapper) attrs -> (String) attrs
+ .get("cn")
+ .get());
+ }
+
+ public void create(final String username, final String password) {
+ Name dn = LdapNameBuilder
+ .newInstance()
+ .add("ou", "users")
+ .add("cn", username)
+ .build();
+ DirContextAdapter context = new DirContextAdapter(dn);
+
+ context.setAttributeValues("objectclass", new String[]{"top", "person", "organizationalPerson", "inetOrgPerson"});
+ context.setAttributeValue("cn", username);
+ context.setAttributeValue("sn", username);
+ context.setAttributeValue("userPassword", digestSHA(password));
+
+ ldapTemplate.bind(context);
+ }
+
+ public void modify(final String username, final String password) {
+ Name dn = LdapNameBuilder
+ .newInstance()
+ .add("ou", "users")
+ .add("cn", username)
+ .build();
+ DirContextOperations context = ldapTemplate.lookupContext(dn);
+
+ context.setAttributeValues("objectclass", new String[]{"top", "person", "organizationalPerson", "inetOrgPerson"});
+ context.setAttributeValue("cn", username);
+ context.setAttributeValue("sn", username);
+ context.setAttributeValue("userPassword", digestSHA(password));
+
+ ldapTemplate.modifyAttributes(context);
+ }
+
+ private String digestSHA(final String password) {
+ String base64;
+ try {
+ MessageDigest digest = MessageDigest.getInstance("SHA");
+ digest.update(password.getBytes());
+ base64 = Base64
+ .getEncoder()
+ .encodeToString(digest.digest());
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ return "{SHA}" + base64;
+ }
+}
diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java b/spring-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java
new file mode 100644
index 0000000000..54954e3c9d
--- /dev/null
+++ b/spring-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java
@@ -0,0 +1,63 @@
+package com.baeldung.ldap.data.service;
+
+import com.baeldung.ldap.data.repository.User;
+import com.baeldung.ldap.data.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ldap.support.LdapUtils;
+import org.springframework.stereotype.Service;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class UserService {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ public Boolean authenticate(final String username, final String password) {
+ User user = userRepository.findByUsernameAndPassword(username, password);
+ return user != null;
+ }
+
+ public List search(final String username) {
+ List userList = userRepository.findByUsernameLikeIgnoreCase(username);
+ if (userList == null) {
+ return Collections.emptyList();
+ }
+
+ return userList.stream()
+ .map(User::getUsername)
+ .collect(Collectors.toList());
+ }
+
+ public void create(final String username, final String password) {
+ User newUser = new User(username,digestSHA(password));
+ newUser.setId(LdapUtils.emptyLdapName());
+ userRepository.save(newUser);
+
+ }
+
+ public void modify(final String username, final String password) {
+ User user = userRepository.findByUsername(username);
+ user.setPassword(password);
+ userRepository.save(user);
+ }
+
+ private String digestSHA(final String password) {
+ String base64;
+ try {
+ MessageDigest digest = MessageDigest.getInstance("SHA");
+ digest.update(password.getBytes());
+ base64 = Base64.getEncoder()
+ .encodeToString(digest.digest());
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ return "{SHA}" + base64;
+ }
+}
diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java b/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java
index 8572e5d1be..fb3000b2bd 100644
--- a/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java
+++ b/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java
@@ -1,5 +1,6 @@
package com.baeldung.ldap.javaconfig;
+import com.baeldung.ldap.client.LdapClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@@ -7,15 +8,15 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
+import org.springframework.data.ldap.repository.config.EnableLdapRepositories;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;
-import com.baeldung.ldap.client.LdapClient;
-
@Configuration
@PropertySource("classpath:application.properties")
-@ComponentScan(basePackages = { "com.baeldung.ldap.*" })
+@ComponentScan(basePackages = {"com.baeldung.ldap.*"})
@Profile("default")
+@EnableLdapRepositories(basePackages = "com.baeldung.ldap.**")
public class AppConfig {
@Autowired
diff --git a/spring-ldap/src/main/resources/logback.xml b/spring-ldap/src/main/resources/logback.xml
index ec0dc2469a..32b78577ee 100644
--- a/spring-ldap/src/main/resources/logback.xml
+++ b/spring-ldap/src/main/resources/logback.xml
@@ -7,13 +7,13 @@
-
-
+
+
-
+
-
+
\ No newline at end of file
diff --git a/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java b/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java
index b65588dc38..f5b74d64c6 100644
--- a/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java
+++ b/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java
@@ -1,7 +1,6 @@
package com.baeldung.ldap.client;
-import java.util.List;
-
+import com.baeldung.ldap.javaconfig.TestConfig;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
@@ -13,11 +12,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import com.baeldung.ldap.javaconfig.TestConfig;
+import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("testlive")
-@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class)
public class LdapClientLiveTest {
private static final String USER2 = "TEST02";
diff --git a/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryTest.java b/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryTest.java
new file mode 100644
index 0000000000..9f38af9263
--- /dev/null
+++ b/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.ldap.client;
+
+import com.baeldung.ldap.data.service.UserService;
+import com.baeldung.ldap.javaconfig.TestConfig;
+import org.hamcrest.Matchers;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ActiveProfiles("testlive")
+@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class)
+public class LdapDataRepositoryTest {
+
+ private static final String USER2 = "TEST02";
+ private static final String USER3 = "TEST03";
+ private static final String USER4 = "TEST04";
+
+ private static final String USER2_PWD = "TEST02";
+ private static final String USER3_PWD = "TEST03";
+ private static final String USER4_PWD = "TEST04";
+
+ private static final String SEARCH_STRING = "TEST*";
+
+ @Autowired
+ private UserService userService;
+
+ @Test
+ public void givenLdapClient_whenCorrectCredentials_thenSuccessfulLogin() {
+ Boolean isValid = userService.authenticate(USER3, USER3_PWD);
+ assertEquals(true, isValid);
+ }
+
+ @Test
+ public void givenLdapClient_whenIncorrectCredentials_thenFailedLogin() {
+ Boolean isValid = userService.authenticate(USER3, USER2_PWD);
+ assertEquals(false, isValid);
+ }
+
+ @Test
+ public void givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() {
+ List userList = userService.search(SEARCH_STRING);
+ assertThat(userList, Matchers.containsInAnyOrder(USER2, USER3));
+ }
+
+ @Test
+ public void givenLdapClientNotExists_whenDataProvided_thenNewUserCreated() {
+ userService.create(USER4, USER4_PWD);
+ userService.authenticate(USER4, USER4_PWD);
+ }
+
+ @Test
+ public void givenLdapClientExists_whenDataProvided_thenExistingUserModified() {
+ userService.modify(USER2, USER3_PWD);
+ userService.authenticate(USER2, USER3_PWD);
+ }
+
+}
diff --git a/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java b/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java
index e2968e977c..c6293982da 100644
--- a/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java
+++ b/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java
@@ -1,5 +1,6 @@
package com.baeldung.ldap.javaconfig;
+import com.baeldung.ldap.client.LdapClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@@ -8,15 +9,15 @@ import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
+import org.springframework.data.ldap.repository.config.EnableLdapRepositories;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;
import org.springframework.ldap.test.TestContextSourceFactoryBean;
-import com.baeldung.ldap.client.LdapClient;
-
@Configuration
@PropertySource("classpath:test_application.properties")
-@ComponentScan(basePackages = { "com.baeldung.ldap.*" })
+@ComponentScan(basePackages = {"com.baeldung.ldap.*"})
+@EnableLdapRepositories(basePackages = "com.baeldung.ldap.**")
@Profile("testlive")
public class TestConfig {
@Autowired
diff --git a/spring-mvc-email/pom.xml b/spring-mvc-email/pom.xml
index c40abdb4bf..9228054878 100644
--- a/spring-mvc-email/pom.xml
+++ b/spring-mvc-email/pom.xml
@@ -21,16 +21,17 @@
org.springframework.boot
spring-boot-starter-web
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
org.springframework.boot
spring-boot-starter-mail
-
+
-
- org.apache.tomcat.embed
- tomcat-embed-jasper
-
javax.servlet
jstl
diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java
index f146ee1d04..bc5d6b3151 100644
--- a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java
+++ b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java
@@ -2,10 +2,11 @@ package com.baeldung.spring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
@SpringBootApplication
-public class Application {
+public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java b/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java
index 472c0c8bf5..59868593a3 100644
--- a/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java
+++ b/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java
@@ -1,11 +1,15 @@
package org.baeldung.web.controller.redirect;
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.View;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.RedirectView;
@@ -49,4 +53,16 @@ public class RedirectController {
model.addAttribute("redirectionAttribute", flashAttribute);
return new ModelAndView("redirection", model);
}
+
+ @RequestMapping(value = "/redirectPostToPost", method = RequestMethod.POST)
+ public ModelAndView redirectPostToPost(HttpServletRequest request) {
+ request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);
+ return new ModelAndView("redirect:/redirectedPostToPost");
+ }
+
+ @RequestMapping(value = "/redirectedPostToPost", method = RequestMethod.POST)
+ public ModelAndView redirectedPostToPost() {
+ return new ModelAndView("redirection");
+ }
+
}
\ No newline at end of file
diff --git a/spring-security-mvc-ldap/pom.xml b/spring-security-mvc-ldap/pom.xml
index f2b6b766eb..e6452ea70b 100644
--- a/spring-security-mvc-ldap/pom.xml
+++ b/spring-security-mvc-ldap/pom.xml
@@ -57,7 +57,7 @@
- 1.5.7
+ 1.5.5
diff --git a/spring-security-mvc-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java b/spring-security-mvc-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java
index 4bcb255046..5936aa30ef 100644
--- a/spring-security-mvc-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java
+++ b/spring-security-mvc-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java
@@ -1,8 +1,9 @@
package org.baeldung;
import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.context.annotation.ComponentScan;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@@ -11,17 +12,22 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
* class to run up a Jetty Server (on http://localhost:8080)
*
*/
-@EnableAutoConfiguration
-@ComponentScan("org.baeldung")
-public class SampleLDAPApplication extends WebMvcConfigurerAdapter {
+@SpringBootApplication
+public class SampleLDAPApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SampleLDAPApplication.class, args);
}
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- registry.addViewController("/login").setViewName("login");
+ @Bean
+ public WebMvcConfigurerAdapter adapter() {
+ return new WebMvcConfigurerAdapter() {
+ @Override
+ public void addViewControllers(ViewControllerRegistry registry) {
+ registry.addViewController("/login")
+ .setViewName("login");
+ }
+ };
}
}
\ No newline at end of file
diff --git a/spring-security-rest-custom/pom.xml b/spring-security-rest-custom/pom.xml
index c329bd1cb8..77a58a56d8 100644
--- a/spring-security-rest-custom/pom.xml
+++ b/spring-security-rest-custom/pom.xml
@@ -33,12 +33,6 @@
org.springframework
spring-core
-
-
- commons-logging
- commons-logging
-
-
org.springframework
@@ -79,6 +73,12 @@
spring-oxm
+
+ commons-logging
+ commons-logging
+ ${commons-logging.version}
+
+
@@ -105,24 +105,11 @@
org.apache.httpcomponents
httpcore
- ${httpcore.version}
-
-
- commons-logging
- commons-logging
-
-
org.apache.httpcomponents
httpclient
-
-
- commons-logging
- commons-logging
-
-
@@ -213,7 +200,7 @@
19.0
3.5
-
+ 1.2
4.4.5
4.5.2
diff --git a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java
index 5ef699d264..c0ad5eb690 100644
--- a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java
+++ b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java
@@ -3,24 +3,14 @@ package org.baeldung.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.context.request.RequestContextListener;
@EnableOAuth2Sso
@SpringBootApplication
-public class UiApplication extends WebSecurityConfigurerAdapter {
+public class UiApplication extends SpringBootServletInitializer {
- @Override
- public void configure(HttpSecurity http) throws Exception {
- http.antMatcher("/**")
- .authorizeRequests()
- .antMatchers("/", "/login**")
- .permitAll()
- .anyRequest()
- .authenticated();
- }
@Bean
public RequestContextListener requestContextListener() {
diff --git a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java
new file mode 100644
index 0000000000..5dbe9ada34
--- /dev/null
+++ b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java
@@ -0,0 +1,20 @@
+package org.baeldung.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+public class UiSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ public void configure(HttpSecurity http) throws Exception {
+ http.antMatcher("/**")
+ .authorizeRequests()
+ .antMatchers("/", "/login**")
+ .permitAll()
+ .anyRequest()
+ .authenticated();
+ }
+
+}
diff --git a/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java b/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java
index 5ef699d264..6e29879cb3 100644
--- a/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java
+++ b/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java
@@ -3,24 +3,13 @@ package org.baeldung.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.context.request.RequestContextListener;
@EnableOAuth2Sso
@SpringBootApplication
-public class UiApplication extends WebSecurityConfigurerAdapter {
-
- @Override
- public void configure(HttpSecurity http) throws Exception {
- http.antMatcher("/**")
- .authorizeRequests()
- .antMatchers("/", "/login**")
- .permitAll()
- .anyRequest()
- .authenticated();
- }
+public class UiApplication extends SpringBootServletInitializer {
@Bean
public RequestContextListener requestContextListener() {
diff --git a/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiSecurityConfig.java b/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiSecurityConfig.java
new file mode 100644
index 0000000000..5dbe9ada34
--- /dev/null
+++ b/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiSecurityConfig.java
@@ -0,0 +1,20 @@
+package org.baeldung.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+public class UiSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ public void configure(HttpSecurity http) throws Exception {
+ http.antMatcher("/**")
+ .authorizeRequests()
+ .antMatchers("/", "/login**")
+ .permitAll()
+ .anyRequest()
+ .authenticated();
+ }
+
+}
diff --git a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java
index 625e5439ee..b8eda25960 100644
--- a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java
+++ b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java
@@ -2,11 +2,12 @@ package org.baeldung.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
-public class UiApplication {
+public class UiApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(UiApplication.class, args);