diff --git a/guest/thread-pools/pom.xml b/guest/thread-pools/pom.xml
new file mode 100644
index 0000000000..72a10213c4
--- /dev/null
+++ b/guest/thread-pools/pom.xml
@@ -0,0 +1,28 @@
+
+ 4.0.0
+ com.stackify
+ thread-pools
+ 0.0.1-SNAPSHOT
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+
+
+
\ No newline at end of file
diff --git a/guest/thread-pools/src/main/java/com/stackify/models/Employee.java b/guest/thread-pools/src/main/java/com/stackify/models/Employee.java
new file mode 100644
index 0000000000..65661f38d5
--- /dev/null
+++ b/guest/thread-pools/src/main/java/com/stackify/models/Employee.java
@@ -0,0 +1,28 @@
+package com.stackify.models;
+
+public class Employee {
+ private String name;
+ private double salary;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+
+ public Employee(String name, double salary) {
+ super();
+ this.name = name;
+ this.salary = salary;
+ }
+}
diff --git a/guest/thread-pools/src/main/java/com/stackify/services/EmployeeService.java b/guest/thread-pools/src/main/java/com/stackify/services/EmployeeService.java
new file mode 100644
index 0000000000..824f87a625
--- /dev/null
+++ b/guest/thread-pools/src/main/java/com/stackify/services/EmployeeService.java
@@ -0,0 +1,9 @@
+package com.stackify.services;
+
+import com.stackify.models.Employee;
+
+public class EmployeeService {
+ public double calculateBonus(Employee employee) {
+ return 0.1 * employee.getSalary();
+ }
+}
diff --git a/guest/thread-pools/src/main/java/com/stackify/threadpools/FactorialTask.java b/guest/thread-pools/src/main/java/com/stackify/threadpools/FactorialTask.java
new file mode 100644
index 0000000000..2dd83d9b20
--- /dev/null
+++ b/guest/thread-pools/src/main/java/com/stackify/threadpools/FactorialTask.java
@@ -0,0 +1,64 @@
+package com.stackify.threadpools;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ForkJoinTask;
+import java.util.concurrent.RecursiveTask;
+import java.util.stream.IntStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FactorialTask extends RecursiveTask {
+
+ private static final Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+
+ private static final long serialVersionUID = 1L;
+
+ private int start = 1;
+ private int n;
+
+ private static final int THRESHOLD = 20;
+
+ public FactorialTask(int n) {
+ this.n = n;
+ }
+
+ public FactorialTask(int start, int n) {
+ logger.info("New FactorialTask Created");
+ this.start = start;
+ this.n = n;
+ }
+
+ @Override
+ protected BigInteger compute() {
+ if ((n - start) >= THRESHOLD) {
+ return ForkJoinTask.invokeAll(createSubtasks())
+ .stream()
+ .map(ForkJoinTask::join)
+ .reduce(BigInteger.ONE, BigInteger::multiply);
+ } else {
+ return calculate(start, n);
+ }
+ }
+
+ private Collection createSubtasks() {
+ List dividedTasks = new ArrayList<>();
+
+ int mid = (start + n) / 2;
+
+ dividedTasks.add(new FactorialTask(start, mid));
+ dividedTasks.add(new FactorialTask(mid + 1, n));
+ return dividedTasks;
+ }
+
+ private BigInteger calculate(int start, int n) {
+ logger.info("Calculate factorial from " + start + " to " + n);
+ return IntStream.rangeClosed(start, n)
+ .mapToObj(BigInteger::valueOf)
+ .reduce(BigInteger.ONE, BigInteger::multiply);
+ }
+
+}
diff --git a/guest/thread-pools/src/main/java/com/stackify/threadpools/ThreadsApplication.java b/guest/thread-pools/src/main/java/com/stackify/threadpools/ThreadsApplication.java
new file mode 100644
index 0000000000..cc9048eee7
--- /dev/null
+++ b/guest/thread-pools/src/main/java/com/stackify/threadpools/ThreadsApplication.java
@@ -0,0 +1,102 @@
+package com.stackify.threadpools;
+
+import java.math.BigInteger;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.stackify.models.Employee;
+import com.stackify.services.EmployeeService;
+
+public class ThreadsApplication {
+
+ private static final Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+
+ public static void main(String[] args) {
+ testExecutor();
+ testExecutorService();
+ testScheduledExecutorService();
+ testThreadPoolExecutor();
+ testForkJoinPool();
+ }
+
+ private static EmployeeService employeeService = new EmployeeService();
+
+ public static void testExecutor() {
+ Executor executor = Executors.newSingleThreadExecutor();
+ executor.execute(() -> System.out.println("Single thread pool test"));
+ }
+
+ public static void testExecutorService() {
+
+ Employee employee = new Employee("John", 2000);
+
+ ExecutorService executor = Executors.newFixedThreadPool(10);
+
+ Callable callableTask = () -> {
+ return employeeService.calculateBonus(employee);
+ };
+ Future future = executor.submit(callableTask);
+
+ try {
+ if (future.isDone()) {
+ double result = future.get();
+ System.out.println("Bonus is:" + result);
+ }
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ executor.shutdown();
+ }
+
+ public static void testScheduledExecutorService() {
+ Employee employee = new Employee("John", 2000);
+
+ ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
+
+ Callable callableTask = () -> {
+ return employeeService.calculateBonus(employee);
+ };
+
+ Future futureScheduled = executor.schedule(callableTask, 2, TimeUnit.MILLISECONDS);
+
+ try {
+ System.out.println("Bonus:" + futureScheduled.get());
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ executor.scheduleAtFixedRate(() -> System.out.println("Fixed Rate Scheduled"), 2, 2000, TimeUnit.MILLISECONDS);
+ executor.scheduleWithFixedDelay(() -> System.out.println("Fixed Delay Scheduled"), 2, 2000, TimeUnit.MILLISECONDS);
+ }
+
+ public static void testThreadPoolExecutor() {
+ ThreadPoolExecutor fixedPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
+ ThreadPoolExecutor cachedPoolExecutor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
+
+ ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 6, 60, TimeUnit.SECONDS, new LinkedBlockingQueue());
+ executor.setMaximumPoolSize(8);
+
+ ScheduledThreadPoolExecutor scheduledExecutor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(5);
+ }
+
+ public static void testForkJoinPool() {
+ ForkJoinPool pool = ForkJoinPool.commonPool();
+ logger.info("Thread Pool Created");
+ BigInteger result = pool.invoke(new FactorialTask(100));
+ System.out.println(result.toString());
+ }
+}
diff --git a/libraries/pom.xml b/libraries/pom.xml
index ddfd75da82..cf77d197a2 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -1,531 +1,568 @@
-
- parent-modules
- com.baeldung
- 1.0.0-SNAPSHOT
-
- 4.0.0
- libraries
- libraries
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- org.apache.felix
- maven-bundle-plugin
- 3.3.0
- maven-plugin
-
-
- true
-
-
- maven-failsafe-plugin
- 2.20
-
-
- chromedriver
-
-
-
-
- net.serenity-bdd.maven.plugins
- serenity-maven-plugin
- ${serenity.plugin.version}
-
-
- serenity-reports
- post-integration-test
-
- aggregate
-
-
-
-
-
-
- org.datanucleus
- datanucleus-maven-plugin
- 5.0.2
-
- JDO
- ${basedir}/datanucleus.properties
- ${basedir}/log4j.properties
- true
- false
-
-
-
-
- process-classes
-
- enhance
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- 3.0.2
-
-
- **/log4j.properties
-
-
-
- com.baeldung.neuroph.NeurophXOR
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.18.1
-
-
- test
- test
-
- test
-
-
-
- test/java/com/baeldung/neuroph/XORTest.java
-
-
-
-
-
-
-
-
-
-
-
- org.beykery
- neuroph
- ${neuroph.version}
-
-
-
- cglib
- cglib
- ${cglib.version}
-
-
- commons-beanutils
- commons-beanutils
- ${commons-beanutils.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang.version}
-
-
- org.apache.commons
- commons-text
- ${commons-text.version}
-
-
- org.apache.commons
- commons-collections4
- ${commons.collections.version}
-
-
- org.jasypt
- jasypt
- ${jasypt.version}
-
-
- org.javatuples
- javatuples
- ${javatuples.version}
-
-
- org.javassist
- javassist
- ${javaassist.version}
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
-
-
- org.skyscreamer
- jsonassert
- ${jsonassert.version}
-
-
- org.javers
- javers-core
- ${javers.version}
-
-
- org.eclipse.jetty
- jetty-server
- ${jetty.version}
-
-
- org.eclipse.jetty
- jetty-servlet
- ${jetty.version}
-
-
- rome
- rome
- ${rome.version}
-
-
- io.specto
- hoverfly-java
- 0.8.0
-
-
- org.apache.httpcomponents
- httpclient
- ${httpclient.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- commons-io
- commons-io
- ${commons.io.version}
-
-
- commons-chain
- commons-chain
- ${commons-chain.version}
-
-
- org.apache.commons
- commons-csv
- ${commons-csv.version}
-
-
- commons-dbutils
- commons-dbutils
- ${commons.dbutils.version}
-
-
- org.apache.flink
- flink-core
- ${flink.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- org.apache.flink
- flink-java
- ${flink.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- org.apache.flink
- flink-test-utils_2.10
- ${flink.version}
- test
-
-
- org.apache.commons
- commons-math3
- 3.6.1
-
-
- net.serenity-bdd
- serenity-core
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-junit
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-jbehave
- ${serenity.jbehave.version}
- test
-
-
- net.serenity-bdd
- serenity-rest-assured
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-jira-requirements-provider
- ${serenity.jira.version}
- test
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
-
- org.datanucleus
- javax.jdo
- 3.2.0-m6
-
-
- org.datanucleus
- datanucleus-core
- 5.1.0-m1
-
-
- org.datanucleus
- datanucleus-api-jdo
- 5.1.0-m1
-
-
- org.datanucleus
- datanucleus-rdbms
- 5.1.0-m1
-
-
- org.datanucleus
- datanucleus-maven-plugin
- 5.0.2
-
-
- org.datanucleus
- datanucleus-xml
- 5.0.0-release
-
-
- net.openhft
- chronicle
- 3.6.4
-
-
- org.springframework
- spring-web
- 4.3.8.RELEASE
-
-
- net.serenity-bdd
- serenity-spring
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-screenplay
- ${serenity.version}
- test
-
-
- net.serenity-bdd
- serenity-screenplay-webdriver
- ${serenity.version}
- test
-
-
- io.rest-assured
- spring-mock-mvc
- 3.0.3
- test
-
-
- org.multiverse
- multiverse-core
- ${multiverse.version}
-
-
- com.zaxxer
- HikariCP
- 2.6.1
- compile
-
-
- com.h2database
- h2
- ${h2.version}
-
-
- pl.pragmatists
- JUnitParams
- ${jUnitParams.version}
- test
-
-
- org.quartz-scheduler
- quartz
- 2.3.0
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- org.jooq
- jool
- 0.9.12
-
-
- org.openjdk.jmh
- jmh-core
- 1.19
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- 1.19
-
-
- io.netty
- netty-all
- ${netty.version}
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- info.debatty
- java-lsh
- ${java-lsh.version}
-
-
- au.com.dius
- pact-jvm-consumer-junit_2.11
- ${pact.version}
- test
-
-
- org.codehaus.groovy
- groovy-all
- 2.4.10
-
-
- org.awaitility
- awaitility
- ${awaitility.version}
- test
-
-
- org.awaitility
- awaitility-proxy
- ${awaitility.version}
- test
-
-
- org.hamcrest
- java-hamcrest
- ${org.hamcrest.java-hamcrest.version}
- test
-
-
- net.agkn
- hll
- ${hll.version}
-
-
- net.bytebuddy
- byte-buddy
- ${bytebuddy.version}
-
-
- net.bytebuddy
- byte-buddy-agent
- ${bytebuddy.version}
-
-
- org.pcollections
- pcollections
- ${pcollections.version}
-
-
- com.machinezoo.noexception
- noexception
- 1.1.0
-
-
- org.eclipse.collections
- eclipse-collections
- ${eclipse-collections.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
-
- 0.7.0
- 3.2.4
- 3.5
- 1.1
- 1.9.3
- 1.2
- 1.4
- 1.9.2
- 1.2
- 3.21.0-GA
- 3.6.2
- 1.5.0
- 3.1.0
- 9.4.3.v20170317
- 4.5.3
- 2.5
- 1.6
- 1.4.196
- 9.4.2.v20170220
- 4.5.3
- 2.5
- 1.2.0
- 2.8.5
- 2.92
- 1.4.0
- 1.24.0
- 1.1.3-rc.5
- 1.4.0
- 1.1.0
- 4.1.10.Final
- 4.1
- 4.12
- 0.10
- 3.5.0
- 3.0.0
- 2.0.0.0
- 1.6.0
- 1.7.1
- 2.1.2
- 1.0
- 8.2.0
- 0.6.5
- 0.9.0
-
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ libraries
+ libraries
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ 3.3.0
+ maven-plugin
+
+
+ true
+
+
+ maven-failsafe-plugin
+ 2.20
+
+
+ chromedriver
+
+
+
+
+ net.serenity-bdd.maven.plugins
+ serenity-maven-plugin
+ ${serenity.plugin.version}
+
+
+ serenity-reports
+ post-integration-test
+
+ aggregate
+
+
+
+
+
+
+ org.datanucleus
+ datanucleus-maven-plugin
+ 5.0.2
+
+ JDO
+ ${basedir}/datanucleus.properties
+ ${basedir}/log4j.properties
+ true
+ false
+
+
+
+
+ process-classes
+
+ enhance
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.0.2
+
+
+ **/log4j.properties
+
+
+
+ com.baeldung.neuroph.NeurophXOR
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.18.1
+
+
+ test
+ test
+
+ test
+
+
+
+ test/java/com/baeldung/neuroph/XORTest.java
+
+
+
+
+
+
+
+
+
+
+
+ org.beykery
+ neuroph
+ ${neuroph.version}
+
+
+
+ cglib
+ cglib
+ ${cglib.version}
+
+
+ commons-beanutils
+ commons-beanutils
+ ${commons-beanutils.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons.collections.version}
+
+
+ org.jasypt
+ jasypt
+ ${jasypt.version}
+
+
+ org.javatuples
+ javatuples
+ ${javatuples.version}
+
+
+ org.javassist
+ javassist
+ ${javaassist.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ org.skyscreamer
+ jsonassert
+ ${jsonassert.version}
+
+
+ org.javers
+ javers-core
+ ${javers.version}
+
+
+ org.eclipse.jetty
+ jetty-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-servlet
+ ${jetty.version}
+
+
+ rome
+ rome
+ ${rome.version}
+
+
+ io.specto
+ hoverfly-java
+ 0.8.0
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ commons-io
+ commons-io
+ ${commons.io.version}
+
+
+ commons-chain
+ commons-chain
+ ${commons-chain.version}
+
+
+ org.apache.commons
+ commons-csv
+ ${commons-csv.version}
+
+
+ commons-dbutils
+ commons-dbutils
+ ${commons.dbutils.version}
+
+
+ org.apache.flink
+ flink-core
+ ${flink.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.apache.flink
+ flink-java
+ ${flink.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.apache.flink
+ flink-test-utils_2.10
+ ${flink.version}
+ test
+
+
+ org.apache.commons
+ commons-math3
+ 3.6.1
+
+
+ net.serenity-bdd
+ serenity-core
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-junit
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-jbehave
+ ${serenity.jbehave.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-rest-assured
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-jira-requirements-provider
+ ${serenity.jira.version}
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ org.datanucleus
+ javax.jdo
+ 3.2.0-m6
+
+
+ org.datanucleus
+ datanucleus-core
+ 5.1.0-m1
+
+
+ org.datanucleus
+ datanucleus-api-jdo
+ 5.1.0-m1
+
+
+ org.datanucleus
+ datanucleus-rdbms
+ 5.1.0-m1
+
+
+ org.datanucleus
+ datanucleus-maven-plugin
+ 5.0.2
+
+
+ org.datanucleus
+ datanucleus-xml
+ 5.0.0-release
+
+
+ net.openhft
+ chronicle
+ 3.6.4
+
+
+ org.springframework
+ spring-web
+ 4.3.8.RELEASE
+
+
+ net.serenity-bdd
+ serenity-spring
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay-webdriver
+ ${serenity.version}
+ test
+
+
+ io.rest-assured
+ spring-mock-mvc
+ 3.0.3
+ test
+
+
+ org.multiverse
+ multiverse-core
+ ${multiverse.version}
+
+
+ com.zaxxer
+ HikariCP
+ 2.6.1
+ compile
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+ pl.pragmatists
+ JUnitParams
+ ${jUnitParams.version}
+ test
+
+
+ org.quartz-scheduler
+ quartz
+ 2.3.0
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ org.jooq
+ jool
+ 0.9.12
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.19
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.19
+
+
+ io.netty
+ netty-all
+ ${netty.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ info.debatty
+ java-lsh
+ ${java-lsh.version}
+
+
+ au.com.dius
+ pact-jvm-consumer-junit_2.11
+ ${pact.version}
+ test
+
+
+ org.codehaus.groovy
+ groovy-all
+ 2.4.10
+
+
+ org.awaitility
+ awaitility
+ ${awaitility.version}
+ test
+
+
+ org.awaitility
+ awaitility-proxy
+ ${awaitility.version}
+ test
+
+
+ org.hamcrest
+ java-hamcrest
+ ${org.hamcrest.java-hamcrest.version}
+ test
+
+
+ net.agkn
+ hll
+ ${hll.version}
+
+
+ net.bytebuddy
+ byte-buddy
+ ${bytebuddy.version}
+
+
+ net.bytebuddy
+ byte-buddy-agent
+ ${bytebuddy.version}
+
+
+ org.pcollections
+ pcollections
+ ${pcollections.version}
+
+
+ com.machinezoo.noexception
+ noexception
+ 1.1.0
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse-collections.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.geotools
+ gt-shapefile
+ ${geotools.version}
+
+
+ org.geotools
+ gt-epsg-hsql
+ ${geotools.version}
+
+
+ org.geotools
+ gt-swing
+ ${geotools.version}
+
+
+
+
+ maven2-repository.dev.java.net
+ Java.net repository
+ http://download.java.net/maven/2
+
+
+ osgeo
+ Open Source Geospatial Foundation Repository
+ http://download.osgeo.org/webdav/geotools/
+
+
+
+ true
+
+ opengeo
+ OpenGeo Maven Repository
+ http://repo.opengeo.org
+
+
+
+ 0.7.0
+ 3.2.4
+ 3.5
+ 1.1
+ 1.9.3
+ 1.2
+ 1.4
+ 1.9.2
+ 1.2
+ 3.21.0-GA
+ 3.6.2
+ 1.5.0
+ 3.1.0
+ 9.4.3.v20170317
+ 4.5.3
+ 2.5
+ 1.6
+ 1.4.196
+ 9.4.2.v20170220
+ 4.5.3
+ 2.5
+ 1.2.0
+ 2.8.5
+ 2.92
+ 1.4.0
+ 1.24.0
+ 1.1.3-rc.5
+ 1.4.0
+ 1.1.0
+ 4.1.10.Final
+ 4.1
+ 4.12
+ 0.10
+ 3.5.0
+ 3.0.0
+ 2.0.0.0
+ 1.6.0
+ 1.7.1
+ 2.1.2
+ 1.0
+ 8.2.0
+ 0.6.5
+ 0.9.0
+ 15.2
+
+
diff --git a/libraries/src/main/java/com/baeldung/geotools/ShapeFile.java b/libraries/src/main/java/com/baeldung/geotools/ShapeFile.java
new file mode 100644
index 0000000000..77c67abc84
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/geotools/ShapeFile.java
@@ -0,0 +1,187 @@
+package com.baeldung.geotools;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.geotools.data.DataUtilities;
+import org.geotools.data.DefaultTransaction;
+import org.geotools.data.Transaction;
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.data.shapefile.ShapefileDataStoreFactory;
+import org.geotools.data.simple.SimpleFeatureSource;
+import org.geotools.data.simple.SimpleFeatureStore;
+import org.geotools.feature.DefaultFeatureCollection;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
+import org.geotools.geometry.jts.JTSFactoryFinder;
+import org.geotools.referencing.crs.DefaultGeographicCRS;
+import org.geotools.swing.data.JFileDataStoreChooser;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.Point;
+
+public class ShapeFile {
+
+ private static final String FILE_NAME = "shapefile.shp";
+
+ public static void main(String[] args) throws Exception {
+
+ DefaultFeatureCollection collection = new DefaultFeatureCollection();
+
+ GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
+
+ SimpleFeatureType TYPE = DataUtilities.createType("Location", "location:Point:srid=4326," + "name:String");
+
+ SimpleFeatureType CITY = createFeatureType();
+
+ SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY);
+
+ addLocations(featureBuilder, collection);
+
+ File shapeFile = getNewShapeFile();
+
+ ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
+
+ Map params = new HashMap();
+ params.put("url", shapeFile.toURI()
+ .toURL());
+ params.put("create spatial index", Boolean.TRUE);
+
+ ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
+ dataStore.createSchema(CITY);
+
+ // If you decide to use the TYPE type and create a Data Store with it,
+ // You will need to uncomment this line to set the Coordinate Reference System
+ // newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);
+
+ Transaction transaction = new DefaultTransaction("create");
+
+ String typeName = dataStore.getTypeNames()[0];
+ SimpleFeatureSource featureSource = dataStore.getFeatureSource(typeName);
+
+ if (featureSource instanceof SimpleFeatureStore) {
+ SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
+
+ featureStore.setTransaction(transaction);
+ try {
+ featureStore.addFeatures(collection);
+ transaction.commit();
+
+ } catch (Exception problem) {
+ problem.printStackTrace();
+ transaction.rollback();
+
+ } finally {
+ transaction.close();
+ }
+ System.exit(0); // success!
+ } else {
+ System.out.println(typeName + " does not support read/write access");
+ System.exit(1);
+ }
+
+ }
+
+ public static SimpleFeatureType createFeatureType() {
+
+ SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
+ builder.setName("Location");
+ builder.setCRS(DefaultGeographicCRS.WGS84);
+
+ builder.add("Location", Point.class);
+ builder.length(15)
+ .add("Name", String.class);
+
+ SimpleFeatureType CITY = builder.buildFeatureType();
+
+ return CITY;
+ }
+
+ public static void addLocations(SimpleFeatureBuilder featureBuilder, DefaultFeatureCollection collection) {
+
+ Map> locations = new HashMap<>();
+
+ double lat = 13.752222;
+ double lng = 100.493889;
+ String name = "Bangkok";
+ addToLocationMap(name, lat, lng, locations);
+
+ lat = 53.083333;
+ lng = -0.15;
+ name = "New York";
+ addToLocationMap(name, lat, lng, locations);
+
+ lat = -33.925278;
+ lng = 18.423889;
+ name = "Cape Town";
+ addToLocationMap(name, lat, lng, locations);
+
+ lat = -33.859972;
+ lng = 151.211111;
+ name = "Sydney";
+ addToLocationMap(name, lat, lng, locations);
+
+ lat = 45.420833;
+ lng = -75.69;
+ name = "Ottawa";
+ addToLocationMap(name, lat, lng, locations);
+
+ lat = 30.07708;
+ lng = 31.285909;
+ name = "Cairo";
+ addToLocationMap(name, lat, lng, locations);
+
+ GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
+
+ for (Map.Entry> location : locations.entrySet()) {
+ Point point = geometryFactory.createPoint(new Coordinate(location.getValue()
+ .get(0),
+ location.getValue()
+ .get(1)));
+ featureBuilder.add(point);
+ featureBuilder.add(name);
+ SimpleFeature feature = featureBuilder.buildFeature(null);
+ collection.add(feature);
+ }
+
+ }
+
+ private static void addToLocationMap(String name, double lat, double lng, Map> locations) {
+ List coordinates = new ArrayList<>();
+
+ coordinates.add(lat);
+ coordinates.add(lng);
+ locations.put(name, coordinates);
+ }
+
+ private static File getNewShapeFile() {
+ String filePath = new File(".").getAbsolutePath() + FILE_NAME;
+
+
+ JFileDataStoreChooser chooser = new JFileDataStoreChooser("shp");
+ chooser.setDialogTitle("Save shapefile");
+ chooser.setSelectedFile(new File(filePath));
+
+ int returnVal = chooser.showSaveDialog(null);
+
+ if (returnVal != JFileDataStoreChooser.APPROVE_OPTION) {
+ System.exit(0);
+ }
+
+ File shapeFile = chooser.getSelectedFile();
+ if (shapeFile.equals(filePath)) {
+ System.out.println("Error: cannot replace " + filePath);
+ System.exit(0);
+ }
+
+ return shapeFile;
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/geotools/GeoToolsUnitTestTest.java b/libraries/src/test/java/com/baeldung/geotools/GeoToolsUnitTestTest.java
new file mode 100644
index 0000000000..44cd47edc3
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/geotools/GeoToolsUnitTestTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.geotools;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.geotools.feature.DefaultFeatureCollection;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.junit.Test;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+public class GeoToolsUnitTestTest {
+
+ @Test
+ public void givenFeatureType_whenAddLocations_returnFeatureCollection() {
+
+ DefaultFeatureCollection collection = new DefaultFeatureCollection();
+
+ SimpleFeatureType CITY = ShapeFile.createFeatureType();
+
+ SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY);
+
+ ShapeFile.addLocations(featureBuilder, collection);
+
+ assertNotNull(collection);
+
+ }
+
+}
diff --git a/rule-engines/easy-rules/pom.xml b/rule-engines/easy-rules/pom.xml
new file mode 100644
index 0000000000..78edc09d1a
--- /dev/null
+++ b/rule-engines/easy-rules/pom.xml
@@ -0,0 +1,24 @@
+
+ 4.0.0
+
+ com.baeldung.easyrules
+ easy-rules
+ 1.0
+
+ easy-rules
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.jeasy
+ easy-rules-core
+ 3.0.0
+
+
+
\ No newline at end of file
diff --git a/rule-engines/easy-rules/src/main/java/com/baeldung/easyrules/HelloWorldRule.java b/rule-engines/easy-rules/src/main/java/com/baeldung/easyrules/HelloWorldRule.java
new file mode 100644
index 0000000000..5448eabf2a
--- /dev/null
+++ b/rule-engines/easy-rules/src/main/java/com/baeldung/easyrules/HelloWorldRule.java
@@ -0,0 +1,20 @@
+package com.baeldung.easyrules;
+
+import org.jeasy.rules.annotation.Action;
+import org.jeasy.rules.annotation.Condition;
+import org.jeasy.rules.annotation.Rule;
+
+@Rule(name = "Hello World rule", description = "Always say hello world")
+public class HelloWorldRule {
+
+ @Condition
+ public boolean when() {
+ return true;
+ }
+
+ @Action
+ public void then() throws Exception {
+ System.out.println("hello world");
+ }
+
+}
diff --git a/rule-engines/easy-rules/src/main/java/com/baeldung/easyrules/Launcher.java b/rule-engines/easy-rules/src/main/java/com/baeldung/easyrules/Launcher.java
new file mode 100644
index 0000000000..427e3eace0
--- /dev/null
+++ b/rule-engines/easy-rules/src/main/java/com/baeldung/easyrules/Launcher.java
@@ -0,0 +1,21 @@
+package com.baeldung.easyrules;
+
+import org.jeasy.rules.api.Facts;
+import org.jeasy.rules.api.Rules;
+import org.jeasy.rules.api.RulesEngine;
+import org.jeasy.rules.core.DefaultRulesEngine;
+
+public class Launcher {
+ public static void main(String... args) {
+ // create facts
+ Facts facts = new Facts();
+
+ // create rules
+ Rules rules = new Rules();
+ rules.register(new HelloWorldRule());
+
+ // create a rules engine and fire rules on known facts
+ RulesEngine rulesEngine = new DefaultRulesEngine();
+ rulesEngine.fire(rules, facts);
+ }
+}
diff --git a/rule-engines/openl-tablets/pom.xml b/rule-engines/openl-tablets/pom.xml
new file mode 100644
index 0000000000..e983d4e566
--- /dev/null
+++ b/rule-engines/openl-tablets/pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+
+ com.baeldung.openltablets
+ openl-tablets
+ 1.0
+
+ openl-tablets
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.openl
+ org.openl.core
+ 5.19.4
+
+
+ org.openl.rules
+ org.openl.rules
+ 5.19.4
+
+
+
\ No newline at end of file
diff --git a/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/Case.java b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/Case.java
new file mode 100644
index 0000000000..f9f5f4bd5f
--- /dev/null
+++ b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/Case.java
@@ -0,0 +1,23 @@
+package com.baeldung.openltablets.model;
+
+public class Case {
+
+ private User user;
+ private int hourOfDay;
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(final User user) {
+ this.user = user;
+ }
+
+ public int getHourOfDay() {
+ return hourOfDay;
+ }
+
+ public void setHourOfDay(final int hourOfDay) {
+ this.hourOfDay = hourOfDay;
+ }
+}
diff --git a/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/Greeting.java b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/Greeting.java
new file mode 100644
index 0000000000..5dc7bcd117
--- /dev/null
+++ b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/Greeting.java
@@ -0,0 +1,20 @@
+package com.baeldung.openltablets.model;
+
+public enum Greeting {
+
+ GOOD_MORNING("Good Morning"),
+ GOOD_AFTERNOON("Good Afternoon"),
+ GOOD_EVENING("Good Evening"),
+ GOOD_NIGHT("Good Night");
+
+ private final String literal;
+
+ private Greeting(final String literal) {
+ this.literal = literal;
+ }
+
+ public String getLiteral() {
+ return literal;
+ }
+
+}
\ No newline at end of file
diff --git a/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/User.java b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/User.java
new file mode 100644
index 0000000000..8e45487497
--- /dev/null
+++ b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/model/User.java
@@ -0,0 +1,14 @@
+package com.baeldung.openltablets.model;
+
+public class User {
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/IRule.java b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/IRule.java
new file mode 100644
index 0000000000..857a6433ef
--- /dev/null
+++ b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/IRule.java
@@ -0,0 +1,7 @@
+package com.baeldung.openltablets.rules;
+
+import com.baeldung.openltablets.model.Case;
+
+public interface IRule {
+ void helloUser(final Case aCase, final Response response);
+}
\ No newline at end of file
diff --git a/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/Main.java b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/Main.java
new file mode 100644
index 0000000000..34f5c48ed1
--- /dev/null
+++ b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/Main.java
@@ -0,0 +1,31 @@
+package com.baeldung.openltablets.rules;
+
+
+import java.time.LocalDateTime;
+
+import org.openl.rules.runtime.RulesEngineFactory;
+import org.openl.runtime.EngineFactory;
+
+import com.baeldung.openltablets.model.Case;
+import com.baeldung.openltablets.model.User;
+
+public class Main {
+ private IRule instance;
+
+ public static void main(String[] args) {
+ Main rules = new Main();
+ User user = new User();
+ user.setName("Donald Duck");
+ Case aCase = new Case();
+ aCase.setUser(user);
+ aCase.setHourOfDay(23);
+ rules.process(aCase);
+ }
+
+ public void process(Case aCase) {
+ final EngineFactory engineFactory = new RulesEngineFactory(getClass().getClassLoader()
+ .getResource("openltablets/HelloUser.xls"), IRule.class);
+ instance = engineFactory.newEngineInstance();
+ instance.helloUser(aCase, new Response());
+ }
+}
diff --git a/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/Response.java b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/Response.java
new file mode 100644
index 0000000000..27fa634866
--- /dev/null
+++ b/rule-engines/openl-tablets/src/main/java/com/baeldung/openltablets/rules/Response.java
@@ -0,0 +1,24 @@
+package com.baeldung.openltablets.rules;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Response {
+ private String result;
+ private Map map = new HashMap<>();
+
+ public Response() { }
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(final String s) {
+ result = s;
+ }
+
+ public Map getMap() {
+ return map;
+ }
+
+}
diff --git a/rule-engines/openl-tablets/src/main/resources/openltablets/HelloUser.xls b/rule-engines/openl-tablets/src/main/resources/openltablets/HelloUser.xls
new file mode 100644
index 0000000000..1e85d0ce2d
Binary files /dev/null and b/rule-engines/openl-tablets/src/main/resources/openltablets/HelloUser.xls differ
diff --git a/rule-engines/rulebook/pom.xml b/rule-engines/rulebook/pom.xml
new file mode 100644
index 0000000000..711bee8c91
--- /dev/null
+++ b/rule-engines/rulebook/pom.xml
@@ -0,0 +1,24 @@
+
+ 4.0.0
+
+ com.baeldung.rulebook
+ rulebook
+ 1.0
+
+ rulebook
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.deliveredtechnologies
+ rulebook-core
+ 0.6.2
+
+
+
\ No newline at end of file
diff --git a/rule-engines/rulebook/src/main/java/com/baeldung/rulebook/HelloWorldRule.java b/rule-engines/rulebook/src/main/java/com/baeldung/rulebook/HelloWorldRule.java
new file mode 100644
index 0000000000..c09772a3c6
--- /dev/null
+++ b/rule-engines/rulebook/src/main/java/com/baeldung/rulebook/HelloWorldRule.java
@@ -0,0 +1,17 @@
+package com.baeldung.rulebook;
+
+import com.deliveredtechnologies.rulebook.lang.RuleBookBuilder;
+import com.deliveredtechnologies.rulebook.model.RuleBook;
+
+public class HelloWorldRule {
+ public RuleBook