diff --git a/apache-commons-math/pom.xml b/apache-commons-math/pom.xml
new file mode 100644
index 0000000000..98c6953120
--- /dev/null
+++ b/apache-commons-math/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ apache-commons-math
+ 1.0-SNAPSHOT
+
+
+ 3.6.0
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ org.apache.commons
+ commons-math3
+ 3.6.1
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
\ No newline at end of file
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/ComplexTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/ComplexTests.java
new file mode 100644
index 0000000000..2e5074453e
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/ComplexTests.java
@@ -0,0 +1,20 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.complex.Complex;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ComplexTests {
+
+ @Test
+ public void whenComplexPow_thenCorrect() {
+ Complex first = new Complex(1.0, 3.0);
+ Complex second = new Complex(2.0, 5.0);
+
+ Complex power = first.pow(second);
+
+ Assert.assertEquals(-0.007563724861696302, power.getReal(), 1e-7);
+ Assert.assertEquals(0.01786136835085382, power.getImaginary(), 1e-7);
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/FractionTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/FractionTests.java
new file mode 100644
index 0000000000..6efef79b23
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/FractionTests.java
@@ -0,0 +1,20 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.fraction.Fraction;
+import org.apache.commons.math3.fraction.FractionFormat;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class FractionTests {
+
+ @Test
+ public void whenFractionAdd_thenCorrect() {
+ Fraction lhs = new Fraction(1, 3);
+ Fraction rhs = new Fraction(2, 5);
+ Fraction sum = lhs.add(rhs);
+
+ Assert.assertEquals(11, sum.getNumerator());
+ Assert.assertEquals(15, sum.getDenominator());
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/GeometryTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/GeometryTests.java
new file mode 100644
index 0000000000..17cbb607d6
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/GeometryTests.java
@@ -0,0 +1,21 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.geometry.euclidean.twod.Line;
+import org.apache.commons.math3.geometry.euclidean.twod.Vector2D;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GeometryTests {
+
+ @Test
+ public void whenLineIntersection_thenCorrect() {
+ Line l1 = new Line(new Vector2D(0, 0), new Vector2D(1, 1), 0);
+ Line l2 = new Line(new Vector2D(0, 1), new Vector2D(1, 1.5), 0);
+
+ Vector2D intersection = l1.intersection(l2);
+
+ Assert.assertEquals(2, intersection.getX(), 1e-7);
+ Assert.assertEquals(2, intersection.getY(), 1e-7);
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/IntegrationTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/IntegrationTests.java
new file mode 100644
index 0000000000..62ae898fa8
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/IntegrationTests.java
@@ -0,0 +1,21 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.analysis.UnivariateFunction;
+import org.apache.commons.math3.analysis.integration.SimpsonIntegrator;
+import org.apache.commons.math3.analysis.integration.UnivariateIntegrator;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IntegrationTests {
+
+ @Test
+ public void whenUnivariateIntegratorIntegrate_thenCorrect() {
+ final UnivariateFunction function = v -> v;
+ final UnivariateIntegrator integrator = new SimpsonIntegrator(1.0e-12, 1.0e-8, 1, 32);
+
+ final double i = integrator.integrate(100, function, 0, 10);
+
+ Assert.assertEquals(16 + 2d/3d, i, 1e-7);
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java
new file mode 100644
index 0000000000..981f839280
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java
@@ -0,0 +1,25 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.linear.*;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LinearAlgebraTests {
+
+ @Test
+ public void whenDecompositionSolverSolve_thenCorrect() {
+ RealMatrix a =
+ new Array2DRowRealMatrix(new double[][] { { 2, 3, -2 }, { -1, 7, 6 }, { 4, -3, -5 } },
+ false);
+ RealVector b = new ArrayRealVector(new double[] { 1, -2, 1 }, false);
+
+ DecompositionSolver solver = new LUDecomposition(a).getSolver();
+
+ RealVector solution = solver.solve(b);
+
+ Assert.assertEquals(-0.3698630137, solution.getEntry(0), 1e-7);
+ Assert.assertEquals(0.1780821918, solution.getEntry(1), 1e-7);
+ Assert.assertEquals(-0.602739726, solution.getEntry(2), 1e-7);
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java
new file mode 100644
index 0000000000..41ccb16c5a
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java
@@ -0,0 +1,15 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.distribution.NormalDistribution;
+import org.junit.Test;
+
+public class ProbabilitiesTests {
+
+ @Test
+ public void whenNormalDistributionSample_thenSuccess() {
+ final NormalDistribution normalDistribution = new NormalDistribution(10, 3);
+
+ System.out.println(normalDistribution.sample());
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/RootFindingTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/RootFindingTests.java
new file mode 100644
index 0000000000..3e6b542c01
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/RootFindingTests.java
@@ -0,0 +1,20 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.analysis.UnivariateFunction;
+import org.apache.commons.math3.analysis.solvers.BracketingNthOrderBrentSolver;
+import org.apache.commons.math3.analysis.solvers.UnivariateSolver;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RootFindingTests {
+
+ @Test
+ public void whenUnivariateSolverSolver_thenCorrect() {
+ final UnivariateFunction function = v -> Math.pow(v, 2) - 2;
+ UnivariateSolver solver = new BracketingNthOrderBrentSolver(1.0e-12, 1.0e-8, 5);
+ double c = solver.solve(100, function, -10.0, 10.0, 0);
+
+ Assert.assertEquals(-Math.sqrt(2), c, 1e-7);
+ }
+
+}
diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/StatisticsTests.java b/apache-commons-math/src/test/java/com/baeldung/commons/math/StatisticsTests.java
new file mode 100644
index 0000000000..c1b0619b11
--- /dev/null
+++ b/apache-commons-math/src/test/java/com/baeldung/commons/math/StatisticsTests.java
@@ -0,0 +1,38 @@
+package com.baeldung.commons.math;
+
+import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StatisticsTests {
+
+ private double[] values;
+ private DescriptiveStatistics descriptiveStatistics;
+
+ @Before
+ public void setUp() {
+ values = new double[] {65, 51 , 16, 11 , 6519, 191 ,0 , 98, 19854, 1, 32};
+
+ descriptiveStatistics = new DescriptiveStatistics();
+ for(double v : values) {
+ descriptiveStatistics.addValue(v);
+ }
+ }
+
+ @Test
+ public void whenDescriptiveStatisticsGetMean_thenCorrect() {
+ Assert.assertEquals(2439.8181818181815, descriptiveStatistics.getMean(), 1e-7);
+ }
+
+ @Test
+ public void whenDescriptiveStatisticsGetMedian_thenCorrect() {
+ Assert.assertEquals(51, descriptiveStatistics.getPercentile(50), 1e-7);
+ }
+
+ @Test
+ public void whenDescriptiveStatisticsGetStandardDeviation_thenCorrect() {
+ Assert.assertEquals(6093.054649651221, descriptiveStatistics.getStandardDeviation(), 1e-7);
+ }
+
+}
diff --git a/apache-fop/src/main/resources/logback.xml b/apache-fop/src/main/resources/logback.xml
index 62d0ea5037..ec0dc2469a 100644
--- a/apache-fop/src/main/resources/logback.xml
+++ b/apache-fop/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,10 +7,13 @@
-
+
+
+
+
+
-
\ No newline at end of file
diff --git a/apache-velocity/src/main/resources/logback.xml b/apache-velocity/src/main/resources/logback.xml
index 70a420a57a..ec0dc2469a 100644
--- a/apache-velocity/src/main/resources/logback.xml
+++ b/apache-velocity/src/main/resources/logback.xml
@@ -1,23 +1,19 @@
-
-
-
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/aspectj/pom.xml b/aspectj/pom.xml
index 90b527c14f..cbc98dac81 100644
--- a/aspectj/pom.xml
+++ b/aspectj/pom.xml
@@ -70,11 +70,6 @@
spring-aop
4.3.4.RELEASE
-
- log4j
- log4j
- 1.2.17
-
diff --git a/aspectj/src/main/resources/log4j.properties b/aspectj/src/main/resources/log4j.properties
deleted file mode 100644
index 9e2afcd5b0..0000000000
--- a/aspectj/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-log4j.rootLogger=TRACE, stdout
-
-# Redirect log messages to console
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-
-log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE, stdout
-log4j.logger.com.baeldung.performancemonitor.MyPerformanceMonitorInterceptor=INFO, stdout
\ No newline at end of file
diff --git a/aspectj/src/main/resources/logback.xml b/aspectj/src/main/resources/logback.xml
index 8b566286b8..ec0dc2469a 100644
--- a/aspectj/src/main/resources/logback.xml
+++ b/aspectj/src/main/resources/logback.xml
@@ -1,18 +1,19 @@
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n
-
-
+
+
-
-
-
+
+
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/core-java-9/src/main/resources/logback.xml b/core-java-9/src/main/resources/logback.xml
index eefdc7a337..ec0dc2469a 100644
--- a/core-java-9/src/main/resources/logback.xml
+++ b/core-java-9/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,10 +7,13 @@
-
+
+
+
+
+
-
+
-
\ No newline at end of file
diff --git a/core-java/README.md b/core-java/README.md
index a7c8b0e855..45695f13f6 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -91,4 +91,4 @@
- [Avoiding ConcurrentModificationException when iterating and removing](http://www.baeldung.com/avoiding-concurrentmodificationexception-when-iterating-and-removing)
- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list)
- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list)
-
+- [An Introduction to ThreadLocal in Java](http://www.baeldung.com/java-threadlocal)
diff --git a/core-java/src/main/java/com/baeldung/logforging/LogForgingDemo.java b/core-java/src/main/java/com/baeldung/logforging/LogForgingDemo.java
index 84c069a746..0a9a5df850 100644
--- a/core-java/src/main/java/com/baeldung/logforging/LogForgingDemo.java
+++ b/core-java/src/main/java/com/baeldung/logforging/LogForgingDemo.java
@@ -14,9 +14,9 @@ public class LogForgingDemo {
public static void main(String[] args) {
LogForgingDemo demo = new LogForgingDemo();
- demo.addLog(String.valueOf(300));
- demo.addLog(String.valueOf(300 + "\n\nweb - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully"));
- demo.addLog(String.valueOf(encode(300 + "\n\nweb - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully")));
+ demo.addLog("300");
+ demo.addLog("300 \n\nweb - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully");
+ demo.addLog(encode("300 \n\nweb - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully"));
}
public static String encode(String message) {
diff --git a/core-java/src/main/resources/logback.xml b/core-java/src/main/resources/logback.xml
index 62d0ea5037..ec0dc2469a 100644
--- a/core-java/src/main/resources/logback.xml
+++ b/core-java/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,10 +7,13 @@
-
+
+
+
+
+
-
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/unsafe/CASCounter.java b/core-java/src/test/java/com/baeldung/unsafe/CASCounter.java
new file mode 100644
index 0000000000..f7f3b340c2
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/unsafe/CASCounter.java
@@ -0,0 +1,33 @@
+package com.baeldung.unsafe;
+
+import sun.misc.Unsafe;
+
+import java.lang.reflect.Field;
+
+class CASCounter {
+ private final Unsafe unsafe;
+ private volatile long counter = 0;
+ private long offset;
+
+ private Unsafe getUnsafe() throws IllegalAccessException, NoSuchFieldException {
+ Field f = Unsafe.class.getDeclaredField("theUnsafe");
+ f.setAccessible(true);
+ return (Unsafe) f.get(null);
+ }
+
+ public CASCounter() throws Exception {
+ unsafe = getUnsafe();
+ offset = unsafe.objectFieldOffset(CASCounter.class.getDeclaredField("counter"));
+ }
+
+ public void increment() {
+ long before = counter;
+ while (!unsafe.compareAndSwapLong(this, offset, before, before + 1)) {
+ before = counter;
+ }
+ }
+
+ public long getCounter() {
+ return counter;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java b/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java
new file mode 100644
index 0000000000..f5cab88f3d
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java
@@ -0,0 +1,39 @@
+package com.baeldung.unsafe;
+
+import sun.misc.Unsafe;
+
+import java.lang.reflect.Field;
+
+class OffHeapArray {
+ private final static int BYTE = 1;
+ private long size;
+ private long address;
+
+ private Unsafe getUnsafe() throws IllegalAccessException, NoSuchFieldException {
+ Field f = Unsafe.class.getDeclaredField("theUnsafe");
+ f.setAccessible(true);
+ return (Unsafe) f.get(null);
+ }
+
+ public OffHeapArray(long size) throws NoSuchFieldException, IllegalAccessException {
+ this.size = size;
+ address = getUnsafe().allocateMemory(size * BYTE);
+ }
+
+ public void set(long i, byte value) throws NoSuchFieldException, IllegalAccessException {
+ getUnsafe().putByte(address + i * BYTE, value);
+ }
+
+ public int get(long idx) throws NoSuchFieldException, IllegalAccessException {
+ return getUnsafe().getByte(address + idx * BYTE);
+ }
+
+ public long size() {
+ return size;
+ }
+
+ public void freeMemory() throws NoSuchFieldException, IllegalAccessException {
+ getUnsafe().freeMemory(address);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/unsafe/UnsafeTest.java b/core-java/src/test/java/com/baeldung/unsafe/UnsafeTest.java
new file mode 100644
index 0000000000..9f53e38969
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/unsafe/UnsafeTest.java
@@ -0,0 +1,123 @@
+package com.baeldung.unsafe;
+
+import org.junit.Before;
+import org.junit.Test;
+import sun.misc.Unsafe;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.TestCase.assertEquals;
+
+public class UnsafeTest {
+
+ private Unsafe unsafe;
+
+ @Before
+ public void setup() throws NoSuchFieldException, IllegalAccessException {
+ Field f = Unsafe.class.getDeclaredField("theUnsafe");
+ f.setAccessible(true);
+ unsafe = (Unsafe) f.get(null);
+ }
+
+
+ @Test
+ public void givenClass_whenInitializeIt_thenShouldHaveDifferentStateWhenUseUnsafe() throws IllegalAccessException, InstantiationException {
+ //when
+ InitializationOrdering o1 = new InitializationOrdering();
+ assertEquals(o1.getA(), 1);
+
+ //when
+ InitializationOrdering o3 = (InitializationOrdering) unsafe.allocateInstance(InitializationOrdering.class);
+ assertEquals(o3.getA(), 0);
+ }
+
+ @Test
+ public void givenPrivateMethod_whenUsingUnsafe_thenCanModifyPrivateField() throws NoSuchFieldException {
+ //given
+ SecretHolder secretHolder = new SecretHolder();
+
+ //when
+ Field f = secretHolder.getClass().getDeclaredField("SECRET_VALUE");
+ unsafe.putInt(secretHolder, unsafe.objectFieldOffset(f), 1);
+
+ //then
+ assertTrue(secretHolder.secretIsDisclosed());
+ }
+
+ @Test(expected = IOException.class)
+ public void givenUnsafeThrowException_whenThrowCheckedException_thenNotNeedToCatchIt() {
+ unsafe.throwException(new IOException());
+ }
+
+ @Test
+ public void givenArrayBiggerThatMaxInt_whenAllocateItOffHeapMemory_thenSuccess() throws NoSuchFieldException, IllegalAccessException {
+ //given
+ long SUPER_SIZE = (long) Integer.MAX_VALUE * 2;
+ OffHeapArray array = new OffHeapArray(SUPER_SIZE);
+
+ //when
+ int sum = 0;
+ for (int i = 0; i < 100; i++) {
+ array.set((long) Integer.MAX_VALUE + i, (byte) 3);
+ sum += array.get((long) Integer.MAX_VALUE + i);
+ }
+
+ long arraySize = array.size();
+
+ array.freeMemory();
+
+ //then
+ assertEquals(arraySize, SUPER_SIZE);
+ assertEquals(sum, 300);
+
+ }
+
+ @Test
+ public void givenUnsafeCompareAndSwap_whenUseIt_thenCounterYildCorrectLockFreeResults() throws Exception {
+ //given
+ int NUM_OF_THREADS = 1_000;
+ int NUM_OF_INCREMENTS = 10_000;
+ ExecutorService service = Executors.newFixedThreadPool(NUM_OF_THREADS);
+ CASCounter casCounter = new CASCounter();
+
+ //when
+ IntStream.rangeClosed(0, NUM_OF_THREADS - 1)
+ .forEach(i -> service.submit(() -> IntStream
+ .rangeClosed(0, NUM_OF_INCREMENTS - 1)
+ .forEach(j -> casCounter.increment())));
+
+ service.shutdown();
+ service.awaitTermination(1, TimeUnit.MINUTES);
+
+ //then
+ assertEquals(NUM_OF_INCREMENTS * NUM_OF_THREADS, casCounter.getCounter());
+
+ }
+
+ class InitializationOrdering {
+ private long a;
+
+ public InitializationOrdering() {
+ this.a = 1;
+ }
+
+ public long getA() {
+ return this.a;
+ }
+ }
+
+ class SecretHolder {
+ private int SECRET_VALUE = 0;
+
+ public boolean secretIsDisclosed() {
+ return SECRET_VALUE == 1;
+ }
+ }
+
+}
diff --git a/couchbase-sdk/src/main/resources/logback.xml b/couchbase-sdk/src/main/resources/logback.xml
index efcc6fb4c7..ec0dc2469a 100644
--- a/couchbase-sdk/src/main/resources/logback.xml
+++ b/couchbase-sdk/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -8,10 +8,12 @@
-
+
+
+
+
-
\ No newline at end of file
diff --git a/couchbase-sdk/src/test/resources/logback.xml b/couchbase-sdk/src/test/resources/logback.xml
index efcc6fb4c7..ec0dc2469a 100644
--- a/couchbase-sdk/src/test/resources/logback.xml
+++ b/couchbase-sdk/src/test/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -8,10 +8,12 @@
-
+
+
+
+
-
\ No newline at end of file
diff --git a/gson/src/main/resources/logback.xml b/gson/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/gson/src/main/resources/logback.xml
+++ b/gson/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/guava/src/main/resources/logback.xml b/guava/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/guava/src/main/resources/logback.xml
+++ b/guava/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/handling-spring-static-resources/src/main/resources/logback.xml b/handling-spring-static-resources/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/handling-spring-static-resources/src/main/resources/logback.xml
+++ b/handling-spring-static-resources/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/hazelcast/src/main/resources/logback.xml b/hazelcast/src/main/resources/logback.xml
index 8b566286b8..ec0dc2469a 100644
--- a/hazelcast/src/main/resources/logback.xml
+++ b/hazelcast/src/main/resources/logback.xml
@@ -1,18 +1,19 @@
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n
-
-
+
+
-
-
-
+
+
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/httpclient/src/main/resources/logback.xml b/httpclient/src/main/resources/logback.xml
index aa1e9cd522..ec0dc2469a 100644
--- a/httpclient/src/main/resources/logback.xml
+++ b/httpclient/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,11 +7,13 @@
-
-
+
+
+
+
+
-
\ No newline at end of file
diff --git a/jackson/src/main/resources/logback.xml b/jackson/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/jackson/src/main/resources/logback.xml
+++ b/jackson/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/jaxb/src/main/resources/logback.xml b/jaxb/src/main/resources/logback.xml
index 8b566286b8..ec0dc2469a 100644
--- a/jaxb/src/main/resources/logback.xml
+++ b/jaxb/src/main/resources/logback.xml
@@ -1,18 +1,19 @@
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n
-
-
+
+
-
-
-
+
+
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/jsf/src/main/resources/logback.xml b/jsf/src/main/resources/logback.xml
index e9ae1894a6..ec0dc2469a 100644
--- a/jsf/src/main/resources/logback.xml
+++ b/jsf/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,8 +7,13 @@
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt
new file mode 100644
index 0000000000..b189d0f483
--- /dev/null
+++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt
@@ -0,0 +1,143 @@
+package com.baeldung.kotlin
+
+import org.junit.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+class GenericsTest {
+
+ @Test
+ fun givenParametrizeClass_whenInitializeItWithSpecificType_thenShouldBeParameterized() {
+ //given
+ val parameterizedClass = ParameterizedClass("string-value")
+
+ //when
+ val res = parameterizedClass.getValue()
+
+ //then
+ assertTrue(res is String)
+ }
+
+ @Test
+ fun givenParametrizeClass_whenInitializeIt_thenShouldBeParameterizedByInferredType() {
+ //given
+ val parameterizedClass = ParameterizedClass("string-value")
+
+ //when
+ val res = parameterizedClass.getValue()
+
+ //then
+ assertTrue(res is String)
+ }
+
+ @Test
+ fun givenParameterizedProducerByOutKeyword_whenGetValue_thenCanAssignItToSuperType() {
+ //given
+ val parameterizedProducer = ParameterizedProducer("string")
+
+ //when
+ val ref: ParameterizedProducer = parameterizedProducer
+
+ //then
+ assertTrue(ref is ParameterizedProducer)
+ }
+
+ @Test
+ fun givenParameterizedConsumerByInKeyword_whenGetValue_thenCanAssignItToSubType() {
+ //given
+ val parameterizedConsumer = ParameterizedConsumer()
+
+ //when
+ val ref: ParameterizedConsumer = parameterizedConsumer
+
+ //then
+ assertTrue(ref is ParameterizedConsumer)
+ }
+
+ @Test
+ fun givenTypeProjections_whenOperateOnTwoList_thenCanAcceptListOfSubtypes() {
+ //given
+ val ints: Array = arrayOf(1, 2, 3)
+ val any: Array = arrayOfNulls(3)
+
+ //when
+ copy(ints, any)
+
+ //then
+ assertEquals(any[0], 1)
+ assertEquals(any[1], 2)
+ assertEquals(any[2], 3)
+
+ }
+
+ fun copy(from: Array, to: Array) {
+ assert(from.size == to.size)
+ for (i in from.indices)
+ to[i] = from[i]
+ }
+
+ @Test
+ fun givenTypeProjection_whenHaveArrayOfIn_thenShouldAddElementsOfSubtypesToIt() {
+ //given
+ val objects: Array = arrayOfNulls(1)
+
+ //when
+ fill(objects, 1)
+
+ //then
+ assertEquals(objects[0], 1)
+ }
+
+ fun fill(dest: Array, value: Int) {
+ dest[0] = value
+ }
+
+ @Test
+ fun givenStartProjection_whenPassAnyType_thenCompile() {
+ //given
+ val array = arrayOf(1,2,3)
+
+ //then
+ printArray(array)
+
+ }
+
+ fun printArray(array: Array<*>) {
+ array.forEach { println(it) }
+ }
+
+ @Test
+ fun givenFunctionWithDefinedGenericConstraints_whenCallWithProperType_thenCompile(){
+ //given
+ val listOfInts = listOf(5,2,3,4,1)
+
+ //when
+ val sorted = sort(listOfInts)
+
+ //then
+ assertEquals(sorted, listOf(1,2,3,4,5))
+ }
+
+ fun > sort(list: List): List{
+ return list.sorted()
+ }
+
+ class ParameterizedClass(private val value: A) {
+
+ fun getValue(): A {
+ return value
+ }
+ }
+
+ class ParameterizedProducer(private val value: T) {
+ fun get(): T {
+ return value
+ }
+ }
+
+ class ParameterizedConsumer {
+ fun toString(value: T): String {
+ return value.toString()
+ }
+ }
+}
diff --git a/libraries/README.md b/libraries/README.md
index 7d95caa6b1..8a32a8b0e7 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -5,7 +5,8 @@
- [String Processing with Apache Commons Lang 3](http://www.baeldung.com/string-processing-commons-lang)
- [Introduction to Javatuples](http://www.baeldung.com/java-tuples)
- [Introduction to Javassist](http://www.baeldung.com/javassist)
-- [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded)
+- [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded)
+- [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink)
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/mockito/src/main/resources/logback.xml b/mockito/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/mockito/src/main/resources/logback.xml
+++ b/mockito/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java b/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java
index 588707383b..e96a4837db 100644
--- a/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java
+++ b/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java
@@ -4,21 +4,18 @@ import com.baeldung.mybatis.model.Address;
import com.baeldung.mybatis.model.Person;
import org.apache.ibatis.annotations.*;
-
public interface AddressMapper {
- @Insert("Insert into address (streetAddress,personId) values(#{streetAddress},#{personId})")
- @Options(useGeneratedKeys = true,flushCache=true )
- public Integer saveAddress(Address address);
+ @Insert("Insert into address (streetAddress,personId) values(#{streetAddress},#{personId})")
+ @Options(useGeneratedKeys = true, flushCache = true)
+ public Integer saveAddress(Address address);
- @Select("SELECT addressId, streetAddress FROM Address WHERE addressId = #{addressId}")
- @Results(value = {
- @Result(property = "addressId", column = "addressId"),
- @Result(property = "streetAddress", column = "streetAddress"),
- @Result(property = "person", column = "personId",javaType =Person.class,one=@One(select = "getPerson"))
- })
- Address getAddresses(Integer addressID);
+ @Select("SELECT addressId, streetAddress FROM Address WHERE addressId = #{addressId}")
+ @Results(value = { @Result(property = "addressId", column = "addressId"),
+ @Result(property = "streetAddress", column = "streetAddress"),
+ @Result(property = "person", column = "personId", javaType = Person.class, one = @One(select = "getPerson")) })
+ Address getAddresses(Integer addressID);
- @Select("SELECT personId FROM address WHERE addressId = #{addressId})")
- Person getPerson(Integer personId);
+ @Select("SELECT personId FROM address WHERE addressId = #{addressId})")
+ Person getPerson(Integer personId);
}
diff --git a/mybatis/src/main/java/com/baeldung/mybatis/mapper/PersonMapper.java b/mybatis/src/main/java/com/baeldung/mybatis/mapper/PersonMapper.java
index ab207325ad..7021777ed1 100644
--- a/mybatis/src/main/java/com/baeldung/mybatis/mapper/PersonMapper.java
+++ b/mybatis/src/main/java/com/baeldung/mybatis/mapper/PersonMapper.java
@@ -9,44 +9,39 @@ import org.apache.ibatis.mapping.StatementType;
import java.util.List;
import java.util.Map;
-
public interface PersonMapper {
- @Insert("Insert into person(name) values (#{name})")
- public Integer save(Person person);
+ @Insert("Insert into person(name) values (#{name})")
+ public Integer save(Person person);
- @Update("Update Person set name= #{name} where personId=#{personId}")
- public void updatePerson(Person person);
+ @Update("Update Person set name= #{name} where personId=#{personId}")
+ public void updatePerson(Person person);
- @Delete("Delete from Person where personId=#{personId}")
- public void deletePersonById(Integer personId);
+ @Delete("Delete from Person where personId=#{personId}")
+ public void deletePersonById(Integer personId);
- @Select("SELECT person.personId, person.name FROM person WHERE person.personId = #{personId}")
- Person getPerson(Integer personId);
+ @Select("SELECT person.personId, person.name FROM person WHERE person.personId = #{personId}")
+ Person getPerson(Integer personId);
- @Select("Select personId,name from Person where personId=#{personId}")
- @Results(value ={
- @Result(property = "personId", column = "personId"),
- @Result(property="name", column = "name"),
- @Result(property = "addresses",javaType = List.class,column = "personId",
- many=@Many(select = "getAddresses"))
+ @Select("Select personId,name from Person where personId=#{personId}")
+ @Results(value = { @Result(property = "personId", column = "personId"), @Result(property = "name", column = "name"),
+ @Result(property = "addresses", javaType = List.class, column = "personId", many = @Many(select = "getAddresses"))
- })
- public Person getPersonById(Integer personId);
+ })
+ public Person getPersonById(Integer personId);
- @Select("select addressId,streetAddress,personId from address where personId=#{personId}")
- public Address getAddresses(Integer personId);
+ @Select("select addressId,streetAddress,personId from address where personId=#{personId}")
+ public Address getAddresses(Integer personId);
- @Select("select * from Person ")
- @MapKey("personId")
- Map getAllPerson();
+ @Select("select * from Person ")
+ @MapKey("personId")
+ Map getAllPerson();
- @SelectProvider(type=MyBatisUtil.class,method="getPersonByName")
- public Person getPersonByName(String name);
+ @SelectProvider(type = MyBatisUtil.class, method = "getPersonByName")
+ public Person getPersonByName(String name);
-
- @Select(value= "{ CALL getPersonByProc( #{personId, mode=IN, jdbcType=INTEGER})}")
- @Options(statementType = StatementType.CALLABLE)
- public Person getPersonByProc(Integer personId);
+ @Select(value = "{ CALL getPersonByProc( #{personId, mode=IN, jdbcType=INTEGER})}")
+ @Options(statementType = StatementType.CALLABLE)
+ public Person getPersonByProc(Integer personId);
}
diff --git a/mybatis/src/main/java/com/baeldung/mybatis/model/Address.java b/mybatis/src/main/java/com/baeldung/mybatis/model/Address.java
index f32e47aef2..ea9a91c666 100644
--- a/mybatis/src/main/java/com/baeldung/mybatis/model/Address.java
+++ b/mybatis/src/main/java/com/baeldung/mybatis/model/Address.java
@@ -1,49 +1,46 @@
package com.baeldung.mybatis.model;
-
public class Address {
- private Integer addressId;
- private String streetAddress;
- private Integer personId;
+ private Integer addressId;
+ private String streetAddress;
+ private Integer personId;
- public Address() {
- }
+ public Address() {
+ }
- public Integer getPersonId() {
- return personId;
- }
+ public Integer getPersonId() {
+ return personId;
+ }
- public void setPersonId(Integer personId) {
- this.personId = personId;
- }
+ public void setPersonId(Integer personId) {
+ this.personId = personId;
+ }
+ public Address(String streetAddress) {
+ this.streetAddress = streetAddress;
+ }
+ public Person getPerson() {
+ return person;
+ }
- public Address(String streetAddress) {
- this.streetAddress =streetAddress;
- }
+ public void setPerson(Person person) {
+ this.person = person;
+ }
- public Person getPerson() {
- return person;
- }
+ private Person person;
- public void setPerson(Person person) {
- this.person = person;
- }
+ public Address(int i, String name) {
+ this.streetAddress = name;
+ }
- private Person person;
+ public Integer getAddressId() {
+ return addressId;
+ }
- public Address(int i, String name) {
- this.streetAddress = name;
- }
-
- public Integer getAddressId() {
- return addressId;
- }
-
- public String getStreetAddress() {
- return streetAddress;
- }
+ public String getStreetAddress() {
+ return streetAddress;
+ }
}
diff --git a/mybatis/src/main/java/com/baeldung/mybatis/model/Person.java b/mybatis/src/main/java/com/baeldung/mybatis/model/Person.java
index 248e3ca7a1..2de08a9f7c 100644
--- a/mybatis/src/main/java/com/baeldung/mybatis/model/Person.java
+++ b/mybatis/src/main/java/com/baeldung/mybatis/model/Person.java
@@ -3,38 +3,38 @@ package com.baeldung.mybatis.model;
import java.util.ArrayList;
import java.util.List;
-
public class Person {
- private Integer personId;
- private String name;
- private List addresses;
+ private Integer personId;
+ private String name;
+ private List addresses;
- public Person() {
- }
+ public Person() {
+ }
- public Person(Integer personId, String name) {
- this.personId=personId;
- this.name = name;
- addresses = new ArrayList();
- }
+ public Person(Integer personId, String name) {
+ this.personId = personId;
+ this.name = name;
+ addresses = new ArrayList();
+ }
- public Person(String name) {
- this.name=name;
- }
+ public Person(String name) {
+ this.name = name;
+ }
- public Integer getPersonId() {
- return personId;
- }
+ public Integer getPersonId() {
+ return personId;
+ }
- public String getName() {
- return name;
- }
- public void addAddress(Address address){
- addresses.add(address);
- }
+ public String getName() {
+ return name;
+ }
- public List getAddresses() {
- return addresses;
- }
+ public void addAddress(Address address) {
+ addresses.add(address);
+ }
+
+ public List getAddresses() {
+ return addresses;
+ }
}
diff --git a/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java b/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java
index a045e70333..fb8e15245a 100644
--- a/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java
+++ b/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java
@@ -1,33 +1,50 @@
package com.baeldung.mybatis.utils;
+
+import com.baeldung.mybatis.mapper.AddressMapper;
+import com.baeldung.mybatis.mapper.PersonMapper;
+import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.SQL;
+import org.apache.ibatis.mapping.Environment;
+import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
+import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
+import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
- private static SqlSessionFactory sqlSessionFactory;
- static {
- String resource = "mybatis-config.xml";
- InputStream inputStream;
- try {
- inputStream = Resources.getResourceAsStream(resource);
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static SqlSessionFactory getSqlSessionFactory(){
- return sqlSessionFactory;
- }
+ public static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
+ public static final String URL = "jdbc:derby:testdb1;create=true";
+ public static final String USERNAME = "sa";
+ public static final String PASSWORD = "pass123";
+ private static SqlSessionFactory sqlSessionFactory;
- public String getPersonByName(String name){
- return new SQL(){{
- SELECT("*");
- FROM("person");
- WHERE("name like #{name} || '%'");
- }}.toString();
- }
+ public static SqlSessionFactory buildqlSessionFactory() {
+ DataSource dataSource = new PooledDataSource(DRIVER, URL, USERNAME, PASSWORD);
+ Environment environment = new Environment("Development", new JdbcTransactionFactory(), dataSource);
+ Configuration configuration = new Configuration(environment);
+ configuration.addMapper(PersonMapper.class);
+ configuration.addMapper(AddressMapper.class);
+ SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
+ SqlSessionFactory factory = builder.build(configuration);
+ return factory;
+
+ }
+
+ public static SqlSessionFactory getSqlSessionFactory() {
+ return sqlSessionFactory;
+ }
+
+ public String getPersonByName(String name) {
+ return new SQL() {
+ {
+ SELECT("*");
+ FROM("person");
+ WHERE("name like #{name} || '%'");
+ }
+ }.toString();
+ }
}
diff --git a/mybatis/src/main/resources/mybatis-config.xml b/mybatis/src/main/resources/mybatis-config.xml
deleted file mode 100644
index 6987797068..0000000000
--- a/mybatis/src/main/resources/mybatis-config.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java b/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java
index 8724aaa545..8dbf7d2589 100644
--- a/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java
+++ b/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java
@@ -18,132 +18,128 @@ import static junit.framework.TestCase.assertEquals;
public class PersonMapperTest {
- SqlSession session;
+ SqlSession session;
- @Before
- public void setup() throws SQLException {
+ @Before
+ public void setup() throws SQLException {
- session = MyBatisUtil.getSqlSessionFactory().openSession();
- createTables(session);
+ session = MyBatisUtil.buildqlSessionFactory().openSession();
+ createTables(session);
- }
+ }
- private void createTables(SqlSession session) throws SQLException {
+ private void createTables(SqlSession session) throws SQLException {
- String createPersonTable = "create table person ("
- + "personId integer not null generated always as"
- + " identity (start with 1, increment by 1), "
- + "name varchar(30) not null, "
- + "constraint primary_key_person primary key (personId))";
+ String createPersonTable = "create table person (" + "personId integer not null generated always as"
+ + " identity (start with 1, increment by 1), " + "name varchar(30) not null, "
+ + "constraint primary_key_person primary key (personId))";
- String createAddressTable = "create table address ("
- + "addressId integer not null generated always as"
- + " identity (start with 1, increment by 1), "
- + "streetAddress varchar(300), personId integer, "
- + "constraint primary_key_address primary key (addressId))";
+ String createAddressTable = "create table address (" + "addressId integer not null generated always as"
+ + " identity (start with 1, increment by 1), " + "streetAddress varchar(300), personId integer, "
+ + "constraint primary_key_address primary key (addressId))";
- String alterTable="ALTER TABLE " +
- " address ADD CONSTRAINT fk_person FOREIGN KEY (personId) REFERENCES person (personId)";
+ String alterTable = "ALTER TABLE "
+ + " address ADD CONSTRAINT fk_person FOREIGN KEY (personId) REFERENCES person (personId)";
+ session.getConnection().createStatement().execute(createPersonTable);
+ session.getConnection().createStatement().execute(createAddressTable);
+ session.getConnection().createStatement().execute(alterTable);
- session.getConnection().createStatement().execute(createPersonTable);
- session.getConnection().createStatement().execute(createAddressTable);
- session.getConnection().createStatement().execute(alterTable);
+ }
- }
+ @Test
+ public void whenPersonAdressSaved_ThenPersonAddressCanBeQueried() {
+ Person person = new Person("Baljeet S");
+ Address address = new Address("Pune");
+ PersonMapper personMapper = session.getMapper(PersonMapper.class);
+ Integer id = personMapper.save(person);
+ address.setPersonId(id);
+ AddressMapper addressMapper = session.getMapper(AddressMapper.class);
+ addressMapper.saveAddress(address);
- @Test
- public void whenPersonAdressSaved_ThenPersonAddressCanBeQueried(){
- Person person=new Person("Baljeet S");
- Address address = new Address("Pune");
- PersonMapper personMapper=session.getMapper(PersonMapper.class);
- Integer id =personMapper.save(person);
- address.setPersonId(id);
- AddressMapper addressMapper=session.getMapper(AddressMapper.class);
- addressMapper.saveAddress(address);
+ Person returnedPerson = personMapper.getPersonById(id);
+ assertEquals("Baljeet S", returnedPerson.getName());
+ assertEquals("Pune", returnedPerson.getAddresses().get(0).getStreetAddress());
+ }
- Person returnedPerson= personMapper.getPersonById(id);
- assertEquals("Baljeet S", returnedPerson.getName());
- assertEquals("Pune", returnedPerson.getAddresses().get(0).getStreetAddress());
- }
+ @Test
+ public void whenPersonSaved_ThenPersonCanBeQueried() {
+ Person person = new Person("Baljeet S");
+ Address address = new Address("Pune");
+ PersonMapper personMapper = session.getMapper(PersonMapper.class);
+ Integer id = personMapper.save(person);
+ address.setPersonId(id);
+ AddressMapper addressMapper = session.getMapper(AddressMapper.class);
+ addressMapper.saveAddress(address);
- @Test
- public void whenPersonSaved_ThenPersonCanBeQueried(){
- Person person=new Person("Baljeet S");
- Address address = new Address("Pune");
- PersonMapper personMapper=session.getMapper(PersonMapper.class);
- Integer id =personMapper.save(person);
- address.setPersonId(id);
- AddressMapper addressMapper=session.getMapper(AddressMapper.class);
- addressMapper.saveAddress(address);
+ Person returnedPerson = personMapper.getPerson(id);
+ assertEquals("Baljeet S", returnedPerson.getName());
+ }
- Person returnedPerson= personMapper.getPerson(id);
- assertEquals("Baljeet S", returnedPerson.getName());
- }
+ @Test
+ public void whenPersonUpdated_ThenPersonIsChanged() {
+ Person person = new Person("Baljeet S");
+ Address address = new Address("Pune");
+ PersonMapper personMapper = session.getMapper(PersonMapper.class);
+ Integer id = personMapper.save(person);
+ address.setPersonId(id);
+ AddressMapper addressMapper = session.getMapper(AddressMapper.class);
+ addressMapper.saveAddress(address);
- @Test
- public void whenPersonUpdated_ThenPersonIsChanged(){
- Person person=new Person("Baljeet S");
- Address address = new Address("Pune");
- PersonMapper personMapper=session.getMapper(PersonMapper.class);
- Integer id =personMapper.save(person);
- address.setPersonId(id);
- AddressMapper addressMapper=session.getMapper(AddressMapper.class);
- addressMapper.saveAddress(address);
+ personMapper.updatePerson(new Person(id, "Baljeet1"));
+ Person returnedPerson = personMapper.getPerson(id);
+ assertEquals("Baljeet1", returnedPerson.getName());
+ }
- personMapper.updatePerson(new Person(id,"Baljeet1"));
- Person returnedPerson= personMapper.getPerson(id);
- assertEquals("Baljeet1", returnedPerson.getName());
- }
- @Test
- public void whenPersoSaved_ThenMapIsReturned(){
- Person person=new Person("Baljeet S");
- Address address = new Address("Pune");
- PersonMapper personMapper=session.getMapper(PersonMapper.class);
- Integer id =personMapper.save(person);
- address.setPersonId(id);
- AddressMapper addressMapper=session.getMapper(AddressMapper.class);
- addressMapper.saveAddress(address);
+ @Test
+ public void whenPersoSaved_ThenMapIsReturned() {
+ Person person = new Person("Baljeet S");
+ Address address = new Address("Pune");
+ PersonMapper personMapper = session.getMapper(PersonMapper.class);
+ Integer id = personMapper.save(person);
+ address.setPersonId(id);
+ AddressMapper addressMapper = session.getMapper(AddressMapper.class);
+ addressMapper.saveAddress(address);
- Map returnedPerson= personMapper.getAllPerson();
- assertEquals(1, returnedPerson.size());
- }
+ Map returnedPerson = personMapper.getAllPerson();
+ assertEquals(1, returnedPerson.size());
+ }
- @Test
- public void whenPersonSearched_ThenResultIsReturned(){
- Person person=new Person("Baljeet S");
- Address address = new Address("Pune");
- PersonMapper personMapper=session.getMapper(PersonMapper.class);
- Integer id =personMapper.save(person);
- address.setPersonId(id);
- AddressMapper addressMapper=session.getMapper(AddressMapper.class);
- addressMapper.saveAddress(address);
+ @Test
+ public void whenPersonSearched_ThenResultIsReturned() {
+ Person person = new Person("Baljeet S");
+ Address address = new Address("Pune");
+ PersonMapper personMapper = session.getMapper(PersonMapper.class);
+ Integer id = personMapper.save(person);
+ address.setPersonId(id);
+ AddressMapper addressMapper = session.getMapper(AddressMapper.class);
+ addressMapper.saveAddress(address);
- Person returnedPerson= personMapper.getPersonByName("Baljeet S");
- assertEquals("Baljeet S", returnedPerson.getName());
- }
+ Person returnedPerson = personMapper.getPersonByName("Baljeet S");
+ assertEquals("Baljeet S", returnedPerson.getName());
+ }
- @Test
- public void whenAddressSearched_ThenResultIsReturned(){
- Person person=new Person("Baljeet S");
- Address address = new Address("Pune");
- PersonMapper personMapper=session.getMapper(PersonMapper.class);
- Integer id =personMapper.save(person);
- address.setPersonId(id);
- AddressMapper addressMapper=session.getMapper(AddressMapper.class);
- Integer addressId=addressMapper.saveAddress(address);
- Address returnedAddress=addressMapper.getAddresses(addressId);
+ @Test
+ public void whenAddressSearched_ThenResultIsReturned() {
+ Person person = new Person("Baljeet S");
+ Address address = new Address("Pune");
+ PersonMapper personMapper = session.getMapper(PersonMapper.class);
+ Integer id = personMapper.save(person);
+ address.setPersonId(id);
+ AddressMapper addressMapper = session.getMapper(AddressMapper.class);
+ Integer addressId = addressMapper.saveAddress(address);
+ Address returnedAddress = addressMapper.getAddresses(addressId);
- assertEquals("Pune", returnedAddress.getStreetAddress());
- }
+ assertEquals("Pune", returnedAddress.getStreetAddress());
+ }
- @After
- public void cleanup() throws SQLException {
- session.getConnection().createStatement().execute("drop table address");
- session.getConnection().createStatement().execute("drop table person");
+ @After
+ public void cleanup() throws SQLException {
+ session.getConnection().createStatement().execute("drop table address");
+ session.getConnection().createStatement().execute("drop table person");
- session.close();
+ session.close();
- }
+ }
}
diff --git a/querydsl/src/main/resources/logback.xml b/querydsl/src/main/resources/logback.xml
index d0a1dc06ac..ec0dc2469a 100644
--- a/querydsl/src/main/resources/logback.xml
+++ b/querydsl/src/main/resources/logback.xml
@@ -1,37 +1,19 @@
-
-
- %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p: %c - %m%n
-
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
\ No newline at end of file
diff --git a/rest-assured/pom.xml b/rest-assured/pom.xml
index bbeef8bb9c..2c8039401e 100644
--- a/rest-assured/pom.xml
+++ b/rest-assured/pom.xml
@@ -60,14 +60,15 @@
- log4j
- log4j
- ${log4j.version}
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
- org.slf4j
- slf4j-log4j12
- ${slf4j.version}
+ ch.qos.logback
+ logback-core
+ ${logback.version}
@@ -276,8 +277,9 @@
1.4.7
9.4.0.v20161208
- 1.2.17
1.7.21
+ 1.1.7
+
3.5
1.2
diff --git a/rest-assured/src/test/resources/log4j.properties b/rest-assured/src/test/resources/log4j.properties
deleted file mode 100644
index d3c6b9e783..0000000000
--- a/rest-assured/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-## Logger configure
-datestamp=yyyy-MM-dd HH:mm:ss
-log4j.rootLogger=TRACE, file, console
-
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.maxFileSize=1GB
-log4j.appender.file.maxBackupIndex=5
-log4j.appender.file.File=log/rest-assured.log
-log4j.appender.file.threshold=TRACE
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d{${datestamp}} %5p: [%c] - %m%n
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.Threshold=INFO
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{${datestamp}} %5p\: [%c] - %m%n
\ No newline at end of file
diff --git a/rest-assured/src/test/resources/logback.xml b/rest-assured/src/test/resources/logback.xml
new file mode 100644
index 0000000000..ec0dc2469a
--- /dev/null
+++ b/rest-assured/src/test/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rest-testing/src/main/resources/logback.xml b/rest-testing/src/main/resources/logback.xml
index aa1e9cd522..ec0dc2469a 100644
--- a/rest-testing/src/main/resources/logback.xml
+++ b/rest-testing/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,11 +7,13 @@
-
-
+
+
+
+
+
-
\ No newline at end of file
diff --git a/resteasy/bin/src/main/webapp/WEB-INF/classes/logback.xml b/resteasy/bin/src/main/webapp/WEB-INF/classes/logback.xml
index d94e9f71ab..ec0dc2469a 100644
--- a/resteasy/bin/src/main/webapp/WEB-INF/classes/logback.xml
+++ b/resteasy/bin/src/main/webapp/WEB-INF/classes/logback.xml
@@ -1,3 +1,19 @@
-
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resteasy/src/main/webapp/WEB-INF/classes/logback.xml b/resteasy/src/main/webapp/WEB-INF/classes/logback.xml
index d94e9f71ab..ec0dc2469a 100644
--- a/resteasy/src/main/webapp/WEB-INF/classes/logback.xml
+++ b/resteasy/src/main/webapp/WEB-INF/classes/logback.xml
@@ -1,3 +1,19 @@
-
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-all/src/main/resources/logback.xml b/spring-all/src/main/resources/logback.xml
index 45c9697f77..ec0dc2469a 100644
--- a/spring-all/src/main/resources/logback.xml
+++ b/spring-all/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot/README.MD b/spring-boot/README.MD
index 1874f621b5..bb15ffc8cc 100644
--- a/spring-boot/README.MD
+++ b/spring-boot/README.MD
@@ -17,4 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Guide to Internationalization in Spring Boot](http://www.baeldung.com/spring-boot-internationalization)
- [Create a Custom FailureAnalyzer with Spring Boot](http://www.baeldung.com/spring-boot-failure-analyzer)
- [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source)
-
+- [Dynamic DTO Validation Config Retrieved from DB](http://www.baeldung.com/spring-dynamic-dto-validation)
diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
index 53fb418ad6..81345eac83 100644
--- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
+++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
@@ -1,16 +1,14 @@
package com.baeldung.dynamicvalidation;
-import java.util.regex.Pattern;
-
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
+import com.baeldung.dynamicvalidation.dao.ContactInfoExpressionRepository;
+import com.baeldung.dynamicvalidation.model.ContactInfoExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.thymeleaf.util.StringUtils;
-import com.baeldung.dynamicvalidation.dao.ContactInfoExpressionRepository;
-import com.baeldung.dynamicvalidation.model.ContactInfoExpression;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
public class ContactInfoValidator implements ConstraintValidator {
@@ -26,12 +24,15 @@ public class ContactInfoValidator implements ConstraintValidator Pattern.matches(p, value))
+ .orElse(false);
}
}
diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/Employee.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/Employee.java
new file mode 100644
index 0000000000..a805e8f5fe
--- /dev/null
+++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/Employee.java
@@ -0,0 +1,43 @@
+package org.baeldung.boot.boottest;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.Size;
+
+@Entity
+@Table(name = "person")
+public class Employee {
+
+ public Employee() {
+ }
+
+ public Employee(String name) {
+ this.name = name;
+ }
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @Size(min = 3, max = 20)
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRepository.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRepository.java
new file mode 100644
index 0000000000..fa234f0e3a
--- /dev/null
+++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRepository.java
@@ -0,0 +1,21 @@
+package org.baeldung.boot.boottest;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.transaction.Transactional;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@Transactional
+public interface EmployeeRepository extends JpaRepository {
+
+ public Optional findByName(String name);
+
+ public Optional findById(Long id);
+
+ public List findAll();
+
+}
diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java
new file mode 100644
index 0000000000..8442fc03a3
--- /dev/null
+++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java
@@ -0,0 +1,32 @@
+package org.baeldung.boot.boottest;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api")
+public class EmployeeRestController {
+
+ @Autowired
+ EmployeeService employeeService;
+
+ @RequestMapping(value = "/employees", method = RequestMethod.POST)
+ public ResponseEntity createEmployee(@RequestBody Employee employee) {
+ HttpStatus status = HttpStatus.CREATED;
+ Employee saved = employeeService.save(employee);
+ return new ResponseEntity<>(saved, status);
+ }
+
+ @RequestMapping(value = "/employees", method = RequestMethod.GET)
+ public List getAllEmployees() {
+ return employeeService.getAllEmployees();
+ }
+
+}
diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeService.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeService.java
new file mode 100644
index 0000000000..f0ed49e699
--- /dev/null
+++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeService.java
@@ -0,0 +1,17 @@
+package org.baeldung.boot.boottest;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface EmployeeService {
+
+ public Optional getEmployeeById(Long id);
+
+ public Optional getEmployeeByName(String name);
+
+ public List getAllEmployees();
+
+ public boolean exists(String email);
+
+ public Employee save(Employee employee);
+}
diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java
new file mode 100644
index 0000000000..21936255e0
--- /dev/null
+++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java
@@ -0,0 +1,45 @@
+package org.baeldung.boot.boottest;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.transaction.Transactional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@Transactional
+public class EmployeeServiceImpl implements EmployeeService {
+
+ @Autowired
+ EmployeeRepository employeeRepository;
+
+ @Override
+ public Optional getEmployeeById(Long id) {
+ return employeeRepository.findById(id);
+ }
+
+ @Override
+ public Optional getEmployeeByName(String name) {
+ return employeeRepository.findByName(name);
+ }
+
+ @Override
+ public boolean exists(String name) {
+ if (employeeRepository.findByName(name) != null) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public Employee save(Employee employee) {
+ return employeeRepository.save(employee);
+ }
+
+ @Override
+ public List getAllEmployees() {
+ return employeeRepository.findAll();
+ }
+}
diff --git a/spring-boot/src/main/resources/logback.xml b/spring-boot/src/main/resources/logback.xml
index 78913ee76f..ec0dc2469a 100644
--- a/spring-boot/src/main/resources/logback.xml
+++ b/spring-boot/src/main/resources/logback.xml
@@ -1,14 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java
new file mode 100644
index 0000000000..f47e28a7e1
--- /dev/null
+++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java
@@ -0,0 +1,78 @@
+package org.baeldung.boot.boottest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+import org.baeldung.boot.boottest.Employee;
+import org.baeldung.boot.boottest.EmployeeRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+public class EmployeeRepositoryTest {
+
+ @Autowired
+ TestEntityManager entityManager;
+
+ @Autowired
+ EmployeeRepository employeeRepository;
+
+ @Test
+ public void whenFindByName_thenReturnEmployee() {
+ Employee emp = new Employee("test");
+ entityManager.persistAndFlush(emp);
+
+ Optional fromDb = employeeRepository.findByName(emp.getName());
+ assertThat(fromDb.get()
+ .getName()).isEqualTo(emp.getName());
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void whenInvalidName_thenNoSuchElementException() {
+ Optional fromDb = employeeRepository.findByName("doesNotExist");
+ fromDb.get();
+ }
+
+ @Test
+ public void whenFindById_thenReturnEmployee() {
+ Employee emp = new Employee("test");
+ entityManager.persistAndFlush(emp);
+
+ Optional fromDb = employeeRepository.findById(emp.getId());
+ assertThat(fromDb.get()
+ .getName()).isEqualTo(emp.getName());
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void whenInvalidId_thenNoSuchElementException() {
+ Optional fromDb = employeeRepository.findById(-11L);
+ fromDb.get();
+ }
+
+ @Test
+ public void givenSetOfEmployees_whenFindAll_thenReturnAllEmployees() {
+ Employee alex = new Employee("alex");
+ Employee ron = new Employee("ron");
+ Employee bob = new Employee("bob");
+
+ entityManager.persist(alex);
+ entityManager.persist(bob);
+ entityManager.persist(ron);
+ entityManager.flush();
+
+ List allEmployees = employeeRepository.findAll();
+
+ assertThat(allEmployees).hasSize(3)
+ .extracting(Employee::getName)
+ .containsOnly(alex.getName(), ron.getName(), bob.getName());
+ }
+
+}
diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java
new file mode 100644
index 0000000000..6360970345
--- /dev/null
+++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java
@@ -0,0 +1,78 @@
+package org.baeldung.boot.boottest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.hasSize;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.baeldung.boot.DemoApplication;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = DemoApplication.class)
+@AutoConfigureMockMvc
+@TestPropertySource(locations = "classpath:application-integrationtest.properties")
+public class EmployeeRestControllerIntTest {
+
+ @Autowired
+ MockMvc mvc;
+
+ @Autowired
+ EmployeeRepository repository;
+
+ @After
+ public void resetDb() {
+ repository.deleteAll();
+ }
+
+ @Test
+ public void whenValidInput_thenCreateEmployee() throws IOException, Exception {
+ Employee bob = new Employee("bob");
+ mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON)
+ .content(JsonUtil.toJson(bob)));
+
+ List found = repository.findAll();
+ assertThat(found).extracting(Employee::getName)
+ .containsOnly("bob");
+ }
+
+ @Test
+ public void givenEmployees_whenGetEmployees_thenStatus200() throws Exception {
+
+ createTestEmployee("bob");
+ createTestEmployee("alex");
+
+ mvc.perform(get("/api/employees").contentType(MediaType.APPLICATION_JSON))
+ .andDo(print())
+ .andExpect(status().isOk())
+ .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
+ .andExpect(jsonPath("$", hasSize(greaterThanOrEqualTo(2))))
+ .andExpect(jsonPath("$[0].name", is("bob")))
+ .andExpect(jsonPath("$[1].name", is("alex")));
+ }
+
+ private void createTestEmployee(String name) {
+ Employee emp = new Employee(name);
+ repository.saveAndFlush(emp);
+ }
+
+}
diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java
new file mode 100644
index 0000000000..0187ba9969
--- /dev/null
+++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java
@@ -0,0 +1,78 @@
+package org.baeldung.boot.boottest;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.hasSize;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.baeldung.boot.boottest.Employee;
+import org.baeldung.boot.boottest.EmployeeRestController;
+import org.baeldung.boot.boottest.EmployeeService;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.internal.verification.VerificationModeFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(EmployeeRestController.class)
+public class EmployeeRestControllerTest {
+
+ @Autowired
+ MockMvc mvc;
+
+ @MockBean
+ EmployeeService service;
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @Test
+ public void whenPostEmployee_thenCreateEmployee() throws Exception {
+ Employee alex = new Employee("alex");
+ given(service.save(Mockito.anyObject())).willReturn(alex);
+
+ mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON)
+ .content(JsonUtil.toJson(alex)))
+ .andExpect(status().isCreated())
+ .andExpect(jsonPath("$.name", is("alex")));
+ verify(service, VerificationModeFactory.times(1)).save(Mockito.anyObject());
+ reset(service);
+ }
+
+ @Test
+ public void givenEmployees_whenGetEmployees_thenReturnJsonArray() throws Exception {
+ Employee alex = new Employee("alex");
+ Employee john = new Employee("john");
+ Employee bob = new Employee("bob");
+
+ List allEmployees = Arrays.asList(alex, john, bob);
+
+ given(service.getAllEmployees()).willReturn(allEmployees);
+
+ mvc.perform(get("/api/employees").contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(3)))
+ .andExpect(jsonPath("$[0].name", is(alex.getName())))
+ .andExpect(jsonPath("$[1].name", is(john.getName())))
+ .andExpect(jsonPath("$[2].name", is(bob.getName())));
+ verify(service, VerificationModeFactory.times(1)).getAllEmployees();
+ reset(service);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java
new file mode 100644
index 0000000000..345cc29e02
--- /dev/null
+++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java
@@ -0,0 +1,145 @@
+package org.baeldung.boot.boottest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+import org.baeldung.boot.boottest.Employee;
+import org.baeldung.boot.boottest.EmployeeRepository;
+import org.baeldung.boot.boottest.EmployeeService;
+import org.baeldung.boot.boottest.EmployeeServiceImpl;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.internal.verification.VerificationModeFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+public class EmployeeServiceImplTest {
+
+ @TestConfiguration
+ static class EmployeeServiceImplTestContextConfiguration {
+ @Bean
+ public EmployeeService employeeService() {
+ return new EmployeeServiceImpl();
+ }
+ }
+
+ @Autowired
+ EmployeeService employeeService;
+
+ @MockBean
+ EmployeeRepository employeeRepository;
+
+ @Before
+ public void setUp() {
+ Employee john = new Employee("john");
+ john.setId(11L);
+
+ Optional emp = Optional.of(john);
+
+ Employee bob = new Employee("bob");
+ Employee alex = new Employee("alex");
+
+ List allEmployees = Arrays.asList(john, bob, alex);
+
+ Mockito.when(employeeRepository.findByName(john.getName()))
+ .thenReturn(emp);
+ Mockito.when(employeeRepository.findByName("wrong_name"))
+ .thenReturn(Optional.empty());
+ Mockito.when(employeeRepository.findById(john.getId()))
+ .thenReturn(emp);
+ Mockito.when(employeeRepository.findAll())
+ .thenReturn(allEmployees);
+ Mockito.when(employeeRepository.findById(-99L))
+ .thenReturn(Optional.empty());
+ }
+
+ @Test
+ public void whenValidName_thenEmployeeShouldBeFound() {
+ Optional fromDb = employeeService.getEmployeeByName("john");
+ assertThat(fromDb.get()
+ .getName()).isEqualTo("john");
+
+ verifyFindByNameIsCalledOnce("john");
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void whenInValidName_thenEmployeeShouldNotBeFound() {
+ Optional fromDb = employeeService.getEmployeeByName("wrong_name");
+ fromDb.get();
+
+ verifyFindByNameIsCalledOnce("wrong_name");
+ }
+
+ @Test
+ public void whenValidName_thenEmployeeShouldExist() {
+ boolean doesEmployeeExist = employeeService.exists("john");
+ assertThat(doesEmployeeExist).isEqualTo(true);
+
+ verifyFindByNameIsCalledOnce("john");
+ }
+
+ @Test
+ public void whenNonExistingName_thenEmployeeShouldNotExist() {
+ boolean doesEmployeeExist = employeeService.exists("some_name");
+ assertThat(doesEmployeeExist).isEqualTo(false);
+
+ verifyFindByNameIsCalledOnce("some_name");
+ }
+
+ @Test
+ public void whenValidI_thendEmployeeShouldBeFound() {
+ Optional fromDb = employeeService.getEmployeeById(11L);
+ assertThat(fromDb.get()
+ .getName()).isEqualTo("john");
+
+ verifyFindByIdIsCalledOnce();
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void whenInValidId_thenEmployeeShouldNotBeFound() {
+ Optional fromDb = employeeService.getEmployeeById(-99L);
+ verifyFindByIdIsCalledOnce();
+ fromDb.get();
+ }
+
+ @Test
+ public void given3Employees_whengetAll_thenReturn3Records() {
+ Employee alex = new Employee("alex");
+ Employee john = new Employee("john");
+ Employee bob = new Employee("bob");
+
+ List allEmployees = employeeService.getAllEmployees();
+ verifyFindAllEmployeesIsCalledOnce();
+ assertThat(allEmployees).hasSize(3)
+ .extracting(Employee::getName)
+ .contains(alex.getName(), john.getName(), bob.getName());
+ }
+
+ private void verifyFindByNameIsCalledOnce(String name) {
+ Mockito.verify(employeeRepository, VerificationModeFactory.times(1))
+ .findByName(name);
+ Mockito.reset(employeeRepository);
+ }
+
+ private void verifyFindByIdIsCalledOnce() {
+ Mockito.verify(employeeRepository, VerificationModeFactory.times(1))
+ .findById(Mockito.anyLong());
+ Mockito.reset(employeeRepository);
+ }
+
+ private void verifyFindAllEmployeesIsCalledOnce() {
+ Mockito.verify(employeeRepository, VerificationModeFactory.times(1))
+ .findAll();
+ Mockito.reset(employeeRepository);
+ }
+}
diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/JsonUtil.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/JsonUtil.java
new file mode 100644
index 0000000000..3d532ce54a
--- /dev/null
+++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/JsonUtil.java
@@ -0,0 +1,14 @@
+package org.baeldung.boot.boottest;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JsonUtil {
+ public static byte[] toJson(Object object) throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ return mapper.writeValueAsBytes(object);
+ }
+}
diff --git a/spring-boot/src/test/resources/application-integrationtest.properties b/spring-boot/src/test/resources/application-integrationtest.properties
new file mode 100644
index 0000000000..508acf45e0
--- /dev/null
+++ b/spring-boot/src/test/resources/application-integrationtest.properties
@@ -0,0 +1,2 @@
+spring.datasource.url = jdbc:h2:mem:test
+spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/GreetingController.java b/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/GreetingController.java
index d98e22f822..84792deed1 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/GreetingController.java
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/GreetingController.java
@@ -6,8 +6,7 @@
package com.baeldung.spring.cloud.greeting;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@@ -16,8 +15,7 @@ public class GreetingController {
@Autowired
private HelloWorldClient helloWorldClient;
- @RequestMapping(value = "/get-greeting", method = RequestMethod.GET)
-
+ @GetMapping("/get-greeting")
public String greeting() {
return helloWorldClient.HelloWorld();
diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/main/java/com/baeldung/spring/cloud/helloworld/HelloWorldController.java b/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/main/java/com/baeldung/spring/cloud/helloworld/HelloWorldController.java
index 9048e6bed8..6c662e1111 100644
--- a/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/main/java/com/baeldung/spring/cloud/helloworld/HelloWorldController.java
+++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/main/java/com/baeldung/spring/cloud/helloworld/HelloWorldController.java
@@ -5,14 +5,13 @@
*/
package com.baeldung.spring.cloud.helloworld;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
- @RequestMapping(path = "/helloworld", method = RequestMethod.GET)
+ @GetMapping("/helloworld")
public String HelloWorld() {
return "Hello World!";
}
diff --git a/spring-core/src/main/java/com/baeldung/value/SomeBean.java b/spring-core/src/main/java/com/baeldung/value/SomeBean.java
new file mode 100644
index 0000000000..39d5245049
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/value/SomeBean.java
@@ -0,0 +1,17 @@
+package com.baeldung.value;
+
+public class SomeBean {
+ private int someValue;
+
+ public SomeBean(int someValue) {
+ this.someValue = someValue;
+ }
+
+ public int getSomeValue() {
+ return someValue;
+ }
+
+ public void setSomeValue(int someValue) {
+ this.someValue = someValue;
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java
new file mode 100644
index 0000000000..25f4b9fb9c
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java
@@ -0,0 +1,68 @@
+package com.baeldung.value;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+@Configuration
+@PropertySource(name = "myProperties", value = "values.properties")
+public class ValuesApp {
+
+ @Value("string value")
+ private String stringValue;
+
+ @Value("${value.from.file}")
+ private String valueFromFile;
+
+ @Value("${systemValue}")
+ private String systemValue;
+
+ @Value("${unknown_param:some default}")
+ private String someDefault;
+
+ @Value("${priority}")
+ private String prioritySystemProperty;
+
+ @Value("#{systemProperties['priority']}")
+ private String spelValue;
+
+ @Value("#{systemProperties['unknown'] ?: 'some default'}")
+ private String spelSomeDefault;
+
+ @Value("#{someBean.someValue}")
+ private Integer someBeanValue;
+
+ @Value("#{'${listOfValues}'.split(',')}")
+ private List valuesList;
+
+ public static void main(String[] args) {
+ System.setProperty("systemValue", "Some system parameter value");
+ System.setProperty("priority", "System property");
+ ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValuesApp.class);
+ }
+
+ @Bean
+ public SomeBean someBean() {
+ return new SomeBean(10);
+ }
+
+ @PostConstruct
+ public void afterInitialize() {
+ System.out.println(stringValue);
+ System.out.println(valueFromFile);
+ System.out.println(systemValue);
+ System.out.println(someDefault);
+ System.out.println(prioritySystemProperty);
+ System.out.println(spelValue);
+ System.out.println(spelSomeDefault);
+ System.out.println(someBeanValue);
+ System.out.println(valuesList);
+ }
+}
diff --git a/spring-core/src/main/resources/values.properties b/spring-core/src/main/resources/values.properties
new file mode 100644
index 0000000000..d7d61b8ee8
--- /dev/null
+++ b/spring-core/src/main/resources/values.properties
@@ -0,0 +1,3 @@
+value.from.file=Value got from the file
+priority=Properties file
+listOfValues=A,B,C
\ No newline at end of file
diff --git a/spring-custom-aop/spring-custom-aop/src/main/resources/logback.xml b/spring-custom-aop/spring-custom-aop/src/main/resources/logback.xml
index 78913ee76f..ec0dc2469a 100644
--- a/spring-custom-aop/spring-custom-aop/src/main/resources/logback.xml
+++ b/spring-custom-aop/spring-custom-aop/src/main/resources/logback.xml
@@ -1,14 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-data-cassandra/src/main/resources/logback.xml b/spring-data-cassandra/src/main/resources/logback.xml
index 215eeede64..ec0dc2469a 100644
--- a/spring-data-cassandra/src/main/resources/logback.xml
+++ b/spring-data-cassandra/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -16,5 +16,4 @@
-
\ No newline at end of file
diff --git a/spring-data-couchbase-2/src/main/resources/logback.xml b/spring-data-couchbase-2/src/main/resources/logback.xml
index d9067fd1da..ec0dc2469a 100644
--- a/spring-data-couchbase-2/src/main/resources/logback.xml
+++ b/spring-data-couchbase-2/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -8,10 +8,12 @@
-
+
+
+
+
-
\ No newline at end of file
diff --git a/spring-data-couchbase-2/src/test/resources/logback.xml b/spring-data-couchbase-2/src/test/resources/logback.xml
index d9067fd1da..ec0dc2469a 100644
--- a/spring-data-couchbase-2/src/test/resources/logback.xml
+++ b/spring-data-couchbase-2/src/test/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -8,10 +8,12 @@
-
+
+
+
+
-
\ No newline at end of file
diff --git a/spring-data-dynamodb/src/main/resources/logback.xml b/spring-data-dynamodb/src/main/resources/logback.xml
index c0bc602910..ec0dc2469a 100644
--- a/spring-data-dynamodb/src/main/resources/logback.xml
+++ b/spring-data-dynamodb/src/main/resources/logback.xml
@@ -1,14 +1,19 @@
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
-
+
+
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-data-elasticsearch/src/main/resources/logback.xml b/spring-data-elasticsearch/src/main/resources/logback.xml
index db75fcbe40..ec0dc2469a 100644
--- a/spring-data-elasticsearch/src/main/resources/logback.xml
+++ b/spring-data-elasticsearch/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
-
- elasticsearch - %date [%thread] %-5level %logger{36} - %message%n
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
-
-
-
+
+
-
\ No newline at end of file
diff --git a/spring-data-mongodb/src/main/resources/logback.xml b/spring-data-mongodb/src/main/resources/logback.xml
index 215eeede64..ec0dc2469a 100644
--- a/spring-data-mongodb/src/main/resources/logback.xml
+++ b/spring-data-mongodb/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -16,5 +16,4 @@
-
\ No newline at end of file
diff --git a/spring-data-neo4j/src/main/resources/logback.xml b/spring-data-neo4j/src/main/resources/logback.xml
index 215eeede64..ec0dc2469a 100644
--- a/spring-data-neo4j/src/main/resources/logback.xml
+++ b/spring-data-neo4j/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -16,5 +16,4 @@
-
\ No newline at end of file
diff --git a/spring-data-neo4j/src/test/resources/logback.xml b/spring-data-neo4j/src/test/resources/logback.xml
index 39a6538324..ec0dc2469a 100644
--- a/spring-data-neo4j/src/test/resources/logback.xml
+++ b/spring-data-neo4j/src/test/resources/logback.xml
@@ -1,16 +1,19 @@
-
-
+
- %d %5p %40.40c:%4L - %m%n
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
-
+
+
-
-
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/spring-data-redis/src/main/resources/logback.xml b/spring-data-redis/src/main/resources/logback.xml
index 215eeede64..ec0dc2469a 100644
--- a/spring-data-redis/src/main/resources/logback.xml
+++ b/spring-data-redis/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -16,5 +16,4 @@
-
\ No newline at end of file
diff --git a/spring-exceptions/src/main/resources/logback.xml b/spring-exceptions/src/main/resources/logback.xml
index 45c9697f77..ec0dc2469a 100644
--- a/spring-exceptions/src/main/resources/logback.xml
+++ b/spring-exceptions/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate3/src/main/resources/logback.xml b/spring-hibernate3/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-hibernate3/src/main/resources/logback.xml
+++ b/spring-hibernate3/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/resources/logback.xml b/spring-hibernate4/src/main/resources/logback.xml
index 71a6d50a58..ec0dc2469a 100644
--- a/spring-hibernate4/src/main/resources/logback.xml
+++ b/spring-hibernate4/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate5/src/main/resources/logback.xml b/spring-hibernate5/src/main/resources/logback.xml
index 71a6d50a58..ec0dc2469a 100644
--- a/spring-hibernate5/src/main/resources/logback.xml
+++ b/spring-hibernate5/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-jersey/src/main/resources/logback.xml b/spring-jersey/src/main/resources/logback.xml
index 788096686a..ec0dc2469a 100644
--- a/spring-jersey/src/main/resources/logback.xml
+++ b/spring-jersey/src/main/resources/logback.xml
@@ -1,15 +1,19 @@
+
-
- web - %date [%thread] %-5level %logger{36} -
- %message%n
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/spring-jpa/src/main/resources/logback.xml b/spring-jpa/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-jpa/src/main/resources/logback.xml
+++ b/spring-jpa/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-ldap/src/main/resources/logback.xml b/spring-ldap/src/main/resources/logback.xml
index 788096686a..ec0dc2469a 100644
--- a/spring-ldap/src/main/resources/logback.xml
+++ b/spring-ldap/src/main/resources/logback.xml
@@ -1,15 +1,19 @@
+
-
- web - %date [%thread] %-5level %logger{36} -
- %message%n
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/resources/logback.xml b/spring-mvc-java/src/main/resources/logback.xml
index e0721aa890..ec0dc2469a 100644
--- a/spring-mvc-java/src/main/resources/logback.xml
+++ b/spring-mvc-java/src/main/resources/logback.xml
@@ -1,21 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
-
- %date [%thread] %-5level %logger{6} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-xml/src/main/resources/logback.xml b/spring-mvc-xml/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-mvc-xml/src/main/resources/logback.xml
+++ b/spring-mvc-xml/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-quartz/src/main/resources/logback.xml b/spring-quartz/src/main/resources/logback.xml
index be0937fefe..ec0dc2469a 100644
--- a/spring-quartz/src/main/resources/logback.xml
+++ b/spring-quartz/src/main/resources/logback.xml
@@ -1,16 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml
index a9b208bcd2..6afe4004c3 100644
--- a/spring-rest/pom.xml
+++ b/spring-rest/pom.xml
@@ -188,6 +188,12 @@
kryo
${kryo.version}
+
+
+ com.jayway.jsonpath
+ json-path
+
+
@@ -358,7 +364,8 @@
3.4.1
-
+
+ 2.2.0
diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java b/spring-rest/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java
new file mode 100644
index 0000000000..4bcafc04fc
--- /dev/null
+++ b/spring-rest/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java
@@ -0,0 +1,55 @@
+package org.baeldung.web.controller;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.baeldung.web.dto.Bazz;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+@RestController
+@RequestMapping("/bazz")
+public class BazzNewMappingsExampleController {
+
+ @GetMapping
+ public ResponseEntity> getBazzs() throws JsonProcessingException{
+ List data = Arrays.asList(
+ new Bazz("1", "Bazz1"),
+ new Bazz("2", "Bazz2"),
+ new Bazz("3", "Bazz3"),
+ new Bazz("4", "Bazz4"));
+ return new ResponseEntity<>(data, HttpStatus.OK);
+ }
+
+ @GetMapping("/{id}")
+ public ResponseEntity> getBazz(@PathVariable String id){
+ return new ResponseEntity<>(new Bazz(id, "Bazz"+id), HttpStatus.OK);
+ }
+
+ @PostMapping
+ public ResponseEntity> newBazz(@RequestParam("name") String name){
+ return new ResponseEntity<>(new Bazz("5", name), HttpStatus.OK);
+ }
+
+ @PutMapping("/{id}")
+ public ResponseEntity> updateBazz(@PathVariable String id,
+ @RequestParam("name") String name){
+ return new ResponseEntity<>(new Bazz(id, name), HttpStatus.OK);
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity> deleteBazz(@PathVariable String id){
+ return new ResponseEntity<>(new Bazz(id), HttpStatus.OK);
+ }
+
+}
diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Bazz.java b/spring-rest/src/main/java/org/baeldung/web/dto/Bazz.java
new file mode 100644
index 0000000000..d9a495b726
--- /dev/null
+++ b/spring-rest/src/main/java/org/baeldung/web/dto/Bazz.java
@@ -0,0 +1,22 @@
+package org.baeldung.web.dto;
+
+public class Bazz {
+
+
+ public String id;
+ public String name;
+
+ public Bazz(String id){
+ this.id = id;
+ }
+ public Bazz(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return "Bazz [id=" + id + ", name=" + name + "]";
+ }
+
+}
diff --git a/spring-rest/src/main/resources/logback.xml b/spring-rest/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-rest/src/main/resources/logback.xml
+++ b/spring-rest/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-rest/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleControllerTest.java b/spring-rest/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleControllerTest.java
new file mode 100644
index 0000000000..f2f00a40d8
--- /dev/null
+++ b/spring-rest/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleControllerTest.java
@@ -0,0 +1,80 @@
+
+package org.baeldung.web.test;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.baeldung.config.WebConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = WebConfig.class)
+@WebAppConfiguration
+public class BazzNewMappingsExampleControllerTest {
+
+ private MockMvc mockMvc;
+
+ @Autowired
+ private WebApplicationContext webApplicationContext;
+
+ @Before
+ public void setUp() {
+ mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
+ }
+
+ @Test
+ public void whenGettingAllBazz_thenSuccess() throws Exception{
+ mockMvc.perform(get("/bazz"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(4)))
+ .andExpect(jsonPath("$[1].id", is("2")))
+ .andExpect(jsonPath("$[1].name", is("Bazz2")));
+ }
+
+ @Test
+ public void whenGettingABazz_thenSuccess() throws Exception{
+ mockMvc.perform(get("/bazz/1"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.id", is("1")))
+ .andExpect(jsonPath("$.name", is("Bazz1")));
+ }
+
+ @Test
+ public void whenAddingABazz_thenSuccess() throws Exception{
+ mockMvc.perform(post("/bazz").param("name", "Bazz5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.id", is("5")))
+ .andExpect(jsonPath("$.name", is("Bazz5")));
+ }
+
+ @Test
+ public void whenUpdatingABazz_thenSuccess() throws Exception{
+ mockMvc.perform(put("/bazz/5").param("name", "Bazz6"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.id", is("5")))
+ .andExpect(jsonPath("$.name", is("Bazz6")));
+ }
+
+ @Test
+ public void whenDeletingABazz_thenSuccess() throws Exception{
+ mockMvc.perform(delete("/bazz/5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.id", is("5")));
+ }
+}
diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java
index 8cc9d45823..acb7e6820a 100644
--- a/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java
+++ b/spring-security-mvc-boot/src/main/java/org/baeldung/config/SecurityConfig.java
@@ -24,7 +24,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
- auth.userDetailsService(userDetailsService);
+ auth.authenticationProvider(authenticationProvider());
}
@Override
diff --git a/spring-security-mvc-custom/src/main/resources/logback.xml b/spring-security-mvc-custom/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-mvc-custom/src/main/resources/logback.xml
+++ b/spring-security-mvc-custom/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-mvc-digest-auth/src/main/resources/logback.xml b/spring-security-mvc-digest-auth/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-mvc-digest-auth/src/main/resources/logback.xml
+++ b/spring-security-mvc-digest-auth/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-mvc-ldap/src/main/resources/logback.xml b/spring-security-mvc-ldap/src/main/resources/logback.xml
index 2dc76c96f3..ec0dc2469a 100644
--- a/spring-security-mvc-ldap/src/main/resources/logback.xml
+++ b/spring-security-mvc-ldap/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-mvc-login/src/main/resources/logback.xml b/spring-security-mvc-login/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-mvc-login/src/main/resources/logback.xml
+++ b/spring-security-mvc-login/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-mvc-persisted-remember-me/src/main/resources/logback.xml b/spring-security-mvc-persisted-remember-me/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-mvc-persisted-remember-me/src/main/resources/logback.xml
+++ b/spring-security-mvc-persisted-remember-me/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-mvc-session/src/main/resources/logback.xml b/spring-security-mvc-session/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-mvc-session/src/main/resources/logback.xml
+++ b/spring-security-mvc-session/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-rest-basic-auth/src/main/resources/logback.xml b/spring-security-rest-basic-auth/src/main/resources/logback.xml
index 90f61a95bc..ec0dc2469a 100644
--- a/spring-security-rest-basic-auth/src/main/resources/logback.xml
+++ b/spring-security-rest-basic-auth/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-rest-custom/src/main/resources/logback.xml b/spring-security-rest-custom/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-rest-custom/src/main/resources/logback.xml
+++ b/spring-security-rest-custom/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-rest-digest-auth/src/main/resources/logback.xml b/spring-security-rest-digest-auth/src/main/resources/logback.xml
index 90f61a95bc..ec0dc2469a 100644
--- a/spring-security-rest-digest-auth/src/main/resources/logback.xml
+++ b/spring-security-rest-digest-auth/src/main/resources/logback.xml
@@ -1,22 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-rest-full/src/main/resources/logback.xml b/spring-security-rest-full/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-rest-full/src/main/resources/logback.xml
+++ b/spring-security-rest-full/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-rest/src/main/resources/logback.xml b/spring-security-rest/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-security-rest/src/main/resources/logback.xml
+++ b/spring-security-rest/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-thymeleaf/src/main/resources/logback.xml b/spring-thymeleaf/src/main/resources/logback.xml
index 1146dade63..ec0dc2469a 100644
--- a/spring-thymeleaf/src/main/resources/logback.xml
+++ b/spring-thymeleaf/src/main/resources/logback.xml
@@ -1,20 +1,19 @@
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
-
-
- web - %date [%thread] %-5level %logger{36} - %message%n
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/testng/src/test/resources/logback.xml b/testng/src/test/resources/logback.xml
index 346682f033..035520aa15 100644
--- a/testng/src/test/resources/logback.xml
+++ b/testng/src/test/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,8 +7,13 @@
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/vertx/src/main/resources/logback.xml b/vertx/src/main/resources/logback.xml
index e9ae1894a6..ec0dc2469a 100644
--- a/vertx/src/main/resources/logback.xml
+++ b/vertx/src/main/resources/logback.xml
@@ -1,5 +1,5 @@
+
-
web - %date [%thread] %-5level %logger{36} - %message%n
@@ -7,8 +7,13 @@
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/xstream/pom.xml b/xstream/pom.xml
index 7af8efa659..ee1882850a 100644
--- a/xstream/pom.xml
+++ b/xstream/pom.xml
@@ -27,10 +27,23 @@
- log4j
- log4j
- ${log4j.version}
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
@@ -51,7 +64,9 @@
1.4.9
1.3.8
- 1.2.17
+ 1.7.21
+ 1.1.7
+
4.12
diff --git a/xstream/src/main/resources/log4j.properties b/xstream/src/main/resources/log4j.properties
deleted file mode 100644
index 03d8c51aa0..0000000000
--- a/xstream/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# Root logger option
-log4j.rootLogger=DEBUG, file
-# Redirect log messages to console
-# log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-# log4j.appender.stdout.Target=System.out
-# log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-# Redirect log messages to a log file, support file rolling.
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.File=D:\\Test\\xstream-application.log
-log4j.appender.file.MaxFileSize=5MB
-log4j.appender.file.MaxBackupIndex=10
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/xstream/src/main/resources/logback.xml b/xstream/src/main/resources/logback.xml
new file mode 100644
index 0000000000..ec0dc2469a
--- /dev/null
+++ b/xstream/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file