diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index 97ed872a26..711ddb5cee 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -9,9 +9,9 @@
1.0-SNAPSHOT
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.2.RELEASE
@@ -21,6 +21,19 @@
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-freemarker
+
+
+ org.apache.shiro
+ shiro-spring-boot-web-starter
+ ${apache-shiro-core-version}
+
org.apache.shiro
shiro-core
diff --git a/apache-shiro/src/main/java/com/baeldung/ShiroSpringApplication.java b/apache-shiro/src/main/java/com/baeldung/ShiroSpringApplication.java
new file mode 100644
index 0000000000..e12d3ebffa
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/ShiroSpringApplication.java
@@ -0,0 +1,45 @@
+package com.baeldung;
+
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
+import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * Created by smatt on 21/08/2017.
+ */
+@SpringBootApplication
+public class ShiroSpringApplication {
+
+ private static final transient Logger log = LoggerFactory.getLogger(ShiroSpringApplication.class);
+
+ public static void main(String... args) {
+ SpringApplication.run(ShiroSpringApplication.class, args);
+ }
+
+
+ @Bean
+ public Realm realm() {
+ return new MyCustomRealm();
+ }
+
+
+ @Bean
+ public ShiroFilterChainDefinition shiroFilterChainDefinition() {
+ DefaultShiroFilterChainDefinition filter
+ = new DefaultShiroFilterChainDefinition();
+
+ filter.addPathDefinition("/secure", "authc");
+ filter.addPathDefinition("/**", "anon");
+
+ return filter;
+ }
+
+
+
+
+}
diff --git a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
new file mode 100644
index 0000000000..e6e72b2579
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
@@ -0,0 +1,105 @@
+package com.baeldung.controllers;
+
+import com.baeldung.models.UserCredentials;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Controller
+public class ShiroSpringController {
+
+
+
+ @GetMapping("/")
+ public String index() {
+ return "index";
+ }
+
+
+ @RequestMapping( value = "/login", method = {RequestMethod.GET, RequestMethod.POST})
+ public String login(HttpServletRequest req, UserCredentials cred, RedirectAttributes attr) {
+
+ if(req.getMethod().equals(RequestMethod.GET.toString())) {
+ return "login";
+ }
+ else {
+
+ Subject subject = SecurityUtils.getSubject();
+
+ if(!subject.isAuthenticated()) {
+ UsernamePasswordToken token = new UsernamePasswordToken(
+ cred.getUsername(), cred.getPassword(), cred.isRememberMe());
+ try {
+ subject.login(token);
+ } catch (AuthenticationException ae) {
+ ae.printStackTrace();
+ attr.addFlashAttribute("error", "Invalid Credentials");
+ return "redirect:/login";
+ }
+ }
+
+ return "redirect:/secure";
+ }
+ }
+
+
+ @GetMapping("/secure")
+ public String secure(ModelMap modelMap) {
+
+ Subject currentUser = SecurityUtils.getSubject();
+ String role = "", permission = "";
+
+ if(currentUser.hasRole("admin")) {
+ role = role + "You are an Admin";
+ }
+ else if(currentUser.hasRole("editor")) {
+ role = role + "You are an Editor";
+ }
+ else if(currentUser.hasRole("author")) {
+ role = role + "You are an Author";
+ }
+
+ if(currentUser.isPermitted("articles:compose")) {
+ permission = permission + "You can compose an article, ";
+ } else {
+ permission = permission + "You are not permitted to compose an article!, ";
+ }
+
+ if(currentUser.isPermitted("articles:save")) {
+ permission = permission + "You can save articles, ";
+ } else {
+ permission = permission + "\nYou can not save articles, ";
+ }
+
+ if(currentUser.isPermitted("articles:publish")) {
+ permission = permission + "\nYou can publish articles";
+ } else {
+ permission = permission + "\nYou can not publish articles";
+ }
+
+ modelMap.addAttribute("username", currentUser.getPrincipal());
+ modelMap.addAttribute("permission", permission);
+ modelMap.addAttribute("role", role);
+
+ return "secure";
+ }
+
+
+ @PostMapping("/logout")
+ public String logout() {
+ Subject subject = SecurityUtils.getSubject();
+ subject.logout();
+ return "redirect:/";
+ }
+
+}
diff --git a/apache-shiro/src/main/java/com/baeldung/models/UserCredentials.java b/apache-shiro/src/main/java/com/baeldung/models/UserCredentials.java
new file mode 100644
index 0000000000..51b429046a
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/models/UserCredentials.java
@@ -0,0 +1,40 @@
+package com.baeldung.models;
+
+public class UserCredentials {
+
+ private String username;
+ private String password;
+ private boolean rememberMe = false;
+
+ public UserCredentials() {}
+
+ 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;
+ }
+
+ public boolean isRememberMe() {
+ return rememberMe;
+ }
+
+ public void setRememberMe(boolean rememberMe) {
+ this.rememberMe = rememberMe;
+ }
+
+ @Override
+ public String toString() {
+ return "username = " + getUsername()
+ + "\nrememberMe = " + isRememberMe();
+ }
+}
diff --git a/apache-shiro/src/main/resources/application.properties b/apache-shiro/src/main/resources/application.properties
new file mode 100644
index 0000000000..5bcb6b3352
--- /dev/null
+++ b/apache-shiro/src/main/resources/application.properties
@@ -0,0 +1,11 @@
+server.port=9000
+server.servlet-path=/
+server.context-path=/
+
+#shiro-spring-boot-config
+shiro.loginUrl = /login
+shiro.successUrl = /secure
+shiro.unauthorizedUrl = /login
+
+#freemarker
+spring.freemarker.suffix=.ftl
diff --git a/apache-shiro/src/main/resources/templates/index.ftl b/apache-shiro/src/main/resources/templates/index.ftl
new file mode 100644
index 0000000000..0210d656fc
--- /dev/null
+++ b/apache-shiro/src/main/resources/templates/index.ftl
@@ -0,0 +1,10 @@
+
+
+ Index
+
+
+ Welcome Guest!
+
+ Login
+
+
\ No newline at end of file
diff --git a/apache-shiro/src/main/resources/templates/login.ftl b/apache-shiro/src/main/resources/templates/login.ftl
new file mode 100644
index 0000000000..3a0552dc2e
--- /dev/null
+++ b/apache-shiro/src/main/resources/templates/login.ftl
@@ -0,0 +1,27 @@
+
+
+ Login
+
+
+Login
+
+
+
+
\ No newline at end of file
diff --git a/apache-shiro/src/main/resources/templates/secure.ftl b/apache-shiro/src/main/resources/templates/secure.ftl
new file mode 100644
index 0000000000..4466a0162f
--- /dev/null
+++ b/apache-shiro/src/main/resources/templates/secure.ftl
@@ -0,0 +1,15 @@
+
+
+ Secure
+
+
+Welcome ${username}!
+Role: ${role}
+Permissions
+${permission}
+
+
+
+
\ No newline at end of file
diff --git a/core-java-concurrency/.gitignore b/core-java-concurrency/.gitignore
new file mode 100644
index 0000000000..3de4cc647e
--- /dev/null
+++ b/core-java-concurrency/.gitignore
@@ -0,0 +1,26 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+*.txt
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md
new file mode 100644
index 0000000000..f1d95482d4
--- /dev/null
+++ b/core-java-concurrency/README.md
@@ -0,0 +1,32 @@
+=========
+
+## Core Java Concurrency Examples
+
+### Relevant Articles:
+- [Guide To CompletableFuture](http://www.baeldung.com/java-completablefuture)
+- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial)
+- [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava)
+- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future)
+- [Guide to java.util.concurrent.BlockingQueue](http://www.baeldung.com/java-blocking-queue)
+- [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch)
+- [A Guide to ConcurrentMap](http://www.baeldung.com/java-concurrent-map)
+- [Guide to PriorityBlockingQueue in Java](http://www.baeldung.com/java-priority-blocking-queue)
+- [Avoiding the ConcurrentModificationException in Java](http://www.baeldung.com/java-concurrentmodificationexception)
+- [Custom Thread Pools In Java 8 Parallel Streams](http://www.baeldung.com/java-8-parallel-streams-custom-threadpool)
+- [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks)
+- [An Introduction to ThreadLocal in Java](http://www.baeldung.com/java-threadlocal)
+- [Guide to DelayQueue](http://www.baeldung.com/java-delay-queue)
+- [A Guide to Java SynchronousQueue](http://www.baeldung.com/java-synchronous-queue)
+- [Guide to the Java TransferQueue](http://www.baeldung.com/java-transfer-queue)
+- [Guide to the ConcurrentSkipListMap](http://www.baeldung.com/java-concurrent-skip-list-map)
+- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep)
+- [LongAdder and LongAccumulator in Java](http://www.baeldung.com/java-longadder-and-longaccumulator)
+- [The Dining Philosophers Problem in Java](http://www.baeldung.com/java-dining-philoshophers)
+- [Guide to CopyOnWriteArrayList](http://www.baeldung.com/java-copy-on-write-arraylist)
+- [Guide to the Java Phaser](http://www.baeldung.com/java-phaser)
+- [Guide to Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized)
+- [An Introduction to Atomic Variables in Java](http://www.baeldung.com/java-atomic-variables)
+- [CyclicBarrier in Java](http://www.baeldung.com/java-cyclic-barrier)
+- [Guide to Volatile Keyword in Java](http://www.baeldung.com/java-volatile)
+- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent)
+- [Semaphores in Java](http://www.baeldung.com/java-semaphore)
diff --git a/core-java-concurrency/pom.xml b/core-java-concurrency/pom.xml
new file mode 100644
index 0000000000..bf858047e9
--- /dev/null
+++ b/core-java-concurrency/pom.xml
@@ -0,0 +1,237 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-concurrency
+ 0.1.0-SNAPSHOT
+ jar
+
+ core-java-concurrency
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
+
+
+
+
+ core-java-concurrency
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+
+
+ 21.0
+ 3.5
+ 3.6.1
+ 2.5
+ 4.1
+ 4.01
+
+
+ 3.6.1
+ 1.7.0
+
+
+
diff --git a/core-java/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
similarity index 67%
rename from core-java/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
index 38633011bf..e3a1629ce1 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
@@ -3,11 +3,11 @@ package com.baeldung.concurrent.atomic;
public class SafeCounterWithLock {
private volatile int counter;
- public int getValue() {
+ int getValue() {
return counter;
}
- public synchronized void increment() {
+ synchronized void increment() {
counter++;
}
}
diff --git a/core-java/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
similarity index 85%
rename from core-java/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
index 41e10789a6..18ade35efb 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
@@ -5,11 +5,11 @@ import java.util.concurrent.atomic.AtomicInteger;
public class SafeCounterWithoutLock {
private final AtomicInteger counter = new AtomicInteger(0);
- public int getValue() {
+ int getValue() {
return counter.get();
}
- public void increment() {
+ void increment() {
while(true) {
int existingValue = getValue();
int newValue = existingValue + 1;
diff --git a/core-java/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
similarity index 60%
rename from core-java/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
index 8a72788842..500ef5bd7e 100644
--- a/core-java/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
@@ -1,13 +1,13 @@
package com.baeldung.concurrent.atomic;
public class UnsafeCounter {
- int counter;
+ private int counter;
- public int getValue() {
+ int getValue() {
return counter;
}
- public void increment() {
+ void increment() {
counter++;
}
}
diff --git a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/BlockingQueueUsage.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/blockingqueue/BlockingQueueUsage.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/blockingqueue/BlockingQueueUsage.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/blockingqueue/BlockingQueueUsage.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/executor/Invoker.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/executor/Invoker.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/executorservice/Task.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/executorservice/Task.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/FutureDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/skiplist/Event.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/skiplist/Event.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/threadfactory/Task.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
diff --git a/core-java/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
diff --git a/core-java/src/main/java/com/baeldung/threadlocal/Context.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java
similarity index 65%
rename from core-java/src/main/java/com/baeldung/threadlocal/Context.java
rename to core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java
index 241fb2f1e0..88b78fb259 100644
--- a/core-java/src/main/java/com/baeldung/threadlocal/Context.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java
@@ -4,14 +4,14 @@ package com.baeldung.threadlocal;
public class Context {
private final String userName;
- public Context(String userName) {
+ Context(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "Context{" +
- "userNameSecret='" + userName + '\'' +
- '}';
+ "userNameSecret='" + userName + '\'' +
+ '}';
}
}
diff --git a/core-java/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
similarity index 76%
rename from core-java/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
rename to core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
index e5854e218a..8cb4b3968f 100644
--- a/core-java/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
@@ -5,11 +5,11 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class SharedMapWithUserContext implements Runnable {
- public final static Map userContextPerUserId = new ConcurrentHashMap<>();
+ final static Map userContextPerUserId = new ConcurrentHashMap<>();
private final Integer userId;
private UserRepository userRepository = new UserRepository();
- public SharedMapWithUserContext(Integer userId) {
+ SharedMapWithUserContext(Integer userId) {
this.userId = userId;
}
diff --git a/core-java/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
similarity index 92%
rename from core-java/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
rename to core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
index de7e4a0369..d4ab906c30 100644
--- a/core-java/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
@@ -10,7 +10,7 @@ public class ThreadLocalWithUserContext implements Runnable {
private final Integer userId;
private UserRepository userRepository = new UserRepository();
- public ThreadLocalWithUserContext(Integer userId) {
+ ThreadLocalWithUserContext(Integer userId) {
this.userId = userId;
}
diff --git a/core-java/src/main/java/com/baeldung/threadlocal/UserRepository.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java
similarity index 71%
rename from core-java/src/main/java/com/baeldung/threadlocal/UserRepository.java
rename to core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java
index 3fe76f75c0..2597594940 100644
--- a/core-java/src/main/java/com/baeldung/threadlocal/UserRepository.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java
@@ -4,7 +4,7 @@ import java.util.UUID;
public class UserRepository {
- public String getUserNameForUserId(Integer userId) {
+ String getUserNameForUserId(Integer userId) {
return UUID.randomUUID().toString();
}
}
diff --git a/core-java/src/main/java/com/baeldung/threadpool/CountingTask.java b/core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java
similarity index 56%
rename from core-java/src/main/java/com/baeldung/threadpool/CountingTask.java
rename to core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java
index effdf54916..a7447d040f 100644
--- a/core-java/src/main/java/com/baeldung/threadpool/CountingTask.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java
@@ -2,19 +2,21 @@ package com.baeldung.threadpool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
-import java.util.stream.Collectors;
public class CountingTask extends RecursiveTask {
private final TreeNode node;
- public CountingTask(TreeNode node) {
+ CountingTask(TreeNode node) {
this.node = node;
}
@Override
protected Integer compute() {
- return node.value + node.children.stream().map(childNode -> new CountingTask(childNode).fork()).collect(Collectors.summingInt(ForkJoinTask::join));
+ return node.getValue() + node.getChildren().stream()
+ .map(childNode -> new CountingTask(childNode).fork())
+ .mapToInt(ForkJoinTask::join)
+ .sum();
}
}
diff --git a/core-java/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java b/core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java
rename to core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java b/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java
new file mode 100644
index 0000000000..65dfed01a2
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java
@@ -0,0 +1,25 @@
+package com.baeldung.threadpool;
+
+import com.google.common.collect.Sets;
+
+import java.util.Set;
+
+public class TreeNode {
+
+ private int value;
+
+ private Set children;
+
+ TreeNode(int value, TreeNode... children) {
+ this.value = value;
+ this.children = Sets.newHashSet(children);
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public Set getChildren() {
+ return children;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java b/core-java-concurrency/src/main/java/com/baeldung/transferqueue/Consumer.java
similarity index 83%
rename from core-java/src/main/java/com/baeldung/transferqueue/Consumer.java
rename to core-java-concurrency/src/main/java/com/baeldung/transferqueue/Consumer.java
index a5f70d9df5..f3be6a030e 100644
--- a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/transferqueue/Consumer.java
@@ -11,10 +11,10 @@ public class Consumer implements Runnable {
private final TransferQueue transferQueue;
private final String name;
- private final int numberOfMessagesToConsume;
- public final AtomicInteger numberOfConsumedMessages = new AtomicInteger();
+ final int numberOfMessagesToConsume;
+ final AtomicInteger numberOfConsumedMessages = new AtomicInteger();
- public Consumer(TransferQueue transferQueue, String name, int numberOfMessagesToConsume) {
+ Consumer(TransferQueue transferQueue, String name, int numberOfMessagesToConsume) {
this.transferQueue = transferQueue;
this.name = name;
this.numberOfMessagesToConsume = numberOfMessagesToConsume;
diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Producer.java b/core-java-concurrency/src/main/java/com/baeldung/transferqueue/Producer.java
similarity index 84%
rename from core-java/src/main/java/com/baeldung/transferqueue/Producer.java
rename to core-java-concurrency/src/main/java/com/baeldung/transferqueue/Producer.java
index c7df7c410a..b73cf5ac19 100644
--- a/core-java/src/main/java/com/baeldung/transferqueue/Producer.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/transferqueue/Producer.java
@@ -12,10 +12,10 @@ public class Producer implements Runnable {
private final TransferQueue transferQueue;
private final String name;
- private final Integer numberOfMessagesToProduce;
- public final AtomicInteger numberOfProducedMessages = new AtomicInteger();
+ final Integer numberOfMessagesToProduce;
+ final AtomicInteger numberOfProducedMessages = new AtomicInteger();
- public Producer(TransferQueue transferQueue, String name, Integer numberOfMessagesToProduce) {
+ Producer(TransferQueue transferQueue, String name, Integer numberOfMessagesToProduce) {
this.transferQueue = transferQueue;
this.name = name;
this.numberOfMessagesToProduce = numberOfMessagesToProduce;
diff --git a/core-java-concurrency/src/main/java/log4j.properties b/core-java-concurrency/src/main/java/log4j.properties
new file mode 100644
index 0000000000..5fe42d854c
--- /dev/null
+++ b/core-java-concurrency/src/main/java/log4j.properties
@@ -0,0 +1,9 @@
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=DEBUG, A1
+
+# A1 is set to be a ConsoleAppender.
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
diff --git a/core-java-concurrency/src/main/resources/logback.xml b/core-java-concurrency/src/main/resources/logback.xml
new file mode 100644
index 0000000000..ec0dc2469a
--- /dev/null
+++ b/core-java-concurrency/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
similarity index 96%
rename from core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
index 0a6d94e126..45d2ec68e4 100644
--- a/core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
@@ -4,7 +4,11 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.concurrent.*;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
import java.util.stream.Collectors;
import java.util.stream.Stream;
diff --git a/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
similarity index 91%
rename from core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
index fc343e4cee..d49a8b8590 100644
--- a/core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
@@ -18,7 +18,9 @@ public class CountdownLatchExampleIntegrationTest {
// Given
List outputScraper = Collections.synchronizedList(new ArrayList<>());
CountDownLatch countDownLatch = new CountDownLatch(5);
- List workers = Stream.generate(() -> new Thread(new Worker(outputScraper, countDownLatch))).limit(5).collect(toList());
+ List workers = Stream.generate(() -> new Thread(new Worker(outputScraper, countDownLatch)))
+ .limit(5)
+ .collect(toList());
// When
workers.forEach(Thread::start);
@@ -26,7 +28,6 @@ public class CountdownLatchExampleIntegrationTest {
outputScraper.add("Latch released");
// Then
- outputScraper.forEach(Object::toString);
assertThat(outputScraper).containsExactly("Counted down", "Counted down", "Counted down", "Counted down", "Counted down", "Latch released");
}
@@ -35,7 +36,9 @@ public class CountdownLatchExampleIntegrationTest {
// Given
List outputScraper = Collections.synchronizedList(new ArrayList<>());
CountDownLatch countDownLatch = new CountDownLatch(5);
- List workers = Stream.generate(() -> new Thread(new BrokenWorker(outputScraper, countDownLatch))).limit(5).collect(toList());
+ List workers = Stream.generate(() -> new Thread(new BrokenWorker(outputScraper, countDownLatch)))
+ .limit(5)
+ .collect(toList());
// When
workers.forEach(Thread::start);
@@ -63,7 +66,6 @@ public class CountdownLatchExampleIntegrationTest {
outputScraper.add("Workers complete");
// Then
- outputScraper.forEach(Object::toString);
assertThat(outputScraper).containsExactly("Workers ready", "Counted down", "Counted down", "Counted down", "Counted down", "Counted down", "Workers complete");
}
diff --git a/core-java/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
similarity index 99%
rename from core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
index 5f8b05a974..c2513f38c1 100644
--- a/core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
@@ -22,7 +22,6 @@ public class SquareCalculatorIntegrationTest {
private static final Logger LOG = LoggerFactory.getLogger(SquareCalculatorIntegrationTest.class);
-
@Rule
public TestName name = new TestName();
diff --git a/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
similarity index 94%
rename from core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
index 3014ae38b2..f3ced219f7 100644
--- a/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
@@ -49,9 +49,7 @@ public class SynchronizedHashMapWithRWLockManualTest {
private void executeReaderThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) {
for (int i = 0; i < threadCount; i++)
- service.execute(() -> {
- object.get("key" + threadCount);
- });
+ service.execute(() -> object.get("key" + threadCount));
}
}
diff --git a/core-java/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetIntegrationTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java
diff --git a/core-java/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapAggregateStatusManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java
similarity index 99%
rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java
index 33e3326427..cbac6e7f4c 100644
--- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapNullKeyValueManualTest.java
@@ -12,7 +12,7 @@ import static org.junit.Assert.assertNull;
public class ConcurrentMapNullKeyValueManualTest {
- ConcurrentMap concurrentMap;
+ private ConcurrentMap concurrentMap;
@Before
public void setup() {
diff --git a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java
similarity index 62%
rename from core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java
rename to core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java
index 5c1612ca60..3f36d0df5d 100644
--- a/core-java/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/java/concurrentmap/ConcurrentMapPerformanceManualTest.java
@@ -1,27 +1,31 @@
package com.baeldung.java.concurrentmap;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.junit.Test;
public class ConcurrentMapPerformanceManualTest {
@Test
public void givenMaps_whenGetPut500KTimes_thenConcurrentMapFaster() throws Exception {
- Map hashtable = new Hashtable<>();
- Map synchronizedHashMap = Collections.synchronizedMap(new HashMap<>());
- Map concurrentHashMap = new ConcurrentHashMap<>();
+ final Map hashtable = new Hashtable<>();
+ final Map synchronizedHashMap = Collections.synchronizedMap(new HashMap<>());
+ final Map concurrentHashMap = new ConcurrentHashMap<>();
- long hashtableAvgRuntime = timeElapseForGetPut(hashtable);
- long syncHashMapAvgRuntime = timeElapseForGetPut(synchronizedHashMap);
- long concurrentHashMapAvgRuntime = timeElapseForGetPut(concurrentHashMap);
+ final long hashtableAvgRuntime = timeElapseForGetPut(hashtable);
+ final long syncHashMapAvgRuntime = timeElapseForGetPut(synchronizedHashMap);
+ final long concurrentHashMapAvgRuntime = timeElapseForGetPut(concurrentHashMap);
System.out.println(String.format("Hashtable: %s, syncHashMap: %s, ConcurrentHashMap: %s", hashtableAvgRuntime, syncHashMapAvgRuntime, concurrentHashMapAvgRuntime));
@@ -31,13 +35,13 @@ public class ConcurrentMapPerformanceManualTest {
}
private long timeElapseForGetPut(Map map) throws InterruptedException {
- ExecutorService executorService = Executors.newFixedThreadPool(4);
- long startTime = System.nanoTime();
+ final ExecutorService executorService = Executors.newFixedThreadPool(4);
+ final long startTime = System.nanoTime();
for (int i = 0; i < 4; i++) {
executorService.execute(() -> {
for (int j = 0; j < 500_000; j++) {
- int value = ThreadLocalRandom.current().nextInt(10000);
- String key = String.valueOf(value);
+ final int value = ThreadLocalRandom.current().nextInt(10000);
+ final String key = String.valueOf(value);
map.put(key, value);
map.get(key);
}
@@ -56,11 +60,11 @@ public class ConcurrentMapPerformanceManualTest {
return 1;
}
}
- int executeTimes = 5000;
+ final int executeTimes = 5000;
- Map mapOfSameHash = new ConcurrentHashMap<>();
+ final Map mapOfSameHash = new ConcurrentHashMap<>();
ExecutorService executorService = Executors.newFixedThreadPool(2);
- long sameHashStartTime = System.currentTimeMillis();
+ final long sameHashStartTime = System.currentTimeMillis();
for (int i = 0; i < 2; i++) {
executorService.execute(() -> {
for (int j = 0; j < executeTimes; j++) {
@@ -71,10 +75,10 @@ public class ConcurrentMapPerformanceManualTest {
executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.SECONDS);
- long mapOfSameHashDuration = System.currentTimeMillis() - sameHashStartTime;
- Map
- javax.servlet
- jstl
- 1.2
+ org.thymeleaf
+ thymeleaf
+ 3.0.7.RELEASE
+
+
+
+ org.thymeleaf
+ thymeleaf-spring4
+ 3.0.7.RELEASE
diff --git a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt
index 4907e46efb..ec1c4e9511 100644
--- a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt
+++ b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt
@@ -1,13 +1,16 @@
package com.baeldung.kotlin.mvc
+import org.springframework.context.ApplicationContext
+import org.springframework.context.ApplicationContextAware
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
-import org.springframework.web.servlet.ViewResolver
import org.springframework.web.servlet.config.annotation.EnableWebMvc
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
-import org.springframework.web.servlet.view.InternalResourceViewResolver
-import org.springframework.web.servlet.view.JstlView
+import org.thymeleaf.spring4.SpringTemplateEngine
+import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver
+import org.thymeleaf.spring4.view.ThymeleafViewResolver
+import org.thymeleaf.templatemode.TemplateMode
@@ -15,7 +18,13 @@ import org.springframework.web.servlet.view.JstlView
@EnableWebMvc
@Configuration
-open class ApplicationWebConfig: WebMvcConfigurerAdapter() {
+open class ApplicationWebConfig: WebMvcConfigurerAdapter(), ApplicationContextAware {
+
+ private var applicationContext: ApplicationContext? = null
+
+ override fun setApplicationContext(applicationContext: ApplicationContext?) {
+ this.applicationContext = applicationContext
+ }
override fun addViewControllers(registry: ViewControllerRegistry?) {
super.addViewControllers(registry)
@@ -24,14 +33,28 @@ open class ApplicationWebConfig: WebMvcConfigurerAdapter() {
}
@Bean
- open fun viewResolver(): ViewResolver {
- val bean = InternalResourceViewResolver()
+ open fun templateResolver(): SpringResourceTemplateResolver {
+ val templateResolver = SpringResourceTemplateResolver()
+ templateResolver.prefix = "/WEB-INF/view/"
+ templateResolver.suffix = ".html"
+ templateResolver.templateMode = TemplateMode.HTML
+ templateResolver.setApplicationContext(this.applicationContext);
+ return templateResolver
+ }
- bean.setViewClass(JstlView::class.java)
- bean.setPrefix("/WEB-INF/view/")
- bean.setSuffix(".jsp")
+ @Bean
+ open fun templateEngine(): SpringTemplateEngine {
+ val templateEngine = SpringTemplateEngine()
+ templateEngine.setTemplateResolver(templateResolver())
+ return templateEngine
+ }
- return bean
+ @Bean
+ open fun viewResolver(): ThymeleafViewResolver {
+ val viewResolver = ThymeleafViewResolver()
+ viewResolver.templateEngine = templateEngine()
+ viewResolver.order = 1
+ return viewResolver
}
}
\ No newline at end of file
diff --git a/spring-mvc-kotlin/src/main/webapp/WEB-INF/spring-web-config.xml b/spring-mvc-kotlin/src/main/webapp/WEB-INF/spring-web-config.xml
index ffe83a66fa..c7f110ea94 100644
--- a/spring-mvc-kotlin/src/main/webapp/WEB-INF/spring-web-config.xml
+++ b/spring-mvc-kotlin/src/main/webapp/WEB-INF/spring-web-config.xml
@@ -12,13 +12,26 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vavr/pom.xml b/vavr/pom.xml
index 426155263c..53cd07ddf7 100644
--- a/vavr/pom.xml
+++ b/vavr/pom.xml
@@ -40,6 +40,13 @@
org.springframework.boot
spring-boot-starter-test
+
+
+ org.awaitility
+ awaitility
+ ${awaitility.version}
+ test
+
@@ -69,6 +76,7 @@
1.8
0.9.0
4.12
+ 3.0.0
diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java
new file mode 100644
index 0000000000..84621e3a68
--- /dev/null
+++ b/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java
@@ -0,0 +1,203 @@
+package com.baeldung.vavr.future;
+
+import static io.vavr.API.$;
+import static io.vavr.API.Case;
+import static io.vavr.API.Match;
+import static io.vavr.Predicates.exists;
+import static io.vavr.Predicates.forAll;
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.CancellationException;
+import java.util.function.Predicate;
+
+import org.junit.Test;
+
+import io.vavr.collection.List;
+import io.vavr.concurrent.Future;
+
+public class FutureUnitTest {
+
+ private final String SUCCESS = "Success";
+ private final String FAILURE = "Failure";
+
+ @Test
+ public void givenFunctionReturnInteger_WhenCallWithFuture_ShouldReturnFunctionValue() {
+ Future future = Future.of(() -> 1);
+
+ assertEquals(1, future.get()
+ .intValue());
+ }
+
+ @Test
+ public void givenFunctionGetRemoteHttpResourceAsString_WhenCallSuccessWithFuture_ShouldReturnContentValueAsString() {
+ String url = "http://resource";
+ String content = "Content from " + url;
+ Future future = Future.of(() -> getResource(url));
+
+ assertEquals(content, future.get());
+ }
+
+ @Test
+ public void givenFunctionThrowException_WhenCallWithFuture_ShouldReturnFailure() {
+ Future future = Future.of(() -> getResourceThrowException(""));
+ future.await();
+
+ assertTrue(future.isFailure());
+ }
+
+ @Test
+ public void givenAFutureReturnZero_WhenCheckFutureWithExistEvenValue_ShouldReturnRight() {
+ Future future = Future.of(() -> 2);
+ boolean result = future.exists(i -> i % 2 == 0);
+
+ assertTrue(result);
+ }
+
+ @Test
+ public void givenFunction_WhenCallWithFutureAndRegisterConsumerForSuccess_ShouldCallConsumerToStoreValue() {
+ final int[] store = new int[] { 0 };
+ Future future = Future.of(() -> 1);
+ future.onSuccess(i -> {
+ store[0] = i;
+ });
+ await().until(() -> store[0] == 1);
+ }
+
+ @Test
+ public void givenFunctionThrowException_WhenCallWithFutureAndRegisterConsumerForFailer_ShouldCallConsumerToStoreException() {
+ final Throwable[] store = new Throwable[] { null };
+ Future future = Future.of(() -> getResourceThrowException(""));
+ future.onFailure(err -> store[0] = err);
+ await().until(() -> RuntimeException.class.isInstance(store[0]));
+ }
+
+ @Test
+ public void givenAFuture_WhenAddAndThenConsumer_ShouldCallConsumerWithResultOfFutureAction() {
+ int[] store1 = new int[1];
+ int[] store2 = new int[1];
+ Future future = Future.of(() -> 1);
+ Future andThenFuture = future.andThen(i -> store1[0] = i.get() + 1)
+ .andThen(i -> store2[0] = store1[0] + 1);
+ andThenFuture.await();
+
+ assertEquals(2, store1[0]);
+ assertEquals(3, store2[0]);
+ }
+
+ @Test
+ public void givenAFailureFuture_WhenCallOrElseFunction_ShouldReturnNewFuture() {
+ Future future = Future.failed(new RuntimeException());
+ Future future2 = future.orElse(Future.of(() -> 2));
+
+ assertEquals(2, future2.get()
+ .intValue());
+ }
+
+ @Test(expected = CancellationException.class)
+ public void givenAFuture_WhenCallCancel_ShouldReturnCancellationException() {
+ long waitTime = 1000;
+ Future future = Future.of(() -> {
+ Thread.sleep(waitTime);
+ return 1;
+ });
+ future.cancel();
+ future.await();
+ future.get();
+ }
+
+ @Test
+ public void givenAFuture_WhenCallFallBackWithSuccessFuture_ShouldReturnFutureResult() {
+ String expectedResult = "take this";
+ Future future = Future.of(() -> expectedResult);
+ Future secondFuture = Future.of(() -> "take that");
+ Future futureResult = future.fallbackTo(secondFuture);
+ futureResult.await();
+
+ assertEquals(expectedResult, futureResult.get());
+ }
+
+ @Test
+ public void givenAFuture_WhenCallFallBackWithFailureFuture_ShouldReturnValueOfFallBackFuture() {
+ String expectedResult = "take that";
+ Future future = Future.failed(new RuntimeException());
+ Future fallbackFuture = Future.of(() -> expectedResult);
+ Future futureResult = future.fallbackTo(fallbackFuture);
+ futureResult.await();
+
+ assertEquals(expectedResult, futureResult.get());
+ }
+
+ @Test
+ public void givenGetResourceWithFuture_WhenWaitAndMatchWithPredicate_ShouldReturnSuccess() {
+ String url = "http://resource";
+ Future future = Future.of(() -> getResource(url));
+ future.await();
+ String s = Match(future).of(Case($(future0 -> future0.isSuccess()), SUCCESS), Case($(), FAILURE));
+
+ assertEquals(SUCCESS, s);
+ }
+
+ @Test
+ public void givenAFailedFuture_WhenWaitAndMatchWithPredicateCheckSuccess_ShouldReturnFailed() {
+ Future future = Future.failed(new RuntimeException());
+ future.await();
+ String s = Match(future).of(Case($(future0 -> future0.isSuccess()), SUCCESS), Case($(), FAILURE));
+
+ assertEquals(FAILURE, s);
+ }
+
+ @Test
+ public void givenAFuture_WhenMatchWithFuturePredicate_ShouldReturnSuccess() {
+ Future future = Future.of(() -> {
+ Thread.sleep(10);
+ return 1;
+ });
+ Predicate> predicate = f -> f.exists(i -> i % 2 == 1);
+ String s = Match(future).of(Case($(predicate), "Even"), Case($(), "Odd"));
+
+ assertEquals("Even", s);
+ }
+
+ @Test
+ public void givenAListOfFutureReturnFist3Integers_WhenMatchWithExistEvenNumberPredicate_ShouldReturnSuccess() {
+ List> futures = getFutureOfFirst3Number();
+ Predicate> predicate0 = future -> future.exists(i -> i % 2 == 0);
+ String s = Match(futures).of(Case($(exists(predicate0)), "Even"), Case($(), "Odd"));
+
+ assertEquals("Even", s);
+ }
+
+ @Test
+ public void givenAListOfFutureReturnFist3Integers_WhenMatchWithForAllNumberBiggerThanZeroPredicate_ShouldReturnSuccess() {
+ List> futures = getFutureOfFirst3Number();
+ Predicate> predicate0 = future -> future.exists(i -> i > 0);
+ String s = Match(futures).of(Case($(forAll(predicate0)), "Positive numbers"), Case($(), "None"));
+
+ assertEquals("Positive numbers", s);
+ }
+
+ @Test
+ public void givenAListOfFutureReturnFist3Integers_WhenMatchWithForAllNumberSmallerThanZeroPredicate_ShouldReturnFailed() {
+ List> futures = getFutureOfFirst3Number();
+ Predicate> predicate0 = future -> future.exists(i -> i < 0);
+ String s = Match(futures).of(Case($(forAll(predicate0)), "Negative numbers"), Case($(), "None"));
+
+ assertEquals("None", s);
+ }
+
+ private String getResource(String url) throws InterruptedException {
+ Thread.sleep(10);
+ return "Content from " + url;
+ }
+
+ private String getResourceThrowException(String url) {
+ throw new RuntimeException("Exception when get resource " + url);
+ }
+
+ private List> getFutureOfFirst3Number() {
+ List> futures = List.of(Future.of(() -> 1), Future.of(() -> 2), Future.of(() -> 3));
+ return futures;
+ }
+}