diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000..40f5c88746
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Eugen Paraschiv
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index d94a786bc2..271aea0767 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,14 @@
The "REST with Spring" Classes
==============================
+
After 5 months of work, here's the Master Class of REST With Spring:
**[>> THE REST WITH SPRING MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
+And here's the Master Class of Learn Spring Security:
+**[>> LEARN SPRING SECURITY MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
+
+
Spring Tutorials
================
diff --git a/algorithms/README.md b/algorithms/README.md
index b0c5ee9d77..5f101c296c 100644
--- a/algorithms/README.md
+++ b/algorithms/README.md
@@ -14,3 +14,4 @@
- [Bubble Sort in Java](http://www.baeldung.com/java-bubble-sort)
- [Introduction to JGraphT](http://www.baeldung.com/jgrapht)
- [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm)
+- [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance)
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java b/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java
index e884c576c1..ec66621928 100644
--- a/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java
+++ b/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java
@@ -1,22 +1,15 @@
package com.baeldung.algorithms.editdistance;
+import java.util.Arrays;
+
public class EditDistanceBase {
- public static int costOfSubstitution(char a, char b) {
- if (a == b) {
- return 0;
- }
- return 1;
+ static int costOfSubstitution(char a, char b) {
+ return a == b ? 0 : 1;
}
- public static int min(int... numbers) {
- int min = Integer.MAX_VALUE;
-
- for (int x : numbers) {
- if (x < min)
- min = x;
- }
-
- return min;
+ static int min(int... numbers) {
+ return Arrays.stream(numbers)
+ .min().orElse(Integer.MAX_VALUE);
}
}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java b/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java
index 163714002b..1f8824c4f4 100644
--- a/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java
+++ b/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java
@@ -2,7 +2,7 @@ package com.baeldung.algorithms.editdistance;
public class EditDistanceDynamicProgramming extends EditDistanceBase {
- public static int calculate(String x, String y) {
+ static int calculate(String x, String y) {
int[][] dp = new int[x.length() + 1][y.length() + 1];
for (int i = 0; i <= x.length(); i++) {
@@ -14,12 +14,13 @@ public class EditDistanceDynamicProgramming extends EditDistanceBase {
dp[i][j] = i;
else {
- dp[i][j] = min(dp[i - 1][j - 1] + costOfSubstitution(x.charAt(i - 1), y.charAt(j - 1)), dp[i - 1][j] + 1, dp[i][j - 1] + 1);
+ dp[i][j] = min(dp[i - 1][j - 1]
+ + costOfSubstitution(x.charAt(i - 1), y.charAt(j - 1)),
+ dp[i - 1][j] + 1, dp[i][j - 1] + 1);
}
}
}
return dp[x.length()][y.length()];
}
-
}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java b/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java
index 68e470147e..8ed48dc554 100644
--- a/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java
+++ b/algorithms/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java
@@ -2,13 +2,15 @@ package com.baeldung.algorithms.editdistance;
public class EditDistanceRecursive extends EditDistanceBase {
- public static int calculate(String x, String y) {
+ static int calculate(String x, String y) {
- if (x.isEmpty())
+ if (x.isEmpty()) {
return y.length();
+ }
- if (y.isEmpty())
+ if (y.isEmpty()) {
return x.length();
+ }
int substitution = calculate(x.substring(1), y.substring(1)) + costOfSubstitution(x.charAt(0), y.charAt(0));
int insertion = calculate(x, y.substring(1)) + 1;
@@ -16,5 +18,4 @@ public class EditDistanceRecursive extends EditDistanceBase {
return min(substitution, insertion, deletion);
}
-
}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/prime/PrimeGenerator.java b/algorithms/src/main/java/com/baeldung/algorithms/prime/PrimeGenerator.java
new file mode 100644
index 0000000000..48d51a8848
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/prime/PrimeGenerator.java
@@ -0,0 +1,59 @@
+package com.baeldung.algorithms.prime;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class PrimeGenerator {
+ public static List sieveOfEratosthenes(int n) {
+ final boolean prime[] = new boolean[n + 1];
+ Arrays.fill(prime, true);
+
+ for (int p = 2; p * p <= n; p++) {
+ if (prime[p]) {
+ for (int i = p * 2; i <= n; i += p)
+ prime[i] = false;
+ }
+ }
+
+ final List primes = new LinkedList<>();
+ for (int i = 2; i <= n; i++) {
+ if (prime[i])
+ primes.add(i);
+ }
+ return primes;
+ }
+
+ public static List primeNumbersBruteForce(int max) {
+ final List primeNumbers = new LinkedList();
+ for (int i = 2; i <= max; i++) {
+ if (isPrimeBruteForce(i)) {
+ primeNumbers.add(i);
+ }
+ }
+ return primeNumbers;
+ }
+
+ private static boolean isPrimeBruteForce(int x) {
+ for (int i = 2; i < x; i++) {
+ if (x % i == 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static List primeNumbersTill(int max) {
+ return IntStream.rangeClosed(2, max)
+ .filter(x -> isPrime(x))
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ private static boolean isPrime(int x) {
+ return IntStream.rangeClosed(2, (int) (Math.sqrt(x)))
+ .allMatch(n -> x % n != 0);
+ }
+}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceTest.java b/algorithms/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceTest.java
index 1594f73a73..bab2f480a5 100644
--- a/algorithms/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceTest.java
+++ b/algorithms/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceTest.java
@@ -1,16 +1,17 @@
package com.baeldung.algorithms.editdistance;
-import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
+import static org.junit.Assert.assertEquals;
+
@RunWith(Parameterized.class)
public class EditDistanceTest extends EditDistanceDataProvider {
- String x;
- String y;
- int result;
+ private String x;
+ private String y;
+ private int result;
public EditDistanceTest(String a, String b, int res) {
super();
@@ -21,11 +22,11 @@ public class EditDistanceTest extends EditDistanceDataProvider {
@Test
public void testEditDistance_RecursiveImplementation() {
- Assert.assertEquals(result, EditDistanceRecursive.calculate(x, y));
+ assertEquals(result, EditDistanceRecursive.calculate(x, y));
}
@Test
public void testEditDistance_givenDynamicProgrammingImplementation() {
- Assert.assertEquals(result, EditDistanceDynamicProgramming.calculate(x, y));
+ assertEquals(result, EditDistanceDynamicProgramming.calculate(x, y));
}
}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/prime/PrimeGeneratorTest.java b/algorithms/src/test/java/com/baeldung/algorithms/prime/PrimeGeneratorTest.java
new file mode 100644
index 0000000000..4995e938b7
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/prime/PrimeGeneratorTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.algorithms.prime;
+
+import static com.baeldung.algorithms.prime.PrimeGenerator.*;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class PrimeGeneratorTest {
+ @Test
+ public void whenBruteForced_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersBruteForce(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenOptimized_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersTill(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenSieveOfEratosthenes_returnsSuccessfully() {
+ final List primeNumbers = sieveOfEratosthenes(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+}
diff --git a/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java b/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
new file mode 100644
index 0000000000..e2af4f8808
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
@@ -0,0 +1,224 @@
+package com.baeldung.poi.powerpoint;
+
+import org.apache.poi.sl.usermodel.AutoNumberingScheme;
+import org.apache.poi.sl.usermodel.PictureData;
+import org.apache.poi.sl.usermodel.TableCell;
+import org.apache.poi.sl.usermodel.TextParagraph;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.xslf.usermodel.*;
+
+import java.awt.*;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper class for the PowerPoint presentation creation
+ */
+public class PowerPointHelper {
+
+ /**
+ * Read an existing presentation
+ *
+ * @param fileLocation
+ * File location of the presentation
+ * @return instance of {@link XMLSlideShow}
+ * @throws IOException
+ */
+ public XMLSlideShow readingExistingSlideShow(String fileLocation) throws IOException {
+ return new XMLSlideShow(new FileInputStream(fileLocation));
+ }
+
+ /**
+ * Create a sample presentation
+ *
+ * @param fileLocation
+ * File location of the presentation
+ * @throws IOException
+ */
+ public void createPresentation(String fileLocation) throws IOException {
+ // Create presentation
+ XMLSlideShow ppt = new XMLSlideShow();
+
+ XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);
+
+ // Retriving the slide layout
+ XSLFSlideLayout layout = defaultMaster.getLayout(SlideLayout.TITLE_ONLY);
+
+ // Creating the 1st slide
+ XSLFSlide slide1 = ppt.createSlide(layout);
+ XSLFTextShape title = slide1.getPlaceholder(0);
+ // Clearing text to remove the predefined one in the template
+ title.clearText();
+ XSLFTextParagraph p = title.addNewTextParagraph();
+
+ XSLFTextRun r1 = p.addNewTextRun();
+ r1.setText("Baeldung");
+ r1.setFontColor(new Color(78, 147, 89));
+ r1.setFontSize(48.);
+
+ // Add Image
+ ClassLoader classLoader = getClass().getClassLoader();
+ byte[] pictureData = IOUtils.toByteArray(new FileInputStream(classLoader.getResource("logo-leaf.png").getFile()));
+
+ XSLFPictureData pd = ppt.addPicture(pictureData, PictureData.PictureType.PNG);
+ XSLFPictureShape picture = slide1.createPicture(pd);
+ picture.setAnchor(new Rectangle(320, 230, 100, 92));
+
+ // Creating 2nd slide
+ layout = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
+ XSLFSlide slide2 = ppt.createSlide(layout);
+
+ // setting the tile
+ title = slide2.getPlaceholder(0);
+ title.clearText();
+ XSLFTextRun r = title.addNewTextParagraph().addNewTextRun();
+ r.setText("Baeldung");
+
+ // Adding the link
+ XSLFHyperlink link = r.createHyperlink();
+ link.setAddress("http://www.baeldung.com");
+
+ // setting the content
+ XSLFTextShape content = slide2.getPlaceholder(1);
+ content.clearText(); // unset any existing text
+ content.addNewTextParagraph().addNewTextRun().setText("First paragraph");
+ content.addNewTextParagraph().addNewTextRun().setText("Second paragraph");
+ content.addNewTextParagraph().addNewTextRun().setText("Third paragraph");
+
+ // Creating 3rd slide - List
+ layout = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
+ XSLFSlide slide3 = ppt.createSlide(layout);
+ title = slide3.getPlaceholder(0);
+ title.clearText();
+ r = title.addNewTextParagraph().addNewTextRun();
+ r.setText("Lists");
+
+ content = slide3.getPlaceholder(1);
+ content.clearText();
+ XSLFTextParagraph p1 = content.addNewTextParagraph();
+ p1.setIndentLevel(0);
+ p1.setBullet(true);
+ r1 = p1.addNewTextRun();
+ r1.setText("Bullet");
+
+ // the next three paragraphs form an auto-numbered list
+ XSLFTextParagraph p2 = content.addNewTextParagraph();
+ p2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
+ p2.setIndentLevel(1);
+ XSLFTextRun r2 = p2.addNewTextRun();
+ r2.setText("Numbered List Item - 1");
+
+ // Creating 4th slide
+ XSLFSlide slide4 = ppt.createSlide();
+ createTable(slide4);
+
+ // Save presentation
+ FileOutputStream out = new FileOutputStream(fileLocation);
+ ppt.write(out);
+ out.close();
+
+ // Closing presentation
+ ppt.close();
+ }
+
+ /**
+ * Delete a slide from the presentation
+ *
+ * @param ppt
+ * The presentation
+ * @param slideNumber
+ * The number of the slide to be deleted (0-based)
+ */
+ public void deleteSlide(XMLSlideShow ppt, int slideNumber) {
+ ppt.removeSlide(slideNumber);
+ }
+
+ /**
+ * Re-order the slides inside a presentation
+ *
+ * @param ppt
+ * The presentation
+ * @param slideNumber
+ * The number of the slide to move
+ * @param newSlideNumber
+ * The new position of the slide (0-base)
+ */
+ public void reorderSlide(XMLSlideShow ppt, int slideNumber, int newSlideNumber) {
+ List slides = ppt.getSlides();
+
+ XSLFSlide secondSlide = slides.get(slideNumber);
+ ppt.setSlideOrder(secondSlide, newSlideNumber);
+ }
+
+ /**
+ * Retrieve the placeholder inside a slide
+ *
+ * @param slide
+ * The slide
+ * @return List of placeholder inside a slide
+ */
+ public List retrieveTemplatePlaceholders(XSLFSlide slide) {
+ List placeholders = new ArrayList<>();
+
+ for (XSLFShape shape : slide.getShapes()) {
+ if (shape instanceof XSLFAutoShape) {
+ placeholders.add(shape);
+ }
+ }
+ return placeholders;
+ }
+
+ /**
+ * Create a table
+ *
+ * @param slide
+ * Slide
+ */
+ private void createTable(XSLFSlide slide) {
+
+ XSLFTable tbl = slide.createTable();
+ tbl.setAnchor(new Rectangle(50, 50, 450, 300));
+
+ int numColumns = 3;
+ int numRows = 5;
+
+ // header
+ XSLFTableRow headerRow = tbl.addRow();
+ headerRow.setHeight(50);
+ for (int i = 0; i < numColumns; i++) {
+ XSLFTableCell th = headerRow.addCell();
+ XSLFTextParagraph p = th.addNewTextParagraph();
+ p.setTextAlign(TextParagraph.TextAlign.CENTER);
+ XSLFTextRun r = p.addNewTextRun();
+ r.setText("Header " + (i + 1));
+ r.setBold(true);
+ r.setFontColor(Color.white);
+ th.setFillColor(new Color(79, 129, 189));
+ th.setBorderWidth(TableCell.BorderEdge.bottom, 2.0);
+ th.setBorderColor(TableCell.BorderEdge.bottom, Color.white);
+ // all columns are equally sized
+ tbl.setColumnWidth(i, 150);
+ }
+
+ // data
+ for (int rownum = 0; rownum < numRows; rownum++) {
+ XSLFTableRow tr = tbl.addRow();
+ tr.setHeight(50);
+ for (int i = 0; i < numColumns; i++) {
+ XSLFTableCell cell = tr.addCell();
+ XSLFTextParagraph p = cell.addNewTextParagraph();
+ XSLFTextRun r = p.addNewTextRun();
+
+ r.setText("Cell " + (i * rownum + 1));
+ if (rownum % 2 == 0) {
+ cell.setFillColor(new Color(208, 216, 232));
+ } else {
+ cell.setFillColor(new Color(233, 247, 244));
+ }
+ }
+ }
+ }
+}
diff --git a/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java b/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
new file mode 100644
index 0000000000..5319208e85
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.poi.powerpoint;
+
+import org.apache.poi.xslf.usermodel.XMLSlideShow;
+import org.apache.poi.xslf.usermodel.XSLFShape;
+import org.apache.poi.xslf.usermodel.XSLFSlide;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+public class PowerPointIntegrationTest {
+
+ private PowerPointHelper pph;
+ private String fileLocation;
+ private static final String FILE_NAME = "presentation.pptx";
+
+ @Before
+ public void setUp() throws Exception {
+ File currDir = new File(".");
+ String path = currDir.getAbsolutePath();
+ fileLocation = path.substring(0, path.length() - 1) + FILE_NAME;
+
+ pph = new PowerPointHelper();
+ pph.createPresentation(fileLocation);
+ }
+
+ @Test
+ public void whenReadingAPresentation_thenOK() throws Exception {
+ XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation);
+
+ Assert.assertNotNull(xmlSlideShow);
+ Assert.assertEquals(4, xmlSlideShow.getSlides().size());
+ }
+
+ @Test
+ public void whenRetrievingThePlaceholdersForEachSlide_thenOK() throws Exception {
+ XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation);
+
+ List onlyTitleSlidePlaceholders = pph.retrieveTemplatePlaceholders(xmlSlideShow.getSlides().get(0));
+ List titleAndBodySlidePlaceholders = pph.retrieveTemplatePlaceholders(xmlSlideShow.getSlides().get(1));
+ List emptySlidePlaceholdes = pph.retrieveTemplatePlaceholders(xmlSlideShow.getSlides().get(3));
+
+ Assert.assertEquals(1, onlyTitleSlidePlaceholders.size());
+ Assert.assertEquals(2, titleAndBodySlidePlaceholders.size());
+ Assert.assertEquals(0, emptySlidePlaceholdes.size());
+
+ }
+
+ @Test
+ public void whenSortingSlides_thenOK() throws Exception {
+ XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation);
+ XSLFSlide slide4 = xmlSlideShow.getSlides().get(3);
+ pph.reorderSlide(xmlSlideShow, 3, 1);
+
+ Assert.assertEquals(slide4, xmlSlideShow.getSlides().get(1));
+ }
+
+ @Test
+ public void givenPresentation_whenDeletingASlide_thenOK() throws Exception {
+ XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation);
+ pph.deleteSlide(xmlSlideShow, 3);
+
+ Assert.assertEquals(3, xmlSlideShow.getSlides().size());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ File testFile = new File(fileLocation);
+ if (testFile.exists()) {
+ testFile.delete();
+ }
+ pph = null;
+ }
+}
diff --git a/apache-spark/README.md b/apache-spark/README.md
new file mode 100644
index 0000000000..fb8059eb27
--- /dev/null
+++ b/apache-spark/README.md
@@ -0,0 +1,3 @@
+### Relevant articles
+
+- [Introduction to Apache Spark](http://www.baeldung.com/apache-spark)
diff --git a/apache-spark/src/main/java/com/baeldung/WordCount.java b/apache-spark/src/main/java/com/baeldung/WordCount.java
index ec1dedcb69..bc73b05536 100644
--- a/apache-spark/src/main/java/com/baeldung/WordCount.java
+++ b/apache-spark/src/main/java/com/baeldung/WordCount.java
@@ -17,37 +17,24 @@ import scala.Tuple2;
public class WordCount {
private static final Pattern SPACE = Pattern.compile(" ");
-
+
public static void main(String[] args) throws Exception {
- if (args.length < 1) {
- System.err.println("Usage: JavaWordCount ");
- System.exit(1);
+ if (args.length < 1) {
+ System.err.println("Usage: JavaWordCount ");
+ System.exit(1);
+ }
+ SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount")
+ .setMaster("local");
+ JavaSparkContext ctx = new JavaSparkContext(sparkConf);
+ JavaRDD lines = ctx.textFile(args[0], 1);
+
+ JavaRDD words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
+ JavaPairRDD wordAsTuple = words.mapToPair(word -> new Tuple2<>(word, 1));
+ JavaPairRDD wordWithCount = wordAsTuple.reduceByKey((Integer i1, Integer i2)->i1 + i2);
+ List> output = wordWithCount.collect();
+ for (Tuple2, ?> tuple : output) {
+ System.out.println(tuple._1() + ": " + tuple._2());
+ }
+ ctx.stop();
}
- SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount").setMaster("local");
- JavaSparkContext ctx = new JavaSparkContext(sparkConf);
- JavaRDD lines = ctx.textFile(args[0], 1);
-
- JavaRDD words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
- JavaPairRDD ones = words.mapToPair(
- new PairFunction() {
- @Override
- public Tuple2 call(String s) {
- return new Tuple2<>(s, 1);
- }
- });
-
- JavaPairRDD counts = ones.reduceByKey(
- new Function2() {
- @Override
- public Integer call(Integer i1, Integer i2) {
- return i1 + i2;
- }
- });
-
- List> output = counts.collect();
- for (Tuple2, ?> tuple : output) {
- System.out.println(tuple._1() + ": " + tuple._2());
- }
- ctx.stop();
-}
}
diff --git a/bootique/dependency-reduced-pom.xml b/bootique/dependency-reduced-pom.xml
index ed18f4e42a..ab09cfb7b1 100644
--- a/bootique/dependency-reduced-pom.xml
+++ b/bootique/dependency-reduced-pom.xml
@@ -28,8 +28,14 @@
junit
junit
- 3.8.1
+ 4.12
test
+
+
+ hamcrest-core
+ org.hamcrest
+
+
diff --git a/cas-secured-app/README.md b/cas-secured-app/README.md
deleted file mode 100644
index ff12555376..0000000000
--- a/cas-secured-app/README.md
+++ /dev/null
@@ -1 +0,0 @@
-## Relevant articles:
diff --git a/cas-server/etc/cas/thekeystore b/cas-server/etc/cas/thekeystore
deleted file mode 100644
index 15f9af2dae..0000000000
Binary files a/cas-server/etc/cas/thekeystore and /dev/null differ
diff --git a/cas-server/etc/cas/thekeystore.crt b/cas-server/etc/cas/thekeystore.crt
deleted file mode 100644
index 5c7543f0c6..0000000000
Binary files a/cas-server/etc/cas/thekeystore.crt and /dev/null differ
diff --git a/cas/cas-secured-app/.gitignore b/cas/cas-secured-app/.gitignore
new file mode 100644
index 0000000000..cd4878159f
--- /dev/null
+++ b/cas/cas-secured-app/.gitignore
@@ -0,0 +1,27 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+/.mvn/
+/mvnw
+/mvnw.cmd
\ No newline at end of file
diff --git a/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml
similarity index 84%
rename from cas-secured-app/pom.xml
rename to cas/cas-secured-app/pom.xml
index f66d54ae67..543354e8b3 100644
--- a/cas-secured-app/pom.xml
+++ b/cas/cas-secured-app/pom.xml
@@ -65,6 +65,24 @@
org.springframework.boot
spring-boot-maven-plugin
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+
@@ -107,4 +125,5 @@
+
diff --git a/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java
similarity index 94%
rename from cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java
rename to cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java
index fc05e3b38f..25cbb9bc9b 100644
--- a/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java
+++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java
@@ -40,14 +40,14 @@ public class CasSecuredAppApplication {
@Primary
public AuthenticationEntryPoint authenticationEntryPoint(ServiceProperties sP) {
CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
- entryPoint.setLoginUrl("https://localhost:8443/cas/login");
+ entryPoint.setLoginUrl("https://localhost:6443/cas/login");
entryPoint.setServiceProperties(sP);
return entryPoint;
}
@Bean
public TicketValidator ticketValidator() {
- return new Cas30ServiceTicketValidator("https://localhost:8443/cas");
+ return new Cas30ServiceTicketValidator("https://localhost:6443/cas");
}
@Bean
@@ -71,7 +71,7 @@ public class CasSecuredAppApplication {
@Bean
public LogoutFilter logoutFilter() {
LogoutFilter logoutFilter = new LogoutFilter(
- "https://localhost:8443/cas/logout", securityContextLogoutHandler());
+ "https://localhost:6443/cas/logout", securityContextLogoutHandler());
logoutFilter.setFilterProcessesUrl("/logout/cas");
return logoutFilter;
}
@@ -79,7 +79,7 @@ public class CasSecuredAppApplication {
@Bean
public SingleSignOutFilter singleSignOutFilter() {
SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
- singleSignOutFilter.setCasServerUrlPrefix("https://localhost:8443/cas");
+ singleSignOutFilter.setCasServerUrlPrefix("https://localhost:6443/cas");
singleSignOutFilter.setIgnoreInitConfiguration(true);
return singleSignOutFilter;
}
diff --git a/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java
similarity index 100%
rename from cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java
rename to cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java
diff --git a/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java
similarity index 100%
rename from cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java
rename to cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java
diff --git a/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java
similarity index 100%
rename from cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java
rename to cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java
diff --git a/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java
similarity index 100%
rename from cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java
rename to cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java
diff --git a/cas-secured-app/src/main/resources/application.properties b/cas/cas-secured-app/src/main/resources/application.properties
similarity index 100%
rename from cas-secured-app/src/main/resources/application.properties
rename to cas/cas-secured-app/src/main/resources/application.properties
diff --git a/cas-secured-app/src/main/resources/templates/auth/logout.ftl b/cas/cas-secured-app/src/main/resources/templates/auth/logout.ftl
similarity index 100%
rename from cas-secured-app/src/main/resources/templates/auth/logout.ftl
rename to cas/cas-secured-app/src/main/resources/templates/auth/logout.ftl
diff --git a/cas-secured-app/src/main/resources/templates/index.ftl b/cas/cas-secured-app/src/main/resources/templates/index.ftl
similarity index 100%
rename from cas-secured-app/src/main/resources/templates/index.ftl
rename to cas/cas-secured-app/src/main/resources/templates/index.ftl
diff --git a/cas-secured-app/src/main/resources/templates/secure/index.ftl b/cas/cas-secured-app/src/main/resources/templates/secure/index.ftl
similarity index 100%
rename from cas-secured-app/src/main/resources/templates/secure/index.ftl
rename to cas/cas-secured-app/src/main/resources/templates/secure/index.ftl
diff --git a/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationTests.java b/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java
similarity index 84%
rename from cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationTests.java
rename to cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java
index 09dbaf0c61..2f2644e2ea 100644
--- a/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationTests.java
+++ b/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java
@@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
-public class CasSecuredAppApplicationTests {
+public class CasSecuredAppApplicationIntegrationTest {
@Test
public void contextLoads() {
diff --git a/cas-server/.gitignore b/cas/cas-server/.gitignore
similarity index 100%
rename from cas-server/.gitignore
rename to cas/cas-server/.gitignore
diff --git a/cas-server/LICENSE.txt b/cas/cas-server/LICENSE.txt
similarity index 100%
rename from cas-server/LICENSE.txt
rename to cas/cas-server/LICENSE.txt
diff --git a/cas-server/README.md b/cas/cas-server/README.md
similarity index 100%
rename from cas-server/README.md
rename to cas/cas-server/README.md
diff --git a/cas-server/build.cmd b/cas/cas-server/build.cmd
similarity index 100%
rename from cas-server/build.cmd
rename to cas/cas-server/build.cmd
diff --git a/cas-server/build.sh b/cas/cas-server/build.sh
similarity index 100%
rename from cas-server/build.sh
rename to cas/cas-server/build.sh
diff --git a/cas-server/etc/cas/config/application.yml b/cas/cas-server/etc/cas/config/application.yml
similarity index 100%
rename from cas-server/etc/cas/config/application.yml
rename to cas/cas-server/etc/cas/config/application.yml
diff --git a/cas-server/etc/cas/config/cas.properties b/cas/cas-server/etc/cas/config/cas.properties
similarity index 100%
rename from cas-server/etc/cas/config/cas.properties
rename to cas/cas-server/etc/cas/config/cas.properties
diff --git a/cas-server/etc/cas/config/log4j2.xml b/cas/cas-server/etc/cas/config/log4j2.xml
similarity index 100%
rename from cas-server/etc/cas/config/log4j2.xml
rename to cas/cas-server/etc/cas/config/log4j2.xml
diff --git a/cas-server/maven/maven-wrapper.properties b/cas/cas-server/maven/maven-wrapper.properties
similarity index 100%
rename from cas-server/maven/maven-wrapper.properties
rename to cas/cas-server/maven/maven-wrapper.properties
diff --git a/cas-server/mvnw b/cas/cas-server/mvnw
similarity index 100%
rename from cas-server/mvnw
rename to cas/cas-server/mvnw
diff --git a/cas-server/mvnw.bat b/cas/cas-server/mvnw.bat
similarity index 100%
rename from cas-server/mvnw.bat
rename to cas/cas-server/mvnw.bat
diff --git a/cas-server/pom.xml b/cas/cas-server/pom.xml
similarity index 100%
rename from cas-server/pom.xml
rename to cas/cas-server/pom.xml
diff --git a/cas-server/src/main/resources/application.properties b/cas/cas-server/src/main/resources/application.properties
similarity index 90%
rename from cas-server/src/main/resources/application.properties
rename to cas/cas-server/src/main/resources/application.properties
index 2d5e9a7277..018fd351ff 100644
--- a/cas-server/src/main/resources/application.properties
+++ b/cas/cas-server/src/main/resources/application.properties
@@ -2,9 +2,9 @@
# CAS Server Context Configuration
#
server.context-path=/cas
-server.port=8443
+server.port=6443
-server.ssl.key-store=file:/etc/cas/thekeystore
+server.ssl.key-store=classpath:/etc/cas/thekeystore
server.ssl.key-store-password=changeit
server.ssl.key-password=changeit
# server.ssl.ciphers=
@@ -40,6 +40,12 @@ spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
+##
+#CAS CONFIG LOCATION
+#
+cas.standalone.config=classpath:/etc/cas/config
+
+
##
# CAS Cloud Bus Configuration
#
@@ -82,6 +88,7 @@ spring.thymeleaf.mode=HTML
# CAS Log4j Configuration
#
# logging.config=file:/etc/cas/log4j2.xml
+
server.context-parameters.isLog4jAutoInitializationDisabled=true
##
@@ -102,11 +109,12 @@ cas.authn.jdbc.query[0].sql=SELECT * FROM users WHERE email = ?
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].user=root
-cas.authn.jdbc.query[0].password=
+cas.authn.jdbc.query[0].password=root
cas.authn.jdbc.query[0].ddlAuto=none
-cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
+#cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
+cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver
cas.authn.jdbc.query[0].fieldPassword=password
-cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT
+cas.authn.jdbc.query[0].passwordEncoder.type=NONE
##
diff --git a/cas-server/src/main/resources/cas.properties b/cas/cas-server/src/main/resources/cas.properties
similarity index 89%
rename from cas-server/src/main/resources/cas.properties
rename to cas/cas-server/src/main/resources/cas.properties
index be2babcd14..f80f22fc11 100644
--- a/cas-server/src/main/resources/cas.properties
+++ b/cas/cas-server/src/main/resources/cas.properties
@@ -1,16 +1,15 @@
-cas.server.name: https://localhost:8443
-cas.server.prefix: https://localhost:8443/cas
+cas.server.name: https://localhost:6443
+cas.server.prefix: https://localhost:643/cas
cas.adminPagesSecurity.ip=127\.0\.0\.1
-logging.config: file:/etc/cas/config/log4j2.xml
-
cas.serviceRegistry.initFromJson=true
cas.serviceRegistry.config.location=classpath:/services
cas.authn.accept.users=
cas.authn.accept.name=
+
#CAS Database Authentication Property
# cas.authn.jdbc.query[0].healthQuery=
diff --git a/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql b/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql
new file mode 100644
index 0000000000..79a4a48a82
--- /dev/null
+++ b/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql
@@ -0,0 +1,16 @@
+-- Dumping database structure for test
+CREATE DATABASE IF NOT EXISTS `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
+USE `test`;
+
+-- Dumping structure for table test.users
+CREATE TABLE IF NOT EXISTS `users` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `email` varchar(50) DEFAULT NULL,
+ `password` text DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+
+/*!40000 ALTER TABLE `users` DISABLE KEYS */;
+INSERT INTO `users` (`id`, `email`, `password`) VALUES
+ (1, 'test@test.com', 'Mellon');
+/*!40000 ALTER TABLE `users` ENABLE KEYS */;
\ No newline at end of file
diff --git a/cas/cas-server/src/main/resources/etc/cas/config/application.yml b/cas/cas-server/src/main/resources/etc/cas/config/application.yml
new file mode 100644
index 0000000000..be1f7c3edd
--- /dev/null
+++ b/cas/cas-server/src/main/resources/etc/cas/config/application.yml
@@ -0,0 +1,2 @@
+info:
+ description: CAS Configuration
\ No newline at end of file
diff --git a/cas/cas-server/src/main/resources/etc/cas/config/cas.properties b/cas/cas-server/src/main/resources/etc/cas/config/cas.properties
new file mode 100644
index 0000000000..47a1477308
--- /dev/null
+++ b/cas/cas-server/src/main/resources/etc/cas/config/cas.properties
@@ -0,0 +1,7 @@
+cas.server.name: https://cas.example.org:8443
+cas.server.prefix: https://cas.example.org:8443/cas
+
+cas.adminPagesSecurity.ip=127\.0\.0\.1
+
+logging.config: file:/etc/cas/config/log4j2.xml
+# cas.serviceRegistry.config.location: classpath:/services
diff --git a/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml b/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml
new file mode 100644
index 0000000000..53b30b4228
--- /dev/null
+++ b/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+ .
+
+ warn
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cas/cas-server/src/main/resources/etc/cas/thekeystore b/cas/cas-server/src/main/resources/etc/cas/thekeystore
new file mode 100644
index 0000000000..86170dff16
Binary files /dev/null and b/cas/cas-server/src/main/resources/etc/cas/thekeystore differ
diff --git a/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt b/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt
new file mode 100644
index 0000000000..5bd9d5baba
Binary files /dev/null and b/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt differ
diff --git a/cas-server/src/main/resources/services/casSecuredApp.json b/cas/cas-server/src/main/resources/services/casSecuredApp.json
similarity index 100%
rename from cas-server/src/main/resources/services/casSecuredApp.json
rename to cas/cas-server/src/main/resources/services/casSecuredApp.json
diff --git a/core-java-8/README.md b/core-java-8/README.md
index 690bd48ed5..540a32b0ba 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -30,3 +30,5 @@
- [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap)
- [Merging Streams in Java](http://www.baeldung.com/java-merge-streams)
- [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception)
+- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones)
+- [Copy a File with Java](http://www.baeldung.com/java-copy-file)
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
new file mode 100644
index 0000000000..034e6785a4
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
@@ -0,0 +1,5 @@
+package com.baeldung.annotations;
+
+@Deprecated
+class ClassWithAnnotation {
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
new file mode 100644
index 0000000000..6f5da03b74
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
@@ -0,0 +1,9 @@
+package com.baeldung.annotations;
+
+class ClassWithDeprecatedMethod {
+
+ @Deprecated
+ static void deprecatedMethod() {
+
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
new file mode 100644
index 0000000000..cfa91f5951
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
@@ -0,0 +1,11 @@
+package com.baeldung.annotations;
+
+class ClassWithSafeVarargs {
+
+ @SafeVarargs
+ final void iterateOverVarargs(T... args) {
+ for (T x : args) {
+ // do stuff with x
+ }
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
new file mode 100644
index 0000000000..fe22ec1c24
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
@@ -0,0 +1,9 @@
+package com.baeldung.annotations;
+
+class ClassWithSuppressWarnings {
+
+ @SuppressWarnings("deprecation")
+ void useDeprecatedMethod() {
+ ClassWithDeprecatedMethod.deprecatedMethod(); // no warning is generated here
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java b/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java
new file mode 100644
index 0000000000..4f16b27281
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java
@@ -0,0 +1,8 @@
+package com.baeldung.annotations;
+
+@FunctionalInterface
+interface IntConsumer {
+
+ void accept(Integer number);
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/Interval.java b/core-java-8/src/main/java/com/baeldung/annotations/Interval.java
new file mode 100644
index 0000000000..f73e6e5b14
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/Interval.java
@@ -0,0 +1,8 @@
+package com.baeldung.annotations;
+
+import java.lang.annotation.Repeatable;
+
+@Repeatable(Intervals.class)
+@interface Interval {
+ int hour() default 1;
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java b/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java
new file mode 100644
index 0000000000..2e11de8215
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java
@@ -0,0 +1,9 @@
+package com.baeldung.annotations;
+
+public class IntervalUsage {
+
+ @Interval(hour = 17)
+ @Interval(hour = 13)
+ void doPeriodicCleanup() {
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java b/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java
new file mode 100644
index 0000000000..af469f18cc
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java
@@ -0,0 +1,5 @@
+package com.baeldung.annotations;
+
+@interface Intervals {
+ Interval[] value();
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java
new file mode 100644
index 0000000000..6e71f446b0
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java
@@ -0,0 +1,11 @@
+package com.baeldung.annotations;
+
+import java.lang.annotation.*;
+
+@Inherited
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.LOCAL_VARIABLE, ElementType.FIELD})
+@interface MyAnnotation {
+
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
new file mode 100644
index 0000000000..37f40a624e
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
@@ -0,0 +1,16 @@
+package com.baeldung.annotations;
+
+class MyAnnotationTarget {
+
+ // this is OK
+ @MyAnnotation
+ String someField;
+
+ // @MyAnnotation <- this is invalid usage!
+ void doSomething() {
+
+ // this also works
+ @MyAnnotation
+ String localVariable;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java b/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java
new file mode 100644
index 0000000000..a4385bc786
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java
@@ -0,0 +1,6 @@
+package com.baeldung.annotations;
+
+interface MyOperation {
+
+ void perform();
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java b/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java
new file mode 100644
index 0000000000..e6a8ce76d3
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java
@@ -0,0 +1,9 @@
+package com.baeldung.annotations;
+
+class MyOperationImpl implements MyOperation {
+
+ @Override
+ public void perform() {
+
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/prime/PrimeGenerator.java b/core-java-8/src/main/java/com/baeldung/prime/PrimeGenerator.java
new file mode 100644
index 0000000000..750807ce77
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/prime/PrimeGenerator.java
@@ -0,0 +1,59 @@
+package com.baeldung.prime;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class PrimeGenerator {
+ public static List sieveOfEratosthenes(int n) {
+ final boolean prime[] = new boolean[n + 1];
+ Arrays.fill(prime, true);
+
+ for (int p = 2; p * p <= n; p++) {
+ if (prime[p]) {
+ for (int i = p * 2; i <= n; i += p)
+ prime[i] = false;
+ }
+ }
+
+ final List primes = new LinkedList<>();
+ for (int i = 2; i <= n; i++) {
+ if (prime[i])
+ primes.add(i);
+ }
+ return primes;
+ }
+
+ public static List primeNumbersBruteForce(int max) {
+ final List primeNumbers = new LinkedList();
+ for (int i = 2; i <= max; i++) {
+ if (isPrimeBruteForce(i)) {
+ primeNumbers.add(i);
+ }
+ }
+ return primeNumbers;
+ }
+
+ private static boolean isPrimeBruteForce(int x) {
+ for (int i = 2; i < x; i++) {
+ if (x % i == 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static List primeNumbersTill(int max) {
+ return IntStream.rangeClosed(2, max)
+ .filter(x -> isPrime(x))
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ private static boolean isPrime(int x) {
+ return IntStream.rangeClosed(2, (int) (Math.sqrt(x)))
+ .allMatch(n -> x % n != 0);
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
new file mode 100644
index 0000000000..3a1016c63b
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
@@ -0,0 +1,55 @@
+package com.baeldung.timezonedisplay;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class TimezoneDisplay {
+
+ public enum OffsetBase {
+ GMT, UTC
+ }
+
+ public List getTimeZoneList(OffsetBase base) {
+ Set availableZoneIds = ZoneId.getAvailableZoneIds();
+
+ LocalDateTime now = LocalDateTime.now();
+ return availableZoneIds
+ .stream()
+ .map(ZoneId::of)
+ .sorted(new ZoneComparator())
+ .map(id -> String.format("(%s%s) %s", base, getOffset(now, id), id.getId()))
+ .collect(Collectors.toList());
+ }
+
+ private String getOffset(LocalDateTime dateTime, ZoneId id) {
+ return dateTime
+ .atZone(id)
+ .getOffset()
+ .getId()
+ .replace("Z", "+00:00");
+ }
+
+ private class ZoneComparator implements Comparator {
+
+ @Override
+ public int compare(ZoneId zoneId1, ZoneId zoneId2) {
+ LocalDateTime now = LocalDateTime.now();
+
+ ZoneOffset offset1 = now
+ .atZone(zoneId1)
+ .getOffset();
+
+ ZoneOffset offset2 = now
+ .atZone(zoneId2)
+ .getOffset();
+
+ return offset1.compareTo(offset2);
+ }
+ }
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
new file mode 100644
index 0000000000..aa9f84e21a
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
@@ -0,0 +1,18 @@
+package com.baeldung.timezonedisplay;
+
+import java.util.List;
+
+public class TimezoneDisplayApp {
+
+ public static void main(String... args) {
+ TimezoneDisplay display = new TimezoneDisplay();
+
+ System.out.println("Time zones in UTC:");
+ List utc = display.getTimeZoneList(TimezoneDisplay.OffsetBase.UTC);
+ utc.forEach(System.out::println);
+
+ System.out.println("Time zones in GMT:");
+ List gmt = display.getTimeZoneList(TimezoneDisplay.OffsetBase.GMT);
+ gmt.forEach(System.out::println);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/prime/PrimeGeneratorTest.java b/core-java-8/src/test/java/com/baeldung/prime/PrimeGeneratorTest.java
new file mode 100644
index 0000000000..e53e1c183e
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/prime/PrimeGeneratorTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.prime;
+
+import static com.baeldung.prime.PrimeGenerator.*;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class PrimeGeneratorTest {
+ @Test
+ public void whenBruteForced_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersBruteForce(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenOptimized_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersTill(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenSieveOfEratosthenes_returnsSuccessfully() {
+ final List primeNumbers = sieveOfEratosthenes(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+}
diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java
new file mode 100644
index 0000000000..c794c57e87
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java
@@ -0,0 +1,39 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+
+/**
+ * Class which shows a way to convert java.util.Date into java.time.LocalDate.
+ *
+ * @author abialas
+ *
+ */
+public class DateToLocalDateConverter {
+
+ public static LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
+ return dateToConvert.toInstant()
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate();
+ }
+
+ public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
+ return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
+ }
+
+ public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
+ return Instant.ofEpochMilli(dateToConvert.getTime())
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate();
+ }
+
+ public static LocalDate convertToLocalDate(Date dateToConvert) {
+ return LocalDate.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault());
+ }
+
+}
diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java
new file mode 100644
index 0000000000..17ca5b1122
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java
@@ -0,0 +1,39 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+/**
+ * Class which shows a way to convert java.util.Date into java.time.LocalDateTime.
+ *
+ * @author abialas
+ *
+ */
+public class DateToLocalDateTimeConverter {
+
+ public static LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
+ return dateToConvert.toInstant()
+ .atZone(ZoneId.systemDefault())
+ .toLocalDateTime();
+ }
+
+ public static LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
+ return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime();
+ }
+
+ public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
+ return Instant.ofEpochMilli(dateToConvert.getTime())
+ .atZone(ZoneId.systemDefault())
+ .toLocalDateTime();
+ }
+
+ public static LocalDateTime convertToLocalDateTime(Date dateToConvert) {
+ return LocalDateTime.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault());
+ }
+
+}
diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java
new file mode 100644
index 0000000000..f219dcf038
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java
@@ -0,0 +1,27 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+/**
+ * Class which shows different ways of converting java.time.LocalDateTime into java.util.Date.
+ *
+ * @author abialas
+ *
+ */
+public class LocalDateTimeToDateConverter {
+
+ public static Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
+ return java.sql.Timestamp.valueOf(dateToConvert);
+ }
+
+ public static Date convertToDateViaInstant(LocalDateTime dateToConvert) {
+ return java.util.Date.from(dateToConvert.atZone(ZoneId.systemDefault())
+ .toInstant());
+ }
+
+}
diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java
new file mode 100644
index 0000000000..f9893da5d0
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java
@@ -0,0 +1,28 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+
+/**
+ * Class which shows different ways of converting java.time.LocalDate into java.util.Date.
+ *
+ * @author abialas
+ *
+ */
+public class LocalDateToDateConverter {
+
+ public static Date convertToDateViaSqlDate(LocalDate dateToConvert) {
+ return java.sql.Date.valueOf(dateToConvert);
+ }
+
+ public static Date convertToDateViaInstant(LocalDate dateToConvert) {
+ return java.util.Date.from(dateToConvert.atStartOfDay()
+ .atZone(ZoneId.systemDefault())
+ .toInstant());
+ }
+
+}
diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java
new file mode 100644
index 0000000000..ab69bba359
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java
@@ -0,0 +1,89 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDate;
+import java.time.temporal.ChronoField;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.junit.Test;
+
+import com.baeldung.java9.datetime.DateToLocalDateConverter;
+
+/**
+ * JUnits for {@link DateToLocalDateConverter} class.
+ *
+ * @author abialas
+ *
+ */
+public class DateToLocalDateConverterTest {
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertViaInstant() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaInstant(dateToConvert);
+
+ // then
+ assertEquals(2010, localDate.get(ChronoField.YEAR));
+ assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertViaMiliseconds() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaMilisecond(dateToConvert);
+
+ // then
+ assertEquals(2010, localDate.get(ChronoField.YEAR));
+ assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertViaSqlDate() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaSqlDate(dateToConvert);
+
+ // then
+ assertEquals(2010, localDate.get(ChronoField.YEAR));
+ assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertToLocalDate() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDate localDateTime = DateToLocalDateConverter.convertToLocalDate(dateToConvert);
+
+ // then
+ assertEquals(2010, localDateTime.get(ChronoField.YEAR));
+ assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH));
+ }
+
+}
diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java
new file mode 100644
index 0000000000..97c70ee5ac
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java
@@ -0,0 +1,97 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoField;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.junit.Test;
+
+import com.baeldung.java9.datetime.DateToLocalDateTimeConverter;
+
+/**
+ * JUnits for {@link DateToLocalDateTimeConverter} class.
+ *
+ * @author abialas
+ *
+ */
+public class DateToLocalDateTimeConverterTest {
+
+ @Test
+ public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10, 8, 20);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaInstant(dateToConvert);
+
+ // then
+ assertEquals(2010, localDateTime.get(ChronoField.YEAR));
+ assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH));
+ assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY));
+ assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010time8hour20minWhenConvertViaMiliseconds() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10, 8, 20);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaMilisecond(dateToConvert);
+
+ // then
+ assertEquals(2010, localDateTime.get(ChronoField.YEAR));
+ assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH));
+ assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY));
+ assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010time8hour20minWhenConvertViaSqlTimestamp() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10, 8, 20);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaSqlTimestamp(dateToConvert);
+
+ // then
+ assertEquals(2010, localDateTime.get(ChronoField.YEAR));
+ assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH));
+ assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY));
+ assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010time8hour20minWhenConvertToLocalDateTime() {
+ // given
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2010, 10, 10, 8, 20);
+ Date dateToConvert = calendar.getTime();
+
+ // when
+ LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTime(dateToConvert);
+
+ // then
+ assertEquals(2010, localDateTime.get(ChronoField.YEAR));
+ assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR));
+ assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH));
+ assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY));
+ assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR));
+ }
+
+}
diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java
new file mode 100644
index 0000000000..2c6898381f
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java
@@ -0,0 +1,61 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.junit.Test;
+
+/**
+ *
+ * JUnits for {@link LocalDateTimeToDateConverter} class.
+ *
+ * @author abialas
+ *
+ */
+public class LocalDateTimeToDateConverterTest {
+
+ @Test
+ public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() {
+ // given
+ LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20);
+
+ // when
+ Date date = LocalDateTimeToDateConverter.convertToDateViaInstant(dateToConvert);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ // then
+ assertEquals(2010, calendar.get(Calendar.YEAR));
+ assertEquals(10, calendar.get(Calendar.MONTH));
+ assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(8, calendar.get(Calendar.HOUR));
+ assertEquals(20, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertViaSqlTimestamp() {
+ // given
+ LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20);
+
+ // when
+ Date date = LocalDateTimeToDateConverter.convertToDateViaSqlTimestamp(dateToConvert);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ // then
+ assertEquals(2010, calendar.get(Calendar.YEAR));
+ assertEquals(10, calendar.get(Calendar.MONTH));
+ assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(8, calendar.get(Calendar.HOUR));
+ assertEquals(20, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+ }
+
+}
diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java
new file mode 100644
index 0000000000..7f20d5d2d2
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java
@@ -0,0 +1,55 @@
+/**
+ *
+ */
+package com.baeldung.java9.datetime;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDate;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.junit.Test;
+
+/**
+ *
+ * JUnits for {@link LocalDateToDateConverter} class.
+ *
+ * @author abialas
+ *
+ */
+public class LocalDateToDateConverterTest {
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertViaInstant() {
+ // given
+ LocalDate dateToConvert = LocalDate.of(2010, 11, 10);
+
+ // when
+ Date date = LocalDateToDateConverter.convertToDateViaInstant(dateToConvert);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ // then
+ assertEquals(2010, calendar.get(Calendar.YEAR));
+ assertEquals(10, calendar.get(Calendar.MONTH));
+ assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH));
+ }
+
+ @Test
+ public void shouldReturn10thNovember2010WhenConvertViaSqlDate() {
+ // given
+ LocalDate dateToConvert = LocalDate.of(2010, 11, 10);
+
+ // when
+ Date date = LocalDateToDateConverter.convertToDateViaSqlDate(dateToConvert);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ // then
+ assertEquals(2010, calendar.get(Calendar.YEAR));
+ assertEquals(10, calendar.get(Calendar.MONTH));
+ assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH));
+ }
+
+}
diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md
index f1d95482d4..48c5f2a50c 100644
--- a/core-java-concurrency/README.md
+++ b/core-java-concurrency/README.md
@@ -30,3 +30,4 @@
- [Guide to Volatile Keyword in Java](http://www.baeldung.com/java-volatile)
- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent)
- [Semaphores in Java](http://www.baeldung.com/java-semaphore)
+- [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread)
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
new file mode 100644
index 0000000000..4d87978070
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.daemon;
+
+public class NewThread extends Thread {
+
+ public void run() {
+ long startTime = System.currentTimeMillis();
+ while (true) {
+ for (int i = 0; i < 10; i++) {
+ System.out.println("New Thread is running..." + i);
+ }
+
+ // prevent the Thread to run forever. It will finish it's execution after 2 seconds
+ if (System.currentTimeMillis() - startTime > 2000) {
+ Thread.currentThread().interrupt();
+ break;
+ }
+ }
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java
new file mode 100644
index 0000000000..16d9aa4c9f
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java
@@ -0,0 +1,39 @@
+package com.baeldung.concurrent.executorservice;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+
+public class DelayedCallable implements Callable {
+
+ private String name;
+ private long period;
+ private CountDownLatch latch;
+
+ public DelayedCallable(String name, long period, CountDownLatch latch) {
+ this(name, period);
+ this.latch = latch;
+ }
+
+ public DelayedCallable(String name, long period) {
+ this.name = name;
+ this.period = period;
+ }
+
+ public String call() {
+
+ try {
+ Thread.sleep(period);
+
+ if (latch != null) {
+ latch.countDown();
+ }
+
+ } catch (InterruptedException ex) {
+ // handle exception
+ ex.printStackTrace();
+ Thread.currentThread().interrupt();
+ }
+
+ return name;
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java
new file mode 100644
index 0000000000..0e72821a88
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java
@@ -0,0 +1,52 @@
+package com.baeldung.concurrent.stopping;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class ControlSubThread implements Runnable {
+
+ private Thread worker;
+ private int interval = 100;
+ private AtomicBoolean running = new AtomicBoolean(false);
+ private AtomicBoolean stopped = new AtomicBoolean(true);
+
+
+ public ControlSubThread(int sleepInterval) {
+ interval = sleepInterval;
+ }
+
+ public void start() {
+ worker = new Thread(this);
+ worker.start();
+ }
+
+ public void stop() {
+ running.set(false);
+ }
+
+ public void interrupt() {
+ running.set(false);
+ worker.interrupt();
+ }
+
+ boolean isRunning() {
+ return running.get();
+ }
+
+ boolean isStopped() {
+ return stopped.get();
+ }
+
+ public void run() {
+ running.set(true);
+ stopped.set(false);
+ while (running.get()) {
+ try {
+ Thread.sleep(interval);
+ } catch (InterruptedException e) {
+ // no-op, just loop again
+ }
+ // do something
+ }
+ stopped.set(true);
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
new file mode 100644
index 0000000000..9b850c4153
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
@@ -0,0 +1,33 @@
+package com.baeldung.concurrent.waitandnotify;
+
+public class Data {
+ private String packet;
+
+ // True if receiver should wait
+ // False if sender should wait
+ private boolean transfer = true;
+
+ public synchronized String receive() {
+ while (transfer) {
+ try {
+ wait();
+ } catch (InterruptedException e) {}
+ }
+ transfer = true;
+
+ notifyAll();
+ return packet;
+ }
+
+ public synchronized void send(String packet) {
+ while (!transfer) {
+ try {
+ wait();
+ } catch (InterruptedException e) {}
+ }
+ transfer = false;
+
+ this.packet = packet;
+ notifyAll();
+ }
+}
\ No newline at end of file
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
new file mode 100644
index 0000000000..d4fd1574c6
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
@@ -0,0 +1,12 @@
+package com.baeldung.concurrent.waitandnotify;
+
+public class NetworkDriver {
+ public static void main(String[] args) {
+ Data data = new Data();
+ Thread sender = new Thread(new Sender(data));
+ Thread receiver = new Thread(new Receiver(data));
+
+ sender.start();
+ receiver.start();
+ }
+}
\ No newline at end of file
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
new file mode 100644
index 0000000000..63f48b8031
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
@@ -0,0 +1,25 @@
+package com.baeldung.concurrent.waitandnotify;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+public class Receiver implements Runnable {
+ private Data load;
+
+ public Receiver(Data load) {
+ this.load = load;
+ }
+
+ public void run() {
+ for(String receivedMessage = load.receive();
+ !"End".equals(receivedMessage) ;
+ receivedMessage = load.receive()) {
+
+ System.out.println(receivedMessage);
+
+ //Thread.sleep() to mimic heavy server-side processing
+ try {
+ Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000));
+ } catch (InterruptedException e) {}
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
new file mode 100644
index 0000000000..b7d782c3f5
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
@@ -0,0 +1,30 @@
+package com.baeldung.concurrent.waitandnotify;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+public class Sender implements Runnable {
+ private Data data;
+
+ public Sender(Data data) {
+ this.data = data;
+ }
+
+ public void run() {
+ String packets[] = {
+ "First packet",
+ "Second packet",
+ "Third packet",
+ "Fourth packet",
+ "End"
+ };
+
+ for (String packet : packets) {
+ data.send(packet);
+
+ //Thread.sleep() to mimic heavy server-side processing
+ try {
+ Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000));
+ } catch (InterruptedException e) {}
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java
new file mode 100644
index 0000000000..3ca69d8847
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.concurrent.daemon;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class DaemonThreadTest {
+
+ @Test
+ @Ignore
+ public void whenCallIsDaemon_thenCorrect() {
+ NewThread daemonThread = new NewThread();
+ NewThread userThread = new NewThread();
+ daemonThread.setDaemon(true);
+ daemonThread.start();
+ userThread.start();
+
+ assertTrue(daemonThread.isDaemon());
+ assertFalse(userThread.isDaemon());
+ }
+
+ @Test(expected = IllegalThreadStateException.class)
+ @Ignore
+ public void givenUserThread_whenSetDaemonWhileRunning_thenIllegalThreadStateException() {
+ NewThread daemonThread = new NewThread();
+ daemonThread.start();
+ daemonThread.setDaemon(true);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java
new file mode 100644
index 0000000000..17b71aa35b
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java
@@ -0,0 +1,215 @@
+package com.baeldung.concurrent.executorservice;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.*;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.fail;
+
+public class WaitingForThreadsToFinishTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishTest.class);
+ private final static ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10);
+
+ public void awaitTerminationAfterShutdown(ExecutorService threadPool) {
+ threadPool.shutdown();
+ try {
+ if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
+ threadPool.shutdownNow();
+ }
+ } catch (InterruptedException ex) {
+ threadPool.shutdownNow();
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ @Test
+ public void givenMultipleThreads_whenUsingCountDownLatch_thenMainShoudWaitForAllToFinish() {
+
+ ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10);
+
+ try {
+ long startTime = System.currentTimeMillis();
+
+ // create a CountDownLatch that waits for the 2 threads to finish
+ CountDownLatch latch = new CountDownLatch(2);
+
+ for (int i = 0; i < 2; i++) {
+ WORKER_THREAD_POOL.submit(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ latch.countDown();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ Thread.currentThread().interrupt();
+ }
+ }
+ });
+ }
+
+ // wait for the latch to be decremented by the two threads
+ latch.await();
+
+ long processingTime = System.currentTimeMillis() - startTime;
+ assertTrue(processingTime >= 1000);
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
+ }
+
+ @Test
+ public void givenMultipleThreads_whenInvokeAll_thenMainThreadShouldWaitForAllToFinish() {
+
+ ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10);
+
+ List> callables = Arrays.asList(
+ new DelayedCallable("fast thread", 100),
+ new DelayedCallable("slow thread", 3000));
+
+ try {
+ long startProcessingTime = System.currentTimeMillis();
+ List> futures = WORKER_THREAD_POOL.invokeAll(callables);
+
+ awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
+
+ try {
+ WORKER_THREAD_POOL.submit(new Callable() {
+ @Override
+ public String call() throws Exception {
+ fail("This thread should have been rejected !");
+ Thread.sleep(1000000);
+ return null;
+ }
+ });
+ } catch (RejectedExecutionException ex) {
+ //
+ }
+
+ long totalProcessingTime = System.currentTimeMillis() - startProcessingTime;
+ assertTrue(totalProcessingTime >= 3000);
+
+ String firstThreadResponse = futures.get(0)
+ .get();
+ assertTrue("First response should be from the fast thread", "fast thread".equals(firstThreadResponse));
+
+ String secondThreadResponse = futures.get(1)
+ .get();
+ assertTrue("Last response should be from the slow thread", "slow thread".equals(secondThreadResponse));
+
+ } catch (ExecutionException | InterruptedException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Test
+ public void givenMultipleThreads_whenUsingCompletionService_thenMainThreadShouldWaitForAllToFinish() {
+
+ CompletionService service = new ExecutorCompletionService<>(WORKER_THREAD_POOL);
+
+ List> callables = Arrays.asList(
+ new DelayedCallable("fast thread", 100),
+ new DelayedCallable("slow thread", 3000));
+
+ for (Callable callable : callables) {
+ service.submit(callable);
+ }
+
+ try {
+
+ long startProcessingTime = System.currentTimeMillis();
+
+ Future future = service.take();
+ String firstThreadResponse = future.get();
+ long totalProcessingTime = System.currentTimeMillis() - startProcessingTime;
+
+ assertTrue("First response should be from the fast thread", "fast thread".equals(firstThreadResponse));
+ assertTrue(totalProcessingTime >= 100 && totalProcessingTime < 1000);
+ LOG.debug("Thread finished after: " + totalProcessingTime + " milliseconds");
+
+ future = service.take();
+ String secondThreadResponse = future.get();
+ totalProcessingTime = System.currentTimeMillis() - startProcessingTime;
+
+ assertTrue("Last response should be from the slow thread", "slow thread".equals(secondThreadResponse));
+ assertTrue(totalProcessingTime >= 3000 && totalProcessingTime < 4000);
+ LOG.debug("Thread finished after: " + totalProcessingTime + " milliseconds");
+
+ } catch (ExecutionException | InterruptedException ex) {
+ ex.printStackTrace();
+ } finally {
+ awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
+ }
+ }
+
+ @Test
+ public void givenMultipleThreads_whenUsingCompletableFutures_thenMainThreadShouldWaitForAllToFinish() {
+
+ CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {
+
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ return "Hello";
+ });
+
+ CompletableFuture future2 = CompletableFuture.supplyAsync(() -> {
+
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ return "Beautiful";
+ });
+
+ CompletableFuture future3 = CompletableFuture.supplyAsync(() -> {
+
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ return "World";
+ });
+
+ long startProcessingTime = System.currentTimeMillis();
+ CompletableFuture combinedFuture = CompletableFuture.allOf(future1, future2, future3);
+ combinedFuture.join();
+
+ long totalProcessingTime = System.currentTimeMillis() - startProcessingTime;
+ assertTrue(totalProcessingTime >= 5000 && totalProcessingTime < 6000);
+
+ LOG.debug("Responses from all threads are available after " + totalProcessingTime + " milliseconds");
+
+ try {
+ String thread1Response = future1.get();
+ assertTrue(thread1Response.equals("Hello"));
+
+ String thread2Response = future2.get();
+ assertTrue(thread2Response.equals("Beautiful"));
+
+ String thread3Response = future3.get();
+ assertTrue(thread3Response.equals("World"));
+
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java
new file mode 100644
index 0000000000..2a51f83e2b
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java
@@ -0,0 +1,133 @@
+package com.baeldung.concurrent.runnable;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.RandomUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RunnableVsThreadLiveTest {
+
+ private static Logger log =
+ LoggerFactory.getLogger(RunnableVsThreadLiveTest.class);
+
+ private static ExecutorService executorService;
+
+ @BeforeClass
+ public static void setup() {
+ executorService = Executors.newCachedThreadPool();
+ }
+
+ @Test
+ public void givenARunnable_whenRunIt_thenResult() throws Exception{
+ Thread thread = new Thread(new SimpleRunnable(
+ "SimpleRunnable executed using Thread"));
+ thread.start();
+ thread.join();
+ }
+
+ @Test
+ public void givenARunnable_whenSubmitToES_thenResult() throws Exception{
+
+ executorService.submit(new SimpleRunnable(
+ "SimpleRunnable executed using ExecutorService")).get();
+ }
+
+ @Test
+ public void givenARunnableLambda_whenSubmitToES_thenResult()
+ throws Exception{
+
+ executorService.submit(()->
+ log.info("Lambda runnable executed!!!")).get();
+ }
+
+ @Test
+ public void givenAThread_whenRunIt_thenResult() throws Exception{
+ Thread thread = new SimpleThread(
+ "SimpleThread executed using Thread");
+ thread.start();
+ thread.join();
+ }
+
+ @Test
+ public void givenAThread_whenSubmitToES_thenResult() throws Exception{
+
+ executorService.submit(new SimpleThread(
+ "SimpleThread executed using ExecutorService")).get();
+ }
+
+ @Test
+ public void givenACallable_whenSubmitToES_thenResult() throws Exception {
+
+ Future future = executorService.submit(
+ new SimpleCallable());
+ log.info("Result from callable: {}", future.get());
+ }
+
+ @Test
+ public void givenACallableAsLambda_whenSubmitToES_thenResult()
+ throws Exception {
+
+ Future future = executorService.submit(() -> RandomUtils.nextInt(0, 100));
+
+ log.info("Result from callable: {}", future.get());
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ if ( executorService != null && !executorService.isShutdown()) {
+ executorService.shutdown();
+ }
+ }
+}
+
+class SimpleThread extends Thread{
+
+ private static final Logger log =
+ LoggerFactory.getLogger(SimpleThread.class);
+
+ private String message;
+
+ SimpleThread(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public void run() {
+ log.info(message);
+ }
+}
+
+class SimpleRunnable implements Runnable {
+
+ private static final Logger log =
+ LoggerFactory.getLogger(SimpleRunnable.class);
+
+ private String message;
+
+ SimpleRunnable(String message) {
+ this.message = message;
+ }
+
+
+ @Override
+ public void run() {
+ log.info(message);
+ }
+}
+
+class SimpleCallable implements Callable {
+
+ @Override
+ public Integer call() throws Exception {
+ return RandomUtils.nextInt(0, 100);
+ }
+
+}
+
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadTest.java
new file mode 100644
index 0000000000..70854f013f
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.concurrent.stopping;
+
+import com.jayway.awaitility.Awaitility;
+import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
+
+import static com.jayway.awaitility.Awaitility.await;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class StopThreadTest {
+
+ @Test
+ public void whenStoppedThreadIsStopped() throws InterruptedException {
+
+ int interval = 100;
+
+ ControlSubThread controlSubThread = new ControlSubThread(interval);
+ controlSubThread.start();
+
+ // Give things a chance to get set up
+ Thread.sleep(interval);
+ assertTrue(controlSubThread.isRunning());
+ assertFalse(controlSubThread.isStopped());
+
+ // Stop it and make sure the flags have been reversed
+ controlSubThread.stop();
+ await()
+ .until(() -> assertTrue(controlSubThread.isStopped()));
+ }
+
+ @Test
+ public void whenInterruptedThreadIsStopped() throws InterruptedException {
+
+ int interval = 5000;
+
+ ControlSubThread controlSubThread = new ControlSubThread(interval);
+ controlSubThread.start();
+
+ // Give things a chance to get set up
+ Thread.sleep(100);
+ assertTrue(controlSubThread.isRunning());
+ assertFalse(controlSubThread.isStopped());
+
+ // Stop it and make sure the flags have been reversed
+ controlSubThread.interrupt();
+
+ // Wait less than the time we would normally sleep, and make sure we exited.
+ Awaitility.await()
+ .atMost(interval/ 10, TimeUnit.MILLISECONDS)
+ .until(controlSubThread::isStopped);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
new file mode 100644
index 0000000000..49f4313e9d
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.concurrent.waitandnotify;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NetworkIntegrationTest {
+
+ private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
+ private String expected;
+
+ @Before
+ public void setUpStreams() {
+ System.setOut(new PrintStream(outContent));
+ System.setErr(new PrintStream(errContent));
+ }
+
+ @Before
+ public void setUpExpectedOutput() {
+ StringWriter expectedStringWriter = new StringWriter();
+
+ PrintWriter printWriter = new PrintWriter(expectedStringWriter);
+ printWriter.println("First packet");
+ printWriter.println("Second packet");
+ printWriter.println("Third packet");
+ printWriter.println("Fourth packet");
+ printWriter.close();
+
+ expected = expectedStringWriter.toString();
+ }
+
+ @After
+ public void cleanUpStreams() {
+ System.setOut(null);
+ System.setErr(null);
+ }
+
+ @Test
+ public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() {
+ Data data = new Data();
+ Thread sender = new Thread(new Sender(data));
+ Thread receiver = new Thread(new Receiver(data));
+
+ sender.start();
+ receiver.start();
+
+ //wait for sender and receiver to finish before we test against expected
+ try {
+ sender.join();
+ receiver.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ assertEquals(expected, outContent.toString());
+ }
+}
diff --git a/core-java-sun/.gitignore b/core-java-sun/.gitignore
new file mode 100644
index 0000000000..3de4cc647e
--- /dev/null
+++ b/core-java-sun/.gitignore
@@ -0,0 +1,26 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+*.txt
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-sun/README.md b/core-java-sun/README.md
new file mode 100644
index 0000000000..9cf8b26f1b
--- /dev/null
+++ b/core-java-sun/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java Cookbooks and Examples
+
+### Relevant Articles:
+- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
diff --git a/core-java-sun/pom.xml b/core-java-sun/pom.xml
new file mode 100644
index 0000000000..3997f47d19
--- /dev/null
+++ b/core-java-sun/pom.xml
@@ -0,0 +1,489 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-sun
+ 0.1.0-SNAPSHOT
+ jar
+
+ core-java-sun
+
+
+
+
+
+ net.sourceforge.collections
+ collections-generic
+ ${collections-generic.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
+
+
+ org.decimal4j
+ decimal4j
+ ${decimal4j.version}
+
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+
+
+
+ org.unix4j
+ unix4j-command
+ ${unix4j.version}
+
+
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
+
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+ test
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+ org.hamcrest
+ hamcrest-core
+ ${org.hamcrest.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+
+ org.javamoney
+ moneta
+ 1.1
+
+
+
+ org.owasp.esapi
+ esapi
+ 2.1.0.1
+
+
+
+ com.sun.messaging.mq
+ fscontext
+ ${fscontext.version}
+
+
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.19
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.19
+
+
+ org.springframework
+ spring-web
+ 4.3.4.RELEASE
+
+
+ com.sun
+ tools
+ 1.8.0
+ system
+ ${java.home}/../lib/tools.jar
+
+
+
+
+ core-java
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.8.5
+
+
+ 1.7.21
+ 1.1.7
+
+
+ 23.0
+ 3.5
+ 1.55
+ 1.10
+ 3.6.1
+ 1.0.3
+ 2.5
+ 4.1
+ 4.01
+ 0.4
+ 1.8.7
+ 1.16.12
+ 4.6-b01
+ 1.13
+ 0.6.5
+ 0.9.0
+
+
+ 1.3
+ 4.12
+ 2.8.9
+ 3.6.1
+ 1.7.0
+
+
+ 3.6.0
+ 2.19.1
+
+
\ No newline at end of file
diff --git a/mockito/.gitignore b/core-java-sun/src/main/java/com/baeldung/.gitignore
similarity index 100%
rename from mockito/.gitignore
rename to core-java-sun/src/main/java/com/baeldung/.gitignore
diff --git a/core-java-sun/src/main/java/com/baeldung/README.md b/core-java-sun/src/main/java/com/baeldung/README.md
new file mode 100644
index 0000000000..51809b2882
--- /dev/null
+++ b/core-java-sun/src/main/java/com/baeldung/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java)
diff --git a/core-java-sun/src/main/java/com/baeldung/javac/Positive.java b/core-java-sun/src/main/java/com/baeldung/javac/Positive.java
new file mode 100644
index 0000000000..443b866fea
--- /dev/null
+++ b/core-java-sun/src/main/java/com/baeldung/javac/Positive.java
@@ -0,0 +1,9 @@
+package com.baeldung.javac;
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.PARAMETER})
+public @interface Positive {
+}
diff --git a/core-java-sun/src/main/java/com/baeldung/javac/SampleJavacPlugin.java b/core-java-sun/src/main/java/com/baeldung/javac/SampleJavacPlugin.java
new file mode 100644
index 0000000000..eb48d6a216
--- /dev/null
+++ b/core-java-sun/src/main/java/com/baeldung/javac/SampleJavacPlugin.java
@@ -0,0 +1,123 @@
+package com.baeldung.javac;
+
+import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.VariableTree;
+import com.sun.source.util.*;
+import com.sun.tools.javac.api.BasicJavacTask;
+import com.sun.tools.javac.code.TypeTag;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.TreeMaker;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.Name;
+import com.sun.tools.javac.util.Names;
+
+import javax.tools.JavaCompiler;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.sun.tools.javac.util.List.nil;
+
+/**
+ * A {@link JavaCompiler javac} plugin which inserts {@code >= 0} checks into resulting {@code *.class} files
+ * for numeric method parameters marked by {@link Positive}
+ */
+public class SampleJavacPlugin implements Plugin {
+
+ public static final String NAME = "MyPlugin";
+
+ private static Set TARGET_TYPES = new HashSet<>(Arrays.asList(
+ // Use only primitive types for simplicity
+ byte.class.getName(), short.class.getName(), char.class.getName(),
+ int.class.getName(), long.class.getName(), float.class.getName(), double.class.getName()));
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public void init(JavacTask task, String... args) {
+ Context context = ((BasicJavacTask) task).getContext();
+ task.addTaskListener(new TaskListener() {
+ @Override
+ public void started(TaskEvent e) {
+ }
+
+ @Override
+ public void finished(TaskEvent e) {
+ if (e.getKind() != TaskEvent.Kind.PARSE) {
+ return;
+ }
+ e.getCompilationUnit()
+ .accept(new TreeScanner() {
+ @Override
+ public Void visitMethod(MethodTree method, Void v) {
+ List parametersToInstrument = method.getParameters()
+ .stream()
+ .filter(SampleJavacPlugin.this::shouldInstrument)
+ .collect(Collectors.toList());
+ if (!parametersToInstrument.isEmpty()) {
+ // There is a possible case that more than one argument is marked by @Positive,
+ // as the checks are added to the method's body beginning, we process parameters RTL
+ // to ensure correct order.
+ Collections.reverse(parametersToInstrument);
+ parametersToInstrument.forEach(p -> addCheck(method, p, context));
+ }
+ // There is a possible case that there is a nested class declared in a method's body,
+ // hence, we want to proceed with method body AST as well.
+ return super.visitMethod(method, v);
+ }
+ }, null);
+ }
+ });
+ }
+
+ private boolean shouldInstrument(VariableTree parameter) {
+ return TARGET_TYPES.contains(parameter.getType().toString())
+ && parameter.getModifiers().getAnnotations()
+ .stream()
+ .anyMatch(a -> Positive.class.getSimpleName().equals(a.getAnnotationType().toString()));
+ }
+
+ private void addCheck(MethodTree method, VariableTree parameter, Context context) {
+ JCTree.JCIf check = createCheck(parameter, context);
+ JCTree.JCBlock body = (JCTree.JCBlock) method.getBody();
+ body.stats = body.stats.prepend(check);
+ }
+
+ private static JCTree.JCIf createCheck(VariableTree parameter, Context context) {
+ TreeMaker factory = TreeMaker.instance(context);
+ Names symbolsTable = Names.instance(context);
+
+ return factory.at(((JCTree) parameter).pos)
+ .If(factory.Parens(createIfCondition(factory, symbolsTable, parameter)),
+ createIfBlock(factory, symbolsTable, parameter),
+ null);
+ }
+
+ private static JCTree.JCBinary createIfCondition(TreeMaker factory, Names symbolsTable, VariableTree parameter) {
+ Name parameterId = symbolsTable.fromString(parameter.getName().toString());
+ return factory.Binary(JCTree.Tag.LE,
+ factory.Ident(parameterId),
+ factory.Literal(TypeTag.INT, 0));
+ }
+
+ private static JCTree.JCBlock createIfBlock(TreeMaker factory, Names symbolsTable, VariableTree parameter) {
+ String parameterName = parameter.getName().toString();
+ Name parameterId = symbolsTable.fromString(parameterName);
+
+ String errorMessagePrefix = String.format("Argument '%s' of type %s is marked by @%s but got '",
+ parameterName, parameter.getType(), Positive.class.getSimpleName());
+ String errorMessageSuffix = "' for it";
+
+ return factory.Block(0, com.sun.tools.javac.util.List.of(
+ factory.Throw(
+ factory.NewClass(null, nil(),
+ factory.Ident(symbolsTable.fromString(IllegalArgumentException.class.getSimpleName())),
+ com.sun.tools.javac.util.List.of(factory.Binary(JCTree.Tag.PLUS,
+ factory.Binary(JCTree.Tag.PLUS, factory.Literal(TypeTag.CLASS, errorMessagePrefix),
+ factory.Ident(parameterId)),
+ factory.Literal(TypeTag.CLASS, errorMessageSuffix))), null))));
+ }
+
+}
diff --git a/core-java-sun/src/main/resources/log4j.properties b/core-java-sun/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..621cf01735
--- /dev/null
+++ b/core-java-sun/src/main/resources/log4j.properties
@@ -0,0 +1,6 @@
+log4j.rootLogger=DEBUG, A1
+
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git a/mockito/src/main/resources/logback.xml b/core-java-sun/src/main/resources/logback.xml
similarity index 100%
rename from mockito/src/main/resources/logback.xml
rename to core-java-sun/src/main/resources/logback.xml
diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SampleJavacPluginIntegrationTest.java b/core-java-sun/src/test/java/com/baeldung/javac/SampleJavacPluginIntegrationTest.java
new file mode 100644
index 0000000000..b877038add
--- /dev/null
+++ b/core-java-sun/src/test/java/com/baeldung/javac/SampleJavacPluginIntegrationTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.javac;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class SampleJavacPluginIntegrationTest {
+
+ private static final String CLASS_TEMPLATE =
+ "package com.baeldung.javac;\n" +
+ "\n" +
+ "public class Test {\n" +
+ " public static %1$s service(@Positive %1$s i) {\n" +
+ " return i;\n" +
+ " }\n" +
+ "}\n" +
+ "";
+
+ private TestCompiler compiler = new TestCompiler();
+ private TestRunner runner = new TestRunner();
+
+ @Test(expected = IllegalArgumentException.class)
+ public void givenInt_whenNegative_thenThrowsException() throws Throwable {
+ compileAndRun(double.class,-1);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void givenInt_whenZero_thenThrowsException() throws Throwable {
+ compileAndRun(int.class,0);
+ }
+
+ @Test
+ public void givenInt_whenPositive_thenSuccess() throws Throwable {
+ assertEquals(1, compileAndRun(int.class, 1));
+ }
+
+ private Object compileAndRun(Class> argumentType, Object argument) throws Throwable {
+ String qualifiedClassName = "com.baeldung.javac.Test";
+ byte[] byteCode = compiler.compile(qualifiedClassName, String.format(CLASS_TEMPLATE, argumentType.getName()));
+ return runner.run(byteCode, qualifiedClassName, "service", new Class[] {argumentType}, argument);
+ }
+}
diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SimpleClassFile.java b/core-java-sun/src/test/java/com/baeldung/javac/SimpleClassFile.java
new file mode 100644
index 0000000000..2c8e66e6e3
--- /dev/null
+++ b/core-java-sun/src/test/java/com/baeldung/javac/SimpleClassFile.java
@@ -0,0 +1,26 @@
+package com.baeldung.javac;
+
+import javax.tools.SimpleJavaFileObject;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+
+/** Holds compiled byte code in a byte array */
+public class SimpleClassFile extends SimpleJavaFileObject {
+
+ private ByteArrayOutputStream out;
+
+ public SimpleClassFile(URI uri) {
+ super(uri, Kind.CLASS);
+ }
+
+ @Override
+ public OutputStream openOutputStream() throws IOException {
+ return out = new ByteArrayOutputStream();
+ }
+
+ public byte[] getCompiledBinaries() {
+ return out.toByteArray();
+ }
+}
\ No newline at end of file
diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SimpleFileManager.java b/core-java-sun/src/test/java/com/baeldung/javac/SimpleFileManager.java
new file mode 100644
index 0000000000..346f240754
--- /dev/null
+++ b/core-java-sun/src/test/java/com/baeldung/javac/SimpleFileManager.java
@@ -0,0 +1,34 @@
+package com.baeldung.javac;
+
+import javax.tools.*;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+/** Adapts {@link SimpleClassFile} to the {@link JavaCompiler} */
+public class SimpleFileManager extends ForwardingJavaFileManager {
+
+ private final List compiled = new ArrayList<>();
+
+ public SimpleFileManager(StandardJavaFileManager delegate) {
+ super(delegate);
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForOutput(Location location,
+ String className,
+ JavaFileObject.Kind kind,
+ FileObject sibling)
+ {
+ SimpleClassFile result = new SimpleClassFile(URI.create("string://" + className));
+ compiled.add(result);
+ return result;
+ }
+
+ /**
+ * @return compiled binaries processed by the current class
+ */
+ public List getCompiled() {
+ return compiled;
+ }
+}
\ No newline at end of file
diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SimpleSourceFile.java b/core-java-sun/src/test/java/com/baeldung/javac/SimpleSourceFile.java
new file mode 100644
index 0000000000..9287b1a0dd
--- /dev/null
+++ b/core-java-sun/src/test/java/com/baeldung/javac/SimpleSourceFile.java
@@ -0,0 +1,23 @@
+package com.baeldung.javac;
+
+import javax.tools.SimpleJavaFileObject;
+import java.net.URI;
+
+/** Exposes given test source to the compiler. */
+public class SimpleSourceFile extends SimpleJavaFileObject {
+
+ private final String content;
+
+ public SimpleSourceFile(String qualifiedClassName, String testSource) {
+ super(URI.create(String.format("file://%s%s",
+ qualifiedClassName.replaceAll("\\.", "/"),
+ Kind.SOURCE.extension)),
+ Kind.SOURCE);
+ content = testSource;
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return content;
+ }
+}
\ No newline at end of file
diff --git a/core-java-sun/src/test/java/com/baeldung/javac/TestCompiler.java b/core-java-sun/src/test/java/com/baeldung/javac/TestCompiler.java
new file mode 100644
index 0000000000..ee40e563a3
--- /dev/null
+++ b/core-java-sun/src/test/java/com/baeldung/javac/TestCompiler.java
@@ -0,0 +1,35 @@
+package com.baeldung.javac;
+
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+
+public class TestCompiler {
+ public byte[] compile(String qualifiedClassName, String testSource) {
+ StringWriter output = new StringWriter();
+
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ SimpleFileManager fileManager = new SimpleFileManager(compiler.getStandardFileManager(
+ null,
+ null,
+ null
+ ));
+ List compilationUnits = singletonList(new SimpleSourceFile(qualifiedClassName, testSource));
+ List arguments = new ArrayList<>();
+ arguments.addAll(asList("-classpath", System.getProperty("java.class.path"),
+ "-Xplugin:" + SampleJavacPlugin.NAME));
+ JavaCompiler.CompilationTask task = compiler.getTask(output,
+ fileManager,
+ null,
+ arguments,
+ null,
+ compilationUnits);
+ task.call();
+ return fileManager.getCompiled().iterator().next().getCompiledBinaries();
+ }
+}
diff --git a/core-java-sun/src/test/java/com/baeldung/javac/TestRunner.java b/core-java-sun/src/test/java/com/baeldung/javac/TestRunner.java
new file mode 100644
index 0000000000..6a03ad4918
--- /dev/null
+++ b/core-java-sun/src/test/java/com/baeldung/javac/TestRunner.java
@@ -0,0 +1,41 @@
+package com.baeldung.javac;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class TestRunner {
+
+ public Object run(byte[] byteCode,
+ String qualifiedClassName,
+ String methodName,
+ Class>[] argumentTypes,
+ Object... args)
+ throws Throwable
+ {
+ ClassLoader classLoader = new ClassLoader() {
+ @Override
+ protected Class> findClass(String name) throws ClassNotFoundException {
+ return defineClass(name, byteCode, 0, byteCode.length);
+ }
+ };
+ Class> clazz;
+ try {
+ clazz = classLoader.loadClass(qualifiedClassName);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("Can't load compiled test class", e);
+ }
+
+ Method method;
+ try {
+ method = clazz.getMethod(methodName, argumentTypes);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException("Can't find the 'main()' method in the compiled test class", e);
+ }
+
+ try {
+ return method.invoke(null, args);
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ }
+ }
+}
diff --git a/spring-hibernate3/.gitignore b/core-java-sun/src/test/resources/.gitignore
similarity index 100%
rename from spring-hibernate3/.gitignore
rename to core-java-sun/src/test/resources/.gitignore
diff --git a/core-java/README.md b/core-java/README.md
index b4b8d9062e..1feee4126e 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -114,4 +114,10 @@
- [StringBuilder and StringBuffer in Java](http://www.baeldung.com/java-string-builder-string-buffer)
- [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int)
- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns)
+- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
+- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
+- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
+- [Guide to Java String Pool](http://www.baeldung.com/java-string-pool)
+- [Copy a File with Java](http://www.baeldung.com/java-copy-file)
+- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index bb3958f36c..2c4cbfc37b 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -181,11 +181,6 @@
2.1.0.1
-
- com.sun.messaging.mq
- fscontext
- ${fscontext.version}
-
com.codepoetics
protonpack
@@ -249,7 +244,7 @@
**/*LongRunningUnitTest.java
**/*ManualTest.java
- true
+
@@ -453,7 +448,7 @@
1.1.7
- 22.0
+ 23.0
3.5
1.55
1.10
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java
new file mode 100644
index 0000000000..0ba6c342d9
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java
@@ -0,0 +1,78 @@
+package com.baeldung.array;
+
+import java.util.Arrays;
+
+import org.apache.commons.lang.ArrayUtils;
+
+public class ArrayInitializer {
+
+ static int[] initializeArrayInLoop() {
+ int array[] = new int[5];
+ for (int i = 0; i < array.length; i++) {
+ array[i] = i + 2;
+ }
+ return array;
+ }
+
+ static int[][] initializeMultiDimensionalArrayInLoop() {
+ int array[][] = new int[2][5];
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 5; j++) {
+ array[i][j] = j + 1;
+ }
+ }
+
+ return array;
+ }
+
+ static String[] initializeArrayAtTimeOfDeclarationMethod1() {
+ String array[] = new String[] { "Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" };
+ return array;
+ }
+
+ static int[] initializeArrayAtTimeOfDeclarationMethod2() {
+ int[] array = new int[] { 1, 2, 3, 4, 5 };
+ return array;
+ }
+
+ static int[] initializeArrayAtTimeOfDeclarationMethod3() {
+ int array[] = { 1, 2, 3, 4, 5 };
+ return array;
+ }
+
+ static long[] initializeArrayUsingArraysFill() {
+ long array[] = new long[5];
+ Arrays.fill(array, 30);
+ return array;
+ }
+
+ static int[] initializeArrayRangeUsingArraysFill() {
+ int array[] = new int[5];
+ Arrays.fill(array, 0, 3, -50);
+ return array;
+ }
+
+ static int[] initializeArrayUsingArraysCopy() {
+ int array[] = { 1, 2, 3, 4, 5 };
+ int[] copy = Arrays.copyOf(array, 5);
+ return copy;
+ }
+
+ static int[] initializeLargerArrayUsingArraysCopy() {
+ int array[] = { 1, 2, 3, 4, 5 };
+ int[] copy = Arrays.copyOf(array, 6);
+ return copy;
+ }
+
+ static int[] initializeArrayUsingArraysSetAll() {
+ int[] array = new int[20];
+
+ Arrays.setAll(array, p -> p > 9 ? 0 : p);
+ return array;
+ }
+
+ static char[] initializeArrayUsingArraysUtilClone() {
+ char[] array = new char[] { 'a', 'b', 'c' };
+ return ArrayUtils.clone(array);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
new file mode 100644
index 0000000000..ce85b487c1
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
@@ -0,0 +1,138 @@
+package com.baeldung.breakcontinue;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * @author Santosh
+ *
+ */
+public class BreakContinue {
+
+ public static int unlabeledBreak() {
+ String searchName = "Wilson";
+ int counter = 0;
+ List names = Arrays.asList("John", "Peter", "Robert", "Wilson", "Anthony", "Donald", "Richard");
+
+ for (String name : names) {
+ counter++;
+ if (name.equalsIgnoreCase(searchName)) {
+ break;
+ }
+ }
+
+ return counter;
+ }
+
+ public static int unlabeledBreakNestedLoops() {
+ String searchName = "Wilson";
+ int counter = 0;
+ Map> nameMap = new HashMap<>();
+ nameMap.put("Grade1", Arrays.asList("John", "Peter", "Robert", "Wilson"));
+ nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Richard", "Arnold"));
+ nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Stephen", "Ryan"));
+
+ Iterator>> iterator = nameMap.entrySet()
+ .iterator();
+ Entry> entry = null;
+ List names = null;
+ while (iterator.hasNext()) {
+ entry = iterator.next();
+ names = entry.getValue();
+ for (String name : names) {
+ if (name.equalsIgnoreCase(searchName)) {
+ counter++;
+ break;
+ }
+ }
+ }
+
+ return counter;
+ }
+
+ public static int labeledBreak() {
+ String searchName = "Wilson";
+ int counter = 0;
+ Map> nameMap = new HashMap<>();
+ nameMap.put("Grade1", Arrays.asList("John", "Peter", "Robert", "Wilson"));
+ nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Richard", "Arnold"));
+ nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Stephen", "Ryan"));
+
+ Iterator>> iterator = nameMap.entrySet()
+ .iterator();
+ Entry> entry = null;
+ List names = null;
+ compare:
+ while (iterator.hasNext()) {
+ entry = iterator.next();
+ names = entry.getValue();
+ for (String name : names) {
+ if (name.equalsIgnoreCase(searchName)) {
+ counter++;
+ break compare;
+ }
+ }
+ }
+
+ return counter;
+ }
+
+ public static int unlabeledContinue() {
+ String searchName = "Wilson";
+ int counter = 0;
+ Map> nameMap = new HashMap<>();
+ nameMap.put("Grade1", Arrays.asList("John", "Wilson", "Robert", "Wilson"));
+ nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Wilson", "Arnold"));
+ nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Wilson", "Ryan"));
+
+ Iterator>> iterator = nameMap.entrySet()
+ .iterator();
+ Entry> entry = null;
+ List names = null;
+ while (iterator.hasNext()) {
+ entry = iterator.next();
+ names = entry.getValue();
+ for (String name : names) {
+ if (!name.equalsIgnoreCase(searchName)) {
+ continue;
+ }
+
+ counter++;
+ }
+ }
+
+ return counter;
+ }
+
+ public static int labeledContinue() {
+ String searchName = "Wilson";
+ int counter = 0;
+ Map> nameMap = new HashMap<>();
+ nameMap.put("Grade1", Arrays.asList("John", "Wilson", "Robert", "Wilson"));
+ nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Wilson", "Arnold"));
+ nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Wilson", "Ryan"));
+
+ Iterator>> iterator = nameMap.entrySet()
+ .iterator();
+ Entry> entry = null;
+ List names = null;
+ compare:
+ while (iterator.hasNext()) {
+ entry = iterator.next();
+ names = entry.getValue();
+ for (String name : names) {
+ if (name.equalsIgnoreCase(searchName)) {
+ counter++;
+ continue compare;
+ }
+ }
+ }
+
+ return counter;
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparable/Player.java b/core-java/src/main/java/com/baeldung/comparable/Player.java
new file mode 100644
index 0000000000..68a78980f3
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparable/Player.java
@@ -0,0 +1,51 @@
+package com.baeldung.comparable;
+
+public class Player implements Comparable {
+
+ private int ranking;
+
+ private String name;
+
+ private int age;
+
+ public Player(int ranking, String name, int age) {
+ this.ranking = ranking;
+ this.name = name;
+ this.age = age;
+ }
+
+ public int getRanking() {
+ return ranking;
+ }
+
+ public void setRanking(int ranking) {
+ this.ranking = ranking;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+ @Override
+ public int compareTo(Player otherPlayer) {
+ return (this.getRanking() - otherPlayer.getRanking());
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java b/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java
new file mode 100644
index 0000000000..a9b883f579
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java
@@ -0,0 +1,25 @@
+package com.baeldung.comparable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PlayerSorter {
+
+ public static void main(String[] args) {
+
+ List footballTeam = new ArrayList();
+ Player player1 = new Player(59, "John", 20);
+ Player player2 = new Player(67, "Roger", 22);
+ Player player3 = new Player(45, "Steven", 24);
+ footballTeam.add(player1);
+ footballTeam.add(player2);
+ footballTeam.add(player3);
+
+ System.out.println("Before Sorting : " + footballTeam);
+ Collections.sort(footballTeam);
+ System.out.println("After Sorting : " + footballTeam);
+
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparator/Player.java b/core-java/src/main/java/com/baeldung/comparator/Player.java
new file mode 100644
index 0000000000..e6e9ee0db6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparator/Player.java
@@ -0,0 +1,46 @@
+package com.baeldung.comparator;
+
+public class Player {
+
+ private int ranking;
+
+ private String name;
+
+ private int age;
+
+ public Player(int ranking, String name, int age) {
+ this.ranking = ranking;
+ this.name = name;
+ this.age = age;
+ }
+
+ public int getRanking() {
+ return ranking;
+ }
+
+ public void setRanking(int ranking) {
+ this.ranking = ranking;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
new file mode 100644
index 0000000000..d2e7ca1f42
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
@@ -0,0 +1,12 @@
+package com.baeldung.comparator;
+
+import java.util.Comparator;
+
+public class PlayerAgeComparator implements Comparator {
+
+ @Override
+ public int compare(Player firstPlayer, Player secondPlayer) {
+ return (firstPlayer.getAge() - secondPlayer.getAge());
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
new file mode 100644
index 0000000000..3bbbcddb80
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
@@ -0,0 +1,27 @@
+package com.baeldung.comparator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PlayerAgeSorter {
+
+ public static void main(String[] args) {
+
+ List footballTeam = new ArrayList();
+ Player player1 = new Player(59, "John", 22);
+ Player player2 = new Player(67, "Roger", 20);
+ Player player3 = new Player(45, "Steven", 24);
+ footballTeam.add(player1);
+ footballTeam.add(player2);
+ footballTeam.add(player3);
+
+ System.out.println("Before Sorting : " + footballTeam);
+ //Instance of PlayerAgeComparator
+ PlayerAgeComparator playerComparator = new PlayerAgeComparator();
+ Collections.sort(footballTeam, playerComparator);
+ System.out.println("After Sorting by age : " + footballTeam);
+
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
new file mode 100644
index 0000000000..2d42698843
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
@@ -0,0 +1,12 @@
+package com.baeldung.comparator;
+
+import java.util.Comparator;
+
+public class PlayerRankingComparator implements Comparator {
+
+ @Override
+ public int compare(Player firstPlayer, Player secondPlayer) {
+ return (firstPlayer.getRanking() - secondPlayer.getRanking());
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
new file mode 100644
index 0000000000..581585fb7e
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
@@ -0,0 +1,27 @@
+package com.baeldung.comparator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PlayerRankingSorter {
+
+ public static void main(String[] args) {
+
+ List footballTeam = new ArrayList();
+ Player player1 = new Player(59, "John", 22);
+ Player player2 = new Player(67, "Roger", 20);
+ Player player3 = new Player(45, "Steven", 40);
+ footballTeam.add(player1);
+ footballTeam.add(player2);
+ footballTeam.add(player3);
+
+ System.out.println("Before Sorting : " + footballTeam);
+ //Instance of PlayerRankingComparator
+ PlayerRankingComparator playerComparator = new PlayerRankingComparator();
+ Collections.sort(footballTeam, playerComparator);
+ System.out.println("After Sorting by ranking : " + footballTeam);
+
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractFactory.java
new file mode 100644
index 0000000000..46d97d1a15
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractFactory.java
@@ -0,0 +1,6 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public interface AbstractFactory {
+ Animal getAnimal(String toyType) ;
+ Color getColor(String colorType);
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternDriver.java
new file mode 100644
index 0000000000..7ab166e16a
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternDriver.java
@@ -0,0 +1,18 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class AbstractPatternDriver {
+ public static void main(String[] args) {
+ AbstractFactory abstractFactory;
+
+ //creating a brown toy dog
+ abstractFactory = FactoryProvider.getFactory("Toy");
+ Animal toy = abstractFactory.getAnimal("Dog");
+
+ abstractFactory = FactoryProvider.getFactory("Color");
+ Color color = abstractFactory.getColor("Brown");
+
+ String result = "A " + toy.getType() + " with " + color.getColor() + " color " + toy.makeSound();
+
+ System.out.println(result);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Animal.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Animal.java
new file mode 100644
index 0000000000..59c1336053
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Animal.java
@@ -0,0 +1,6 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public interface Animal {
+ String getType();
+ String makeSound();
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AnimalFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AnimalFactory.java
new file mode 100644
index 0000000000..49583c3a98
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AnimalFactory.java
@@ -0,0 +1,21 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class AnimalFactory implements AbstractFactory {
+
+ @Override
+ public Animal getAnimal(String animalType) {
+ if ("Dog".equalsIgnoreCase(animalType)) {
+ return new Dog();
+ } else if ("Duck".equalsIgnoreCase(animalType)) {
+ return new Duck();
+ }
+
+ return null;
+ }
+
+ @Override
+ public Color getColor(String color) {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Brown.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Brown.java
new file mode 100644
index 0000000000..f251285ebf
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Brown.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class Brown implements Color {
+
+ @Override
+ public String getColor() {
+ return "brown";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Color.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Color.java
new file mode 100644
index 0000000000..897bb71f38
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Color.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public interface Color {
+ String getColor();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/ColorFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/ColorFactory.java
new file mode 100644
index 0000000000..8f7559ff27
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/ColorFactory.java
@@ -0,0 +1,21 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class ColorFactory implements AbstractFactory {
+
+ @Override
+ public Color getColor(String colorType) {
+ if ("Brown".equalsIgnoreCase(colorType)) {
+ return new Brown();
+ } else if ("White".equalsIgnoreCase(colorType)) {
+ return new White();
+ }
+
+ return null;
+ }
+
+ @Override
+ public Animal getAnimal(String toyType) {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Dog.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Dog.java
new file mode 100644
index 0000000000..002b5665d3
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Dog.java
@@ -0,0 +1,15 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class Dog implements Animal {
+
+ @Override
+ public String getType() {
+ return "Dog";
+ }
+
+ @Override
+ public String makeSound() {
+ return "Barks";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Duck.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Duck.java
new file mode 100644
index 0000000000..5603ad6eee
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Duck.java
@@ -0,0 +1,15 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class Duck implements Animal {
+
+ @Override
+ public String getType() {
+ return "Duck";
+ }
+
+ @Override
+ public String makeSound() {
+ return "Squeks";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/FactoryProvider.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/FactoryProvider.java
new file mode 100644
index 0000000000..fcbee1e6de
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/FactoryProvider.java
@@ -0,0 +1,15 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class FactoryProvider {
+ public static AbstractFactory getFactory(String choice){
+
+ if("Toy".equalsIgnoreCase(choice)){
+ return new AnimalFactory();
+ }
+ else if("Color".equalsIgnoreCase(choice)){
+ return new ColorFactory();
+ }
+
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/White.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/White.java
new file mode 100644
index 0000000000..62ef8048ea
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/White.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+public class White implements Color {
+
+ @Override
+ public String getColor() {
+ return "White";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BankAccount.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BankAccount.java
new file mode 100644
index 0000000000..355fa74895
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BankAccount.java
@@ -0,0 +1,64 @@
+package com.baeldung.designpatterns.creational.builder;
+
+public class BankAccount {
+ private String name;
+ private String accountNumber;
+ private String email;
+ private boolean newsletter;
+
+ //The constructor that takes a builder from which it will create object
+ //the access to this is only provided to builder
+ private BankAccount(BankAccountBuilder builder) {
+ this.name = builder.name;
+ this.accountNumber = builder.accountNumber;
+ this.email = builder.email;
+ this.newsletter = builder.newsletter;
+ }
+
+ public static class BankAccountBuilder {
+ private String name;
+ private String accountNumber;
+ private String email;
+ private boolean newsletter;
+
+ //All Mandatory parameters goes with this constructor
+ public BankAccountBuilder(String name, String accountNumber) {
+ this.name = name;
+ this.accountNumber = accountNumber;
+ }
+
+ //setters for optional parameters which returns this same builder
+ //to support fluent design
+ public BankAccountBuilder withEmail(String email) {
+ this.email = email;
+ return this;
+ }
+
+ public BankAccountBuilder wantNewsletter(boolean newsletter) {
+ this.newsletter = newsletter;
+ return this;
+ }
+
+ //the actual build method that prepares and returns a BankAccount object
+ public BankAccount build() {
+ return new BankAccount(this);
+ }
+ }
+
+ //getters
+ public String getName() {
+ return name;
+ }
+
+ public String getAccountNumber() {
+ return accountNumber;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public boolean isNewsletter() {
+ return newsletter;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BuilderPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BuilderPatternDriver.java
new file mode 100644
index 0000000000..d92a70e664
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BuilderPatternDriver.java
@@ -0,0 +1,16 @@
+package com.baeldung.designpatterns.creational.builder;
+
+public class BuilderPatternDriver {
+ public static void main(String[] args) {
+ BankAccount newAccount = new BankAccount
+ .BankAccountBuilder("Jon", "22738022275")
+ .withEmail("jon@example.com")
+ .wantNewsletter(true)
+ .build();
+
+ System.out.println("Name: " + newAccount.getName());
+ System.out.println("AccountNumber:" + newAccount.getAccountNumber());
+ System.out.println("Email: " + newAccount.getEmail());
+ System.out.println("Want News letter?: " + newAccount.isNewsletter());
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/FactoryDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/FactoryDriver.java
new file mode 100644
index 0000000000..64ee307bb8
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/FactoryDriver.java
@@ -0,0 +1,16 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class FactoryDriver {
+ public static void main(String[] args) {
+ Polygon p;
+ PolygonFactory factory = new PolygonFactory();
+
+ //get the shape which has 4 sides
+ p = factory.getPolygon(4);
+ System.out.println("The shape with 4 sides is a " + p.getType());
+
+ //get the shape which has 4 sides
+ p = factory.getPolygon(8);
+ System.out.println("The shape with 8 sides is a " + p.getType());
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Heptagon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Heptagon.java
new file mode 100644
index 0000000000..935fc2f04c
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Heptagon.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class Heptagon implements Polygon {
+
+ @Override
+ public String getType() {
+ return "Heptagon";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Octagon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Octagon.java
new file mode 100644
index 0000000000..fc62302dc8
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Octagon.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class Octagon implements Polygon {
+
+ @Override
+ public String getType() {
+ return "Octagon";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Pentagon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Pentagon.java
new file mode 100644
index 0000000000..65d109b10b
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Pentagon.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class Pentagon implements Polygon {
+
+ @Override
+ public String getType() {
+ return "Pentagon";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Polygon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Polygon.java
new file mode 100644
index 0000000000..8364e546b0
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Polygon.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public interface Polygon {
+ String getType();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/PolygonFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/PolygonFactory.java
new file mode 100644
index 0000000000..9f34fe77b9
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/PolygonFactory.java
@@ -0,0 +1,22 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class PolygonFactory {
+ public Polygon getPolygon(int numberOfSides) {
+ if(numberOfSides == 3) {
+ return new Triangle();
+ }
+ if(numberOfSides == 4) {
+ return new Square();
+ }
+ if(numberOfSides == 5) {
+ return new Pentagon();
+ }
+ if(numberOfSides == 7) {
+ return new Heptagon();
+ }
+ else if(numberOfSides == 8) {
+ return new Octagon();
+ }
+ return null;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Square.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Square.java
new file mode 100644
index 0000000000..805c1c9ae3
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Square.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class Square implements Polygon {
+
+ @Override
+ public String getType() {
+ return "Square";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Triangle.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Triangle.java
new file mode 100644
index 0000000000..8a8832d8a1
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Triangle.java
@@ -0,0 +1,10 @@
+package com.baeldung.designpatterns.creational.factory;
+
+public class Triangle implements Polygon {
+
+ @Override
+ public String getType() {
+ return "Triangle";
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/Singleton.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/Singleton.java
new file mode 100644
index 0000000000..1a5ac82c89
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/Singleton.java
@@ -0,0 +1,13 @@
+package com.baeldung.designpatterns.creational.singleton;
+
+public class Singleton {
+ private Singleton() {}
+
+ private static class SingletonHolder {
+ public static final Singleton instance = new Singleton();
+ }
+
+ public static Singleton getInstance() {
+ return SingletonHolder.instance;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/SingletonDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/SingletonDriver.java
new file mode 100644
index 0000000000..1955008d3e
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/SingletonDriver.java
@@ -0,0 +1,8 @@
+package com.baeldung.designpatterns.creational.singleton;
+
+public class SingletonDriver {
+ public static void main(String[] args) {
+ Singleton instance = Singleton.getInstance();
+ System.out.println(instance.toString());
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/java/nio/selector/EchoServer.java b/core-java/src/main/java/com/baeldung/java/nio/selector/EchoServer.java
index 2ed9a27c4c..7c1e291646 100644
--- a/core-java/src/main/java/com/baeldung/java/nio/selector/EchoServer.java
+++ b/core-java/src/main/java/com/baeldung/java/nio/selector/EchoServer.java
@@ -13,6 +13,8 @@ import java.util.Set;
public class EchoServer {
+ private static final String POISON_PILL = "POISON_PILL";
+
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverSocket = ServerSocketChannel.open();
@@ -30,23 +32,36 @@ public class EchoServer {
SelectionKey key = iter.next();
if (key.isAcceptable()) {
- SocketChannel client = serverSocket.accept();
- client.configureBlocking(false);
- client.register(selector, SelectionKey.OP_READ);
+ register(selector, serverSocket);
}
if (key.isReadable()) {
- SocketChannel client = (SocketChannel) key.channel();
- client.read(buffer);
- buffer.flip();
- client.write(buffer);
- buffer.clear();
+ answerWithEcho(buffer, key);
}
iter.remove();
}
}
}
+ private static void answerWithEcho(ByteBuffer buffer, SelectionKey key) throws IOException {
+ SocketChannel client = (SocketChannel) key.channel();
+ client.read(buffer);
+ if (new String(buffer.array()).trim().equals(POISON_PILL)) {
+ client.close();
+ System.out.println("Not accepting client messages anymore");
+ }
+
+ buffer.flip();
+ client.write(buffer);
+ buffer.clear();
+ }
+
+ private static void register(Selector selector, ServerSocketChannel serverSocket) throws IOException {
+ SocketChannel client = serverSocket.accept();
+ client.configureBlocking(false);
+ client.register(selector, SelectionKey.OP_READ);
+ }
+
public static Process start() throws IOException, InterruptedException {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
diff --git a/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java
new file mode 100644
index 0000000000..1b2e621b52
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java
@@ -0,0 +1,43 @@
+package com.baeldung.loops;
+
+public class LoopsInJava {
+
+ public int[] simple_for_loop() {
+ int[] arr = new int[5];
+ for (int i = 0; i < 5; i++) {
+ arr[i] = i;
+ System.out.println("Simple for loop: i - " + i);
+ }
+ return arr;
+ }
+
+ public int[] enhanced_for_each_loop() {
+ int[] intArr = { 0, 1, 2, 3, 4 };
+ int[] arr = new int[5];
+ for (int num : intArr) {
+ arr[num] = num;
+ System.out.println("Enhanced for-each loop: i - " + num);
+ }
+ return arr;
+ }
+
+ public int[] while_loop() {
+ int i = 0;
+ int[] arr = new int[5];
+ while (i < 5) {
+ arr[i] = i;
+ System.out.println("While loop: i - " + i++);
+ }
+ return arr;
+ }
+
+ public int[] do_while_loop() {
+ int i = 0;
+ int[] arr = new int[5];
+ do {
+ arr[i] = i;
+ System.out.println("Do-While loop: i - " + i++);
+ } while (i < 5);
+ return arr;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java
new file mode 100644
index 0000000000..7f2665ff2d
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java
@@ -0,0 +1,38 @@
+package com.baeldung.polymorphism;
+
+import java.awt.image.BufferedImage;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FileManager {
+
+ final static Logger logger = LoggerFactory.getLogger(FileManager.class);
+
+ public static void main(String[] args) {
+ GenericFile file1 = new TextFile("SampleTextFile", "This is a sample text content", "v1.0.0");
+ logger.info("File Info: \n" + file1.getFileInfo() + "\n");
+ ImageFile imageFile = new ImageFile("SampleImageFile", 200, 100, new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB).toString()
+ .getBytes(), "v1.0.0");
+ logger.info("File Info: \n" + imageFile.getFileInfo());
+ }
+
+ public static ImageFile createImageFile(String name, int height, int width, byte[] content, String version) {
+ ImageFile imageFile = new ImageFile(name, height, width, content, version);
+ logger.info("File 2 Info: \n" + imageFile.getFileInfo());
+ return imageFile;
+ }
+
+ public static GenericFile createTextFile(String name, String content, String version) {
+ GenericFile file1 = new TextFile(name, content, version);
+ logger.info("File 1 Info: \n" + file1.getFileInfo() + "\n");
+ return file1;
+ }
+
+ public static TextFile createTextFile2(String name, String content, String version) {
+ TextFile file1 = new TextFile(name, content, version);
+ logger.info("File 1 Info: \n" + file1.getFileInfo() + "\n");
+ return file1;
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java
new file mode 100644
index 0000000000..4075083c49
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java
@@ -0,0 +1,63 @@
+package com.baeldung.polymorphism;
+
+import java.util.Date;
+
+public class GenericFile {
+ private String name;
+ private String extension;
+ private Date dateCreated;
+ private String version;
+ private byte[] content;
+
+ public GenericFile() {
+ this.setDateCreated(new Date());
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getExtension() {
+ return extension;
+ }
+
+ public void setExtension(String extension) {
+ this.extension = extension;
+ }
+
+ public Date getDateCreated() {
+ return dateCreated;
+ }
+
+ public void setDateCreated(Date dateCreated) {
+ this.dateCreated = dateCreated;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public byte[] getContent() {
+ return content;
+ }
+
+ public void setContent(byte[] content) {
+ this.content = content;
+ }
+
+ public String getFileInfo() {
+ return "File Name: " + this.getName() + "\n" + "Extension: " + this.getExtension() + "\n" + "Date Created: " + this.getDateCreated() + "\n" + "Version: " + this.getVersion() + "\n";
+ }
+
+ public Object read() {
+ return content;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java
new file mode 100644
index 0000000000..ac72a40993
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java
@@ -0,0 +1,41 @@
+package com.baeldung.polymorphism;
+
+public class ImageFile extends GenericFile {
+ private int height;
+ private int width;
+
+ public ImageFile(String name, int height, int width, byte[] content, String version) {
+ this.setHeight(height);
+ this.setWidth(width);
+ this.setContent(content);
+ this.setName(name);
+ this.setVersion(version);
+ this.setExtension(".jpg");
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+ public String getFileInfo() {
+ return super.getFileInfo() + "Height: " + this.getHeight() + "\n" + "Width: " + this.getWidth();
+ }
+
+ public String read() {
+ return this.getContent()
+ .toString();
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java
new file mode 100644
index 0000000000..8280b4ee95
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java
@@ -0,0 +1,44 @@
+package com.baeldung.polymorphism;
+
+public class TextFile extends GenericFile {
+ private int wordCount;
+
+ public TextFile(String name, String content, String version) {
+ String[] words = content.split(" ");
+ this.setWordCount(words.length > 0 ? words.length : 1);
+ this.setContent(content.getBytes());
+ this.setName(name);
+ this.setVersion(version);
+ this.setExtension(".txt");
+ }
+
+ public int getWordCount() {
+ return wordCount;
+ }
+
+ public void setWordCount(int wordCount) {
+ this.wordCount = wordCount;
+ }
+
+ public String getFileInfo() {
+ return super.getFileInfo() + "Word Count: " + wordCount;
+ }
+
+ public String read() {
+ return this.getContent()
+ .toString();
+ }
+
+ public String read(int limit) {
+ return this.getContent()
+ .toString()
+ .substring(0, limit);
+ }
+
+ public String read(int start, int stop) {
+ return this.getContent()
+ .toString()
+ .substring(start, stop);
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
new file mode 100644
index 0000000000..4882ebe175
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
@@ -0,0 +1,43 @@
+package com.baeldung.timezonedisplay;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+
+public class TimezoneDisplayJava7 {
+
+ public enum OffsetBase {
+ GMT, UTC
+ }
+
+ public List getTimeZoneList(TimezoneDisplayJava7.OffsetBase base) {
+ String[] availableZoneIds = TimeZone.getAvailableIDs();
+ List result = new ArrayList<>(availableZoneIds.length);
+
+ for (String zoneId : availableZoneIds) {
+ TimeZone curTimeZone = TimeZone.getTimeZone(zoneId);
+
+ String offset = calculateOffset(curTimeZone.getRawOffset());
+
+ result.add(String.format("(%s%s) %s", base, offset, zoneId));
+ }
+
+ Collections.sort(result);
+
+ return result;
+ }
+
+ private String calculateOffset(int rawOffset) {
+ if (rawOffset == 0) {
+ return "+00:00";
+ }
+ long hours = TimeUnit.MILLISECONDS.toHours(rawOffset);
+ long minutes = TimeUnit.MILLISECONDS.toMinutes(rawOffset);
+ minutes = Math.abs(minutes - TimeUnit.HOURS.toMinutes(hours));
+
+ return String.format("%+03d:%02d", hours, Math.abs(minutes));
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
new file mode 100644
index 0000000000..9f20667660
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
@@ -0,0 +1,23 @@
+package com.baeldung.timezonedisplay;
+
+import java.util.List;
+
+public class TimezoneDisplayJava7App {
+
+ public static void main(String... args) {
+ TimezoneDisplayJava7 display = new TimezoneDisplayJava7();
+
+ System.out.println("Time zones in UTC:");
+ List utc = display.getTimeZoneList(TimezoneDisplayJava7.OffsetBase.UTC);
+ for (String timeZone : utc) {
+ System.out.println(timeZone);
+ }
+
+ System.out.println("Time zones in GMT:");
+ List gmt = display.getTimeZoneList(TimezoneDisplayJava7.OffsetBase.GMT);
+ for (String timeZone : gmt) {
+ System.out.println(timeZone);
+ }
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/util/StreamUtils.java b/core-java/src/main/java/com/baeldung/util/StreamUtils.java
new file mode 100644
index 0000000000..42f438732f
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/util/StreamUtils.java
@@ -0,0 +1,16 @@
+package com.baeldung.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+import org.apache.commons.io.IOUtils;
+
+public class StreamUtils {
+
+ public static String getStringFromInputStream(InputStream input) throws IOException {
+ StringWriter writer = new StringWriter();
+ IOUtils.copy(input, writer, "UTF-8");
+ return writer.toString();
+ }
+}
diff --git a/core-java/src/main/resources/META-INF/services/com.sun.source.util.Plugin b/core-java/src/main/resources/META-INF/services/com.sun.source.util.Plugin
new file mode 100644
index 0000000000..91fb6eb3b0
--- /dev/null
+++ b/core-java/src/main/resources/META-INF/services/com.sun.source.util.Plugin
@@ -0,0 +1 @@
+com.baeldung.javac.SampleJavacPlugin
\ No newline at end of file
diff --git a/core-java/src/main/resources/countries.properties b/core-java/src/main/resources/countries.properties
new file mode 100644
index 0000000000..e743b5a40b
--- /dev/null
+++ b/core-java/src/main/resources/countries.properties
@@ -0,0 +1,3 @@
+UK
+US
+Germany
diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java
new file mode 100644
index 0000000000..7265fa20e5
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/array/ArrayInitializerTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.array;
+
+import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod1;
+import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod2;
+import static com.baeldung.array.ArrayInitializer.initializeArrayAtTimeOfDeclarationMethod3;
+import static com.baeldung.array.ArrayInitializer.initializeArrayInLoop;
+import static com.baeldung.array.ArrayInitializer.initializeArrayRangeUsingArraysFill;
+import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysCopy;
+import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysFill;
+import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysSetAll;
+import static com.baeldung.array.ArrayInitializer.initializeArrayUsingArraysUtilClone;
+import static com.baeldung.array.ArrayInitializer.initializeLargerArrayUsingArraysCopy;
+import static com.baeldung.array.ArrayInitializer.initializeMultiDimensionalArrayInLoop;
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class ArrayInitializerTest {
+
+ @Test
+ public void whenInitializeArrayInLoop_thenCorrect() {
+ assertArrayEquals(new int[] { 2, 3, 4, 5, 6 }, initializeArrayInLoop());
+ }
+
+ @Test
+ public void whenInitializeMultiDimensionalArrayInLoop_thenCorrect() {
+ assertArrayEquals(new int[][] { { 1, 2, 3, 4, 5 }, { 1, 2, 3, 4, 5 } }, initializeMultiDimensionalArrayInLoop());
+ }
+
+ @Test
+ public void whenInitializeArrayAtTimeOfDeclarationMethod1_thenCorrect() {
+ assertArrayEquals(new String[] { "Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" }, initializeArrayAtTimeOfDeclarationMethod1());
+ }
+
+ @Test
+ public void whenInitializeArrayAtTimeOfDeclarationMethod2_thenCorrect() {
+ assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayAtTimeOfDeclarationMethod2());
+ }
+
+ @Test
+ public void whenInitializeArrayAtTimeOfDeclarationMethod3_thenCorrect() {
+ assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayAtTimeOfDeclarationMethod3());
+ }
+
+ @Test
+ public void whenInitializeArrayUsingArraysFill_thenCorrect() {
+ assertArrayEquals(new long[] { 30, 30, 30, 30, 30 }, initializeArrayUsingArraysFill());
+ }
+
+ @Test
+ public void whenInitializeArrayRangeUsingArraysFill_thenCorrect() {
+ assertArrayEquals(new int[] { -50, -50, -50, 0, 0 }, initializeArrayRangeUsingArraysFill());
+ }
+
+ @Test
+ public void whenInitializeArrayRangeUsingArraysCopy_thenCorrect() {
+ assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, initializeArrayUsingArraysCopy());
+ }
+
+ @Test
+ public void whenInitializeLargerArrayRangeUsingArraysCopy_thenCorrect() {
+ assertArrayEquals(new int[] { 1, 2, 3, 4, 5, 0 }, initializeLargerArrayUsingArraysCopy());
+ }
+
+ @Test
+ public void whenInitializeLargerArrayRangeUsingArraysSetAll_thenCorrect() {
+ assertArrayEquals(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, initializeArrayUsingArraysSetAll());
+ }
+
+ @Test
+ public void whenInitializeArrayUsingArraysUtilClone_thenCorrect() {
+ assertArrayEquals(new char[] { 'a', 'b', 'c' }, initializeArrayUsingArraysUtilClone());
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/arraydeque/ArrayDequeTest.java b/core-java/src/test/java/com/baeldung/arraydeque/ArrayDequeTest.java
new file mode 100644
index 0000000000..50813a8601
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/arraydeque/ArrayDequeTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.arraydeque;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+
+public class ArrayDequeTest {
+
+ @Test
+ public void whenOffer_addsAtLast() {
+ final Deque deque = new ArrayDeque<>();
+
+ deque.offer("first");
+ deque.offer("second");
+
+ assertEquals("second", deque.getLast());
+ }
+
+ @Test
+ public void whenPoll_removesFirst() {
+ final Deque deque = new ArrayDeque<>();
+
+ deque.offer("first");
+ deque.offer("second");
+
+ assertEquals("first", deque.poll());
+ }
+
+ @Test
+ public void whenPush_addsAtFirst() {
+ final Deque deque = new ArrayDeque<>();
+
+ deque.push("first");
+ deque.push("second");
+
+ assertEquals("second", deque.getFirst());
+ }
+
+ @Test
+ public void whenPop_removesLast() {
+ final Deque deque = new ArrayDeque<>();
+
+ deque.push("first");
+ deque.push("second");
+
+ assertEquals("second", deque.pop());
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueTest.java b/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueTest.java
new file mode 100644
index 0000000000..1980497cd3
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.breakcontinue;
+
+import static com.baeldung.breakcontinue.BreakContinue.labeledBreak;
+import static com.baeldung.breakcontinue.BreakContinue.labeledContinue;
+import static com.baeldung.breakcontinue.BreakContinue.unlabeledBreak;
+import static com.baeldung.breakcontinue.BreakContinue.unlabeledBreakNestedLoops;
+import static com.baeldung.breakcontinue.BreakContinue.unlabeledContinue;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class BreakContinueTest {
+
+ @Test
+ public void whenUnlabeledBreak_ThenEqual() {
+ assertEquals(4, unlabeledBreak());
+ }
+
+ @Test
+ public void whenUnlabeledBreakNestedLoops_ThenEqual() {
+ assertEquals(2, unlabeledBreakNestedLoops());
+ }
+
+ @Test
+ public void whenLabeledBreak_ThenEqual() {
+ assertEquals(1, labeledBreak());
+ }
+
+ @Test
+ public void whenUnlabeledContinue_ThenEqual() {
+ assertEquals(5, unlabeledContinue());
+ }
+
+ @Test
+ public void whenLabeledContinue_ThenEqual() {
+ assertEquals(3, labeledContinue());
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java b/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
new file mode 100644
index 0000000000..e8745884b8
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.comparable;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+
+public class ComparableUnitTest {
+
+ @Test
+ public void whenUsingComparable_thenSortedList() {
+ List footballTeam = new ArrayList();
+ Player player1 = new Player(59, "John", 20);
+ Player player2 = new Player(67, "Roger", 22);
+ Player player3 = new Player(45, "Steven", 24);
+ footballTeam.add(player1);
+ footballTeam.add(player2);
+ footballTeam.add(player3);
+ Collections.sort(footballTeam);
+ assertEquals(footballTeam.get(0)
+ .getName(), "Steven");
+ assertEquals(footballTeam.get(2)
+ .getRanking(), 67);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java b/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
new file mode 100644
index 0000000000..5b7ec3bfe4
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.comparator;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ComparatorUnitTest {
+
+ List footballTeam;
+
+ @Before
+ public void setUp() {
+ footballTeam = new ArrayList();
+ Player player1 = new Player(59, "John", 20);
+ Player player2 = new Player(67, "Roger", 22);
+ Player player3 = new Player(45, "Steven", 24);
+ footballTeam.add(player1);
+ footballTeam.add(player2);
+ footballTeam.add(player3);
+ }
+
+ @Test
+ public void whenUsingRankingComparator_thenSortedList() {
+ PlayerRankingComparator playerComparator = new PlayerRankingComparator();
+ Collections.sort(footballTeam, playerComparator);
+ assertEquals(footballTeam.get(0)
+ .getName(), "Steven");
+ assertEquals(footballTeam.get(2)
+ .getRanking(), 67);
+ }
+
+ @Test
+ public void whenUsingAgeComparator_thenSortedList() {
+ PlayerAgeComparator playerComparator = new PlayerAgeComparator();
+ Collections.sort(footballTeam, playerComparator);
+ assertEquals(footballTeam.get(0)
+ .getName(), "John");
+ assertEquals(footballTeam.get(2)
+ .getRanking(), 45);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java b/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
new file mode 100644
index 0000000000..49c8749309
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.comparator;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class Java8ComparatorUnitTest {
+
+ List footballTeam;
+
+ @Before
+ public void setUp() {
+ footballTeam = new ArrayList();
+ Player player1 = new Player(59, "John", 22);
+ Player player2 = new Player(67, "Roger", 20);
+ Player player3 = new Player(45, "Steven", 24);
+ footballTeam.add(player1);
+ footballTeam.add(player2);
+ footballTeam.add(player3);
+ }
+
+ @Test
+ public void whenComparing_UsingLambda_thenSorted() {
+ System.out.println("************** Java 8 Comaparator **************");
+ Comparator byRanking = (Player player1, Player player2) -> player1.getRanking() - player2.getRanking();
+
+ System.out.println("Before Sorting : " + footballTeam);
+ Collections.sort(footballTeam, byRanking);
+ System.out.println("After Sorting : " + footballTeam);
+ assertEquals(footballTeam.get(0)
+ .getName(), "Steven");
+ assertEquals(footballTeam.get(2)
+ .getRanking(), 67);
+ }
+
+ @Test
+ public void whenComparing_UsingComparatorComparing_thenSorted() {
+ System.out.println("********* Comaparator.comparing method *********");
+ System.out.println("********* byRanking *********");
+ Comparator byRanking = Comparator.comparing(Player::getRanking);
+
+ System.out.println("Before Sorting : " + footballTeam);
+ Collections.sort(footballTeam, byRanking);
+ System.out.println("After Sorting : " + footballTeam);
+ assertEquals(footballTeam.get(0)
+ .getName(), "Steven");
+ assertEquals(footballTeam.get(2)
+ .getRanking(), 67);
+
+ System.out.println("********* byAge *********");
+ Comparator byAge = Comparator.comparing(Player::getAge);
+
+ System.out.println("Before Sorting : " + footballTeam);
+ Collections.sort(footballTeam, byAge);
+ System.out.println("After Sorting : " + footballTeam);
+ assertEquals(footballTeam.get(0)
+ .getName(), "Roger");
+ assertEquals(footballTeam.get(2)
+ .getRanking(), 45);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/copyfiles/FileCopierTest.java b/core-java/src/test/java/com/baeldung/copyfiles/FileCopierTest.java
new file mode 100644
index 0000000000..973436a26a
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/copyfiles/FileCopierTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.copyfiles;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.Before;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.*;
+
+public class FileCopierTest {
+ File original = new File("src/test/resources/original.txt");
+
+ @Before
+ public void init() throws IOException {
+ if (!original.exists())
+ Files.createFile(original.toPath());
+ }
+
+ @Test
+ public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException {
+ File copied = new File("src/test/resources/copiedWithIo.txt");
+ try (InputStream in = new BufferedInputStream(new FileInputStream(original));
+ OutputStream out = new BufferedOutputStream(new FileOutputStream(copied))) {
+ byte[] buffer = new byte[1024];
+ int lengthRead;
+ while ((lengthRead = in.read(buffer)) > 0) {
+ out.write(buffer, 0, lengthRead);
+ out.flush();
+ }
+ }
+ assertThat(copied).exists();
+ assertThat(Files.readAllLines(original.toPath()).equals(Files.readAllLines(copied.toPath())));
+ }
+
+ @Test
+ public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException {
+ File copied = new File("src/test/resources/copiedWithApacheCommons.txt");
+ FileUtils.copyFile(original, copied);
+ assertThat(copied).exists();
+ assertThat(Files.readAllLines(original.toPath()).equals(Files.readAllLines(copied.toPath())));
+ }
+
+ @Test
+ public void givenNIO2_whenCopied_thenCopyExistsWithSameContents() throws IOException {
+ Path copied = Paths.get("src/test/resources/copiedWithNio.txt");
+ Path originalPath = original.toPath();
+ Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
+ assertThat(copied).exists();
+ assertThat(Files.readAllLines(originalPath).equals(Files.readAllLines(copied)));
+ }
+
+ @Test
+ public void givenGuava_whenCopied_thenCopyExistsWithSameContents() throws IOException {
+ File copied = new File("src/test/resources/copiedWithApacheCommons.txt");
+ com.google.common.io.Files.copy(original, copied);
+ assertThat(copied).exists();
+ assertThat(Files.readAllLines(original.toPath()).equals(Files.readAllLines(copied.toPath())));
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternIntegrationTest.java
new file mode 100644
index 0000000000..dc02b976a0
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.designpatterns.creational.abstractfactory;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class AbstractPatternIntegrationTest {
+ @Test
+ public void givenAbstractFactory_whenGettingObjects_thenSuccessful() {
+ AbstractFactory abstractFactory;
+
+ //creating a brown toy dog
+ abstractFactory = FactoryProvider.getFactory("Toy");
+ Animal toy = abstractFactory.getAnimal("Dog");
+
+ abstractFactory = FactoryProvider.getFactory("Color");
+ Color color = abstractFactory.getColor("Brown");
+
+ String result = "A " + toy.getType() + " with " + color.getColor() + " color " + toy.makeSound();
+ assertEquals("A Dog with brown color Barks", result);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/builder/BuilderPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/builder/BuilderPatternIntegrationTest.java
new file mode 100644
index 0000000000..898330b26e
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/builder/BuilderPatternIntegrationTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.designpatterns.creational.builder;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class BuilderPatternIntegrationTest {
+ @Test
+ public void whenCreatingObjectThroughBuilder_thenObjectValid() {
+ BankAccount newAccount = new BankAccount
+ .BankAccountBuilder("Jon", "22738022275")
+ .withEmail("jon@example.com")
+ .wantNewsletter(true)
+ .build();
+
+ assertEquals(newAccount.getName(), "Jon");
+ assertEquals(newAccount.getAccountNumber(), "22738022275");
+ assertEquals(newAccount.getEmail(), "jon@example.com");
+ assertEquals(newAccount.isNewsletter(), true);
+ }
+
+ @Test
+ public void whenSkippingOptionalParameters_thenObjectValid() {
+ BankAccount newAccount = new BankAccount
+ .BankAccountBuilder("Jon", "22738022275")
+ .build();
+
+ assertEquals(newAccount.getName(), "Jon");
+ assertEquals(newAccount.getAccountNumber(), "22738022275");
+ assertEquals(newAccount.getEmail(), null);
+ assertEquals(newAccount.isNewsletter(), false);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/factory/FactoryIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/factory/FactoryIntegrationTest.java
new file mode 100644
index 0000000000..ed0419c16d
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/factory/FactoryIntegrationTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.designpatterns.creational.factory;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class FactoryIntegrationTest {
+
+ @Test
+ public void whenUsingFactoryForSquare_thenCorrectObjectReturned() {
+ Polygon p;
+ PolygonFactory factory = new PolygonFactory();
+
+ //get the shape which has 4 sides
+ p = factory.getPolygon(4);
+ String result = "The shape with 4 sides is a " + p.getType();
+
+ assertEquals("The shape with 4 sides is a Square", result);
+ }
+
+ @Test
+ public void whenUsingFactoryForOctagon_thenCorrectObjectReturned() {
+ Polygon p;
+ PolygonFactory factory = new PolygonFactory();
+
+ //get the shape which has 4 sides
+ p = factory.getPolygon(8);
+ String result = "The shape with 8 sides is a " + p.getType();
+
+ assertEquals("The shape with 8 sides is a Octagon", result);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/singleton/SingletonIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/singleton/SingletonIntegrationTest.java
new file mode 100644
index 0000000000..a3d5b7a14d
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/singleton/SingletonIntegrationTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.designpatterns.creational.singleton;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class SingletonIntegrationTest {
+
+ @Test
+ /**
+ * Although there is absolutely no way to determine whether
+ * a class is Singleton, in this test case, we will just
+ * check for two objects if they point to same instance or
+ * not. We will also check for their hashcode.
+ */
+ public void whenGettingMultipleObjects_thenAllPointToSame() {
+ //first object
+ Singleton obj1 = Singleton.getInstance();
+
+ //Second object
+ Singleton obj2 = Singleton.getInstance();
+
+ assertTrue(obj1 == obj2);
+ assertEquals(obj1.hashCode(), obj2.hashCode());
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/file/FilesTest.java b/core-java/src/test/java/com/baeldung/file/FilesTest.java
new file mode 100644
index 0000000000..e17e8580aa
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/file/FilesTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.file;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.CharSink;
+import com.google.common.io.FileWriteMode;
+import org.apache.commons.io.FileUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.util.StreamUtils;
+
+public class FilesTest {
+
+ public static final String fileName = "src/main/resources/countries.properties";
+
+ @Before
+ @After
+ public void setup() throws Exception {
+ PrintWriter writer = new PrintWriter(fileName);
+ writer.print("UK\r\n" + "US\r\n" + "Germany\r\n");
+ writer.close();
+ }
+
+ @Test
+ public void whenAppendToFileUsingGuava_thenCorrect() throws IOException {
+ File file = new File(fileName);
+ CharSink chs = com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND);
+ chs.write("Spain\r\n");
+
+ assertThat(StreamUtils.getStringFromInputStream(
+ new FileInputStream(fileName)))
+ .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
+ }
+
+
+ @Test
+ public void whenAppendToFileUsingFiles_thenCorrect() throws IOException {
+ Files.write(Paths.get(fileName), "Spain\r\n".getBytes(), StandardOpenOption.APPEND);
+
+ assertThat(StreamUtils.getStringFromInputStream(
+ new FileInputStream(fileName)))
+ .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
+ }
+
+ @Test
+ public void whenAppendToFileUsingFileUtils_thenCorrect() throws IOException {
+ File file = new File(fileName);
+ FileUtils.writeStringToFile(file, "Spain\r\n", StandardCharsets.UTF_8, true);
+
+ assertThat(StreamUtils.getStringFromInputStream(
+ new FileInputStream(fileName)))
+ .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
+ }
+
+ @Test
+ public void whenAppendToFileUsingFileOutputStream_thenCorrect() throws Exception {
+ FileOutputStream fos = new FileOutputStream(fileName, true);
+ fos.write("Spain\r\n".getBytes());
+ fos.close();
+
+ assertThat(StreamUtils.getStringFromInputStream(
+ new FileInputStream(fileName)))
+ .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
+ }
+
+ @Test
+ public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException {
+ FileWriter fw = new FileWriter(fileName, true);
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write("Spain");
+ bw.newLine();
+ bw.close();
+
+ assertThat(
+ StreamUtils.getStringFromInputStream(
+ new FileInputStream(fileName)))
+ .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\n");
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java
new file mode 100644
index 0000000000..9590eabfef
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java
@@ -0,0 +1,37 @@
+package com.baeldung.loops;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class WhenUsingLoops {
+
+ private LoopsInJava loops = new LoopsInJava();
+
+ @Test
+ public void shouldRunForLoop() {
+ int[] expected = { 0, 1, 2, 3, 4 };
+ int[] actual = loops.simple_for_loop();
+ Assert.assertArrayEquals(expected, actual);
+ }
+
+ @Test
+ public void shouldRunEnhancedForeachLoop() {
+ int[] expected = { 0, 1, 2, 3, 4 };
+ int[] actual = loops.enhanced_for_each_loop();
+ Assert.assertArrayEquals(expected, actual);
+ }
+
+ @Test
+ public void shouldRunWhileLoop() {
+ int[] expected = { 0, 1, 2, 3, 4 };
+ int[] actual = loops.while_loop();
+ Assert.assertArrayEquals(expected, actual);
+ }
+
+ @Test
+ public void shouldRunDoWhileLoop() {
+ int[] expected = { 0, 1, 2, 3, 4 };
+ int[] actual = loops.do_while_loop();
+ Assert.assertArrayEquals(expected, actual);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
new file mode 100644
index 0000000000..9fa8ee9cd5
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
@@ -0,0 +1,20 @@
+package com.baeldung.nestedclass;
+
+import org.junit.Test;
+
+abstract class SimpleAbstractClass {
+ abstract void run();
+}
+
+public class AnonymousInner {
+
+ @Test
+ public void run() {
+ SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() {
+ void run() {
+ System.out.println("Running Anonymous Class...");
+ }
+ };
+ simpleAbstractClass.run();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java
new file mode 100644
index 0000000000..3db33cde9b
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java
@@ -0,0 +1,21 @@
+package com.baeldung.nestedclass;
+
+import org.junit.Test;
+
+public class Enclosing {
+
+ private static int x = 1;
+
+ public static class StaticNested {
+
+ private void run() {
+ System.out.println("x = " + x);
+ }
+ }
+
+ @Test
+ public void test() {
+ Enclosing.StaticNested nested = new Enclosing.StaticNested();
+ nested.run();
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
new file mode 100644
index 0000000000..deeb72de0c
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
@@ -0,0 +1,22 @@
+package com.baeldung.nestedclass;
+
+import org.junit.Test;
+
+public class NewEnclosing {
+
+ private void run() {
+ class Local {
+ void run() {
+ System.out.println("Welcome to Baeldung!");
+ }
+ }
+ Local local = new Local();
+ local.run();
+ }
+
+ @Test
+ public void test() {
+ NewEnclosing newEnclosing = new NewEnclosing();
+ newEnclosing.run();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java
new file mode 100644
index 0000000000..a3a723b30e
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java
@@ -0,0 +1,30 @@
+package com.baeldung.nestedclass;
+
+import org.junit.Test;
+
+public class NewOuter {
+
+ int a = 1;
+ static int b = 2;
+
+ public class InnerClass {
+ int a = 3;
+ static final int b = 4;
+
+ public void run() {
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ System.out.println("NewOuterTest.this.a = " + NewOuter.this.a);
+ System.out.println("NewOuterTest.b = " + NewOuter.b);
+ System.out.println("NewOuterTest.this.b = " + NewOuter.this.b);
+ }
+ }
+
+ @Test
+ public void test() {
+ NewOuter outer = new NewOuter();
+ NewOuter.InnerClass inner = outer.new InnerClass();
+ inner.run();
+
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java
new file mode 100644
index 0000000000..d5e46670c9
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java
@@ -0,0 +1,20 @@
+package com.baeldung.nestedclass;
+
+import org.junit.Test;
+
+public class Outer {
+
+ public class Inner {
+
+ public void run() {
+ System.out.println("Calling test...");
+ }
+ }
+
+ @Test
+ public void test() {
+ Outer outer = new Outer();
+ Outer.Inner inner = outer.new Inner();
+ inner.run();
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
new file mode 100644
index 0000000000..8fb606c2fc
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.polymorphism;
+
+import static org.junit.Assert.*;
+
+import java.awt.image.BufferedImage;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class PolymorphismUnitTest {
+
+ @Test
+ public void givenImageFile_whenFileCreated_shouldSucceed() {
+ ImageFile imageFile = FileManager.createImageFile("SampleImageFile", 200, 100, new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB).toString()
+ .getBytes(), "v1.0.0");
+ assertEquals(200, imageFile.getHeight());
+ }
+
+ // Downcasting then Upcasting
+ @Test
+ public void givenTextFile_whenTextFileCreatedAndAssignedToGenericFileAndCastBackToTextFileOnGetWordCount_shouldSucceed() {
+ GenericFile textFile = FileManager.createTextFile("SampleTextFile", "This is a sample text content", "v1.0.0");
+ TextFile textFile2 = (TextFile) textFile;
+ assertEquals(6, textFile2.getWordCount());
+ }
+
+ // Downcasting
+ @Test(expected = ClassCastException.class)
+ public void givenGenericFile_whenCastToTextFileAndInvokeGetWordCount_shouldFail() {
+ GenericFile genericFile = new GenericFile();
+ TextFile textFile = (TextFile) genericFile;
+ System.out.println(textFile.getWordCount());
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/stack/StackUnitTest.java b/core-java/src/test/java/com/baeldung/stack/StackUnitTest.java
new file mode 100644
index 0000000000..2b04617f36
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/stack/StackUnitTest.java
@@ -0,0 +1,137 @@
+package com.baeldung.stack;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Stack;
+
+import org.junit.Test;
+public class StackUnitTest {
+
+ @Test
+ public void whenStackIsCreated_thenItHasSize0() {
+ Stack intStack = new Stack();
+ assertEquals(0, intStack.size());
+ }
+
+ @Test
+ public void givenEmptyStack_whenElementIsPushed_thenStackSizeisIncreased() {
+ Stack intStack = new Stack();
+ intStack.push(1);
+ assertEquals(1, intStack.size());
+ }
+
+ @Test
+ public void givenEmptyStack_whenMultipleElementsArePushed_thenStackSizeisIncreased() {
+ Stack intStack = new Stack();
+ List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
+ boolean result = intStack.addAll(intList);
+ assertTrue(result);
+ assertEquals(7, intList.size());
+ }
+
+ @Test
+ public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ intStack.pop();
+ assertTrue(intStack.isEmpty());
+ }
+
+ @Test
+ public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ intStack.peek();
+ assertEquals(1, intStack.search(5));
+ assertEquals(1, intStack.size());
+ }
+
+ @Test
+ public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ assertEquals(1, intStack.search(5));
+ }
+
+ @Test
+ public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ int indexOf = intStack.indexOf(5);
+ assertEquals(0, indexOf);
+ }
+
+ @Test
+ public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ intStack.push(5);
+ intStack.push(5);
+ int lastIndexOf = intStack.lastIndexOf(5);
+ assertEquals(2, lastIndexOf);
+ }
+
+ @Test
+ public void givenElementOnStack_whenRemoveElementIsInvoked_thenElementIsRemoved() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ intStack.push(5);
+ intStack.removeElement(5);
+ assertEquals(1, intStack.size());
+ }
+
+ @Test
+ public void givenElementOnStack_whenRemoveElementAtIsInvoked_thenElementIsRemoved() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ intStack.push(7);
+ intStack.removeElementAt(1);
+ assertEquals(-1, intStack.search(7));
+ }
+
+ @Test
+ public void givenElementsOnStack_whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved() {
+ Stack intStack = new Stack();
+ intStack.push(5);
+ intStack.push(7);
+ intStack.removeAllElements();
+ assertTrue(intStack.isEmpty());
+ }
+
+ @Test
+ public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved() {
+ Stack intStack = new Stack();
+ List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
+ intStack.addAll(intList);
+ intStack.add(500);
+ intStack.removeAll(intList);
+ assertEquals(1, intStack.size());
+ }
+
+ @Test
+ public void givenElementsOnStack_whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() {
+ Stack intStack = new Stack();
+ List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
+ intStack.addAll(intList);
+ intStack.removeIf(element -> element < 6);
+ assertEquals(2, intStack.size());
+ }
+
+ @Test
+ public void whenAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual() {
+ Stack intStack = new Stack<>();
+ List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
+ intStack.addAll(intList);
+ ListIterator it = intStack.listIterator();
+ Stack result = new Stack();
+ while(it.hasNext()) {
+ result.push(it.next());
+ }
+
+ assertThat(result, equalTo(intStack));
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java
index 0e325950b0..e88b2d7c2c 100644
--- a/core-java/src/test/java/com/baeldung/string/StringTest.java
+++ b/core-java/src/test/java/com/baeldung/string/StringTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.IllegalFormatException;
import java.util.regex.PatternSyntaxException;
@@ -29,11 +30,17 @@ public class StringTest {
}
@Test
- public void whenGetBytes_thenCorrect() {
- byte[] byteArray = "abcd".getBytes();
- byte[] expected = new byte[] { 97, 98, 99, 100 };
+ public void whenGetBytes_thenCorrect() throws UnsupportedEncodingException {
+ byte[] byteArray1 = "abcd".getBytes();
+ byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII);
+ byte[] byteArray3 = "ijkl".getBytes("UTF-8");
+ byte[] expected1 = new byte[] { 97, 98, 99, 100 };
+ byte[] expected2 = new byte[] { 101, 102, 103, 104 };
+ byte[] expected3 = new byte[] { 105, 106, 107, 108 };
- assertArrayEquals(expected, byteArray);
+ assertArrayEquals(expected1, byteArray1);
+ assertArrayEquals(expected2, byteArray2);
+ assertArrayEquals(expected3, byteArray3);
}
@Test
@@ -123,6 +130,7 @@ public class StringTest {
@Test
public void whenCallLastIndexOf_thenCorrect() {
assertEquals(2, "foo".lastIndexOf("o"));
+ assertEquals(2, "foo".lastIndexOf(111));
}
@Test
@@ -215,4 +223,4 @@ public class StringTest {
assertEquals("200", String.valueOf(l));
}
-}
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/string/formatter/StringFormatterExampleTests.java b/core-java/src/test/java/com/baeldung/string/formatter/StringFormatterExampleTests.java
new file mode 100644
index 0000000000..ad4f5dce7e
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/string/formatter/StringFormatterExampleTests.java
@@ -0,0 +1,141 @@
+package com.baeldung.string.formatter;
+
+import java.util.Calendar;
+import java.util.Formatter;
+import java.util.GregorianCalendar;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class StringFormatterExampleTests {
+
+ @Test
+ public void givenString_whenFormatSpecifierForCalendar_thenGotExpected() {
+ //Syntax of Format Specifiers for Date/Time Representation
+ Calendar c = new GregorianCalendar(2017, 11, 10);
+ String s = String.format("The date is: %tm %1$te,%1$tY", c);
+
+
+ assertEquals("The date is: 12 10,2017", s);
+ }
+
+ @Test
+ public void givenString_whenGeneralConversion_thenConvertedString() {
+ //General Conversions
+ String s = String.format("The correct answer is %s", false);
+ assertEquals("The correct answer is false", s);
+
+ s = String.format("The correct answer is %b", null);
+ assertEquals("The correct answer is false", s);
+
+ s = String.format("The correct answer is %B", true);
+ assertEquals("The correct answer is TRUE", s);
+ }
+
+ @Test
+ public void givenString_whenCharConversion_thenConvertedString() {
+ //Character Conversions
+ String s = String.format("The correct answer is %c", 'a');
+ assertEquals("The correct answer is a", s);
+
+ s = String.format("The correct answer is %c", null);
+ assertEquals("The correct answer is null", s);
+
+ s = String.format("The correct answer is %C", 'b');
+ assertEquals("The correct answer is B", s);
+
+ s = String.format("The valid unicode character: %c", 0x0400);
+ assertTrue(Character.isValidCodePoint(0x0400));
+ assertEquals("The valid unicode character: Ѐ", s);
+ }
+
+ @Test(expected = java.util.IllegalFormatCodePointException.class)
+ public void givenString_whenIllegalCodePointForConversion_thenError() {
+ String s = String.format("The valid unicode character: %c", 0x11FFFF);
+ assertFalse(Character.isValidCodePoint(0x11FFFF));
+ assertEquals("The valid unicode character: Ā", s);
+ }
+
+ @Test
+ public void givenString_whenNumericIntegralConversion_thenConvertedString() {
+ //Numeric Integral Conversions
+ String s = String.format("The number 25 in decimal = %d", 25);
+ assertEquals("The number 25 in decimal = 25", s);
+
+ s = String.format("The number 25 in octal = %o", 25);
+ assertEquals("The number 25 in octal = 31", s);
+
+ s = String.format("The number 25 in hexadecimal = %x", 25);
+ assertEquals("The number 25 in hexadecimal = 19", s);
+ }
+
+ @Test
+ public void givenString_whenNumericFloatingConversion_thenConvertedString() {
+ //Numeric Floating-point Conversions
+ String s = String.format("The computerized scientific format of 10000.00 "
+ + "= %e", 10000.00);
+ assertEquals("The computerized scientific format of 10000.00 = 1.000000e+04", s);
+
+ s = String.format("The decimal format of 10.019 = %f", 10.019);
+ assertEquals("The decimal format of 10.019 = 10.019000", s);
+ }
+
+ @Test
+ public void givenString_whenLineSeparatorConversion_thenConvertedString() {
+ //Line Separator Conversion
+ String s = String.format("First Line %nSecond Line");
+ assertEquals("First Line " + System.getProperty("line.separator")
+ + "Second Line", s);
+ }
+
+ @Test
+ public void givenString_whenSpecifyFlag_thenGotFormattedString() {
+ //Without left-justified flag
+ String s = String.format("Without left justified flag: %5d", 25);
+ assertEquals("Without left justified flag: 25", s);
+
+ //Using left-justified flag
+ s = String.format("With left justified flag: %-5d", 25);
+ assertEquals("With left justified flag: 25 ", s);
+ }
+
+ @Test
+ public void givenString_whenSpecifyPrecision_thenGotExpected() {
+
+ //Precision
+ String s = String.format("Output of 25.09878 with Precision 2: %.2f", 25.09878);
+ assertEquals("Output of 25.09878 with Precision 2: 25.10", s);
+
+ s = String.format("Output of general conversion type with Precision 2: %.2b", true);
+ assertEquals("Output of general conversion type with Precision 2: tr", s);
+ }
+
+ @Test
+ public void givenString_whenSpecifyArgumentIndex_thenGotExpected() {
+ Calendar c = new GregorianCalendar(2017, 11, 10);
+ //Argument_Index
+ String s = String.format("The date is: %tm %1$te,%1$tY", c);
+ assertEquals("The date is: 12 10,2017", s);
+
+ s = String.format("The date is: %tm %
-
-
- 4.0.0
-
- drools-backward-chaining
- 1.0
- drools-backward-chaining
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
-
- 6.4.0.Final
-
-
-
-
- org.kie
- kie-api
- ${runtime.version}
-
-
- org.drools
- drools-core
- ${runtime.version}
-
-
- org.drools
- drools-decisiontables
- ${runtime.version}
-
-
-
diff --git a/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java b/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java
deleted file mode 100644
index 7fc5bd3685..0000000000
--- a/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung;
-
-import org.kie.api.KieServices;
-import org.kie.api.runtime.KieContainer;
-import org.kie.api.runtime.KieSession;
-
-import com.baeldung.model.Beatle;
-
-public class BackwardChainingBeatles {
- public static void main(String[] args) {
-
- KieServices ks = KieServices.Factory.get();
- KieContainer kContainer = ks.getKieClasspathContainer();
- KieSession kSession = kContainer.newKieSession("ksession-backward-chaining");
- // drools session base on the xml configuration (kmodule.xml)
-
- // graph population
- kSession.insert(new Beatle("Starr", "drums"));
- kSession.insert(new Beatle("McCartney", "bass"));
- kSession.insert(new Beatle("Lennon", "guitar"));
- kSession.insert(new Beatle("Harrison", "guitar"));
-
- kSession.insert("Ringo"); // invoke the rule that calls the query implentation of backward chaining
- kSession.fireAllRules(); // invoke all the rules
-
- }
-
-}
\ No newline at end of file
diff --git a/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java b/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java
deleted file mode 100644
index 4b219b3a69..0000000000
--- a/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.baeldung.model;
-
-import org.kie.api.definition.type.Position;
-
-public class Beatle {
-
- @Position(0)
- private String lastName;
- @Position(1)
- private String instrument;
-
- public Beatle(String lastName, String instrument) {
- this.lastName = lastName;
- this.instrument = instrument;
- }
-
- public String getInstrument() {
- return instrument;
- }
-
- public void setInstrument(String instrument) {
- this.instrument = instrument;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
-}
\ No newline at end of file
diff --git a/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml b/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml
deleted file mode 100644
index 6498e26343..0000000000
--- a/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl b/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl
deleted file mode 100644
index 8d0d06a79e..0000000000
--- a/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.baeldung
-
-import com.baeldung.model.Beatle;
-
-
-query whichBeatle(String lastName, String instrument)
- Beatle(lastName, instrument;)
- or
- (Beatle(lastName, null;)
- and
- whichBeatle(null, instrument;)) //recursive call to the function that allows to search in a derivation tree structure
-end
-
-rule "Ringo"
- when
- String(this == "Ringo")
- whichBeatle("Starr", "drums";)
- then
- System.out.println("The beatle is Ringo Starr");
-end
-
-rule "Paul"
- when
- String(this == "Paul")
- whichBeatle("McCartney", "bass";)
- then
- System.out.println("The beatle is Paul McCartney");
-end
-
-rule "John"
- when
- String(this == "John")
- whichBeatle("Lennon", "guitar";)
- then
- System.out.println("The beatle is John Lennon");
-end
-
-rule "George"
- when
- String(this == "George")
- whichBeatle("Harrison", "guitar";)
- then
- System.out.println("The beatle is George Harrison");
-end
diff --git a/drools/pom.xml b/drools/pom.xml
index 29231f150c..5f228802fa 100644
--- a/drools/pom.xml
+++ b/drools/pom.xml
@@ -1,24 +1,19 @@
-
4.0.0
- com.baeldung
drools
- 1.0.0-SNAPSHOT
-
com.baeldung
parent-modules
1.0.0-SNAPSHOT
-
-
- 4.4.6
- 7.1.0.Beta2
- 3.13
-
+
+ 4.4.6
+ 7.4.1.Final
+ 3.13
+
@@ -68,4 +63,25 @@
-
\ No newline at end of file
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
diff --git a/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java b/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java
new file mode 100644
index 0000000000..6f15ee510b
--- /dev/null
+++ b/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java
@@ -0,0 +1,30 @@
+package com.baeldung.drools.backward_chaining;
+
+import org.kie.api.runtime.KieSession;
+
+import com.baeldung.drools.config.DroolsBeanFactory;
+import com.baeldung.drools.model.Fact;
+import com.baeldung.drools.model.Result;
+
+public class BackwardChaining {
+ public static void main(String[] args) {
+ Result result = new BackwardChaining().backwardChaining();
+ System.out.println(result.getValue());
+ result.getFacts()
+ .stream()
+ .forEach(System.out::println);
+ }
+
+ public Result backwardChaining() {
+ Result result = new Result();
+ KieSession ksession = new DroolsBeanFactory().getKieSession();
+ ksession.setGlobal("result", result);
+ ksession.insert(new Fact("Asia", "Planet Earth"));
+ ksession.insert(new Fact("China", "Asia"));
+ ksession.insert(new Fact("Great Wall of China", "China"));
+
+ ksession.fireAllRules();
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java
index e8841b05e2..cf5d56f246 100644
--- a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java
+++ b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java
@@ -3,7 +3,6 @@ package com.baeldung.drools.config;
import org.drools.decisiontable.DecisionTableProviderImpl;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
-import org.kie.api.io.KieResources;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
@@ -22,7 +21,7 @@ public class DroolsBeanFactory {
private KieFileSystem getKieFileSystem() throws IOException{
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
- List rules=Arrays.asList("SuggestApplicant.drl","Product_rules.xls");
+ List rules=Arrays.asList("BackwardChaining.drl","SuggestApplicant.drl","Product_rules.xls");
for(String rule:rules){
kieFileSystem.write(ResourceFactory.newClassPathResource(rule));
}
@@ -56,9 +55,11 @@ public class DroolsBeanFactory {
getKieRepository();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
+ kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/BackwardChaining.drl"));
kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/SuggestApplicant.drl"));
kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/Product_rules.xls"));
-
+
+
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
kb.buildAll();
KieModule kieModule = kb.getKieModule();
diff --git a/drools/src/main/java/com/baeldung/drools/model/Fact.java b/drools/src/main/java/com/baeldung/drools/model/Fact.java
new file mode 100644
index 0000000000..62b44b9d92
--- /dev/null
+++ b/drools/src/main/java/com/baeldung/drools/model/Fact.java
@@ -0,0 +1,69 @@
+package com.baeldung.drools.model;
+
+import org.kie.api.definition.type.Position;
+
+public class Fact {
+
+ @Position(0)
+ private String element;
+
+ @Position(1)
+ private String place;
+
+ public Fact(String element, String place) {
+ this.element = element;
+ this.place = place;
+ }
+
+ public String getElement() {
+ return element;
+ }
+
+ public void setElement(String element) {
+ this.element = element;
+ }
+
+ public String getPlace() {
+ return place;
+ }
+
+ public void setPlace(String place) {
+ this.place = place;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((element == null) ? 0 : element.hashCode());
+ result = prime * result + ((place == null) ? 0 : place.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Fact other = (Fact) obj;
+ if (element == null) {
+ if (other.element != null)
+ return false;
+ } else if (!element.equals(other.element))
+ return false;
+ if (place == null) {
+ if (other.place != null)
+ return false;
+ } else if (!place.equals(other.place))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "Fact{" + "element='" + element + '\'' + ", place='" + place + '\'' + '}';
+ }
+}
\ No newline at end of file
diff --git a/drools/src/main/java/com/baeldung/drools/model/Result.java b/drools/src/main/java/com/baeldung/drools/model/Result.java
new file mode 100644
index 0000000000..b22557832b
--- /dev/null
+++ b/drools/src/main/java/com/baeldung/drools/model/Result.java
@@ -0,0 +1,31 @@
+package com.baeldung.drools.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Result {
+ private String value;
+ private List facts = new ArrayList<>();
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public List getFacts() {
+ return facts;
+ }
+
+ public void setFacts(List facts) {
+ this.facts = facts;
+ }
+
+ public void addFact(String fact) {
+ this.facts.add(fact);
+ }
+
+
+}
diff --git a/drools/src/main/resources/com/baeldung/drools/rules/BackwardChaining.drl b/drools/src/main/resources/com/baeldung/drools/rules/BackwardChaining.drl
new file mode 100644
index 0000000000..975be84fb4
--- /dev/null
+++ b/drools/src/main/resources/com/baeldung/drools/rules/BackwardChaining.drl
@@ -0,0 +1,27 @@
+package com.baeldung.drools.rules
+
+import com.baeldung.drools.model.Fact;
+
+global com.baeldung.drools.model.Result result;
+
+dialect "mvel"
+
+query belongsTo(String x, String y)
+ Fact(x, y;)
+ or
+ (Fact(z, y;) and belongsTo(x, z;))
+end
+
+rule "Great Wall of China BELONGS TO Planet Earth"
+when
+ belongsTo("Great Wall of China", "Planet Earth";)
+then
+ result.setValue("Decision one taken: Great Wall of China BELONGS TO Planet Earth");
+end
+
+rule "print all facts"
+when
+ belongsTo(element, place;)
+then
+ result.addFact(element + " IS ELEMENT OF " + place);
+end
diff --git a/drools/src/test/java/com/baeldung/drools/backward_chaining/BackwardChainingTest.java b/drools/src/test/java/com/baeldung/drools/backward_chaining/BackwardChainingTest.java
new file mode 100644
index 0000000000..f49d0b82de
--- /dev/null
+++ b/drools/src/test/java/com/baeldung/drools/backward_chaining/BackwardChainingTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.drools.backward_chaining;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.kie.api.runtime.KieSession;
+
+import com.baeldung.drools.config.DroolsBeanFactory;
+import com.baeldung.drools.model.Fact;
+import com.baeldung.drools.model.Result;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class BackwardChainingTest {
+ private Result result;
+ private KieSession ksession;
+
+ @Before
+ public void before() {
+ result = new Result();
+ ksession = new DroolsBeanFactory().getKieSession();
+ }
+
+ @Test
+ public void whenWallOfChinaIsGiven_ThenItBelongsToPlanetEarth() {
+
+ ksession.setGlobal("result", result);
+ ksession.insert(new Fact("Asia", "Planet Earth"));
+ ksession.insert(new Fact("China", "Asia"));
+ ksession.insert(new Fact("Great Wall of China", "China"));
+
+ ksession.fireAllRules();
+
+ // Assert Decision one
+ assertEquals(result.getValue(), "Decision one taken: Great Wall of China BELONGS TO Planet Earth");
+ }
+}
diff --git a/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java b/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java
index 62feb6b4b9..57376e9c4a 100644
--- a/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java
+++ b/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java
@@ -1,5 +1,6 @@
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.List;
import javax.ejb.EJB;
@@ -15,7 +16,6 @@ import wildfly.beans.UserBeanLocal;
* Servlet implementation class TestEJBServlet
*/
public class TestEJBServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
@EJB
private UserBeanLocal userBean;
@@ -23,8 +23,16 @@ public class TestEJBServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List users = userBean.getUsers();
- response.getWriter()
- .append("The number of users is: " + users.size());
+ PrintWriter out = response.getWriter();
+
+ out.println("");
+ out.println("");
+ for (User user : users) {
+ out.print(user.getUsername());
+ out.print(" " + user.getEmail() + "
");
+ }
+ out.println("");
+ out.println("");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
diff --git a/ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml b/ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml
index 1a3fc32381..2aa6bc2cd7 100644
--- a/ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml
+++ b/ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml
@@ -3,7 +3,13 @@
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
- java:/PostgresDS
+ java:/H2DS
model.User
+
+
+
+
+
+
diff --git a/ejb/wildfly/wildfly-jpa/src/main/resources/data.sql b/ejb/wildfly/wildfly-jpa/src/main/resources/data.sql
new file mode 100644
index 0000000000..03eafa534e
--- /dev/null
+++ b/ejb/wildfly/wildfly-jpa/src/main/resources/data.sql
@@ -0,0 +1 @@
+INSERT INTO users (username, email, postal_number) VALUES ('user1', 'user1@baeldung.com', 1000), ('user2', 'user2@baeldung.com', 2);
\ No newline at end of file
diff --git a/gradle/.gitignore b/gradle/.gitignore
new file mode 100644
index 0000000000..da88288c09
--- /dev/null
+++ b/gradle/.gitignore
@@ -0,0 +1 @@
+/.gradle/
diff --git a/gradle/.travis.yml b/gradle/.travis.yml
new file mode 100644
index 0000000000..b2b534799b
--- /dev/null
+++ b/gradle/.travis.yml
@@ -0,0 +1,27 @@
+# More details on how to configure the Travis build
+# https://docs.travis-ci.com/user/customizing-the-build/
+
+# Speed up build with travis caches
+cache:
+ directories:
+ - $HOME/.gradle/caches/
+ - $HOME/.gradle/wrapper/
+
+language: java
+
+jdk:
+ - oraclejdk8
+
+#Skipping install step to avoid having Travis run arbitrary './gradlew assemble' task
+# https://docs.travis-ci.com/user/customizing-the-build/#Skipping-the-Installation-Step
+install:
+ - true
+
+#Don't build tags
+branches:
+ except:
+ - /^v\d/
+
+#Build and perform release (if needed)
+script:
+ - ./gradlew build -s && ./gradlew ciPerformRelease
\ No newline at end of file
diff --git a/gradle/build.gradle b/gradle/build.gradle
index fc561987f7..dcc592a2b4 100644
--- a/gradle/build.gradle
+++ b/gradle/build.gradle
@@ -1,25 +1,35 @@
-apply plugin: 'java'
-apply plugin: 'maven'
-
-repositories{
- mavenCentral()
+allprojects {
+ repositories {
+ jcenter()
+ }
}
-dependencies{
- compile 'org.springframework:spring-context:4.3.5.RELEASE'
-}
-task hello {
- println "this Baeldung's tutorial is ${awesomeness}"
+subprojects {
+
+ version = '1.0'
}
-uploadArchives {
- repositories {
- mavenDeployer {
- repository(url: 'http://yourmavenrepo/repository') {
- authentication(userName: 'user', password: 'password');
- }
-
- }
- }
+apply plugin: 'eclipse'
+
+println 'This will be executed during the configuration phase.'
+
+task configured {
+ println 'This will also be executed during the configuration phase.'
+}
+
+task execFirstTest {
+ doLast {
+ println 'This will be executed during the execution phase.'
+ }
+}
+
+task execSecondTest {
+ doFirst {
+ println 'This will be executed first during the execution phase.'
+ }
+ doLast {
+ println 'This will be executed last during the execution phase.'
+ }
+ println 'This will be executed during the configuration phase as well.'
}
diff --git a/gradle/gradle.properties b/gradle/gradle.properties
deleted file mode 100644
index 41701e5a19..0000000000
--- a/gradle/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-awesomeness=awesome
-group=com.baeldung.tutorial
-version=1.0.1
diff --git a/gradle/gradle/shipkit.gradle b/gradle/gradle/shipkit.gradle
new file mode 100644
index 0000000000..144c01dc05
--- /dev/null
+++ b/gradle/gradle/shipkit.gradle
@@ -0,0 +1,41 @@
+//This default Shipkit configuration file was created automatically and is intended to be checked-in.
+//Default configuration is sufficient for local testing and trying out Shipkit.
+//To leverage Shipkit fully, please fix the TODO items, refer to our Getting Started Guide for help:
+//
+// https://github.com/mockito/shipkit/blob/master/docs/getting-started.md
+//
+shipkit {
+ //TODO is the repository correct?
+ gitHub.repository = "unspecified-user/unspecified-repo"
+
+ //TODO generate and use your own read-only GitHub personal access token
+ gitHub.readOnlyAuthToken = "76826c9ec886612f504d12fd4268b16721c4f85d"
+
+ //TODO generate GitHub write token, and ensure your Travis CI has this env variable exported
+ gitHub.writeAuthToken = System.getenv("GH_WRITE_TOKEN")
+}
+
+allprojects {
+ plugins.withId("com.jfrog.bintray") {
+
+ //Bintray configuration is handled by JFrog Bintray Gradle Plugin
+ //For reference see the official documentation: https://github.com/bintray/gradle-bintray-plugin
+ bintray {
+
+ //TODO sign up for free open source account with https://bintray.com, then look up your API key on your profile page in Bintray
+ key = '7ea297848ca948adb7d3ee92a83292112d7ae989'
+ //TODO don't check in the key, remove above line and use env variable exported on CI:
+ //key = System.getenv("BINTRAY_API_KEY")
+
+ pkg {
+ //TODO configure Bintray settings per your project (https://github.com/bintray/gradle-bintray-plugin)
+ repo = 'bootstrap'
+ user = 'shipkit-bootstrap-bot'
+ userOrg = 'shipkit-bootstrap'
+ name = 'maven'
+ licenses = ['MIT']
+ labels = ['continuous delivery', 'release automation', 'shipkit']
+ }
+ }
+ }
+}
diff --git a/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 3391a4cdf6..0000000000
Binary files a/gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle/wrapper/gradle-wrapper.properties
index b601d97764..ebf7ae9184 100644
--- a/gradle/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sat Dec 31 15:46:08 BRT 2016
+#Thu Oct 12 16:43:02 BDT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip
diff --git a/gradle/gradletaskdemo/aplugin.gradle b/gradle/gradletaskdemo/aplugin.gradle
new file mode 100644
index 0000000000..ca96c50b54
--- /dev/null
+++ b/gradle/gradletaskdemo/aplugin.gradle
@@ -0,0 +1,5 @@
+task fromPlugin {
+ doLast {
+ println "I'm from plugin"
+ }
+}
\ No newline at end of file
diff --git a/gradle/gradletaskdemo/build.gradle b/gradle/gradletaskdemo/build.gradle
new file mode 100644
index 0000000000..58dadd7460
--- /dev/null
+++ b/gradle/gradletaskdemo/build.gradle
@@ -0,0 +1,110 @@
+buildscript {
+ repositories {
+ maven {
+ url "https://plugins.gradle.org/m2/"
+ }
+ }
+ dependencies {
+ classpath "org.shipkit:shipkit:0.9.117"
+ }
+}
+
+
+plugins {
+ id 'java'
+}
+
+
+apply from: 'aplugin.gradle'
+apply plugin: 'org.shipkit.bintray-release'
+
+
+//hello task
+task hello {
+ doLast {
+ println 'Baeldung'
+ }
+}
+
+//Groovy in gradle task
+task toLower {
+ doLast {
+ String someString = 'HELLO FROM BAELDUNG'
+ println "Original: " + someString
+ println "Lower case: " + someString.toLowerCase()
+ }
+}
+
+
+// Task dependencies
+task helloGradle {
+ doLast {
+ println 'Hello Gradle!'
+ }
+}
+
+task fromBaeldung(dependsOn: helloGradle) {
+ doLast {
+ println "I'm from Baeldung"
+ }
+}
+
+
+//Adding behavior to a task via api
+task helloBaeldung {
+ doLast {
+ println 'I will be executed second'
+ }
+}
+
+helloBaeldung.doFirst {
+ println 'I will be executed first'
+}
+
+helloBaeldung.doLast {
+ println 'I will be executed third'
+}
+
+helloBaeldung {
+ doLast {
+ println 'I will be executed fourth'
+ }
+}
+
+
+
+
+//Adding extra task properties
+task ourTask {
+ ext.theProperty = "theValue"
+}
+
+task printTaskProperty {
+ doLast {
+ println ourTask.theProperty
+ }
+}
+
+
+
+//Declaring dependencies
+dependencies {
+ compile group:
+ 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'
+ compile 'org.springframework:spring-core:4.3.5.RELEASE',
+ 'org.springframework:spring-aop:4.3.5.RELEASE'
+ compile(
+ [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'],
+ [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE']
+ )
+ testCompile('org.hibernate:hibernate-core:5.2.12.Final') {
+ transitive = true
+ }
+ runtime(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') {
+ transitive = false
+ }
+ runtime "org.codehaus.groovy:groovy-all:2.4.11@jar"
+ runtime group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.11', ext: 'jar'
+
+ compile fileTree(dir: 'libs', include: '*.jar')
+}
diff --git a/gradle/gradletaskdemo/build/tmp/jar/MANIFEST.MF b/gradle/gradletaskdemo/build/tmp/jar/MANIFEST.MF
new file mode 100644
index 0000000000..59499bce4a
--- /dev/null
+++ b/gradle/gradletaskdemo/build/tmp/jar/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/gradle/gradlew b/gradle/gradlew
index 9d82f78915..27309d9231 100644
--- a/gradle/gradlew
+++ b/gradle/gradlew
@@ -6,12 +6,30 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
@@ -30,6 +48,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,26 +59,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
diff --git a/gradle/gradlew.bat b/gradle/gradlew.bat
index 8a0b282aa6..832fdb6079 100644
--- a/gradle/gradlew.bat
+++ b/gradle/gradlew.bat
@@ -8,14 +8,14 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
@@ -46,7 +46,7 @@ echo location of your Java installation.
goto fail
:init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
diff --git a/gradle/greeter/.gitignore b/gradle/greeter/.gitignore
new file mode 100644
index 0000000000..e93e09f86e
--- /dev/null
+++ b/gradle/greeter/.gitignore
@@ -0,0 +1,3 @@
+/.gradle
+/build
+/bin
diff --git a/gradle/greeter/build.gradle b/gradle/greeter/build.gradle
new file mode 100644
index 0000000000..6f43f23494
--- /dev/null
+++ b/gradle/greeter/build.gradle
@@ -0,0 +1,18 @@
+apply plugin : 'java'
+apply plugin : 'application'
+
+
+
+dependencies {
+ compile project(':greeting-library')
+ compile project(':greeting-library-java')
+}
+
+mainClassName = 'greeter.Greeter'
+run {
+ if (project.hasProperty("appArgs")) {
+ args Eval.me(appArgs)
+ }
+ else
+ args = ["Baeldung"];
+}
diff --git a/gradle/greeter/src/main/java/greeter/Greeter.java b/gradle/greeter/src/main/java/greeter/Greeter.java
new file mode 100644
index 0000000000..7b59f0c4bc
--- /dev/null
+++ b/gradle/greeter/src/main/java/greeter/Greeter.java
@@ -0,0 +1,13 @@
+package greeter;
+
+import baeldunggreeter.Formatter;
+
+public class Greeter {
+ public static void main(String[] args) {
+ final String output = GreetingFormatter
+ .greeting(args[0]);
+ String date = Formatter.getFormattedDate();
+ System.out.println(output);
+ System.out.println("Today is :" + date);
+ }
+}
diff --git a/gradle/greeter/src/test/java/greetertest/TestGreeting.java b/gradle/greeter/src/test/java/greetertest/TestGreeting.java
new file mode 100644
index 0000000000..0ae5fab631
--- /dev/null
+++ b/gradle/greeter/src/test/java/greetertest/TestGreeting.java
@@ -0,0 +1,11 @@
+
+
+
+
+public class TestGreeting{
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/gradle/greeting-library-java/.gitignore b/gradle/greeting-library-java/.gitignore
new file mode 100644
index 0000000000..348c102afc
--- /dev/null
+++ b/gradle/greeting-library-java/.gitignore
@@ -0,0 +1,2 @@
+/build
+/bin
diff --git a/gradle/greeting-library-java/build.gradle b/gradle/greeting-library-java/build.gradle
new file mode 100644
index 0000000000..34931bd0cd
--- /dev/null
+++ b/gradle/greeting-library-java/build.gradle
@@ -0,0 +1,9 @@
+apply plugin :'java'
+//apply plugin : 'application'
+
+
+
+dependencies{
+ compile group: 'joda-time', name: 'joda-time', version: '2.9.9'
+ testCompile group: 'junit', name: 'junit', version: '4.12'
+}
diff --git a/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java b/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java
new file mode 100644
index 0000000000..367e992c1b
--- /dev/null
+++ b/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java
@@ -0,0 +1,14 @@
+package baeldunggreeter;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class Formatter {
+ public static String getFormattedDate() {
+ DateFormat dateFormat = new SimpleDateFormat(
+ "yyyy-MM-dd HH:mm:ss");
+ Date date = new Date();
+ return dateFormat.format(date);
+ }
+}
diff --git a/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java b/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java
new file mode 100644
index 0000000000..49efc934a5
--- /dev/null
+++ b/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java
@@ -0,0 +1,23 @@
+package baeldunggreetertest;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.Date;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+import baeldunggreeter.Formatter;
+
+public class FormatterTest {
+
+ @Test
+ public void testFormatter() {
+
+ String dateRegex1 = "^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])$";
+ String dateString = Formatter.getFormattedDate();
+ assertTrue(Pattern
+ .matches(dateRegex1, dateString));
+
+ }
+}
\ No newline at end of file
diff --git a/gradle/greeting-library/.gitignore b/gradle/greeting-library/.gitignore
new file mode 100644
index 0000000000..84c048a73c
--- /dev/null
+++ b/gradle/greeting-library/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy b/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy
new file mode 100644
index 0000000000..94c863e294
--- /dev/null
+++ b/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy
@@ -0,0 +1,10 @@
+package greeter
+
+import groovy.transform.CompileStatic
+
+@CompileStatic
+class GreetingFormatter{
+ static String greeting(final String name) {
+ "Hello, ${name.capitalize()}"
+ }
+}
diff --git a/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy b/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy
new file mode 100644
index 0000000000..f1c1211552
--- /dev/null
+++ b/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy
@@ -0,0 +1,13 @@
+package greeter
+
+import spock.lang.Specification
+
+class GreetingFormatterSpec extends Specification {
+
+ def 'Creating a greeting'() {
+
+ expect: 'The greeeting to be correctly capitalized'
+ GreetingFormatter.greeting('gradlephant') == 'Hello, Gradlephant'
+
+ }
+}
diff --git a/gradle/greeting-library/build.gradle b/gradle/greeting-library/build.gradle
new file mode 100644
index 0000000000..eb526b3b03
--- /dev/null
+++ b/gradle/greeting-library/build.gradle
@@ -0,0 +1,9 @@
+apply plugin : 'groovy'
+
+dependencies {
+ compile 'org.codehaus.groovy:groovy:2.4.12'
+
+ testCompile 'org.spockframework:spock-core:1.0-groovy-2.4', {
+ exclude module : 'groovy-all'
+ }
+}
diff --git a/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy b/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy
new file mode 100644
index 0000000000..db8a035b67
--- /dev/null
+++ b/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy
@@ -0,0 +1,10 @@
+package greeter
+
+import groovy.transform.CompileStatic
+
+@CompileStatic
+class GreetingFormatter{
+ static String greeting(final String name) {
+ "Hello, ${name.capitalize()}"
+ }
+}
\ No newline at end of file
diff --git a/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy b/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy
new file mode 100644
index 0000000000..f1c1211552
--- /dev/null
+++ b/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy
@@ -0,0 +1,13 @@
+package greeter
+
+import spock.lang.Specification
+
+class GreetingFormatterSpec extends Specification {
+
+ def 'Creating a greeting'() {
+
+ expect: 'The greeeting to be correctly capitalized'
+ GreetingFormatter.greeting('gradlephant') == 'Hello, Gradlephant'
+
+ }
+}
diff --git a/gradle/settings.gradle b/gradle/settings.gradle
new file mode 100644
index 0000000000..38704681bd
--- /dev/null
+++ b/gradle/settings.gradle
@@ -0,0 +1,10 @@
+rootProject.name = 'gradletutorial'
+
+
+include 'greeting-library'
+include 'greeting-library-java'
+include 'greeter'
+include 'gradletaskdemo'
+
+
+println 'This will be executed during the initialization phase.'
diff --git a/gradle/src/main/java/Main.java b/gradle/src/main/java/Main.java
deleted file mode 100644
index 10edd1840b..0000000000
--- a/gradle/src/main/java/Main.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class Main{
- public static void main(String[] args){
- System.out.println("Baeldung Rocks");
- }
-}
diff --git a/gradle/version.properties b/gradle/version.properties
new file mode 100644
index 0000000000..565e9213ae
--- /dev/null
+++ b/gradle/version.properties
@@ -0,0 +1,3 @@
+#Version of the produced binaries. This file is intended to be checked-in.
+#It will be automatically bumped by release automation.
+version=0.0.1
diff --git a/guava-modules/README.md b/guava-modules/README.md
new file mode 100644
index 0000000000..79e45a89e7
--- /dev/null
+++ b/guava-modules/README.md
@@ -0,0 +1,3 @@
+
+## Guava Modules
+
diff --git a/guava18/README.md b/guava-modules/guava-18/README.md
similarity index 100%
rename from guava18/README.md
rename to guava-modules/guava-18/README.md
diff --git a/guava18/pom.xml b/guava-modules/guava-18/pom.xml
similarity index 89%
rename from guava18/pom.xml
rename to guava-modules/guava-18/pom.xml
index 0b96918171..f8dbf5657e 100644
--- a/guava18/pom.xml
+++ b/guava-modules/guava-18/pom.xml
@@ -4,13 +4,14 @@
4.0.0
com.baeldung
- guava18
+ guava-18
0.1.0-SNAPSHOT
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/guava18/src/main/java/com/baeldung/guava/entity/Administrator.java b/guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Administrator.java
similarity index 100%
rename from guava18/src/main/java/com/baeldung/guava/entity/Administrator.java
rename to guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Administrator.java
diff --git a/guava18/src/main/java/com/baeldung/guava/entity/Player.java b/guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Player.java
similarity index 100%
rename from guava18/src/main/java/com/baeldung/guava/entity/Player.java
rename to guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Player.java
diff --git a/guava18/src/main/java/com/baeldung/guava/entity/User.java b/guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/User.java
similarity index 100%
rename from guava18/src/main/java/com/baeldung/guava/entity/User.java
rename to guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/User.java
diff --git a/guava18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java
similarity index 100%
rename from guava18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java
rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java
diff --git a/guava18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java
similarity index 100%
rename from guava18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java
rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java
diff --git a/guava18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java
similarity index 100%
rename from guava18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java
rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java
diff --git a/guava18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java
similarity index 100%
rename from guava18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java
rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java
diff --git a/guava19/README.md b/guava-modules/guava-19/README.md
similarity index 100%
rename from guava19/README.md
rename to guava-modules/guava-19/README.md
diff --git a/guava19/pom.xml b/guava-modules/guava-19/pom.xml
similarity index 89%
rename from guava19/pom.xml
rename to guava-modules/guava-19/pom.xml
index af9bc51eb9..4a23bf7aec 100644
--- a/guava19/pom.xml
+++ b/guava-modules/guava-19/pom.xml
@@ -4,13 +4,14 @@
4.0.0
com.baeldung
- guava19
+ guava-19
0.1.0-SNAPSHOT
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/guava19/src/main/java/com/baeldung/guava/entity/User.java b/guava-modules/guava-19/src/main/java/com/baeldung/guava/entity/User.java
similarity index 100%
rename from guava19/src/main/java/com/baeldung/guava/entity/User.java
rename to guava-modules/guava-19/src/main/java/com/baeldung/guava/entity/User.java
diff --git a/guava19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java
similarity index 100%
rename from guava19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java
rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java
diff --git a/guava19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java
similarity index 100%
rename from guava19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java
rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java
diff --git a/guava19/src/test/java/com/baeldung/guava/HashingUnitTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/HashingUnitTest.java
similarity index 100%
rename from guava19/src/test/java/com/baeldung/guava/HashingUnitTest.java
rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/HashingUnitTest.java
diff --git a/guava19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java
similarity index 100%
rename from guava19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java
rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java
diff --git a/guava21/README.md b/guava-modules/guava-21/README.md
similarity index 100%
rename from guava21/README.md
rename to guava-modules/guava-21/README.md
diff --git a/guava21/pom.xml b/guava-modules/guava-21/pom.xml
similarity index 89%
rename from guava21/pom.xml
rename to guava-modules/guava-21/pom.xml
index 930def2a67..f5432fb7df 100644
--- a/guava21/pom.xml
+++ b/guava-modules/guava-21/pom.xml
@@ -4,13 +4,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- guava21
+ guava-21
1.0-SNAPSHOT
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java
similarity index 100%
rename from guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java
rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java
diff --git a/guava21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java b/guava-modules/guava-21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java
similarity index 100%
rename from guava21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java
rename to guava-modules/guava-21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java
diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java
similarity index 100%
rename from guava21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java
rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java
diff --git a/guest/spring-mvc/README.md b/guest/spring-mvc/README.md
new file mode 100644
index 0000000000..9e5cd64a04
--- /dev/null
+++ b/guest/spring-mvc/README.md
@@ -0,0 +1,17 @@
+## Building
+
+To build the module, use Maven's `package` goal:
+
+```
+mvn clean package
+```
+
+## Running
+
+To run the application, use Spring Boot's `run` goal:
+
+```
+mvn spring-boot:run
+```
+
+The application will be accessible at [http://localhost:8080/](http://localhost:8080/)
diff --git a/guest/spring-mvc/pom.xml b/guest/spring-mvc/pom.xml
index 9974a76e8a..1f695a75a7 100644
--- a/guest/spring-mvc/pom.xml
+++ b/guest/spring-mvc/pom.xml
@@ -3,7 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.forketyfork.guest
+ com.stackify.guest
spring-mvc
0.0.1-SNAPSHOT
jar
diff --git a/guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/Spring5Application.java b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/Spring5Application.java
similarity index 76%
rename from guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/Spring5Application.java
rename to guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/Spring5Application.java
index d9af7c8ac9..42d40fa02d 100644
--- a/guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/Spring5Application.java
+++ b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/Spring5Application.java
@@ -1,11 +1,11 @@
-package com.forketyfork.guest.springmvc;
+package com.stackify.guest.springmvc;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.boot.SpringApplication;
@SpringBootApplication
-@ComponentScan(basePackages = {"com.forketyfork.guest.springmvc"})
+@ComponentScan(basePackages = {"com.stackify.guest.springmvc"})
public class Spring5Application {
public static void main(String[] args) {
diff --git a/guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/model/LoginData.java b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/model/LoginData.java
similarity index 89%
rename from guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/model/LoginData.java
rename to guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/model/LoginData.java
index a9140da4f9..b1a0e86ef4 100644
--- a/guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/model/LoginData.java
+++ b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/model/LoginData.java
@@ -1,4 +1,4 @@
-package com.forketyfork.guest.springmvc.model;
+package com.stackify.guest.springmvc.model;
public class LoginData {
diff --git a/guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/web/InternalsController.java b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/InternalsController.java
similarity index 67%
rename from guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/web/InternalsController.java
rename to guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/InternalsController.java
index c39da4e3e5..0bd8570eed 100644
--- a/guest/spring-mvc/src/main/java/com/forketyfork/guest/springmvc/web/InternalsController.java
+++ b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/InternalsController.java
@@ -1,11 +1,14 @@
-package com.forketyfork.guest.springmvc.web;
+package com.stackify.guest.springmvc.web;
-import com.forketyfork.guest.springmvc.model.LoginData;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
+import com.stackify.guest.springmvc.model.LoginData;
+
import java.util.Collections;
@Controller
@@ -28,4 +31,10 @@ public class InternalsController {
}
}
+ @ResponseBody
+ @PostMapping("/message")
+ public MyOutputResource sendMessage(@RequestBody MyInputResource inputResource) {
+ return new MyOutputResource("Received: " + inputResource.getRequestMessage());
+ }
+
}
diff --git a/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/MyInputResource.java b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/MyInputResource.java
new file mode 100644
index 0000000000..cf5815840a
--- /dev/null
+++ b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/MyInputResource.java
@@ -0,0 +1,14 @@
+package com.stackify.guest.springmvc.web;
+
+public class MyInputResource {
+
+ private String requestMessage;
+
+ public String getRequestMessage() {
+ return requestMessage;
+ }
+
+ public void setRequestMessage(String requestMessage) {
+ this.requestMessage = requestMessage;
+ }
+}
diff --git a/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/MyOutputResource.java b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/MyOutputResource.java
new file mode 100644
index 0000000000..2d0e174243
--- /dev/null
+++ b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/MyOutputResource.java
@@ -0,0 +1,15 @@
+package com.stackify.guest.springmvc.web;
+
+public class MyOutputResource {
+
+ private String responseMessage;
+
+ public MyOutputResource(String responseMessage) {
+ this.responseMessage = responseMessage;
+ }
+
+ public String getResponseMessage() {
+ return responseMessage;
+ }
+
+}
diff --git a/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/RestfulWebServiceController.java b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/RestfulWebServiceController.java
new file mode 100644
index 0000000000..edb35e6ecf
--- /dev/null
+++ b/guest/spring-mvc/src/main/java/com/stackify/guest/springmvc/web/RestfulWebServiceController.java
@@ -0,0 +1,14 @@
+package com.stackify.guest.springmvc.web;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class RestfulWebServiceController {
+
+ @GetMapping("/message")
+ public MyOutputResource getMessage() {
+ return new MyOutputResource("Hello!");
+ }
+
+}
diff --git a/guest/spring-security/README.md b/guest/spring-security/README.md
new file mode 100644
index 0000000000..9e5cd64a04
--- /dev/null
+++ b/guest/spring-security/README.md
@@ -0,0 +1,17 @@
+## Building
+
+To build the module, use Maven's `package` goal:
+
+```
+mvn clean package
+```
+
+## Running
+
+To run the application, use Spring Boot's `run` goal:
+
+```
+mvn spring-boot:run
+```
+
+The application will be accessible at [http://localhost:8080/](http://localhost:8080/)
diff --git a/guest/spring-security/pom.xml b/guest/spring-security/pom.xml
new file mode 100644
index 0000000000..c41637bfc2
--- /dev/null
+++ b/guest/spring-security/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+
+ com.stackify.guest
+ spring-security
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.0.M6
+
+
+
+ spring-security
+ Spring Security Sample Project
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.thymeleaf
+ thymeleaf-spring5
+ 3.0.8.RELEASE
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ com.h2database
+ h2
+ runtime
+
+
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+ false
+
+
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+ false
+
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/Application.java b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/Application.java
new file mode 100644
index 0000000000..fbd0eee044
--- /dev/null
+++ b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/Application.java
@@ -0,0 +1,15 @@
+package com.stackify.guest.springsecurity;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.stackify.guest.springsecurity"})
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebMvcConfiguration.java b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebMvcConfiguration.java
new file mode 100644
index 0000000000..b8dfe9050d
--- /dev/null
+++ b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebMvcConfiguration.java
@@ -0,0 +1,16 @@
+package com.stackify.guest.springsecurity.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebMvcConfiguration implements WebMvcConfigurer {
+
+ @Override
+ public void addViewControllers(ViewControllerRegistry registry) {
+ registry.addViewController("/customLogin").setViewName("customLogin");
+ registry.addViewController("/loginSuccess").setViewName("index");
+ }
+
+}
\ No newline at end of file
diff --git a/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebSecurityConfig.java b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebSecurityConfig.java
new file mode 100644
index 0000000000..164808d5b3
--- /dev/null
+++ b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebSecurityConfig.java
@@ -0,0 +1,40 @@
+package com.stackify.guest.springsecurity.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.JdbcUserDetailsManager;
+
+import javax.sql.DataSource;
+
+@EnableWebSecurity
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Bean
+ public UserDetailsService jdbcUserDetailsService(DataSource dataSource) {
+ JdbcUserDetailsManager manager = new JdbcUserDetailsManager();
+ manager.setDataSource(dataSource);
+ return manager;
+ }
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests()
+ .antMatchers("/css/**").permitAll()
+ .anyRequest().authenticated()
+ .and().formLogin()
+ .loginPage("/customLogin")
+ .defaultSuccessUrl("/loginSuccess", true)
+ .permitAll();
+ }
+
+}
\ No newline at end of file
diff --git a/guest/spring-security/src/main/resources/data.sql b/guest/spring-security/src/main/resources/data.sql
new file mode 100644
index 0000000000..b3f7db9105
--- /dev/null
+++ b/guest/spring-security/src/main/resources/data.sql
@@ -0,0 +1,2 @@
+INSERT INTO users VALUES ('jill', '$2a$04$qUlqAEEYF1YvrpJMosodoewgL6aO.qgHytl2k5L7kdXEWnJsFdxvq', TRUE);
+INSERT INTO authorities VALUES ('jill', 'USERS');
diff --git a/guest/spring-security/src/main/resources/schema.sql b/guest/spring-security/src/main/resources/schema.sql
new file mode 100644
index 0000000000..3de1b9a29f
--- /dev/null
+++ b/guest/spring-security/src/main/resources/schema.sql
@@ -0,0 +1,10 @@
+CREATE TABLE users (
+ username VARCHAR(256) PRIMARY KEY,
+ password VARCHAR(256),
+ enabled BOOLEAN
+);
+
+CREATE TABLE authorities (
+ username VARCHAR(256) REFERENCES users (username),
+ authority VARCHAR(256)
+);
diff --git a/guest/spring-security/src/main/resources/static/css/styles.css b/guest/spring-security/src/main/resources/static/css/styles.css
new file mode 100644
index 0000000000..72bcc4934f
--- /dev/null
+++ b/guest/spring-security/src/main/resources/static/css/styles.css
@@ -0,0 +1,3 @@
+.bad-login {
+ color: red;
+}
\ No newline at end of file
diff --git a/guest/spring-security/src/main/resources/templates/customLogin.html b/guest/spring-security/src/main/resources/templates/customLogin.html
new file mode 100644
index 0000000000..c689c78514
--- /dev/null
+++ b/guest/spring-security/src/main/resources/templates/customLogin.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/guest/spring-security/src/main/resources/templates/index.html b/guest/spring-security/src/main/resources/templates/index.html
new file mode 100644
index 0000000000..0769f9015f
--- /dev/null
+++ b/guest/spring-security/src/main/resources/templates/index.html
@@ -0,0 +1,11 @@
+
+
+Hello, !
+
+
\ No newline at end of file
diff --git a/hibernate5/README.md b/hibernate5/README.md
index ff12555376..4690ebbe76 100644
--- a/hibernate5/README.md
+++ b/hibernate5/README.md
@@ -1 +1,4 @@
## Relevant articles:
+
+- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping)
+- [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers)
diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml
index c501b7f11d..3b0b2fcd88 100644
--- a/hibernate5/pom.xml
+++ b/hibernate5/pom.xml
@@ -17,23 +17,47 @@
UTF-8
3.6.0
-
+ 5.2.12.Final
+ 6.0.6
+ 2.2.3
+
org.hibernate
hibernate-core
- 5.2.9.Final
+ ${hibernate.version}
junit
junit
4.12
+
+ org.assertj
+ assertj-core
+ 3.8.0
+ test
+
com.h2database
h2
1.4.194
+
+ org.hibernate
+ hibernate-spatial
+ ${hibernate.version}
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
+
+ ch.vorburger.mariaDB4j
+ mariaDB4j
+ ${mariaDB4j.version}
+
hibernate5
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java
index 5a10b2ba56..30f3c3cf53 100644
--- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java
@@ -68,7 +68,7 @@ public class HibernateMultiTenantUtil {
Properties properties = new Properties();
URL propertiesURL = Thread.currentThread()
.getContextClassLoader()
- .getResource("hibernate.properties");
+ .getResource("hibernate-multitenancy.properties");
FileInputStream inputStream = new FileInputStream(propertiesURL.getFile());
properties.load(inputStream);
System.out.println("LOADED PROPERTIES FROM hibernate.properties");
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
index c1f7301d46..f1fc22d29a 100644
--- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
@@ -1,24 +1,105 @@
package com.baeldung.hibernate;
+import com.baeldung.hibernate.pojo.Employee;
+import com.baeldung.hibernate.pojo.EntityDescription;
+import com.baeldung.hibernate.pojo.OrderEntry;
+import com.baeldung.hibernate.pojo.OrderEntryIdClass;
+import com.baeldung.hibernate.pojo.OrderEntryPK;
+import com.baeldung.hibernate.pojo.PointEntity;
+import com.baeldung.hibernate.pojo.Product;
+import com.baeldung.hibernate.pojo.Phone;
+import com.baeldung.hibernate.pojo.TemporalValues;
+import com.baeldung.hibernate.pojo.Course;
+import com.baeldung.hibernate.pojo.Student;
+import com.baeldung.hibernate.pojo.User;
+import com.baeldung.hibernate.pojo.UserProfile;
+import com.baeldung.hibernate.pojo.inheritance.Animal;
+import com.baeldung.hibernate.pojo.inheritance.Bag;
+import com.baeldung.hibernate.pojo.inheritance.Book;
+import com.baeldung.hibernate.pojo.inheritance.Car;
+import com.baeldung.hibernate.pojo.inheritance.MyEmployee;
+import com.baeldung.hibernate.pojo.inheritance.MyProduct;
+import com.baeldung.hibernate.pojo.inheritance.Pen;
+import com.baeldung.hibernate.pojo.inheritance.Person;
+import com.baeldung.hibernate.pojo.inheritance.Pet;
+import com.baeldung.hibernate.pojo.inheritance.Vehicle;
+
+import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
-import org.hibernate.cfg.Configuration;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.service.ServiceRegistry;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
public class HibernateUtil {
+ private static SessionFactory sessionFactory;
+ private static String PROPERTY_FILE_NAME;
- private static final SessionFactory sessionFactory;
-
- static {
- try {
- Configuration configuration = new Configuration().configure();
- sessionFactory = configuration.buildSessionFactory();
-
- } catch (Throwable ex) {
- System.err.println("Initial SessionFactory creation failed." + ex);
- throw new ExceptionInInitializerError(ex);
- }
+ public static SessionFactory getSessionFactory() throws IOException {
+ return getSessionFactory(null);
}
- public static SessionFactory getSessionFactory() {
+ public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
+ PROPERTY_FILE_NAME = propertyFileName;
+ if (sessionFactory == null) {
+ ServiceRegistry serviceRegistry = configureServiceRegistry();
+ sessionFactory = makeSessionFactory(serviceRegistry);
+ }
return sessionFactory;
}
+
+ private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ metadataSources.addPackage("com.baeldung.hibernate.pojo");
+ metadataSources.addAnnotatedClass(Employee.class);
+ metadataSources.addAnnotatedClass(Phone.class);
+ metadataSources.addAnnotatedClass(EntityDescription.class);
+ metadataSources.addAnnotatedClass(TemporalValues.class);
+ metadataSources.addAnnotatedClass(User.class);
+ metadataSources.addAnnotatedClass(Student.class);
+ metadataSources.addAnnotatedClass(Course.class);
+ metadataSources.addAnnotatedClass(Product.class);
+ metadataSources.addAnnotatedClass(OrderEntryPK.class);
+ metadataSources.addAnnotatedClass(OrderEntry.class);
+ metadataSources.addAnnotatedClass(OrderEntryIdClass.class);
+ metadataSources.addAnnotatedClass(UserProfile.class);
+ metadataSources.addAnnotatedClass(Book.class);
+ metadataSources.addAnnotatedClass(MyEmployee.class);
+ metadataSources.addAnnotatedClass(MyProduct.class);
+ metadataSources.addAnnotatedClass(Pen.class);
+ metadataSources.addAnnotatedClass(Person.class);
+ metadataSources.addAnnotatedClass(Animal.class);
+ metadataSources.addAnnotatedClass(Pet.class);
+ metadataSources.addAnnotatedClass(Vehicle.class);
+ metadataSources.addAnnotatedClass(Car.class);
+ metadataSources.addAnnotatedClass(Bag.class);
+ metadataSources.addAnnotatedClass(PointEntity.class);
+
+ Metadata metadata = metadataSources.buildMetadata();
+ return metadata.getSessionFactoryBuilder()
+ .build();
+
+ }
+
+ private static ServiceRegistry configureServiceRegistry() throws IOException {
+ Properties properties = getProperties();
+ return new StandardServiceRegistryBuilder().applySettings(properties)
+ .build();
+ }
+
+ private static Properties getProperties() throws IOException {
+ Properties properties = new Properties();
+ URL propertiesURL = Thread.currentThread()
+ .getContextClassLoader()
+ .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties"));
+ try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
+ properties.load(inputStream);
+ }
+ return properties;
+ }
}
\ No newline at end of file
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Course.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Course.java
new file mode 100644
index 0000000000..97760acd3b
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Course.java
@@ -0,0 +1,27 @@
+package com.baeldung.hibernate.pojo;
+
+import java.util.UUID;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Course {
+
+ @Id
+ @GeneratedValue
+ private UUID courseId;
+
+ public UUID getCourseId() {
+ return courseId;
+ }
+
+ public void setCourseId(UUID courseId) {
+ this.courseId = courseId;
+ }
+
+
+
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Department.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Department.java
new file mode 100644
index 0000000000..6dd106b88e
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Department.java
@@ -0,0 +1,25 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.TableGenerator;
+
+@Entity
+public class Department {
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator="table-generator")
+ @TableGenerator (name="table-generator", table="dep_ids", pkColumnName="seq_id", valueColumnName="seq_value")
+ private long depId;
+
+ public long getDepId() {
+ return depId;
+ }
+
+ public void setDepId(long depId) {
+ this.depId = depId;
+ }
+
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Employee.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Employee.java
new file mode 100644
index 0000000000..e9732b2b67
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Employee.java
@@ -0,0 +1,87 @@
+package com.baeldung.hibernate.pojo;
+
+import org.hibernate.annotations.*;
+
+import javax.persistence.Entity;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+@Entity
+@Where(clause = "deleted = false")
+@FilterDef(name = "incomeLevelFilter", parameters = @ParamDef(name = "incomeLimit", type = "int"))
+@Filter(name = "incomeLevelFilter", condition = "grossIncome > :incomeLimit")
+public class Employee implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private long grossIncome;
+
+ private int taxInPercents;
+
+ private boolean deleted;
+
+ public long getTaxJavaWay() {
+ return grossIncome * taxInPercents / 100;
+ }
+
+ @Formula("grossIncome * taxInPercents / 100")
+ private long tax;
+
+ @OneToMany
+ @JoinColumn(name = "employee_id")
+ @Where(clause = "deleted = false")
+ private Set phones = new HashSet<>(0);
+
+ public Employee() {
+ }
+
+ public Employee(long grossIncome, int taxInPercents) {
+ this.grossIncome = grossIncome;
+ this.taxInPercents = taxInPercents;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public long getGrossIncome() {
+ return grossIncome;
+ }
+
+ public int getTaxInPercents() {
+ return taxInPercents;
+ }
+
+ public long getTax() {
+ return tax;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public void setGrossIncome(long grossIncome) {
+ this.grossIncome = grossIncome;
+ }
+
+ public void setTaxInPercents(int taxInPercents) {
+ this.taxInPercents = taxInPercents;
+ }
+
+ public boolean getDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+ public Set getPhones() {
+ return phones;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java
new file mode 100644
index 0000000000..131bb73a80
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java
@@ -0,0 +1,55 @@
+package com.baeldung.hibernate.pojo;
+
+import org.hibernate.annotations.Any;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+public class EntityDescription implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private String description;
+
+ @Any(
+ metaDef = "EntityDescriptionMetaDef",
+ metaColumn = @Column(name = "entity_type")
+ )
+ @JoinColumn(name = "entity_id")
+ private Serializable entity;
+
+ public EntityDescription() {
+ }
+
+ public EntityDescription(String description, Serializable entity) {
+ this.description = description;
+ this.entity = entity;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Serializable getEntity() {
+ return entity;
+ }
+
+ public void setEntity(Serializable entity) {
+ this.entity = entity;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntry.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntry.java
new file mode 100644
index 0000000000..a28b7c8dbe
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntry.java
@@ -0,0 +1,20 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+@Entity
+public class OrderEntry {
+
+ @EmbeddedId
+ private OrderEntryPK entryId;
+
+ public OrderEntryPK getEntryId() {
+ return entryId;
+ }
+
+ public void setEntryId(OrderEntryPK entryId) {
+ this.entryId = entryId;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java
new file mode 100644
index 0000000000..18926640af
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java
@@ -0,0 +1,31 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+@Entity
+@IdClass(OrderEntryPK.class)
+public class OrderEntryIdClass {
+ @Id
+ private long orderId;
+ @Id
+ private long productId;
+
+ public long getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(long orderId) {
+ this.orderId = orderId;
+ }
+
+ public long getProductId() {
+ return productId;
+ }
+
+ public void setProductId(long productId) {
+ this.productId = productId;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java
new file mode 100644
index 0000000000..637d590629
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java
@@ -0,0 +1,46 @@
+package com.baeldung.hibernate.pojo;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class OrderEntryPK implements Serializable {
+
+ private long orderId;
+ private long productId;
+
+ public long getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(long orderId) {
+ this.orderId = orderId;
+ }
+
+ public long getProductId() {
+ return productId;
+ }
+
+ public void setProductId(long productId) {
+ this.productId = productId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderEntryPK pk = (OrderEntryPK) o;
+ return Objects.equals(orderId, pk.orderId) && Objects.equals(productId, pk.productId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId, productId);
+ }
+}
\ No newline at end of file
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Phone.java
new file mode 100644
index 0000000000..d923bda5de
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Phone.java
@@ -0,0 +1,50 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Entity
+public class Phone implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private boolean deleted;
+
+ private String number;
+
+ public Phone() {
+ }
+
+ public Phone(String number) {
+ this.number = number;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java
new file mode 100644
index 0000000000..223f5dcbde
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java
@@ -0,0 +1,41 @@
+package com.baeldung.hibernate.pojo;
+
+import com.vividsolutions.jts.geom.Point;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class PointEntity {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private Point point;
+
+ public PointEntity() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Point getPoint() {
+ return point;
+ }
+
+ public void setPoint(Point point) {
+ this.point = point;
+ }
+
+ @Override
+ public String toString() {
+ return "PointEntity{" + "id=" + id + ", point=" + point + '}';
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Product.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Product.java
new file mode 100644
index 0000000000..efd6b63dc0
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Product.java
@@ -0,0 +1,26 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Parameter;
+
+@Entity
+public class Product {
+
+ @Id
+ @GeneratedValue(generator = "prod-generator")
+ @GenericGenerator(name = "prod-generator", parameters = @Parameter(name = "prefix", value = "prod"), strategy = "com.baeldung.hibernate.pojo.generator.MyGenerator")
+ private String prodId;
+
+ public String getProdId() {
+ return prodId;
+ }
+
+ public void setProdId(String prodId) {
+ this.prodId = prodId;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java
new file mode 100644
index 0000000000..a6dec4a30d
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java
@@ -0,0 +1,23 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Student {
+
+ @Id
+ @GeneratedValue (strategy = GenerationType.SEQUENCE)
+ private long studentId;
+
+ public long getStudentId() {
+ return studentId;
+ }
+
+ public void setStudent_id(long studentId) {
+ this.studentId = studentId;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java
new file mode 100644
index 0000000000..f3fe095cae
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java
@@ -0,0 +1,195 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.time.*;
+import java.util.Calendar;
+
+@Entity
+public class TemporalValues implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ @Basic
+ private java.sql.Date sqlDate;
+
+ @Basic
+ private java.sql.Time sqlTime;
+
+ @Basic
+ private java.sql.Timestamp sqlTimestamp;
+
+ @Basic
+ @Temporal(TemporalType.DATE)
+ private java.util.Date utilDate;
+
+ @Basic
+ @Temporal(TemporalType.TIME)
+ private java.util.Date utilTime;
+
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ private java.util.Date utilTimestamp;
+
+ @Basic
+ @Temporal(TemporalType.DATE)
+ private java.util.Calendar calendarDate;
+
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ private java.util.Calendar calendarTimestamp;
+
+ @Basic
+ private java.time.LocalDate localDate;
+
+ @Basic
+ private java.time.LocalTime localTime;
+
+ @Basic
+ private java.time.OffsetTime offsetTime;
+
+ @Basic
+ private java.time.Instant instant;
+
+ @Basic
+ private java.time.LocalDateTime localDateTime;
+
+ @Basic
+ private java.time.OffsetDateTime offsetDateTime;
+
+ @Basic
+ private java.time.ZonedDateTime zonedDateTime;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Date getSqlDate() {
+ return sqlDate;
+ }
+
+ public void setSqlDate(Date sqlDate) {
+ this.sqlDate = sqlDate;
+ }
+
+ public Time getSqlTime() {
+ return sqlTime;
+ }
+
+ public void setSqlTime(Time sqlTime) {
+ this.sqlTime = sqlTime;
+ }
+
+ public Timestamp getSqlTimestamp() {
+ return sqlTimestamp;
+ }
+
+ public void setSqlTimestamp(Timestamp sqlTimestamp) {
+ this.sqlTimestamp = sqlTimestamp;
+ }
+
+ public java.util.Date getUtilDate() {
+ return utilDate;
+ }
+
+ public void setUtilDate(java.util.Date utilDate) {
+ this.utilDate = utilDate;
+ }
+
+ public java.util.Date getUtilTime() {
+ return utilTime;
+ }
+
+ public void setUtilTime(java.util.Date utilTime) {
+ this.utilTime = utilTime;
+ }
+
+ public java.util.Date getUtilTimestamp() {
+ return utilTimestamp;
+ }
+
+ public void setUtilTimestamp(java.util.Date utilTimestamp) {
+ this.utilTimestamp = utilTimestamp;
+ }
+
+ public Calendar getCalendarDate() {
+ return calendarDate;
+ }
+
+ public void setCalendarDate(Calendar calendarDate) {
+ this.calendarDate = calendarDate;
+ }
+
+ public Calendar getCalendarTimestamp() {
+ return calendarTimestamp;
+ }
+
+ public void setCalendarTimestamp(Calendar calendarTimestamp) {
+ this.calendarTimestamp = calendarTimestamp;
+ }
+
+ public LocalDate getLocalDate() {
+ return localDate;
+ }
+
+ public void setLocalDate(LocalDate localDate) {
+ this.localDate = localDate;
+ }
+
+ public LocalTime getLocalTime() {
+ return localTime;
+ }
+
+ public void setLocalTime(LocalTime localTime) {
+ this.localTime = localTime;
+ }
+
+ public OffsetTime getOffsetTime() {
+ return offsetTime;
+ }
+
+ public void setOffsetTime(OffsetTime offsetTime) {
+ this.offsetTime = offsetTime;
+ }
+
+ public Instant getInstant() {
+ return instant;
+ }
+
+ public void setInstant(Instant instant) {
+ this.instant = instant;
+ }
+
+ public LocalDateTime getLocalDateTime() {
+ return localDateTime;
+ }
+
+ public void setLocalDateTime(LocalDateTime localDateTime) {
+ this.localDateTime = localDateTime;
+ }
+
+ public OffsetDateTime getOffsetDateTime() {
+ return offsetDateTime;
+ }
+
+ public void setOffsetDateTime(OffsetDateTime offsetDateTime) {
+ this.offsetDateTime = offsetDateTime;
+ }
+
+ public ZonedDateTime getZonedDateTime() {
+ return zonedDateTime;
+ }
+
+ public void setZonedDateTime(ZonedDateTime zonedDateTime) {
+ this.zonedDateTime = zonedDateTime;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/User.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/User.java
new file mode 100644
index 0000000000..90203d29ec
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/User.java
@@ -0,0 +1,24 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+
+@Entity
+public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence-generator")
+ @SequenceGenerator(name = "sequence-generator", sequenceName = "user_sequence", initialValue = 4)
+ private long userId;
+
+ public long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(long userId) {
+ this.userId = userId;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/UserProfile.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/UserProfile.java
new file mode 100644
index 0000000000..ac870c2818
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/UserProfile.java
@@ -0,0 +1,34 @@
+package com.baeldung.hibernate.pojo;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.MapsId;
+import javax.persistence.OneToOne;
+
+@Entity
+public class UserProfile {
+
+ @Id
+ private long profileId;
+
+ @OneToOne
+ @MapsId
+ private User user;
+
+ public long getProfileId() {
+ return profileId;
+ }
+
+ public void setProfileId(long profileId) {
+ this.profileId = profileId;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java
new file mode 100644
index 0000000000..17ffe9b7e1
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java
@@ -0,0 +1,41 @@
+package com.baeldung.hibernate.pojo.generator;
+
+import java.io.Serializable;
+import java.util.Properties;
+import java.util.stream.Stream;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.id.Configurable;
+import org.hibernate.id.IdentifierGenerator;
+import org.hibernate.service.ServiceRegistry;
+import org.hibernate.type.Type;
+
+public class MyGenerator implements IdentifierGenerator, Configurable {
+
+ private String prefix;
+
+ @Override
+ public Serializable generate(SharedSessionContractImplementor session, Object obj) throws HibernateException {
+
+ String query = String.format("select %s from %s",
+ session.getEntityPersister(obj.getClass().getName(), obj).getIdentifierPropertyName(),
+ obj.getClass().getSimpleName());
+
+ Stream ids = session.createQuery(query).stream();
+
+ Long max = ids.map(o -> o.replace(prefix + "-", ""))
+ .mapToLong(Long::parseLong)
+ .max()
+ .orElse(0L);
+
+ return prefix + "-" + (max + 1);
+ }
+
+ @Override
+ public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException {
+ prefix = properties.getProperty("prefix");
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java
new file mode 100644
index 0000000000..6fe7f915fc
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java
@@ -0,0 +1,40 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+@Entity
+@Inheritance(strategy = InheritanceType.JOINED)
+public class Animal {
+
+ @Id
+ private long animalId;
+
+ private String species;
+
+ public Animal() {}
+
+ public Animal(long animalId, String species) {
+ this.animalId = animalId;
+ this.species = species;
+ }
+
+ public long getAnimalId() {
+ return animalId;
+ }
+
+ public void setAnimalId(long animalId) {
+ this.animalId = animalId;
+ }
+
+ public String getSpecies() {
+ return species;
+ }
+
+ public void setSpecies(String species) {
+ this.species = species;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java
new file mode 100644
index 0000000000..fa6e1b4bef
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java
@@ -0,0 +1,38 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Polymorphism;
+import org.hibernate.annotations.PolymorphismType;
+
+@Entity
+@Polymorphism(type = PolymorphismType.EXPLICIT)
+public class Bag implements Item {
+
+ @Id
+ private long bagId;
+
+ private String type;
+
+ public Bag(long bagId, String type) {
+ this.bagId = bagId;
+ this.type = type;
+ }
+
+ public long getBagId() {
+ return bagId;
+ }
+
+ public void setBagId(long bagId) {
+ this.bagId = bagId;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java
new file mode 100644
index 0000000000..36ca8dd77c
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java
@@ -0,0 +1,27 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+@Entity
+@DiscriminatorValue("1")
+public class Book extends MyProduct {
+ private String author;
+
+ public Book() {
+ }
+
+ public Book(long productId, String name, String author) {
+ super(productId, name);
+ this.author = author;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java
new file mode 100644
index 0000000000..49d1f7749a
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java
@@ -0,0 +1,25 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Car extends Vehicle {
+ private String engine;
+
+ public Car() {
+ }
+
+ public Car(long vehicleId, String manufacturer, String engine) {
+ super(vehicleId, manufacturer);
+ this.engine = engine;
+ }
+
+ public String getEngine() {
+ return engine;
+ }
+
+ public void setEngine(String engine) {
+ this.engine = engine;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java
new file mode 100644
index 0000000000..9656030736
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java
@@ -0,0 +1,5 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+public interface Item {
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java
new file mode 100644
index 0000000000..9a6bce16cf
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java
@@ -0,0 +1,22 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Entity;
+
+@Entity
+public class MyEmployee extends Person {
+ private String company;
+
+ public MyEmployee(long personId, String name, String company) {
+ super(personId, name);
+ this.company = company;
+ }
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java
new file mode 100644
index 0000000000..13f04d8904
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java
@@ -0,0 +1,47 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.annotations.DiscriminatorFormula;
+
+@Entity
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+@DiscriminatorColumn(name = "product_type", discriminatorType = DiscriminatorType.INTEGER)
+// @DiscriminatorFormula("case when author is not null then 1 else 2 end")
+public class MyProduct {
+ @Id
+ private long productId;
+
+ private String name;
+
+ public MyProduct() {
+ }
+
+ public MyProduct(long productId, String name) {
+ super();
+ this.productId = productId;
+ this.name = name;
+ }
+
+ public long getProductId() {
+ return productId;
+ }
+
+ public void setProductId(long productId) {
+ this.productId = productId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java
new file mode 100644
index 0000000000..32b77e52af
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java
@@ -0,0 +1,27 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+@Entity
+@DiscriminatorValue("2")
+public class Pen extends MyProduct {
+ private String color;
+
+ public Pen() {
+ }
+
+ public Pen(long productId, String name, String color) {
+ super(productId, name);
+ this.color = color;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java
new file mode 100644
index 0000000000..99084b88af
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java
@@ -0,0 +1,38 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+@MappedSuperclass
+public class Person {
+
+ @Id
+ private long personId;
+
+ private String name;
+
+ public Person() {
+ }
+
+ public Person(long personId, String name) {
+ this.personId = personId;
+ this.name = name;
+ }
+
+ public long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(long personId) {
+ this.personId = personId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java
new file mode 100644
index 0000000000..870b3cd684
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java
@@ -0,0 +1,27 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+@Entity
+@PrimaryKeyJoinColumn(name = "petId")
+public class Pet extends Animal {
+ private String name;
+
+ public Pet() {
+ }
+
+ public Pet(long animalId, String species, String name) {
+ super(animalId, species);
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java
new file mode 100644
index 0000000000..b2a920573e
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java
@@ -0,0 +1,40 @@
+package com.baeldung.hibernate.pojo.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+@Entity
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Vehicle {
+ @Id
+ private long vehicleId;
+
+ private String manufacturer;
+
+ public Vehicle() {
+ }
+
+ public Vehicle(long vehicleId, String manufacturer) {
+ this.vehicleId = vehicleId;
+ this.manufacturer = manufacturer;
+ }
+
+ public long getVehicleId() {
+ return vehicleId;
+ }
+
+ public void setVehicleId(long vehicleId) {
+ this.vehicleId = vehicleId;
+ }
+
+ public String getManufacturer() {
+ return manufacturer;
+ }
+
+ public void setManufacturer(String manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/package-info.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/package-info.java
new file mode 100644
index 0000000000..992cda7c1d
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/package-info.java
@@ -0,0 +1,9 @@
+@AnyMetaDef(name = "EntityDescriptionMetaDef", metaType = "string", idType = "int",
+ metaValues = {
+ @MetaValue(value = "Employee", targetEntity = Employee.class),
+ @MetaValue(value = "Phone", targetEntity = Phone.class)
+ })
+package com.baeldung.hibernate.pojo;
+
+import org.hibernate.annotations.AnyMetaDef;
+import org.hibernate.annotations.MetaValue;
\ No newline at end of file
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java
new file mode 100644
index 0000000000..b207d6630a
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java
@@ -0,0 +1,164 @@
+package com.baeldung.hibernate;
+
+import com.baeldung.hibernate.pojo.Employee;
+import com.baeldung.hibernate.pojo.EntityDescription;
+import com.baeldung.hibernate.pojo.Phone;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DynamicMappingIntegrationTest {
+
+ private Session session;
+
+ private Transaction transaction;
+
+ @Before
+ public void setUp() throws IOException {
+ session = HibernateUtil.getSessionFactory().openSession();
+ transaction = session.beginTransaction();
+
+ session.createNativeQuery("delete from phone").executeUpdate();
+ session.createNativeQuery("delete from employee").executeUpdate();
+
+ transaction.commit();
+ transaction = session.beginTransaction();
+ }
+
+ @After
+ public void tearDown() {
+ transaction.rollback();
+ session.close();
+ }
+
+ @Test
+ public void givenEntity_whenFieldMappedWithFormula_thenFieldIsCalculated() {
+ Employee employee = new Employee(10_000L, 25);
+ assertThat(employee.getTaxJavaWay()).isEqualTo(2_500L);
+
+ session.save(employee);
+ session.flush();
+ session.clear();
+
+ employee = session.get(Employee.class, employee.getId());
+ assertThat(employee.getTax()).isEqualTo(2_500L);
+ }
+
+ @Test
+ public void givenEntityMappedWithWhere_whenDeletedIsTrue_thenEntityNotFetched() {
+ Employee employee = new Employee();
+
+ session.save(employee);
+ session.clear();
+
+ employee = session.find(Employee.class, employee.getId());
+ assertThat(employee).isNotNull();
+
+ employee.setDeleted(true);
+ session.flush();
+
+ employee = session.find(Employee.class, employee.getId());
+ assertThat(employee).isNotNull();
+
+ session.clear();
+
+ employee = session.find(Employee.class, employee.getId());
+ assertThat(employee).isNull();
+
+ }
+
+ @Test
+ public void givenCollectionMappedWithWhere_whenDeletedIsTrue_thenEntityNotFetched() {
+ Employee employee = new Employee();
+ Phone phone1 = new Phone("555-45-67");
+ Phone phone2 = new Phone("555-89-01");
+ employee.getPhones().add(phone1);
+ employee.getPhones().add(phone2);
+
+ session.save(phone1);
+ session.save(phone2);
+ session.save(employee);
+ session.flush();
+ session.clear();
+
+ employee = session.find(Employee.class, employee.getId());
+ assertThat(employee.getPhones()).hasSize(2);
+
+ employee.getPhones().iterator().next().setDeleted(true);
+ session.flush();
+ session.clear();
+
+ employee = session.find(Employee.class, employee.getId());
+ assertThat(employee.getPhones()).hasSize(1);
+
+ List fullPhoneList = session.createQuery("from Phone").getResultList();
+ assertThat(fullPhoneList).hasSize(2);
+
+ }
+
+ @Test
+ public void givenFilterByIncome_whenIncomeLimitSet_thenFilterIsApplied() throws IOException {
+ session.save(new Employee(10_000, 25));
+ session.save(new Employee(12_000, 25));
+ session.save(new Employee(15_000, 25));
+
+ session.flush();
+ session.clear();
+
+ session.enableFilter("incomeLevelFilter")
+ .setParameter("incomeLimit", 11_000);
+
+ List employees = session.createQuery("from Employee").getResultList();
+
+ assertThat(employees).hasSize(2);
+
+ Employee employee = session.get(Employee.class, 1);
+ assertThat(employee.getGrossIncome()).isEqualTo(10_000);
+
+ session.close();
+
+ session = HibernateUtil.getSessionFactory().openSession();
+ transaction = session.beginTransaction();
+
+ employees = session.createQuery("from Employee").getResultList();
+
+ assertThat(employees).hasSize(3);
+
+ }
+
+ @Test
+ public void givenMappingWithAny_whenDescriptionAddedToEntity_thenDescriptionCanReferAnyEntity() {
+ Employee employee = new Employee();
+ Phone phone1 = new Phone("555-45-67");
+ Phone phone2 = new Phone("555-89-01");
+ employee.getPhones().add(phone1);
+ employee.getPhones().add(phone2);
+
+ EntityDescription employeeDescription = new EntityDescription("Send to conference next year", employee);
+ EntityDescription phone1Description = new EntityDescription("Home phone (do not call after 10PM)", phone1);
+ EntityDescription phone2Description = new EntityDescription("Work phone", phone1);
+
+ session.save(phone1);
+ session.save(phone2);
+ session.save(employee);
+ session.save(employeeDescription);
+ session.save(phone1Description);
+ session.save(phone2Description);
+ session.flush();
+ session.clear();
+
+ List descriptions = session.createQuery("from EntityDescription").getResultList();
+
+ assertThat(Employee.class.isAssignableFrom(descriptions.get(0).getEntity().getClass())).isTrue();
+ assertThat(Phone.class.isAssignableFrom(descriptions.get(1).getEntity().getClass())).isTrue();
+ assertThat(Phone.class.isAssignableFrom(descriptions.get(2).getEntity().getClass())).isTrue();
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java
new file mode 100644
index 0000000000..6d0aa0a4cd
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java
@@ -0,0 +1,97 @@
+package com.baeldung.hibernate;
+
+import com.baeldung.hibernate.pojo.PointEntity;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.Query;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class HibernateSpatialTest {
+
+ private Session session;
+ private Transaction transaction;
+
+ @Before
+ public void setUp() throws IOException {
+ session = HibernateUtil.getSessionFactory("hibernate-spatial.properties")
+ .openSession();
+ transaction = session.beginTransaction();
+ }
+
+ @After
+ public void tearDown() {
+ transaction.rollback();
+ session.close();
+ }
+
+ @Test
+ public void shouldConvertWktToGeometry() throws ParseException {
+ Geometry geometry = wktToGeometry("POINT (2 5)");
+ assertEquals("Point", geometry.getGeometryType());
+ assertTrue(geometry instanceof Point);
+ }
+
+ @Test
+ public void shouldInsertAndSelectPoints() throws ParseException {
+ PointEntity entity = new PointEntity();
+ entity.setPoint((Point) wktToGeometry("POINT (1 1)"));
+
+ session.persist(entity);
+ PointEntity fromDb = session.find(PointEntity.class, entity.getId());
+ assertEquals("POINT (1 1)", fromDb.getPoint().toString());
+ }
+
+ @Test
+ public void shouldSelectDisjointPoints() throws ParseException {
+ insertPoint("POINT (1 2)");
+ insertPoint("POINT (3 4)");
+ insertPoint("POINT (5 6)");
+
+ Point point = (Point) wktToGeometry("POINT (3 4)");
+ Query query = session.createQuery("select p from PointEntity p "
+ + "where disjoint(p.point, :point) = true", PointEntity.class);
+ query.setParameter("point", point);
+ assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(0)).getPoint().toString());
+ assertEquals("POINT (5 6)", ((PointEntity) query.getResultList().get(1)).getPoint().toString());
+ }
+
+ @Test
+ public void shouldSelectAllPointsWithinPolygon() throws ParseException {
+ insertPoint("POINT (1 1)");
+ insertPoint("POINT (1 2)");
+ insertPoint("POINT (3 4)");
+ insertPoint("POINT (5 6)");
+
+ Query query = session.createQuery("select p from PointEntity p where within(p.point, :area) = true",
+ PointEntity.class);
+ query.setParameter("area", wktToGeometry("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))"));
+ assertEquals(3, query.getResultList().size());
+ assertEquals("POINT (1 1)", ((PointEntity) query.getResultList().get(0)).getPoint().toString());
+ assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(1)).getPoint().toString());
+ assertEquals("POINT (3 4)", ((PointEntity) query.getResultList().get(2)).getPoint().toString());
+ }
+
+ private void insertPoint(String point) throws ParseException {
+ PointEntity entity = new PointEntity();
+ entity.setPoint((Point) wktToGeometry(point));
+ session.persist(entity);
+ }
+
+ private Geometry wktToGeometry(String wellKnownText) throws ParseException {
+ WKTReader fromText = new WKTReader();
+ Geometry geom = null;
+ geom = fromText.read(wellKnownText);
+ return geom;
+ }
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java
new file mode 100644
index 0000000000..6b54dc80a8
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.hibernate;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.hibernate.Transaction;
+import java.io.IOException;
+import org.hibernate.Session;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.baeldung.hibernate.pojo.Product;
+import com.baeldung.hibernate.pojo.Course;
+import com.baeldung.hibernate.pojo.OrderEntry;
+import com.baeldung.hibernate.pojo.OrderEntryIdClass;
+import com.baeldung.hibernate.pojo.OrderEntryPK;
+import com.baeldung.hibernate.pojo.Student;
+import com.baeldung.hibernate.pojo.User;
+import com.baeldung.hibernate.pojo.UserProfile;
+
+public class IdentifiersIntegrationTest {
+ private Session session;
+
+ private Transaction transaction;
+
+ @Before
+ public void setUp() throws IOException {
+ session = HibernateUtil.getSessionFactory()
+ .openSession();
+ transaction = session.beginTransaction();
+ }
+
+ @After
+ public void tearDown() {
+ transaction.rollback();
+ session.close();
+ }
+
+ @Test
+ public void whenSaveSimpleIdEntities_thenOk() {
+ Student student = new Student();
+ session.save(student);
+ User user = new User();
+ session.save(user);
+
+ assertThat(student.getStudentId()).isEqualTo(1L);
+ assertThat(user.getUserId()).isEqualTo(4L);
+
+ Course course = new Course();
+ session.save(course);
+
+ }
+
+ @Test
+ public void whenSaveCustomGeneratedId_thenOk() {
+ Product product = new Product();
+ session.save(product);
+ Product product2 = new Product();
+ session.save(product2);
+
+ assertThat(product2.getProdId()).isEqualTo("prod-2");
+ }
+
+ @Test
+ public void whenSaveCompositeIdEntity_thenOk() {
+ OrderEntryPK entryPK = new OrderEntryPK();
+ entryPK.setOrderId(1L);
+ entryPK.setProductId(30L);
+
+ OrderEntry entry = new OrderEntry();
+ entry.setEntryId(entryPK);
+ session.save(entry);
+
+ assertThat(entry.getEntryId()
+ .getOrderId()).isEqualTo(1L);
+ }
+
+ @Test
+ public void whenSaveIdClassEntity_thenOk() {
+ OrderEntryIdClass entry = new OrderEntryIdClass();
+ entry.setOrderId(1L);
+ entry.setProductId(30L);
+ session.save(entry);
+
+ assertThat(entry.getOrderId()).isEqualTo(1L);
+ }
+
+ @Test
+ public void whenSaveDerivedIdEntity_thenOk() {
+ User user = new User();
+ session.save(user);
+
+ UserProfile profile = new UserProfile();
+ profile.setUser(user);
+ session.save(profile);
+
+ assertThat(profile.getProfileId()).isEqualTo(user.getUserId());
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java
new file mode 100644
index 0000000000..0f35dbb8af
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java
@@ -0,0 +1,89 @@
+package com.baeldung.hibernate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.hibernate.pojo.inheritance.Bag;
+import com.baeldung.hibernate.pojo.inheritance.Book;
+import com.baeldung.hibernate.pojo.inheritance.Car;
+import com.baeldung.hibernate.pojo.inheritance.MyEmployee;
+import com.baeldung.hibernate.pojo.inheritance.Pen;
+import com.baeldung.hibernate.pojo.inheritance.Pet;
+
+public class InheritanceMappingIntegrationTest {
+ private Session session;
+
+ private Transaction transaction;
+
+ @Before
+ public void setUp() throws IOException {
+ session = HibernateUtil.getSessionFactory()
+ .openSession();
+ transaction = session.beginTransaction();
+ }
+
+ @After
+ public void tearDown() {
+ transaction.rollback();
+ session.close();
+ }
+
+ @Test
+ public void givenSubclasses_whenQuerySingleTableSuperclass_thenOk() {
+ Book book = new Book(1, "1984", "George Orwell");
+ session.save(book);
+ Pen pen = new Pen(2, "my pen", "blue");
+ session.save(pen);
+
+ assertThat(session.createQuery("from MyProduct")
+ .getResultList()
+ .size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenSubclasses_whenQueryMappedSuperclass_thenOk() {
+ MyEmployee emp = new MyEmployee(1, "john", "baeldung");
+ session.save(emp);
+
+ assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Person")
+ .getResultList()
+ .size()).isEqualTo(1);
+ }
+
+ @Test
+ public void givenSubclasses_whenQueryJoinedTableSuperclass_thenOk() {
+ Pet pet = new Pet(1, "dog", "lassie");
+ session.save(pet);
+
+ assertThat(session.createQuery("from Animal")
+ .getResultList()
+ .size()).isEqualTo(1);
+ }
+
+ @Test
+ public void givenSubclasses_whenQueryTablePerClassSuperclass_thenOk() {
+ Car car = new Car(1, "audi", "xyz");
+ session.save(car);
+
+ assertThat(session.createQuery("from Vehicle")
+ .getResultList()
+ .size()).isEqualTo(1);
+ }
+
+ @Test
+ public void givenSubclasses_whenQueryNonMappedInterface_thenOk() {
+ Bag bag = new Bag(1, "large");
+ session.save(bag);
+
+ assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Item")
+ .getResultList()
+ .size()).isEqualTo(0);
+ }
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesTest.java
new file mode 100644
index 0000000000..ec8afc8db2
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesTest.java
@@ -0,0 +1,126 @@
+package com.baeldung.hibernate;
+
+import com.baeldung.hibernate.pojo.TemporalValues;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TemporalValuesTest {
+
+ private Session session;
+
+ private Transaction transaction;
+
+ @Before
+ public void setUp() throws IOException {
+ session = HibernateUtil.getSessionFactory().withOptions()
+ .jdbcTimeZone(TimeZone.getTimeZone("UTC"))
+ .openSession();
+ transaction = session.beginTransaction();
+ session.createNativeQuery("delete from temporalvalues").executeUpdate();
+ }
+
+ @After
+ public void tearDown() {
+ transaction.rollback();
+ session.close();
+ }
+
+ @Test
+ public void givenEntity_whenMappingSqlTypes_thenTemporalIsSelectedAutomatically() {
+ TemporalValues temporalValues = new TemporalValues();
+ temporalValues.setSqlDate(java.sql.Date.valueOf("2017-11-15"));
+ temporalValues.setSqlTime(java.sql.Time.valueOf("15:30:14"));
+ temporalValues.setSqlTimestamp(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332"));
+
+ session.save(temporalValues);
+ session.flush();
+ session.clear();
+
+ temporalValues = session.get(TemporalValues.class, temporalValues.getId());
+ assertThat(temporalValues.getSqlDate()).isEqualTo(java.sql.Date.valueOf("2017-11-15"));
+ assertThat(temporalValues.getSqlTime()).isEqualTo(java.sql.Time.valueOf("15:30:14"));
+ assertThat(temporalValues.getSqlTimestamp()).isEqualTo(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332"));
+
+ }
+
+ @Test
+ public void givenEntity_whenMappingUtilDateType_thenTemporalIsSpecifiedExplicitly() throws Exception {
+ TemporalValues temporalValues = new TemporalValues();
+ temporalValues.setUtilDate(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15"));
+ temporalValues.setUtilTime(new SimpleDateFormat("HH:mm:ss").parse("15:30:14"));
+ temporalValues.setUtilTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.332"));
+
+ session.save(temporalValues);
+ session.flush();
+ session.clear();
+
+ temporalValues = session.get(TemporalValues.class, temporalValues.getId());
+ assertThat(temporalValues.getUtilDate()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15"));
+ assertThat(temporalValues.getUtilTime()).isEqualTo(new SimpleDateFormat("HH:mm:ss").parse("15:30:14"));
+ assertThat(temporalValues.getUtilTimestamp()).isEqualTo(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332"));
+
+ }
+
+ @Test
+ public void givenEntity_whenMappingCalendarType_thenTemporalIsSpecifiedExplicitly() throws Exception {
+ TemporalValues temporalValues = new TemporalValues();
+
+ Calendar calendarDate = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ calendarDate.set(Calendar.YEAR, 2017);
+ calendarDate.set(Calendar.MONTH, 10);
+ calendarDate.set(Calendar.DAY_OF_MONTH, 15);
+ temporalValues.setCalendarDate(calendarDate);
+
+ Calendar calendarTimestamp = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ calendarTimestamp.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.322"));
+ temporalValues.setCalendarTimestamp(calendarTimestamp);
+
+ session.save(temporalValues);
+ session.flush();
+ session.clear();
+
+ temporalValues = session.get(TemporalValues.class, temporalValues.getId());
+ assertThat(temporalValues.getCalendarDate().getTime()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15"));
+ assertThat(temporalValues.getCalendarTimestamp().getTime()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.322"));
+
+ }
+
+ @Test
+ public void givenEntity_whenMappingJavaTimeTypes_thenTemporalIsSelectedAutomatically() {
+ TemporalValues temporalValues = new TemporalValues();
+
+ temporalValues.setLocalDate(LocalDate.parse("2017-11-15"));
+ temporalValues.setLocalTime(LocalTime.parse("15:30:18"));
+ temporalValues.setOffsetTime(OffsetTime.parse("08:22:12+01:00"));
+ temporalValues.setInstant(Instant.parse("2017-11-15T08:22:12Z"));
+ temporalValues.setLocalDateTime(LocalDateTime.parse("2017-11-15T08:22:12"));
+ temporalValues.setOffsetDateTime(OffsetDateTime.parse("2017-11-15T08:22:12+01:00"));
+ temporalValues.setZonedDateTime(ZonedDateTime.parse("2017-11-15T08:22:12+01:00[Europe/Paris]"));
+
+ session.save(temporalValues);
+ session.flush();
+ session.clear();
+
+ temporalValues = session.get(TemporalValues.class, temporalValues.getId());
+ assertThat(temporalValues.getLocalDate()).isEqualTo(LocalDate.parse("2017-11-15"));
+ assertThat(temporalValues.getLocalTime()).isEqualTo(LocalTime.parse("15:30:18"));
+ assertThat(temporalValues.getOffsetTime()).isEqualTo(OffsetTime.parse("08:22:12+01:00"));
+ assertThat(temporalValues.getInstant()).isEqualTo(Instant.parse("2017-11-15T08:22:12Z"));
+ assertThat(temporalValues.getLocalDateTime()).isEqualTo(LocalDateTime.parse("2017-11-15T08:22:12"));
+ assertThat(temporalValues.getOffsetDateTime()).isEqualTo(OffsetDateTime.parse("2017-11-15T08:22:12+01:00"));
+ assertThat(temporalValues.getZonedDateTime()).isEqualTo(ZonedDateTime.parse("2017-11-15T08:22:12+01:00[Europe/Paris]"));
+
+ }
+
+}
diff --git a/hibernate5/src/test/resources/hibernate-multitenancy.properties b/hibernate5/src/test/resources/hibernate-multitenancy.properties
new file mode 100644
index 0000000000..298ecd05d3
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-multitenancy.properties
@@ -0,0 +1,9 @@
+hibernate.connection.driver_class=org.h2.Driver
+hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1
+hibernate.connection.username=sa
+hibernate.connection.autocommit=true
+jdbc.password=
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.multiTenancy=DATABASE
diff --git a/hibernate5/src/test/resources/hibernate-spatial.properties b/hibernate5/src/test/resources/hibernate-spatial.properties
new file mode 100644
index 0000000000..e85cd49cc3
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-spatial.properties
@@ -0,0 +1,10 @@
+hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
+hibernate.connection.driver_class=com.mysql.jdbc.Driver
+hibernate.connection.url=jdbc:mysql://localhost:3306/hibernate-spatial
+hibernate.connection.username=root
+hibernate.connection.password=pass
+hibernate.connection.pool_size=5
+hibernate.show_sql=true
+hibernate.format_sql=true
+hibernate.max_fetch_depth=5
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/hibernate5/src/test/resources/hibernate.properties b/hibernate5/src/test/resources/hibernate.properties
index 298ecd05d3..7b8764637b 100644
--- a/hibernate5/src/test/resources/hibernate.properties
+++ b/hibernate5/src/test/resources/hibernate.properties
@@ -6,4 +6,4 @@ jdbc.password=
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
-hibernate.multiTenancy=DATABASE
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/jackson/README.md b/jackson/README.md
index a710a1689e..a05c95de94 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -35,3 +35,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
- [Jackson – Change Name of Field](http://www.baeldung.com/jackson-name-of-property)
- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria)
+- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values)
diff --git a/jee7/.gitignore b/jee-7/.gitignore
similarity index 100%
rename from jee7/.gitignore
rename to jee-7/.gitignore
diff --git a/jee7/README.md b/jee-7/README.md
similarity index 100%
rename from jee7/README.md
rename to jee-7/README.md
diff --git a/jee7/pom.xml b/jee-7/pom.xml
similarity index 99%
rename from jee7/pom.xml
rename to jee-7/pom.xml
index 6858a05d17..f1d50f55c6 100644
--- a/jee7/pom.xml
+++ b/jee-7/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.baeldung
- jee7
+ jee-7
1.0-SNAPSHOT
war
JavaEE 7 Arquillian Archetype Sample
diff --git a/jee7/src/main/java/com/baeldung/arquillian/CapsConvertor.java b/jee-7/src/main/java/com/baeldung/arquillian/CapsConvertor.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/arquillian/CapsConvertor.java
rename to jee-7/src/main/java/com/baeldung/arquillian/CapsConvertor.java
diff --git a/jee7/src/main/java/com/baeldung/arquillian/CapsService.java b/jee-7/src/main/java/com/baeldung/arquillian/CapsService.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/arquillian/CapsService.java
rename to jee-7/src/main/java/com/baeldung/arquillian/CapsService.java
diff --git a/jee7/src/main/java/com/baeldung/arquillian/Car.java b/jee-7/src/main/java/com/baeldung/arquillian/Car.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/arquillian/Car.java
rename to jee-7/src/main/java/com/baeldung/arquillian/Car.java
diff --git a/jee7/src/main/java/com/baeldung/arquillian/CarEJB.java b/jee-7/src/main/java/com/baeldung/arquillian/CarEJB.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/arquillian/CarEJB.java
rename to jee-7/src/main/java/com/baeldung/arquillian/CarEJB.java
diff --git a/jee7/src/main/java/com/baeldung/arquillian/Component.java b/jee-7/src/main/java/com/baeldung/arquillian/Component.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/arquillian/Component.java
rename to jee-7/src/main/java/com/baeldung/arquillian/Component.java
diff --git a/jee7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java b/jee-7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java
rename to jee-7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java
diff --git a/jee7/src/main/java/com/baeldung/convListVal/ConvListVal.java b/jee-7/src/main/java/com/baeldung/convListVal/ConvListVal.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/convListVal/ConvListVal.java
rename to jee-7/src/main/java/com/baeldung/convListVal/ConvListVal.java
diff --git a/jee7/src/main/java/com/baeldung/convListVal/MyListener.java b/jee-7/src/main/java/com/baeldung/convListVal/MyListener.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/convListVal/MyListener.java
rename to jee-7/src/main/java/com/baeldung/convListVal/MyListener.java
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp
similarity index 100%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp
rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java b/jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/Employee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/Employee.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/Employee.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/Employee.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java b/jee-7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/package-info.java b/jee-7/src/main/java/com/baeldung/jaxws/client/package-info.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/client/package-info.java
rename to jee-7/src/main/java/com/baeldung/jaxws/client/package-info.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java b/jee-7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java b/jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java b/jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java
rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java
diff --git a/jee7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl b/jee-7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl
similarity index 100%
rename from jee7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl
rename to jee-7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl
diff --git a/jee7/src/main/java/com/baeldung/json/Person.java b/jee-7/src/main/java/com/baeldung/json/Person.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/json/Person.java
rename to jee-7/src/main/java/com/baeldung/json/Person.java
diff --git a/jee7/src/main/java/com/baeldung/json/PersonBuilder.java b/jee-7/src/main/java/com/baeldung/json/PersonBuilder.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/json/PersonBuilder.java
rename to jee-7/src/main/java/com/baeldung/json/PersonBuilder.java
diff --git a/jee7/src/main/java/com/baeldung/json/PersonWriter.java b/jee-7/src/main/java/com/baeldung/json/PersonWriter.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/json/PersonWriter.java
rename to jee-7/src/main/java/com/baeldung/json/PersonWriter.java
diff --git a/jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java b/jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java
rename to jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java
diff --git a/jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java b/jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java
rename to jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java
diff --git a/jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java b/jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java
rename to jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java
diff --git a/jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java b/jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java
rename to jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java
diff --git a/jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java b/jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java
rename to jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java
diff --git a/jee7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java
diff --git a/jee7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java
diff --git a/jee7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java
diff --git a/jee7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java
diff --git a/jee7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java
diff --git a/jee7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java
diff --git a/jee7/src/main/java/com/baeldung/timer/TimerEvent.java b/jee-7/src/main/java/com/baeldung/timer/TimerEvent.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/TimerEvent.java
rename to jee-7/src/main/java/com/baeldung/timer/TimerEvent.java
diff --git a/jee7/src/main/java/com/baeldung/timer/TimerEventListener.java b/jee-7/src/main/java/com/baeldung/timer/TimerEventListener.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/TimerEventListener.java
rename to jee-7/src/main/java/com/baeldung/timer/TimerEventListener.java
diff --git a/jee7/src/main/java/com/baeldung/timer/WorkerBean.java b/jee-7/src/main/java/com/baeldung/timer/WorkerBean.java
similarity index 100%
rename from jee7/src/main/java/com/baeldung/timer/WorkerBean.java
rename to jee-7/src/main/java/com/baeldung/timer/WorkerBean.java
diff --git a/jee7/src/main/resources/META-INF/persistence.xml b/jee-7/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from jee7/src/main/resources/META-INF/persistence.xml
rename to jee-7/src/main/resources/META-INF/persistence.xml
diff --git a/jee7/src/main/webapp/ConvListVal.xhtml b/jee-7/src/main/webapp/ConvListVal.xhtml
similarity index 100%
rename from jee7/src/main/webapp/ConvListVal.xhtml
rename to jee-7/src/main/webapp/ConvListVal.xhtml
diff --git a/jee7/src/main/webapp/WEB-INF/beans.xml b/jee-7/src/main/webapp/WEB-INF/beans.xml
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/beans.xml
rename to jee-7/src/main/webapp/WEB-INF/beans.xml
diff --git a/jee7/src/main/webapp/WEB-INF/faces-config.xml b/jee-7/src/main/webapp/WEB-INF/faces-config.xml
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/faces-config.xml
rename to jee-7/src/main/webapp/WEB-INF/faces-config.xml
diff --git a/jee7/src/main/webapp/WEB-INF/spring/security.xml b/jee-7/src/main/webapp/WEB-INF/spring/security.xml
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/spring/security.xml
rename to jee-7/src/main/webapp/WEB-INF/spring/security.xml
diff --git a/jee7/src/main/webapp/WEB-INF/views/admin.jsp b/jee-7/src/main/webapp/WEB-INF/views/admin.jsp
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/views/admin.jsp
rename to jee-7/src/main/webapp/WEB-INF/views/admin.jsp
diff --git a/jee7/src/main/webapp/WEB-INF/views/home.jsp b/jee-7/src/main/webapp/WEB-INF/views/home.jsp
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/views/home.jsp
rename to jee-7/src/main/webapp/WEB-INF/views/home.jsp
diff --git a/jee7/src/main/webapp/WEB-INF/views/login.jsp b/jee-7/src/main/webapp/WEB-INF/views/login.jsp
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/views/login.jsp
rename to jee-7/src/main/webapp/WEB-INF/views/login.jsp
diff --git a/jee7/src/main/webapp/WEB-INF/views/user.jsp b/jee-7/src/main/webapp/WEB-INF/views/user.jsp
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/views/user.jsp
rename to jee-7/src/main/webapp/WEB-INF/views/user.jsp
diff --git a/jee7/src/main/webapp/WEB-INF/web.xml b/jee-7/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from jee7/src/main/webapp/WEB-INF/web.xml
rename to jee-7/src/main/webapp/WEB-INF/web.xml
diff --git a/jee7/src/main/webapp/index.jsp b/jee-7/src/main/webapp/index.jsp
similarity index 100%
rename from jee7/src/main/webapp/index.jsp
rename to jee-7/src/main/webapp/index.jsp
diff --git a/jee7/src/main/webapp/secure.jsp b/jee-7/src/main/webapp/secure.jsp
similarity index 100%
rename from jee7/src/main/webapp/secure.jsp
rename to jee-7/src/main/webapp/secure.jsp
diff --git a/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java b/jee-7/src/test/java/com/baeldug/json/JsonUnitTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldug/json/JsonUnitTest.java
rename to jee-7/src/test/java/com/baeldug/json/JsonUnitTest.java
diff --git a/jee7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java b/jee-7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java
rename to jee-7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java
diff --git a/jee7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java b/jee-7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java
rename to jee-7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java
diff --git a/jee7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java b/jee-7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java
rename to jee-7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java
diff --git a/jee7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java
rename to jee-7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java
diff --git a/jee7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java
rename to jee-7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java
diff --git a/jee7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java
rename to jee-7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java
diff --git a/jee7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java
rename to jee-7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java
diff --git a/jee7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java
rename to jee-7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java
diff --git a/jee7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java b/jee-7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java
similarity index 100%
rename from jee7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java
rename to jee-7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java
diff --git a/jee7/src/test/resources/META-INF/persistence.xml b/jee-7/src/test/resources/META-INF/persistence.xml
similarity index 100%
rename from jee7/src/test/resources/META-INF/persistence.xml
rename to jee-7/src/test/resources/META-INF/persistence.xml
diff --git a/jsonb/.gitignore b/jsonb/.gitignore
new file mode 100644
index 0000000000..dec013dfa4
--- /dev/null
+++ b/jsonb/.gitignore
@@ -0,0 +1,12 @@
+#folders#
+.idea
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/jsonb/README.md b/jsonb/README.md
new file mode 100644
index 0000000000..a638f0355c
--- /dev/null
+++ b/jsonb/README.md
@@ -0,0 +1 @@
+## JSON B
diff --git a/jsonb/pom.xml b/jsonb/pom.xml
new file mode 100644
index 0000000000..5058d89c31
--- /dev/null
+++ b/jsonb/pom.xml
@@ -0,0 +1,106 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ json-b
+ 0.0.1-SNAPSHOT
+ jar
+
+ json-b
+ json-b sample project
+
+
+ yasson
+
+ true
+
+
+
+
+ org.eclipse
+ yasson
+ ${yasson.version}
+
+
+ org.glassfish
+ javax.json
+ ${javax.json.version}
+
+
+
+
+ johnzon
+
+
+
+ org.apache.geronimo.specs
+ geronimo-json_1.1_spec
+ ${geronimo-json_1.1_spec.version}
+
+
+ org.apache.johnzon
+ johnzon-jsonb
+ ${johnzon.version}
+
+
+
+
+
+
+ javax.json.bind
+ javax.json.bind-api
+ ${jsonb-api.version}
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.jupiter.version}
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.jupiter.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ ${junit.platform.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
+
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 1.8
+ 1.0.0
+ 5.0.0
+ 2.20
+ 1.0
+ 1.1.3
+ 1.0
+ 1.0.1
+ 1.1.2
+ 4.1
+
+
+
\ No newline at end of file
diff --git a/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java b/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java
new file mode 100644
index 0000000000..dfab2eb0d2
--- /dev/null
+++ b/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java
@@ -0,0 +1,26 @@
+package com.baeldung.adapter;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.bind.adapter.JsonbAdapter;
+
+import com.baeldung.jsonb.Person;
+
+public class PersonAdapter implements JsonbAdapter {
+
+ @Override
+ public JsonObject adaptToJson(Person p) throws Exception {
+ return Json.createObjectBuilder()
+ .add("id", p.getId())
+ .add("name", p.getName())
+ .build();
+ }
+
+ @Override
+ public Person adaptFromJson(JsonObject adapted) throws Exception {
+ Person person = new Person();
+ person.setId(adapted.getInt("id"));
+ person.setName(adapted.getString("name"));
+ return person;
+ }
+}
\ No newline at end of file
diff --git a/jsonb/src/main/java/com/baeldung/jsonb/Person.java b/jsonb/src/main/java/com/baeldung/jsonb/Person.java
new file mode 100644
index 0000000000..a506c1b000
--- /dev/null
+++ b/jsonb/src/main/java/com/baeldung/jsonb/Person.java
@@ -0,0 +1,127 @@
+package com.baeldung.jsonb;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+import javax.json.bind.annotation.JsonbDateFormat;
+import javax.json.bind.annotation.JsonbNumberFormat;
+import javax.json.bind.annotation.JsonbProperty;
+import javax.json.bind.annotation.JsonbTransient;
+
+public class Person {
+
+ private int id;
+ @JsonbProperty("person-name")
+ private String name;
+ @JsonbProperty(nillable = true)
+ private String email;
+ @JsonbTransient
+ private int age;
+ @JsonbDateFormat("dd-MM-yyyy")
+ private LocalDate registeredDate;
+ private BigDecimal salary;
+
+ public Person() {
+ this(0, "", "", 0, LocalDate.now(), new BigDecimal(0));
+ }
+
+ public Person(int id, String name, String email, int age, LocalDate registeredDate, BigDecimal salary) {
+ this.id = id;
+ this.name = name;
+ this.email = email;
+ this.age = age;
+ this.registeredDate = registeredDate;
+ this.salary = salary;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @JsonbNumberFormat(locale = "en_US", value = "#0.0")
+ public BigDecimal getSalary() {
+ return salary;
+ }
+
+ public void setSalary(BigDecimal salary) {
+ this.salary = salary;
+ }
+
+ public LocalDate getRegisteredDate() {
+ return registeredDate;
+ }
+
+ public void setRegisteredDate(LocalDate registeredDate) {
+ this.registeredDate = registeredDate;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Person [id=");
+ builder.append(id);
+ builder.append(", name=");
+ builder.append(name);
+ builder.append(", email=");
+ builder.append(email);
+ builder.append(", age=");
+ builder.append(age);
+ builder.append(", registeredDate=");
+ builder.append(registeredDate);
+ builder.append(", salary=");
+ builder.append(salary);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + id;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Person other = (Person) obj;
+ if (id != other.id)
+ return false;
+ return true;
+ }
+
+}
diff --git a/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java b/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java
new file mode 100644
index 0000000000..67beda77e1
--- /dev/null
+++ b/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java
@@ -0,0 +1,188 @@
+package com.baeldung.jsonb;
+
+import static org.junit.Assert.assertTrue;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.config.PropertyNamingStrategy;
+import javax.json.bind.config.PropertyOrderStrategy;
+
+import org.apache.commons.collections4.ListUtils;
+import org.junit.Test;
+
+import com.baeldung.adapter.PersonAdapter;
+
+public class JsonbTest {
+
+ @Test
+ public void givenPersonList_whenSerializeWithJsonb_thenGetPersonJsonArray() {
+ Jsonb jsonb = JsonbBuilder.create();
+ // @formatter:off
+ List personList = Arrays.asList(
+ new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)),
+ new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)),
+ new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)),
+ new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)));
+ // @formatter:on
+ String jsonArrayPerson = jsonb.toJson(personList);
+ // @formatter:off
+ String jsonExpected = "[" +
+ "{\"email\":\"jhon@test.com\"," +
+ "\"id\":1,\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1000.0\"}," +
+ "{\"email\":\"jhon1@test.com\"," +
+ "\"id\":2,\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1500.0\"},{\"email\":null," +
+ "\"id\":3,\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1000.0\"}," +
+ "{\"email\":\"tom@test.com\"," +
+ "\"id\":4,\"person-name\":\"Tom\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1500.0\"}"
+ + "]";
+ // @formatter:on
+ assertTrue(jsonArrayPerson.equals(jsonExpected));
+ }
+
+ @Test
+ public void givenPersonJsonArray_whenDeserializeWithJsonb_thenGetPersonList() {
+ Jsonb jsonb = JsonbBuilder.create();
+ // @formatter:off
+ String personJsonArray =
+ "[" +
+ "{\"email\":\"jhon@test.com\"," +
+ "\"id\":1,\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1000.0\"}," +
+ "{\"email\":\"jhon1@test.com\"," +
+ "\"id\":2,\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1500.0\"},{\"email\":null," +
+ "\"id\":3,\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1000.0\"}," +
+ "{\"email\":\"tom@test.com\"," +
+ "\"id\":4,\"person-name\":\"Tom\"," +
+ "\"registeredDate\":\"09-09-2019\"," +
+ "\"salary\":\"1500.0\"}"
+ + "]";
+ // @formatter:on
+ @SuppressWarnings("serial")
+ List personList = jsonb.fromJson(personJsonArray, new ArrayList() {
+ }.getClass()
+ .getGenericSuperclass());
+ // @formatter:off
+ List personListExpected = Arrays.asList(
+ new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)),
+ new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)),
+ new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)),
+ new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)));
+ // @formatter:on
+ assertTrue(ListUtils.isEqualList(personList, personListExpected));
+ }
+
+ @Test
+ public void givenPersonObject_whenNamingStrategy_thenGetCustomPersonJson() {
+ JsonbConfig config = new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES);
+ Jsonb jsonb = JsonbBuilder.create(config);
+ Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000));
+ String jsonPerson = jsonb.toJson(person);
+ // @formatter:off
+ String jsonExpected =
+ "{\"email\":\"jhon@test.com\"," +
+ "\"id\":1," +
+ "\"person-name\":\"Jhon\"," +
+ "\"registered_date\":\"07-09-2019\"," +
+ "\"salary\":\"1000.0\"}";
+ // @formatter:on
+ assertTrue(jsonExpected.equals(jsonPerson));
+ }
+
+ @Test
+ public void givenPersonObject_whenWithPropertyOrderStrategy_thenGetReversePersonJson() {
+ JsonbConfig config = new JsonbConfig().withPropertyOrderStrategy(PropertyOrderStrategy.REVERSE);
+ Jsonb jsonb = JsonbBuilder.create(config);
+ Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000));
+ String jsonPerson = jsonb.toJson(person);
+ // @formatter:off
+ String jsonExpected =
+ "{\"salary\":\"1000.0\","+
+ "\"registeredDate\":\"07-09-2019\"," +
+ "\"person-name\":\"Jhon\"," +
+ "\"id\":1," +
+ "\"email\":\"jhon@test.com\"}";
+ // @formatter:on
+ assertTrue(jsonExpected.equals(jsonPerson));
+ }
+
+ @Test
+ public void givenPersonObject_whenSerializeWithJsonb_thenGetPersonJson() {
+ Jsonb jsonb = JsonbBuilder.create();
+ Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000));
+ String jsonPerson = jsonb.toJson(person);
+ // @formatter:off
+ String jsonExpected =
+ "{\"email\":\"jhon@test.com\"," +
+ "\"id\":1," +
+ "\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"07-09-2019\"," +
+ "\"salary\":\"1000.0\"}";
+ // @formatter:on
+ assertTrue(jsonExpected.equals(jsonPerson));
+ }
+
+ @Test
+ public void givenPersonJson_whenDeserializeWithJsonb_thenGetPersonObject() {
+ Jsonb jsonb = JsonbBuilder.create();
+ Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0));
+ // @formatter:off
+ String jsonPerson =
+ "{\"email\":\"jhon@test.com\"," +
+ "\"id\":1," +
+ "\"person-name\":\"Jhon\"," +
+ "\"registeredDate\":\"07-09-2019\"," +
+ "\"salary\":\"1000.0\"}";
+ // @formatter:on
+ assertTrue(jsonb.fromJson(jsonPerson, Person.class)
+ .equals(person));
+ }
+
+ @Test
+ public void givenPersonObject_whenSerializeWithAdapter_thenGetPersonJson() {
+ JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter());
+ Jsonb jsonb = JsonbBuilder.create(config);
+ Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0));// new Person(1, "Jhon");
+ String jsonPerson = jsonb.toJson(person);
+ // @formatter:off
+ String jsonExpected =
+ "{\"id\":1," +
+ "\"name\":\"Jhon\"}";
+ // @formatter:on
+ assertTrue(jsonExpected.equals(jsonPerson));
+ }
+
+ @Test
+ public void givenPersonJson_whenDeserializeWithAdapter_thenGetPersonObject() {
+ JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter());
+ Jsonb jsonb = JsonbBuilder.create(config);
+ Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0));// new Person(1, "Jhon");
+ // @formatter:off
+ String jsonPerson =
+ "{\"id\":1," +
+ "\"name\":\"Jhon\"}";
+ // @formatter:on
+ assertTrue(jsonb.fromJson(jsonPerson, Person.class)
+ .equals(person));
+ }
+
+}
diff --git a/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java b/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java
new file mode 100644
index 0000000000..15b07ee03a
--- /dev/null
+++ b/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.junit5;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.AfterClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.DEFAULT)
+public class DefaultOrderOfExecutionTest {
+ private static StringBuilder output = new StringBuilder("");
+
+ @Test
+ public void secondTest() {
+ output.append("b");
+ }
+
+ @Test
+ public void thirdTest() {
+ output.append("c");
+ }
+
+ @Test
+ public void firstTest() {
+ output.append("a");
+ }
+
+ @AfterClass
+ public static void assertOutput() {
+ assertEquals(output.toString(), "cab");
+ }
+}
diff --git a/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java b/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java
new file mode 100644
index 0000000000..189efc8945
--- /dev/null
+++ b/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.junit5;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.JVM)
+public class JVMOrderOfExecutionTest {
+
+ private static StringBuilder output = new StringBuilder("");
+
+ @Test
+ public void secondTest() {
+ output.append("b");
+ }
+
+ @Test
+ public void thirdTest() {
+ output.append("c");
+ }
+
+ @Test
+ public void firstTest() {
+ output.append("a");
+ }
+}
\ No newline at end of file
diff --git a/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java b/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java
new file mode 100644
index 0000000000..88de057fc8
--- /dev/null
+++ b/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.junit5;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.AfterClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class NameAscendingOrderOfExecutionTest {
+ private static StringBuilder output = new StringBuilder("");
+
+ @Test
+ public void secondTest() {
+ output.append("b");
+ }
+
+ @Test
+ public void thirdTest() {
+ output.append("c");
+ }
+
+ @Test
+ public void firstTest() {
+ output.append("a");
+ }
+
+ @AfterClass
+ public static void assertOutput() {
+ assertEquals(output.toString(), "abc");
+ }
+}
diff --git a/libraries-data/file.dat b/libraries-data/file.dat
new file mode 100644
index 0000000000..70177cef97
Binary files /dev/null and b/libraries-data/file.dat differ
diff --git a/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteTest.java b/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteIntegrationTest.java
similarity index 99%
rename from libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteTest.java
rename to libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteIntegrationTest.java
index 26eb481286..5a713902b4 100644
--- a/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteTest.java
+++ b/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteIntegrationTest.java
@@ -16,7 +16,7 @@ import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.jdbc.JdbcPooledConnectionSource;
import com.j256.ormlite.table.TableUtils;
-public class ORMLiteTest {
+public class ORMLiteIntegrationTest {
private static JdbcPooledConnectionSource connectionSource;
private static Dao libraryDao;
diff --git a/libraries-data/src/test/java/com/baeldung/reladomo/ReladomoTest.java b/libraries-data/src/test/java/com/baeldung/reladomo/ReladomoIntegrationTest.java
similarity index 96%
rename from libraries-data/src/test/java/com/baeldung/reladomo/ReladomoTest.java
rename to libraries-data/src/test/java/com/baeldung/reladomo/ReladomoIntegrationTest.java
index 61c29e8aa3..3660d9a8e1 100644
--- a/libraries-data/src/test/java/com/baeldung/reladomo/ReladomoTest.java
+++ b/libraries-data/src/test/java/com/baeldung/reladomo/ReladomoIntegrationTest.java
@@ -9,7 +9,7 @@ import org.junit.Test;
import com.gs.fw.common.mithra.test.ConnectionManagerForTests;
import com.gs.fw.common.mithra.test.MithraTestResource;
-public class ReladomoTest {
+public class ReladomoIntegrationTest {
private MithraTestResource mithraTestResource;
@Before
diff --git a/libraries/README.md b/libraries/README.md
index c6bbb5634c..ae2522ca9e 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -39,7 +39,6 @@
- [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv)
- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference)
- [Introduction to NoException](http://www.baeldung.com/no-exception)
-- [Introduction to FunctionalJava](http://www.baeldung.com/functional-java)
- [Apache Commons IO](http://www.baeldung.com/apache-commons-io)
- [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types)
- [Introduction to javax.measure](http://www.baeldung.com/javax-measure)
@@ -53,7 +52,13 @@
- [Using Pairs in Java](http://www.baeldung.com/java-pairs)
- [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag)
- [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine)
-+-[Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue)
+- [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue)
+- [Introduction To Docx4J](http://www.baeldung.com/docx4j)
+- [Introduction to StreamEx](http://www.baeldung.com/streamex)
+- [Introduction to BouncyCastle with Java](http://www.baeldung.com/java-bouncy-castle)
+- [Intro to JDO Queries 2/2](http://www.baeldung.com/jdo-queries)
+- [Guide to google-http-client](http://www.baeldung.com/google-http-client)
+
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/libraries/helloWorld.docx b/libraries/helloWorld.docx
new file mode 100644
index 0000000000..a58ff2d80a
Binary files /dev/null and b/libraries/helloWorld.docx differ
diff --git a/libraries/pom.xml b/libraries/pom.xml
index b519b9cd53..546fe8a6d8 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -1,6 +1,6 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
parent-modules
com.baeldung
@@ -105,6 +105,13 @@
+
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
@@ -326,6 +333,11 @@
datanucleus-xml
5.0.0-release
+
+ org.datanucleus
+ datanucleus-jdo-query
+ 5.0.2
+
net.openhft
chronicle
@@ -546,29 +558,29 @@
${protonpack.version}
- org.functionaljava
- functionaljava
- 4.7
-
-
- org.functionaljava
- functionaljava-java8
- 4.7
+ org.functionaljava
+ functionaljava
+ 4.7
- org.functionaljava
- functionaljava-quickcheck
- 4.7
-
-
- org.functionaljava
- functionaljava-java-core
- 4.7
+ org.functionaljava
+ functionaljava-java8
+ 4.7
- javax.cache
- cache-api
- ${cache.version}
+ org.functionaljava
+ functionaljava-quickcheck
+ 4.7
+
+
+ org.functionaljava
+ functionaljava-java-core
+ 4.7
+
+
+ javax.cache
+ cache-api
+ ${cache.version}
com.hazelcast
@@ -581,7 +593,7 @@
1.0.1
- com.netopyr.wurmloch
+ com.netopyr.wurmloch
wurmloch-crdt
${crdt.version}
@@ -600,6 +612,31 @@
caffeine
${caffeine.version}
+
+ org.bouncycastle
+ bcprov-jdk15on
+ 1.58
+
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ 1.58
+
+
+ com.google.http-client
+ google-http-client
+ ${googleclient.version}
+
+
+ com.google.http-client
+ google-http-client-jackson2
+ ${googleclient.version}
+
+
+ com.google.http-client
+ google-http-client-gson
+ ${googleclient.version}
+
@@ -617,6 +654,7 @@
+ 1.23.0
0.1.0
0.7.0
3.2.4
diff --git a/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java b/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java
new file mode 100644
index 0000000000..5d8a7a6643
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java
@@ -0,0 +1,111 @@
+package com.baeldung.bouncycastle;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.PrivateKey;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.bouncycastle.asn1.ASN1InputStream;
+import org.bouncycastle.asn1.cms.ContentInfo;
+import org.bouncycastle.cert.X509CertificateHolder;
+import org.bouncycastle.cert.jcajce.JcaCertStore;
+import org.bouncycastle.cms.CMSAlgorithm;
+import org.bouncycastle.cms.CMSEnvelopedData;
+import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
+import org.bouncycastle.cms.CMSException;
+import org.bouncycastle.cms.CMSProcessableByteArray;
+import org.bouncycastle.cms.CMSSignedData;
+import org.bouncycastle.cms.CMSSignedDataGenerator;
+import org.bouncycastle.cms.CMSTypedData;
+import org.bouncycastle.cms.KeyTransRecipientInformation;
+import org.bouncycastle.cms.RecipientInformation;
+import org.bouncycastle.cms.SignerInformation;
+import org.bouncycastle.cms.SignerInformationStore;
+import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder;
+import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;
+import org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder;
+import org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient;
+import org.bouncycastle.cms.jcajce.JceKeyTransRecipient;
+import org.bouncycastle.cms.jcajce.JceKeyTransRecipientInfoGenerator;
+import org.bouncycastle.operator.ContentSigner;
+import org.bouncycastle.operator.OperatorCreationException;
+import org.bouncycastle.operator.OutputEncryptor;
+import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
+import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
+import org.bouncycastle.util.Store;
+
+public class BouncyCastleCrypto {
+
+ public static byte[] signData(byte[] data, final X509Certificate signingCertificate, final PrivateKey signingKey)
+ throws CertificateEncodingException, OperatorCreationException, CMSException, IOException {
+ byte[] signedMessage = null;
+ List certList = new ArrayList();
+ CMSTypedData cmsData = new CMSProcessableByteArray(data);
+ certList.add(signingCertificate);
+ Store certs = new JcaCertStore(certList);
+ CMSSignedDataGenerator cmsGenerator = new CMSSignedDataGenerator();
+ ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256withRSA").build(signingKey);
+ cmsGenerator.addSignerInfoGenerator(
+ new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build())
+ .build(contentSigner, signingCertificate));
+ cmsGenerator.addCertificates(certs);
+ CMSSignedData cms = cmsGenerator.generate(cmsData, true);
+ signedMessage = cms.getEncoded();
+ return signedMessage;
+ }
+
+ public static boolean verifSignData(final byte[] signedData)
+ throws CMSException, IOException, OperatorCreationException, CertificateException {
+ ByteArrayInputStream bIn = new ByteArrayInputStream(signedData);
+ ASN1InputStream aIn = new ASN1InputStream(bIn);
+ CMSSignedData s = new CMSSignedData(ContentInfo.getInstance(aIn.readObject()));
+ aIn.close();
+ bIn.close();
+ Store certs = s.getCertificates();
+ SignerInformationStore signers = s.getSignerInfos();
+ Collection c = signers.getSigners();
+ SignerInformation signer = c.iterator().next();
+ Collection certCollection = certs.getMatches(signer.getSID());
+ Iterator certIt = certCollection.iterator();
+ X509CertificateHolder certHolder = certIt.next();
+ boolean verifResult = signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certHolder));
+ if (!verifResult) {
+ return false;
+ }
+ return true;
+ }
+
+ public static byte[] encryptData(final byte[] data, X509Certificate encryptionCertificate)
+ throws CertificateEncodingException, CMSException, IOException {
+ byte[] encryptedData = null;
+ if (null != data && null != encryptionCertificate) {
+ CMSEnvelopedDataGenerator cmsEnvelopedDataGenerator = new CMSEnvelopedDataGenerator();
+ JceKeyTransRecipientInfoGenerator jceKey = new JceKeyTransRecipientInfoGenerator(encryptionCertificate);
+ cmsEnvelopedDataGenerator.addRecipientInfoGenerator(jceKey);
+ CMSTypedData msg = new CMSProcessableByteArray(data);
+ OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC).setProvider("BC")
+ .build();
+ CMSEnvelopedData cmsEnvelopedData = cmsEnvelopedDataGenerator.generate(msg, encryptor);
+ encryptedData = cmsEnvelopedData.getEncoded();
+ }
+ return encryptedData;
+ }
+
+ public static byte[] decryptData(final byte[] encryptedData, final PrivateKey decryptionKey) throws CMSException {
+ byte[] decryptedData = null;
+ if (null != encryptedData && null != decryptionKey) {
+ CMSEnvelopedData envelopedData = new CMSEnvelopedData(encryptedData);
+ Collection recip = envelopedData.getRecipientInfos().getRecipients();
+ KeyTransRecipientInformation recipientInfo = (KeyTransRecipientInformation) recip.iterator().next();
+ JceKeyTransRecipient recipient = new JceKeyTransEnvelopedRecipient(decryptionKey);
+ decryptedData = recipientInfo.getContent(recipient);
+ }
+ return decryptedData;
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubExample.java b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubExample.java
new file mode 100644
index 0000000000..0618a7294d
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubExample.java
@@ -0,0 +1,65 @@
+package com.baeldung.googlehttpclientguide;
+
+import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler;
+import com.google.api.client.http.HttpRequest;
+import com.google.api.client.http.HttpRequestFactory;
+import com.google.api.client.http.HttpResponse;
+import com.google.api.client.http.HttpResponseException;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.http.apache.ApacheHttpTransport;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.JsonObjectParser;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.client.util.ExponentialBackOff;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class GitHubExample {
+ static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
+ //static final HttpTransport HTTP_TRANSPORT = new ApacheHttpTransport();
+ static final JsonFactory JSON_FACTORY = new JacksonFactory();
+ //static final JsonFactory JSON_FACTORY = new GsonFactory();
+
+ private static void run() throws Exception {
+ HttpRequestFactory requestFactory
+ = HTTP_TRANSPORT.createRequestFactory(
+ (HttpRequest request) -> {
+ request.setParser(new JsonObjectParser(JSON_FACTORY));
+ });
+ GitHubUrl url = new GitHubUrl("https://api.github.com/users");
+ url.per_page = 10;
+ url.page = 1;
+ HttpRequest request = requestFactory.buildGetRequest(url);
+ ExponentialBackOff backoff = new ExponentialBackOff.Builder()
+ .setInitialIntervalMillis(500)
+ .setMaxElapsedTimeMillis(900000)
+ .setMaxIntervalMillis(6000)
+ .setMultiplier(1.5)
+ .setRandomizationFactor(0.5)
+ .build();
+ request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backoff));
+ Type type = new TypeToken>() {}.getType();
+ List users = (List)request.execute().parseAs(type);
+ System.out.println(users);
+ url.appendRawPath("/eugenp");
+ request = requestFactory.buildGetRequest(url);
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Future responseFuture = request.executeAsync(executor);
+ User eugen = responseFuture.get().parseAs(User.class);
+ System.out.println(eugen);
+ executor.shutdown();
+ }
+
+ public static void main(String[] args) {
+ try {
+ run();
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ }
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubUrl.java b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubUrl.java
new file mode 100644
index 0000000000..c44de1e145
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubUrl.java
@@ -0,0 +1,18 @@
+package com.baeldung.googlehttpclientguide;
+
+import com.google.api.client.http.GenericUrl;
+import com.google.api.client.util.Key;
+
+public class GitHubUrl extends GenericUrl{
+
+ public GitHubUrl(String encodedUrl) {
+ super(encodedUrl);
+ }
+
+ @Key
+ public int per_page;
+
+ @Key
+ public int page;
+
+}
diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/User.java b/libraries/src/main/java/com/baeldung/googlehttpclientguide/User.java
new file mode 100644
index 0000000000..bf4ee96b25
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/User.java
@@ -0,0 +1,77 @@
+package com.baeldung.googlehttpclientguide;
+
+import com.google.api.client.json.GenericJson;
+import com.google.api.client.util.Key;
+
+public class User extends GenericJson {
+ @Key
+ private String login;
+ @Key
+ private long id;
+ @Key
+ private String url;
+ @Key
+ private String company;
+ @Key
+ private String blog;
+ @Key
+ private String email;
+
+ @Key("subscriptions_url")
+ private String subscriptionsUrl;
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getBlog() {
+ return blog;
+ }
+
+ public void setBlog(String blog) {
+ this.blog = blog;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "login=" + login + ", id=" + id + ", url=" + url + ", company=" + company + ", blog=" + blog + ", email=" + email + '}';
+ }
+
+
+}
diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/logging.properties b/libraries/src/main/java/com/baeldung/googlehttpclientguide/logging.properties
new file mode 100644
index 0000000000..02489378df
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/logging.properties
@@ -0,0 +1,10 @@
+# Properties file which configures the operation of the JDK logging facility.
+# The system will look for this config file to be specified as a system property:
+# -Djava.util.logging.config.file=${project_loc:dailymotion-simple-cmdline-sample}/logging.properties
+
+# Set up the console handler (uncomment "level" to show more fine-grained messages)
+handlers = java.util.logging.ConsoleHandler
+java.util.logging.ConsoleHandler.level = ALL
+
+# Set up logging of HTTP requests and responses (uncomment "level" to show)
+com.google.api.client.http.level = ALL
diff --git a/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java b/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java
new file mode 100644
index 0000000000..384dde48d1
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java
@@ -0,0 +1,104 @@
+package com.baeldung.jdo.query;
+
+import java.util.List;
+
+import javax.jdo.JDOQLTypedQuery;
+import javax.jdo.PersistenceManager;
+import javax.jdo.PersistenceManagerFactory;
+import javax.jdo.Query;
+
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.datanucleus.metadata.PersistenceUnitMetaData;
+
+public class MyApp {
+
+ private static PersistenceManagerFactory pmf;
+ private static PersistenceManager pm;
+
+ public static void main(String[] args) {
+
+ defineDynamicPersistentUnit();
+ createTestData();
+ queryUsingJDOQL();
+ queryUsingTypedJDOQL();
+ queryUsingSQL();
+ queryUsingJPQL();
+
+ }
+
+ public static void createTestData(){
+ ProductItem item1 = new ProductItem("supportedItem", "price less than 10", "SoldOut",5);
+ ProductItem item2 = new ProductItem("pro2", "price less than 10","InStock", 8);
+ ProductItem item3 = new ProductItem("pro3", "price more than 10","SoldOut", 15);
+
+ if( pm != null ){
+ pm.makePersistent(item1);
+ pm.makePersistent(item2);
+ pm.makePersistent(item3);
+ }
+ }
+
+ public static void defineDynamicPersistentUnit(){
+
+ PersistenceUnitMetaData pumd = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null);
+ pumd.addProperty("javax.jdo.option.ConnectionURL", "jdbc:mysql://localhost:3306/jdo_db");
+ pumd.addProperty("javax.jdo.option.ConnectionUserName", "root");
+ pumd.addProperty("javax.jdo.option.ConnectionPassword", "admin");
+ pumd.addProperty("javax.jdo.option.ConnectionDriverName", "com.mysql.jdbc.Driver");
+ pumd.addProperty("datanucleus.schema.autoCreateAll", "true");
+
+ pmf = new JDOPersistenceManagerFactory(pumd, null);
+ pm = pmf.getPersistenceManager();
+ }
+
+ public static void queryUsingJDOQL(){
+
+ Query query = pm.newQuery("SELECT FROM com.baeldung.jdo.query.ProductItem "
+ + "WHERE price < threshold PARAMETERS double threshold");
+ List explicitParamResults = (List)query.execute(10);
+
+ query = pm.newQuery("SELECT FROM "
+ + "com.baeldung.jdo.query.ProductItem WHERE price < :threshold");
+ query.setParameters("double threshold");
+ List explicitParamResults2 = (List)query.execute(10);
+
+ query = pm.newQuery("SELECT FROM "
+ + "com.baeldung.jdo.query.ProductItem WHERE price < :threshold");
+ List implicitParamResults = (List)query.execute(10);
+
+ }
+
+ public static void queryUsingTypedJDOQL(){
+
+ JDOQLTypedQuery tq = pm.newJDOQLTypedQuery(ProductItem.class);
+ QProductItem cand = QProductItem.candidate();
+ tq=tq.filter(cand.price.lt(10).and(cand.name.startsWith("pro")));
+ List results = tq.executeList();
+
+ }
+
+ public static void queryUsingSQL(){
+
+ Query query = pm.newQuery("javax.jdo.query.SQL","select * from "
+ + "product_item where price < ? and status = ?");
+ query.setClass(ProductItem.class);
+ query.setParameters(10,"InStock");
+ List results = query.executeList();
+
+ }
+
+ public static void queryUsingJPQL(){
+ Query query = pm.newQuery("JPQL","select i from "
+ + "com.baeldung.jdo.query.ProductItem i where i.price < 10"
+ + " and i.status = 'InStock'");
+ List results = (List) query.execute();
+
+ }
+
+ public static void namedQuery(){
+ Query query = pm.newNamedQuery(
+ ProductItem.class, "PriceBelow10");
+ List results = query.executeList();
+
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java b/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java
new file mode 100644
index 0000000000..52221a7d97
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java
@@ -0,0 +1,68 @@
+package com.baeldung.jdo.query;
+
+import javax.jdo.annotations.IdGeneratorStrategy;
+import javax.jdo.annotations.PersistenceAware;
+import javax.jdo.annotations.PersistenceCapable;
+import javax.jdo.annotations.Persistent;
+import javax.jdo.annotations.PrimaryKey;
+
+@PersistenceCapable(table = "product_item")
+public class ProductItem {
+
+ @PrimaryKey
+ @Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
+ int id;
+ String name;
+ String description;
+ String status;
+ double price;
+
+ public ProductItem(){
+
+ }
+
+ public ProductItem(String name,String description,String status,double price){
+ this.name=name;
+ this.description = description;
+ this.status = status;
+ this.price = price;
+ }
+
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public double getPrice() {
+ return price;
+ }
+ public void setPrice(double price) {
+ this.price = price;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+
+}
diff --git a/libraries/src/main/resources/Baeldung.cer b/libraries/src/main/resources/Baeldung.cer
new file mode 100644
index 0000000000..72d0918424
--- /dev/null
+++ b/libraries/src/main/resources/Baeldung.cer
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDPjCCAiagAwIBAgIJAPvd1gx14C3CMA0GCSqGSIb3DQEBBQUAMEcxCzAJBgNV
+BAYTAk1BMRAwDgYDVQQIEwdNb3JvY2NvMRMwEQYDVQQHEwpDYXNhYmxhbmNhMREw
+DwYDVQQDEwhCYWVsZHVuZzAeFw0xNzEwMTIxMDQzMTRaFw0yNzEwMTMxMDQzMTRa
+MEcxCzAJBgNVBAYTAk1BMRAwDgYDVQQIEwdNb3JvY2NvMRMwEQYDVQQHEwpDYXNh
+YmxhbmNhMREwDwYDVQQDEwhCYWVsZHVuZzCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMyi5GmOeN4QaH/CP5gSOyHX8znb5TDHWV8wc+ZT7kNU8zt5tGMh
+jozK6hax155/6tOsBDR0rSYBhL+Dm/+uCVS7qOlRHhf6cNGtzGF1gnNJB2WjI8oM
+AYm24xpLj1WphKUwKrn3nTMPnQup5OoNAMYl99flANrRYVjjxrLQvDZDUio6Iujr
+CZ2TtXGM0g/gP++28KT7g1KlUui3xtB0u33wx7UN8Fix3JmjOaPHGwxGpwP3VGSj
+fs8cuhqVwRQaZpCOoHU/P8wpXKw80sSdhz+SRueMPtVYqK0CiLL5/O0h0Y3le4IV
+whgg3KG1iTGOWn60UMFn1EYmQ18k5Nsma6UCAwEAAaMtMCswCQYDVR0TBAIwADAR
+BglghkgBhvhCAQEEBAMCBPAwCwYDVR0PBAQDAgUgMA0GCSqGSIb3DQEBBQUAA4IB
+AQC8DDBmJ3p4xytxBiE0s4p1715WT6Dm/QJHp0XC0hkSoyZKDh+XVmrzm+J3SiW1
+vpswb5hLgPo040YX9jnDmgOD+TpleTuKHxZRYj92UYWmdjkWLVtFMcvOh+gxBiAP
+pHIqZsqo8lfcyAuh8Jx834IXbknfCUtERDLG/rU9P/3XJhrM2GC5qPQznrW4EYhU
+CGPyIJXmvATMVvXMWCtfogAL+n42vjYXQXZoAWomHhLHoNbSJUErnNdWDOh4WoJt
+XJCxA6U5LSBplqb3wB2hUTqw+0admKltvmy+KA1PD7OxoGiY7V544zeGqJam1qxU
+ia7y5BL6uOa/4ShSV8pcJDYz
+-----END CERTIFICATE-----
diff --git a/libraries/src/main/resources/Baeldung.p12 b/libraries/src/main/resources/Baeldung.p12
new file mode 100644
index 0000000000..65ec8bc8fe
Binary files /dev/null and b/libraries/src/main/resources/Baeldung.p12 differ
diff --git a/libraries/src/main/resources/META-INF/package.jdo b/libraries/src/main/resources/META-INF/package.jdo
index d30207e2e0..d3cf501bb6 100644
--- a/libraries/src/main/resources/META-INF/package.jdo
+++ b/libraries/src/main/resources/META-INF/package.jdo
@@ -16,6 +16,14 @@
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java
index d17a7dcf1b..7ca656efbf 100644
--- a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java
@@ -1,6 +1,5 @@
package com.baeldung.awaitility;
-import org.awaitility.Awaitility;
import org.awaitility.Duration;
import org.junit.Before;
import org.junit.Test;
diff --git a/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java b/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java
new file mode 100644
index 0000000000..3965eeecd4
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.bouncycastle;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.Security;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+
+import org.bouncycastle.cms.CMSException;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.operator.OperatorCreationException;
+import org.junit.Test;
+
+public class BouncyCastleLiveTest {
+
+ String certificatePath = "src/main/resources/Baeldung.cer";
+ String privateKeyPath = "src/main/resources/Baeldung.p12";
+ char[] p12Password = "password".toCharArray();
+ char[] keyPassword = "password".toCharArray();
+
+ @Test
+ public void givenCryptographicResource_whenOperationSuccess_returnTrue()
+ throws CertificateException, NoSuchProviderException, NoSuchAlgorithmException, IOException,
+ KeyStoreException, UnrecoverableKeyException, CMSException, OperatorCreationException {
+ Security.addProvider(new BouncyCastleProvider());
+
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509", "BC");
+ X509Certificate certificate = (X509Certificate) certFactory
+ .generateCertificate(new FileInputStream(certificatePath));
+ KeyStore keystore = KeyStore.getInstance("PKCS12");
+ keystore.load(new FileInputStream(privateKeyPath), p12Password);
+ PrivateKey privateKey = (PrivateKey) keystore.getKey("baeldung", keyPassword);
+ String secretMessage = "My password is 123456Seven";
+ System.out.println("Original Message : " + secretMessage);
+ byte[] stringToEncrypt = secretMessage.getBytes();
+ byte[] encryptedData = BouncyCastleCrypto.encryptData(stringToEncrypt, certificate);
+ byte[] rawData = BouncyCastleCrypto.decryptData(encryptedData, privateKey);
+ String decryptedMessage = new String(rawData);
+ assertTrue(decryptedMessage.equals(secretMessage));
+ byte[] signedData = BouncyCastleCrypto.signData(rawData, certificate, privateKey);
+ Boolean check = BouncyCastleCrypto.verifSignData(signedData);
+ assertTrue(check);
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java
index 18488f9380..e95b63aa96 100644
--- a/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java
+++ b/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java
@@ -51,7 +51,6 @@ public class MemberStatusIntegrationTest {
/**
* This test should fail, comment out @Ignore to see how failed test can be reflected in Serenity report.
- * Remember to add <testFailureIgnore>true</testFailureIgnore> under maven-surefire-plugin configuration.
*/
@Test
@Ignore
diff --git a/logging-modules/README.md b/logging-modules/README.md
new file mode 100644
index 0000000000..23458cf30b
--- /dev/null
+++ b/logging-modules/README.md
@@ -0,0 +1,3 @@
+
+## Logging Modules
+
diff --git a/log-mdc/README.md b/logging-modules/log-mdc/README.md
similarity index 100%
rename from log-mdc/README.md
rename to logging-modules/log-mdc/README.md
diff --git a/log-mdc/pom.xml b/logging-modules/log-mdc/pom.xml
similarity index 98%
rename from log-mdc/pom.xml
rename to logging-modules/log-mdc/pom.xml
index e91d4e231e..5551585372 100644
--- a/log-mdc/pom.xml
+++ b/logging-modules/log-mdc/pom.xml
@@ -12,6 +12,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java b/logging-modules/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java
diff --git a/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java b/logging-modules/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/config/AppInitializer.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/Transfer.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/TransferService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java
diff --git a/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/Investment.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/Investment.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/Investment.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/Investment.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java
diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java
similarity index 100%
rename from log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java
rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java
diff --git a/log-mdc/src/main/resources/log4j.properties b/logging-modules/log-mdc/src/main/resources/log4j.properties
similarity index 100%
rename from log-mdc/src/main/resources/log4j.properties
rename to logging-modules/log-mdc/src/main/resources/log4j.properties
diff --git a/log-mdc/src/main/resources/log4j2.xml b/logging-modules/log-mdc/src/main/resources/log4j2.xml
similarity index 100%
rename from log-mdc/src/main/resources/log4j2.xml
rename to logging-modules/log-mdc/src/main/resources/log4j2.xml
diff --git a/log-mdc/src/main/resources/logback.xml b/logging-modules/log-mdc/src/main/resources/logback.xml
similarity index 100%
rename from log-mdc/src/main/resources/logback.xml
rename to logging-modules/log-mdc/src/main/resources/logback.xml
diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java
similarity index 100%
rename from log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java
rename to logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java
diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java
similarity index 100%
rename from log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java
rename to logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java
diff --git a/log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java
similarity index 100%
rename from log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java
rename to logging-modules/log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java
diff --git a/log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java
similarity index 100%
rename from log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java
rename to logging-modules/log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java
diff --git a/log4j/README.md b/logging-modules/log4j/README.md
similarity index 83%
rename from log4j/README.md
rename to logging-modules/log4j/README.md
index 3c0258142c..8aae1b5826 100644
--- a/log4j/README.md
+++ b/logging-modules/log4j/README.md
@@ -2,6 +2,5 @@
- [Introduction to Java Logging](http://www.baeldung.com/java-logging-intro)
- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback)
- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode)
-- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java)
- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback)
- [A Guide to Rolling File Appenders](http://www.baeldung.com/java-logging-rolling-file-appenders)
diff --git a/log4j/pom.xml b/logging-modules/log4j/pom.xml
similarity index 90%
rename from log4j/pom.xml
rename to logging-modules/log4j/pom.xml
index 2e73baac49..6a3fbde393 100644
--- a/log4j/pom.xml
+++ b/logging-modules/log4j/pom.xml
@@ -11,6 +11,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
@@ -26,12 +27,6 @@
${log4j.version}
-
- log4j
- apache-log4j-extras
- ${log4j.version}
-
-
org.apache.logging.log4j
diff --git a/log4j/src/main/java/com/baeldung/log4j/Log4jExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/log4j/Log4jExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jExample.java
diff --git a/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java
diff --git a/log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java
rename to logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java
diff --git a/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java
diff --git a/log4j/src/main/java/com/baeldung/logback/LogbackExample.java b/logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/logback/LogbackExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackExample.java
diff --git a/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java
diff --git a/log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java b/logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java
diff --git a/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java
similarity index 100%
rename from log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java
rename to logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java
diff --git a/log4j/src/main/resources/log4j.xml b/logging-modules/log4j/src/main/resources/log4j.xml
similarity index 100%
rename from log4j/src/main/resources/log4j.xml
rename to logging-modules/log4j/src/main/resources/log4j.xml
diff --git a/log4j/src/main/resources/log4j2.xml b/logging-modules/log4j/src/main/resources/log4j2.xml
similarity index 100%
rename from log4j/src/main/resources/log4j2.xml
rename to logging-modules/log4j/src/main/resources/log4j2.xml
diff --git a/log4j/src/main/resources/logback.xml b/logging-modules/log4j/src/main/resources/logback.xml
similarity index 100%
rename from log4j/src/main/resources/logback.xml
rename to logging-modules/log4j/src/main/resources/logback.xml
diff --git a/log4j2/README.md b/logging-modules/log4j2/README.md
similarity index 100%
rename from log4j2/README.md
rename to logging-modules/log4j2/README.md
diff --git a/log4j2/pom.xml b/logging-modules/log4j2/pom.xml
similarity index 98%
rename from log4j2/pom.xml
rename to logging-modules/log4j2/pom.xml
index ea398af845..48608fbc80 100644
--- a/log4j2/pom.xml
+++ b/logging-modules/log4j2/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
- ..
+ ../../
diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java
similarity index 100%
rename from log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java
rename to logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java
diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java
similarity index 100%
rename from log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java
rename to logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java
diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java
similarity index 100%
rename from log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java
rename to logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java
diff --git a/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml b/logging-modules/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml
similarity index 100%
rename from log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml
rename to logging-modules/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml
diff --git a/log4j2/src/test/resources/log4j2.xml b/logging-modules/log4j2/src/test/resources/log4j2.xml
similarity index 100%
rename from log4j2/src/test/resources/log4j2.xml
rename to logging-modules/log4j2/src/test/resources/log4j2.xml
diff --git a/lucene/pom.xml b/lucene/pom.xml
new file mode 100644
index 0000000000..6659d9ac32
--- /dev/null
+++ b/lucene/pom.xml
@@ -0,0 +1,35 @@
+
+ 4.0.0
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+ lucene
+ 0.0.1-SNAPSHOT
+ lucene
+ An Apache Lucene demo application
+
+
+
+
+ org.apache.lucene
+ lucene-core
+ 7.1.0
+
+
+
+ org.apache.lucene
+ lucene-queryparser
+ 7.1.0
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
\ No newline at end of file
diff --git a/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java b/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java
new file mode 100644
index 0000000000..97b1ec7b5d
--- /dev/null
+++ b/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java
@@ -0,0 +1,128 @@
+package com.baeldung.lucene;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.SortedDocValuesField;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.classic.ParseException;
+import org.apache.lucene.queryparser.classic.QueryParser;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.BytesRef;
+
+public class InMemoryLuceneIndex {
+
+ private Directory memoryIndex;
+ private StandardAnalyzer analyzer;
+
+ public InMemoryLuceneIndex(Directory memoryIndex, StandardAnalyzer analyzer) {
+ super();
+ this.memoryIndex = memoryIndex;
+ this.analyzer = analyzer;
+ }
+
+ /**
+ *
+ * @param title
+ * @param body
+ */
+ public void indexDocument(String title, String body) {
+
+ IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
+ try {
+ IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig);
+ Document document = new Document();
+
+ document.add(new TextField("title", title, Field.Store.YES));
+ document.add(new TextField("body", body, Field.Store.YES));
+ document.add(new SortedDocValuesField("title", new BytesRef(title)));
+
+ writter.addDocument(document);
+ writter.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public List searchIndex(String inField, String queryString) {
+ try {
+ Query query = new QueryParser(inField, analyzer).parse(queryString);
+
+ IndexReader indexReader = DirectoryReader.open(memoryIndex);
+ IndexSearcher searcher = new IndexSearcher(indexReader);
+ TopDocs topDocs = searcher.search(query, 10);
+ List documents = new ArrayList<>();
+ for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+ documents.add(searcher.doc(scoreDoc.doc));
+ }
+
+ return documents;
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+ public void deleteDocument(Term term) {
+ try {
+ IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
+ IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig);
+ writter.deleteDocuments(term);
+ writter.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public List searchIndex(Query query) {
+ try {
+ IndexReader indexReader = DirectoryReader.open(memoryIndex);
+ IndexSearcher searcher = new IndexSearcher(indexReader);
+ TopDocs topDocs = searcher.search(query, 10);
+ List documents = new ArrayList<>();
+ for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+ documents.add(searcher.doc(scoreDoc.doc));
+ }
+
+ return documents;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+ public List searchIndex(Query query, Sort sort) {
+ try {
+ IndexReader indexReader = DirectoryReader.open(memoryIndex);
+ IndexSearcher searcher = new IndexSearcher(indexReader);
+ TopDocs topDocs = searcher.search(query, 10, sort);
+ List documents = new ArrayList<>();
+ for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+ documents.add(searcher.doc(scoreDoc.doc));
+ }
+
+ return documents;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+}
diff --git a/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java b/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java
new file mode 100644
index 0000000000..acf688cb99
--- /dev/null
+++ b/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java
@@ -0,0 +1,152 @@
+package com.baeldung.lucene;
+
+import java.util.List;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.FuzzyQuery;
+import org.apache.lucene.search.PhraseQuery;
+import org.apache.lucene.search.PrefixQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.WildcardQuery;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.BytesRef;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LuceneInMemorySearchTest {
+
+ @Test
+ public void givenSearchQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("Hello world", "Some hello world ");
+
+ List documents = inMemoryLuceneIndex.searchIndex("body", "world");
+
+ Assert.assertEquals("Hello world", documents.get(0).get("title"));
+ }
+
+ @Test
+ public void givenTermQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("activity", "running in track");
+ inMemoryLuceneIndex.indexDocument("activity", "Cars are running on road");
+
+ Term term = new Term("body", "running");
+ Query query = new TermQuery(term);
+
+ List documents = inMemoryLuceneIndex.searchIndex(query);
+ Assert.assertEquals(2, documents.size());
+ }
+
+ @Test
+ public void givenPrefixQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("article", "Lucene introduction");
+ inMemoryLuceneIndex.indexDocument("article", "Introduction to Lucene");
+
+ Term term = new Term("body", "intro");
+ Query query = new PrefixQuery(term);
+
+ List documents = inMemoryLuceneIndex.searchIndex(query);
+ Assert.assertEquals(2, documents.size());
+ }
+
+ @Test
+ public void givenBooleanQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("Destination", "Las Vegas singapore car");
+ inMemoryLuceneIndex.indexDocument("Commutes in singapore", "Bus Car Bikes");
+
+ Term term1 = new Term("body", "singapore");
+ Term term2 = new Term("body", "car");
+
+ TermQuery query1 = new TermQuery(term1);
+ TermQuery query2 = new TermQuery(term2);
+
+ BooleanQuery booleanQuery = new BooleanQuery.Builder().add(query1, BooleanClause.Occur.MUST)
+ .add(query2, BooleanClause.Occur.MUST).build();
+
+ List documents = inMemoryLuceneIndex.searchIndex(booleanQuery);
+ Assert.assertEquals(1, documents.size());
+ }
+
+ @Test
+ public void givenPhraseQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("quotes", "A rose by any other name would smell as sweet.");
+
+ Query query = new PhraseQuery(1, "body", new BytesRef("smell"), new BytesRef("sweet"));
+ List documents = inMemoryLuceneIndex.searchIndex(query);
+
+ Assert.assertEquals(1, documents.size());
+ }
+
+ @Test
+ public void givenFuzzyQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("article", "Halloween Festival");
+ inMemoryLuceneIndex.indexDocument("decoration", "Decorations for Halloween");
+
+ Term term = new Term("body", "hallowen");
+ Query query = new FuzzyQuery(term);
+
+ List documents = inMemoryLuceneIndex.searchIndex(query);
+ Assert.assertEquals(2, documents.size());
+ }
+
+ @Test
+ public void givenWildCardQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("article", "Lucene introduction");
+ inMemoryLuceneIndex.indexDocument("article", "Introducing Lucene with Spring");
+
+ Term term = new Term("body", "intro*");
+ Query query = new WildcardQuery(term);
+
+ List documents = inMemoryLuceneIndex.searchIndex(query);
+ Assert.assertEquals(2, documents.size());
+ }
+
+ @Test
+ public void givenSortFieldWhenSortedThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("Ganges", "River in India");
+ inMemoryLuceneIndex.indexDocument("Mekong", "This river flows in south Asia");
+ inMemoryLuceneIndex.indexDocument("Amazon", "Rain forest river");
+ inMemoryLuceneIndex.indexDocument("Rhine", "Belongs to Europe");
+ inMemoryLuceneIndex.indexDocument("Nile", "Longest River");
+
+ Term term = new Term("body", "river");
+ Query query = new WildcardQuery(term);
+
+ SortField sortField = new SortField("title", SortField.Type.STRING_VAL, false);
+ Sort sortByTitle = new Sort(sortField);
+
+ List documents = inMemoryLuceneIndex.searchIndex(query, sortByTitle);
+ Assert.assertEquals(4, documents.size());
+ Assert.assertEquals("Amazon", documents.get(0).getField("title").stringValue());
+ }
+
+ @Test
+ public void whenDocumentDeletedThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("Ganges", "River in India");
+ inMemoryLuceneIndex.indexDocument("Mekong", "This river flows in south Asia");
+
+ Term term = new Term("title", "ganges");
+ inMemoryLuceneIndex.deleteDocument(term);
+
+ Query query = new TermQuery(term);
+
+ List documents = inMemoryLuceneIndex.searchIndex(query);
+ Assert.assertEquals(0, documents.size());
+ }
+
+}
\ No newline at end of file
diff --git a/metrics/README.md b/metrics/README.md
index 09fe925604..c7772bffa0 100644
--- a/metrics/README.md
+++ b/metrics/README.md
@@ -2,3 +2,4 @@
- [Intro to Dropwizard Metrics](http://www.baeldung.com/dropwizard-metrics)
- [Introduction to Netflix Servo](http://www.baeldung.com/netflix-servo)
+- [Quick Guide to Micrometer](http://www.baeldung.com/micrometer)
diff --git a/muleesb/.gitignore b/muleesb/.gitignore
new file mode 100644
index 0000000000..541f92c42e
--- /dev/null
+++ b/muleesb/.gitignore
@@ -0,0 +1 @@
+# Add any directories, files, or patterns you don't want to be tracked by version control
\ No newline at end of file
diff --git a/muleesb/.mule/objectstore/b2fe1a90-c473-11e7-8eb5-98e7f44e8ac8/partition-descriptor b/muleesb/.mule/objectstore/b2fe1a90-c473-11e7-8eb5-98e7f44e8ac8/partition-descriptor
new file mode 100644
index 0000000000..0b8060f303
--- /dev/null
+++ b/muleesb/.mule/objectstore/b2fe1a90-c473-11e7-8eb5-98e7f44e8ac8/partition-descriptor
@@ -0,0 +1 @@
+DEFAULT_PARTITION
\ No newline at end of file
diff --git a/muleesb/.mule/queue-tx-log/tx1.log b/muleesb/.mule/queue-tx-log/tx1.log
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/muleesb/.mule/queue-tx-log/tx2.log b/muleesb/.mule/queue-tx-log/tx2.log
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/muleesb/.mule/queue-xa-tx-log/tx1.log b/muleesb/.mule/queue-xa-tx-log/tx1.log
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/muleesb/.mule/queue-xa-tx-log/tx2.log b/muleesb/.mule/queue-xa-tx-log/tx2.log
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/muleesb/mule-project.xml b/muleesb/mule-project.xml
new file mode 100644
index 0000000000..0d522b0141
--- /dev/null
+++ b/muleesb/mule-project.xml
@@ -0,0 +1,5 @@
+
+
+ muleesb
+
+
diff --git a/muleesb/pom.xml b/muleesb/pom.xml
new file mode 100644
index 0000000000..2c88bf83da
--- /dev/null
+++ b/muleesb/pom.xml
@@ -0,0 +1,214 @@
+
+
+
+ 4.0.0
+ com.mycompany
+ muleesb
+ 1.0.0-SNAPSHOT
+ mule
+ Mule muleesb Application
+
+
+ UTF-8
+ UTF-8
+
+ 3.8.1
+ 1.2
+ 1.3.6
+ 3.9.0
+
+
+
+
+
+ org.mule.tools.maven
+ mule-app-maven-plugin
+ ${mule.tools.version}
+ true
+
+ true
+
+
+
+ org.mule.tools
+ muleesb-maven-plugin
+ 1.0
+
+ 3.7.0
+ /home/abir/AnypointStudio/workspace/variablescopetest
+
+
+
+ deploy
+
+ start
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 1.7
+
+
+ add-resource
+ generate-resources
+
+ add-resource
+
+
+
+
+ src/main/app/
+
+
+ mappings/
+
+
+ src/main/api/
+
+
+
+
+
+
+
+ com.mulesoft.munit.tools
+ munit-maven-plugin
+ ${munit.version}
+
+
+ test
+ test
+
+ test
+
+
+
+
+
+ true
+
+ html
+
+
+
+
+
+
+
+ src/test/munit
+
+
+ src/test/resources
+
+
+
+
+
+
+
+
+ org.mule.modules
+ mule-module-spring-config
+ ${mule.version}
+ provided
+
+
+
+ org.mule.transports
+ mule-transport-file
+ ${mule.version}
+ provided
+
+
+ org.mule.transports
+ mule-transport-http
+ ${mule.version}
+ provided
+
+
+ org.mule.transports
+ mule-transport-jdbc
+ ${mule.version}
+ provided
+
+
+ org.mule.transports
+ mule-transport-jms
+ ${mule.version}
+ provided
+
+
+ org.mule.transports
+ mule-transport-vm
+ ${mule.version}
+ provided
+
+
+
+ org.mule.modules
+ mule-module-scripting
+ ${mule.version}
+ provided
+
+
+ org.mule.modules
+ mule-module-xml
+ ${mule.version}
+ provided
+
+
+
+ org.mule.tests
+ mule-tests-functional
+ ${mule.version}
+ test
+
+
+ org.mule.modules
+ mule-module-apikit
+ ${mule.version}
+ provided
+
+
+ com.mulesoft.munit
+ mule-munit-support
+ ${mule.munit.support.version}
+ test
+
+
+ com.mulesoft.munit
+ munit-runner
+ ${munit.version}
+ test
+
+
+
+
+
+ Central
+ Central
+ http://repo1.maven.org/maven2/
+ default
+
+
+ mulesoft-releases
+ MuleSoft Releases Repository
+ http://repository.mulesoft.org/releases/
+ default
+
+
+
+
+ mulesoft-release
+ mulesoft release repository
+ default
+ http://repository.mulesoft.org/releases/
+
+ false
+
+
+
+
diff --git a/muleesb/src/main/app/mule-app.properties b/muleesb/src/main/app/mule-app.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/muleesb/src/main/app/mule-deploy.properties b/muleesb/src/main/app/mule-deploy.properties
new file mode 100644
index 0000000000..07eabe9cc6
--- /dev/null
+++ b/muleesb/src/main/app/mule-deploy.properties
@@ -0,0 +1,6 @@
+#** GENERATED CONTENT ** Mule Application Deployment Descriptor
+#Mon Nov 06 15:54:37 BDT 2017
+redeployment.enabled=true
+encoding=UTF-8
+domain=default
+config.resources=variablescopetest.xml
diff --git a/muleesb/src/main/app/variablescopetest.xml b/muleesb/src/main/app/variablescopetest.xml
new file mode 100644
index 0000000000..518b901084
--- /dev/null
+++ b/muleesb/src/main/app/variablescopetest.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/muleesb/src/main/java/com/baeldung/transformer/FromFlow2Component.java b/muleesb/src/main/java/com/baeldung/transformer/FromFlow2Component.java
new file mode 100644
index 0000000000..0e180062a7
--- /dev/null
+++ b/muleesb/src/main/java/com/baeldung/transformer/FromFlow2Component.java
@@ -0,0 +1,18 @@
+package com.baeldung.transformer;
+
+import org.mule.api.MuleEventContext;
+import org.mule.api.MuleMessage;
+import org.mule.api.lifecycle.Callable;
+
+public class FromFlow2Component implements Callable {
+
+ @Override
+ public Object onCall(MuleEventContext eventContext) throws Exception {
+
+ MuleMessage message = eventContext.getMessage();
+ message.setPayload("Converted in flow 2");
+
+ return message;
+ }
+
+}
diff --git a/muleesb/src/main/java/com/baeldung/transformer/InitializationTransformer.java b/muleesb/src/main/java/com/baeldung/transformer/InitializationTransformer.java
new file mode 100644
index 0000000000..1e1ad15be8
--- /dev/null
+++ b/muleesb/src/main/java/com/baeldung/transformer/InitializationTransformer.java
@@ -0,0 +1,29 @@
+package com.baeldung.transformer;
+
+import org.mule.api.MuleMessage;
+import org.mule.api.transformer.TransformerException;
+import org.mule.api.transport.PropertyScope;
+import org.mule.transformer.AbstractMessageTransformer;
+
+public class InitializationTransformer extends AbstractMessageTransformer {
+
+ @Override
+ public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
+ // TODO Auto-generated method stub
+
+ String payload = null;
+
+ try {
+ payload = message.getPayloadAsString();
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ System.out.println("Logged Payload: "+payload);
+ message.setPayload("Payload from Initialization");
+ message.setProperty("outboundKey", "outboundpropertyvalue",PropertyScope.OUTBOUND);
+
+
+ return message;
+ }
+}
\ No newline at end of file
diff --git a/muleesb/src/main/java/com/baeldung/transformer/InvokingMessageComponent.java b/muleesb/src/main/java/com/baeldung/transformer/InvokingMessageComponent.java
new file mode 100644
index 0000000000..105522e5b4
--- /dev/null
+++ b/muleesb/src/main/java/com/baeldung/transformer/InvokingMessageComponent.java
@@ -0,0 +1,16 @@
+package com.baeldung.transformer;
+
+import org.mule.api.MuleMessage;
+import org.mule.api.transformer.TransformerException;
+import org.mule.transformer.AbstractMessageTransformer;
+
+public class InvokingMessageComponent extends AbstractMessageTransformer {
+
+ @Override
+ public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
+ // TODO Auto-generated method stub
+ String InboundProp = (String) message.getInboundProperty("outboundKey");
+ System.out.println("InboundProp:" + InboundProp);
+ return InboundProp;
+ }
+}
\ No newline at end of file
diff --git a/muleesb/src/main/resources/log4j2.xml b/muleesb/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..98c4b02433
--- /dev/null
+++ b/muleesb/src/main/resources/log4j2.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/muleesb/src/test/munit/variablescopetest-test-suite.xml b/muleesb/src/test/munit/variablescopetest-test-suite.xml
new file mode 100644
index 0000000000..43e410a327
--- /dev/null
+++ b/muleesb/src/test/munit/variablescopetest-test-suite.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/muleesb/src/test/resources/log4j2-test.xml b/muleesb/src/test/resources/log4j2-test.xml
new file mode 100644
index 0000000000..6351ae041c
--- /dev/null
+++ b/muleesb/src/test/resources/log4j2-test.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mustache/pom.xml b/mustache/pom.xml
index 8aab038313..230aeecd60 100644
--- a/mustache/pom.xml
+++ b/mustache/pom.xml
@@ -85,7 +85,6 @@
**/JdbcTest.java
**/*LiveTest.java
- true
diff --git a/noexception/README.md b/noexception/README.md
index d840191369..9dd4c11190 100644
--- a/noexception/README.md
+++ b/noexception/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception)
+- [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception)
diff --git a/osgi/osgi-intro-sample-activator/pom.xml b/osgi/osgi-intro-sample-activator/pom.xml
new file mode 100644
index 0000000000..1584913627
--- /dev/null
+++ b/osgi/osgi-intro-sample-activator/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+ osgi-intro
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+
+ bundle
+
+ osgi-intro-sample-activator
+
+
+
+ org.osgi
+ org.osgi.core
+
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ true
+
+
+ ${project.groupId}.${project.artifactId}
+ ${project.artifactId}
+ ${project.version}
+
+
+ com.baeldung.osgi.sample.activator.HelloWorld
+
+
+
+ com.baeldung.osgi.sample.activator
+
+
+
+
+
+
+
+
diff --git a/osgi/osgi-intro-sample-activator/src/main/java/com/baeldung/osgi/sample/activator/HelloWorld.java b/osgi/osgi-intro-sample-activator/src/main/java/com/baeldung/osgi/sample/activator/HelloWorld.java
new file mode 100644
index 0000000000..72fe624bac
--- /dev/null
+++ b/osgi/osgi-intro-sample-activator/src/main/java/com/baeldung/osgi/sample/activator/HelloWorld.java
@@ -0,0 +1,16 @@
+package com.baeldung.osgi.sample.activator;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class HelloWorld implements BundleActivator {
+
+ public void start(BundleContext ctx) {
+ System.out.println("Hello World.");
+ }
+
+ public void stop(BundleContext bundleContext) {
+ System.out.println("Goodbye World.");
+ }
+
+}
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-client/pom.xml b/osgi/osgi-intro-sample-client/pom.xml
new file mode 100644
index 0000000000..4096674d7d
--- /dev/null
+++ b/osgi/osgi-intro-sample-client/pom.xml
@@ -0,0 +1,49 @@
+
+
+
+ osgi-intro
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+
+ osgi-intro-sample-client
+
+ bundle
+
+
+
+ com.baeldung
+ osgi-intro-sample-service
+ 1.0-SNAPSHOT
+
+
+ org.osgi
+ org.osgi.core
+
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+
+
+ ${project.groupId}.${project.artifactId}
+ ${project.artifactId}
+ ${project.version}
+ com.baeldung.osgi.sample.client.Client
+
+ com.baeldung.osgi.sample.client
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-client/src/main/java/com/baeldung/osgi/sample/client/Client.java b/osgi/osgi-intro-sample-client/src/main/java/com/baeldung/osgi/sample/client/Client.java
new file mode 100644
index 0000000000..a82ed63fa7
--- /dev/null
+++ b/osgi/osgi-intro-sample-client/src/main/java/com/baeldung/osgi/sample/client/Client.java
@@ -0,0 +1,44 @@
+package com.baeldung.osgi.sample.client;
+
+import com.baeldung.osgi.sample.service.definition.Greeter;
+import org.osgi.framework.*;
+
+public class Client implements BundleActivator, ServiceListener {
+
+ private BundleContext ctx;
+ private ServiceReference serviceReference;
+
+ public void start(BundleContext ctx) {
+ this.ctx = ctx;
+ try {
+ ctx.addServiceListener(this, "(objectclass=" + Greeter.class.getName() + ")");
+ } catch (InvalidSyntaxException ise) {
+ ise.printStackTrace();
+ }
+ }
+
+ public void stop(BundleContext bundleContext) {
+ if (serviceReference != null) {
+ ctx.ungetService(serviceReference);
+ }
+ this.ctx = null;
+ }
+
+ public void serviceChanged(ServiceEvent serviceEvent) {
+ int type = serviceEvent.getType();
+ switch (type) {
+ case (ServiceEvent.REGISTERED):
+ System.out.println("Notification of service registered.");
+ serviceReference = serviceEvent.getServiceReference();
+ Greeter service = (Greeter) (ctx.getService(serviceReference));
+ System.out.println(service.sayHiTo("John"));
+ break;
+ case (ServiceEvent.UNREGISTERING):
+ System.out.println("Notification of service unregistered.");
+ ctx.ungetService(serviceEvent.getServiceReference());
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/osgi/osgi-intro-sample-service/pom.xml b/osgi/osgi-intro-sample-service/pom.xml
new file mode 100644
index 0000000000..cbc660bb74
--- /dev/null
+++ b/osgi/osgi-intro-sample-service/pom.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+ osgi-intro
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ osgi-intro-sample-service
+
+
+ bundle
+
+
+
+ org.osgi
+ org.osgi.core
+
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ true
+
+
+ ${project.groupId}.${project.artifactId}
+ ${project.artifactId}
+ ${project.version}
+ com.baeldung.osgi.sample.service.implementation.GreeterImpl
+ com.baeldung.osgi.sample.service.implementation
+ com.baeldung.osgi.sample.service.definition
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/definition/Greeter.java b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/definition/Greeter.java
new file mode 100644
index 0000000000..f1e82a3465
--- /dev/null
+++ b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/definition/Greeter.java
@@ -0,0 +1,7 @@
+package com.baeldung.osgi.sample.service.definition;
+
+public interface Greeter {
+
+ public String sayHiTo(String name);
+
+}
diff --git a/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/implementation/GreeterImpl.java b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/implementation/GreeterImpl.java
new file mode 100644
index 0000000000..48e26e3e6b
--- /dev/null
+++ b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/implementation/GreeterImpl.java
@@ -0,0 +1,30 @@
+package com.baeldung.osgi.sample.service.implementation;
+
+import com.baeldung.osgi.sample.service.definition.Greeter;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+import java.util.Hashtable;
+
+public class GreeterImpl implements Greeter, BundleActivator {
+
+ private ServiceReference reference;
+ private ServiceRegistration registration;
+
+ @Override public String sayHiTo(String name) {
+ return "Hello " + name;
+ }
+
+ @Override public void start(BundleContext context) throws Exception {
+ System.out.println("Registering service.");
+ registration = context.registerService(Greeter.class, new GreeterImpl(), new Hashtable());
+ reference = registration.getReference();
+ }
+
+ @Override public void stop(BundleContext context) throws Exception {
+ System.out.println("Unregistering service.");
+ registration.unregister();
+ }
+}
diff --git a/osgi/pom.xml b/osgi/pom.xml
new file mode 100644
index 0000000000..e6ef9c3192
--- /dev/null
+++ b/osgi/pom.xml
@@ -0,0 +1,87 @@
+
+
+ 4.0.0
+
+ osgi-intro
+ pom
+ 1.0-SNAPSHOT
+
+ osgi-intro-sample-activator
+ osgi-intro-sample-service
+ osgi-intro-sample-client
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+
+
+ ${project.groupId}
+ osgi-intro-client
+ ${project.version}
+
+
+
+ ${project.groupId}
+ osgi-intro-service
+ ${project.version}
+
+
+
+ ${project.groupId}
+ osgi-intro-gxyz
+ ${project.version}
+
+
+
+ ${project.groupId}
+ osgi-intro-mapquest
+ ${project.version}
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 3.9.0
+
+
+ javax.json
+ javax.json-api
+ 1.1
+
+
+ org.glassfish
+ javax.json
+ 1.1
+
+
+ org.osgi
+ org.osgi.core
+ 6.0.0
+ provided
+
+
+
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ 3.3.0
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osgi/readme.md b/osgi/readme.md
new file mode 100644
index 0000000000..ea4a411c7b
--- /dev/null
+++ b/osgi/readme.md
@@ -0,0 +1,91 @@
+OSGi
+====
+
+Info
+---
+
+com.baeldung.osgi
+com.baeldung.osgi.sample.activator
+
+Apache Felix
+---
+
+
+### Start
+
+Download Apache Felix Framework Distribution
+from
+org.apache.felix.main.distribution-5.6.8
+
+No! The Apache Karaf container is best.
+Download it from:
+
+Download a binary distribution and unzip wherever you prefer.
+
+Then run
+
+ bin\karaf.bat start
+
+
+Unzip, pay attention to the files not being clipped(!).
+
+ system:exit
+
+exit!
+
+ shutdown -h
+
+or `^D`
+
+### clean start
+
+full clean, remove "data directory "
+
+or...
+
+ bin\karaf.bat clean
+
+ bin\start.bat clean
+
+### run mode
+
+can be launched in
+
+- the "regular" mode starts Apache Karaf in foreground, including the shell console.
+- the "server" mode starts Apache Karaf in foreground, without the shell console.
+- the "background" mode starts Apache Karaf in background.
+
+### Logging
+
+https://karaf.apache.org/manual/latest/#_log
+
+can be logged to console
+
+
+### Bundle deploy
+
+ bundle:install mvn:com.baeldung/osgi-intro-sample-activator/1.0-SNAPSHOT
+
+ install mvn:com.baeldung/osgi-intro-sample-service/1.0-SNAPSHOT
+ install mvn:com.baeldung/osgi-intro-sample-client/1.0-SNAPSHOT
+
+Eclipse's Equinox
+====
+
+Eclipse's OSGi platform
+http://www.eclipse.org/equinox/
+
+http://www.eclipse.org/equinox/documents/quickstart-framework.php
+
+click on "download"
+
+Latest Release
+Oxygen.1 Wed, 6 Sep 2017 -- 17:00 (-0400)
+
+org.eclipse.osgi_3.12.1.v20170821-1548.jar
+
+ = = NOT GOOD = =
+
+
+
+
diff --git a/parent-boot-4/pom.xml b/parent-boot-4/pom.xml
index 2af36e9365..608e57ddaf 100644
--- a/parent-boot-4/pom.xml
+++ b/parent-boot-4/pom.xml
@@ -63,7 +63,7 @@
**/JdbcTest.java
**/*LiveTest.java
- true
+
diff --git a/parent-boot-5/pom.xml b/parent-boot-5/pom.xml
index 57e9ed3c67..2fa397f298 100644
--- a/parent-boot-5/pom.xml
+++ b/parent-boot-5/pom.xml
@@ -65,7 +65,6 @@
**/*EntryPointsTest.java
**/*LiveTest.java
- true
diff --git a/patterns/README.md b/patterns/README.md
index bcd54a64b1..67d84154cb 100644
--- a/patterns/README.md
+++ b/patterns/README.md
@@ -1,3 +1,4 @@
###Relevant Articles:
- [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern)
- [Introduction to Intercepting Filter Pattern in Java](http://www.baeldung.com/intercepting-filter-pattern-in-java)
+- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/template-method-pattern-in-java)
diff --git a/patterns/behavioral-patterns/pom.xml b/patterns/behavioral-patterns/pom.xml
new file mode 100644
index 0000000000..3c40520ce1
--- /dev/null
+++ b/patterns/behavioral-patterns/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+ com.baeldung.pattern.templatemethod
+ pattern.templatemethod
+ 1.0
+ jar
+
+ com.baeldung.patterns
+ patterns-parent
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.7.0
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
\ No newline at end of file
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/application/Application.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/application/Application.java
new file mode 100644
index 0000000000..9ab34c3cd8
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/application/Application.java
@@ -0,0 +1,21 @@
+package com.baeldung.pattern.templatemethod.application;
+
+import com.baeldung.pattern.templatemethod.model.Computer;
+import com.baeldung.pattern.templatemethod.model.StandardComputer;
+import com.baeldung.pattern.templatemethod.model.HighEndComputer;
+import com.baeldung.pattern.templatemethod.model.ComputerBuilder;
+import com.baeldung.pattern.templatemethod.model.HighEndComputerBuilder;
+import com.baeldung.pattern.templatemethod.model.StandardComputerBuilder;
+
+public class Application {
+
+ public static void main(String[] args) {
+ ComputerBuilder standardComputerBuilder = new StandardComputerBuilder();
+ Computer standardComputer = standardComputerBuilder.buildComputer();
+ standardComputer.getComputerParts().forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));
+
+ ComputerBuilder highEndComputerBuilder = new HighEndComputerBuilder();
+ Computer highEndComputer = highEndComputerBuilder.buildComputer();
+ highEndComputer.getComputerParts().forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/Computer.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/Computer.java
new file mode 100644
index 0000000000..1419398f62
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/Computer.java
@@ -0,0 +1,17 @@
+package com.baeldung.pattern.templatemethod.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Computer {
+
+ private Map computerParts = new HashMap<>();
+
+ public Computer(Map computerParts) {
+ this.computerParts = computerParts;
+ }
+
+ public Map getComputerParts() {
+ return computerParts;
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/ComputerBuilder.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/ComputerBuilder.java
new file mode 100644
index 0000000000..515a6940f5
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/ComputerBuilder.java
@@ -0,0 +1,38 @@
+package com.baeldung.pattern.templatemethod.model;
+
+import com.baeldung.pattern.templatemethod.model.Computer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public abstract class ComputerBuilder {
+
+ protected Map computerParts = new HashMap<>();
+ protected List motherboardSetupStatus = new ArrayList<>();
+
+ public final Computer buildComputer() {
+ addMotherboard();
+ setupMotherboard();
+ addProcessor();
+ return getComputer();
+ }
+
+ public abstract void addMotherboard();
+
+ public abstract void setupMotherboard();
+
+ public abstract void addProcessor();
+
+ public List getMotherboardSetupStatus() {
+ return motherboardSetupStatus;
+ }
+
+ public Map getComputerParts() {
+ return computerParts;
+ }
+
+ private Computer getComputer() {
+ return new Computer(computerParts);
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputer.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputer.java
new file mode 100644
index 0000000000..0684b1b233
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputer.java
@@ -0,0 +1,11 @@
+package com.baeldung.pattern.templatemethod.model;
+
+import com.baeldung.pattern.templatemethod.model.Computer;
+import java.util.Map;
+
+public class HighEndComputer extends Computer {
+
+ public HighEndComputer(Map computerParts) {
+ super(computerParts);
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputerBuilder.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputerBuilder.java
new file mode 100644
index 0000000000..c992aa2bff
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputerBuilder.java
@@ -0,0 +1,21 @@
+package com.baeldung.pattern.templatemethod.model;
+
+public class HighEndComputerBuilder extends ComputerBuilder {
+
+ @Override
+ public void addMotherboard() {
+ computerParts.put("Motherboard", "High-end Motherboard");
+ }
+
+ @Override
+ public void setupMotherboard() {
+ motherboardSetupStatus.add("Screwing the high-end motherboard to the case.");
+ motherboardSetupStatus.add("Pluging in the power supply connectors.");
+ motherboardSetupStatus.forEach(step -> System.out.println(step));
+ }
+
+ @Override
+ public void addProcessor() {
+ computerParts.put("Processor", "High-end Processor");
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputer.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputer.java
new file mode 100644
index 0000000000..4e1d857016
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputer.java
@@ -0,0 +1,11 @@
+package com.baeldung.pattern.templatemethod.model;
+
+import com.baeldung.pattern.templatemethod.model.Computer;
+import java.util.Map;
+
+public class StandardComputer extends Computer {
+
+ public StandardComputer(Map computerParts) {
+ super(computerParts);
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputerBuilder.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputerBuilder.java
new file mode 100644
index 0000000000..cc81dddc1b
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputerBuilder.java
@@ -0,0 +1,21 @@
+package com.baeldung.pattern.templatemethod.model;
+
+public class StandardComputerBuilder extends ComputerBuilder {
+
+ @Override
+ public void addMotherboard() {
+ computerParts.put("Motherboard", "Standard Motherboard");
+ }
+
+ @Override
+ public void setupMotherboard() {
+ motherboardSetupStatus.add("Screwing the standard motherboard to the case.");
+ motherboardSetupStatus.add("Pluging in the power supply connectors.");
+ motherboardSetupStatus.forEach(step -> System.out.println(step));
+ }
+
+ @Override
+ public void addProcessor() {
+ computerParts.put("Processor", "Standard Processor");
+ }
+}
diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/templatemethod/test/TemplateMethodPatternTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/templatemethod/test/TemplateMethodPatternTest.java
new file mode 100644
index 0000000000..679559af9f
--- /dev/null
+++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/templatemethod/test/TemplateMethodPatternTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.pattern.templatemethod.test;
+
+import com.baeldung.pattern.templatemethod.model.Computer;
+import com.baeldung.pattern.templatemethod.model.HighEndComputerBuilder;
+import com.baeldung.pattern.templatemethod.model.StandardComputerBuilder;
+import org.junit.Assert;
+import static org.junit.Assert.assertEquals;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertThat;
+
+public class TemplateMethodPatternTest {
+
+ private static StandardComputerBuilder standardComputerBuilder;
+ private static HighEndComputerBuilder highEndComputerBuilder;
+
+ @BeforeClass
+ public static void setUpStandardComputerBuilderInstance() {
+ standardComputerBuilder = new StandardComputerBuilder();
+ }
+
+ @BeforeClass
+ public static void setUpHighEndComputerBuilderInstance() {
+ highEndComputerBuilder = new HighEndComputerBuilder();
+ }
+
+ @Test
+ public void givenStandardMotherBoard_whenAddingMotherBoard_thenEqualAssertion() {
+ standardComputerBuilder.addMotherboard();
+ assertEquals("Standard Motherboard", standardComputerBuilder.getComputerParts().get("Motherboard"));
+ }
+
+ @Test
+ public void givenStandardMotherboard_whenSetup_thenTwoEqualAssertions() {
+ standardComputerBuilder.setupMotherboard();
+ assertEquals("Screwing the standard motherboard to the case.", standardComputerBuilder.getMotherboardSetupStatus().get(0));
+ assertEquals("Pluging in the power supply connectors.", standardComputerBuilder.getMotherboardSetupStatus().get(1));
+ }
+
+ @Test
+ public void givenStandardProcessor_whenAddingProcessor_thenEqualAssertion() {
+ standardComputerBuilder.addProcessor();
+ assertEquals("Standard Processor", standardComputerBuilder.getComputerParts().get("Processor"));
+ }
+
+ @Test
+ public void givenAllStandardParts_whenBuildingComputer_thenTwoParts() {
+ standardComputerBuilder.buildComputer();
+ assertEquals(2, standardComputerBuilder.getComputerParts().size());
+ }
+
+ @Test
+ public void givenAllStandardParts_whenComputerisBuilt_thenComputerInstance() {
+ assertThat(standardComputerBuilder.buildComputer(), instanceOf(Computer.class));
+ }
+
+ @Test
+ public void givenHighEnddMotherBoard_whenAddingMotherBoard_thenEqualAssertion() {
+ highEndComputerBuilder.addMotherboard();
+ Assert.assertEquals("High-end Motherboard", highEndComputerBuilder.getComputerParts().get("Motherboard"));
+ }
+
+ @Test
+ public void givenHighEnddMotheroboard_whenSetup_thenTwoEqualAssertions() {
+ highEndComputerBuilder.setupMotherboard();
+ assertEquals("Screwing the high-end motherboard to the case.", highEndComputerBuilder.getMotherboardSetupStatus().get(0));
+ assertEquals("Pluging in the power supply connectors.", highEndComputerBuilder.getMotherboardSetupStatus().get(1));
+ }
+
+ @Test
+ public void givenHightEndProcessor_whenAddingProcessor_thenEqualAssertion() {
+ highEndComputerBuilder.addProcessor();
+ assertEquals("High-end Processor", highEndComputerBuilder.getComputerParts().get("Processor"));
+ }
+
+ @Test
+ public void givenAllHighEnddParts_whenBuildingComputer_thenTwoParts() {
+ highEndComputerBuilder.buildComputer();
+ assertEquals(2, highEndComputerBuilder.getComputerParts().size());
+ }
+
+ @Test
+ public void givenAllHighEndParts_whenComputerisBuilt_thenComputerInstance() {
+ assertThat(standardComputerBuilder.buildComputer(), instanceOf(Computer.class));
+ }
+}
diff --git a/patterns/pom.xml b/patterns/pom.xml
index c40d7c58b7..1462952e37 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -9,6 +9,7 @@
front-controller
intercepting-filter
+ behavioral-patterns
@@ -51,4 +52,4 @@
3.0.0
9.4.0.v20161208
-
+
\ No newline at end of file
diff --git a/persistence-modules/README.md b/persistence-modules/README.md
new file mode 100644
index 0000000000..6c2b1d2ca9
--- /dev/null
+++ b/persistence-modules/README.md
@@ -0,0 +1,3 @@
+
+## Persistence Modules
+
diff --git a/java-cassandra/README.md b/persistence-modules/java-cassandra/README.md
similarity index 100%
rename from java-cassandra/README.md
rename to persistence-modules/java-cassandra/README.md
diff --git a/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml
similarity index 98%
rename from java-cassandra/pom.xml
rename to persistence-modules/java-cassandra/pom.xml
index 12df920e7d..81e072c3a7 100644
--- a/java-cassandra/pom.xml
+++ b/persistence-modules/java-cassandra/pom.xml
@@ -11,6 +11,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java
similarity index 100%
rename from java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java
rename to persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java
similarity index 100%
rename from java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java
rename to persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java
similarity index 100%
rename from java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java
rename to persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java
similarity index 100%
rename from java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java
rename to persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java
similarity index 100%
rename from java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java
rename to persistence-modules/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java
diff --git a/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java b/persistence-modules/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java
similarity index 100%
rename from java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java
rename to persistence-modules/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java
diff --git a/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java b/persistence-modules/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java
similarity index 100%
rename from java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java
rename to persistence-modules/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java
diff --git a/java-mongodb/.gitignore b/persistence-modules/java-mongodb/.gitignore
similarity index 100%
rename from java-mongodb/.gitignore
rename to persistence-modules/java-mongodb/.gitignore
diff --git a/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md
similarity index 100%
rename from java-mongodb/README.md
rename to persistence-modules/java-mongodb/README.md
diff --git a/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml
similarity index 97%
rename from java-mongodb/pom.xml
rename to persistence-modules/java-mongodb/pom.xml
index 304d961b0a..9784b2c5a8 100644
--- a/java-mongodb/pom.xml
+++ b/persistence-modules/java-mongodb/pom.xml
@@ -11,6 +11,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/java-mongodb/src/main/java/com/baeldung/MongoExample.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoExample.java
similarity index 100%
rename from java-mongodb/src/main/java/com/baeldung/MongoExample.java
rename to persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoExample.java
diff --git a/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java
similarity index 100%
rename from java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java
rename to persistence-modules/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java
diff --git a/liquibase/README.md b/persistence-modules/liquibase/README.md
similarity index 100%
rename from liquibase/README.md
rename to persistence-modules/liquibase/README.md
diff --git a/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml
similarity index 96%
rename from liquibase/pom.xml
rename to persistence-modules/liquibase/pom.xml
index d26acc8c98..a574ba497c 100644
--- a/liquibase/pom.xml
+++ b/persistence-modules/liquibase/pom.xml
@@ -6,6 +6,7 @@
parent-modules
com.baeldung
1.0.0-SNAPSHOT
+ ../../
4.0.0
diff --git a/liquibase/src/main/resources/liquibase/db-changelog.xml b/persistence-modules/liquibase/src/main/resources/liquibase/db-changelog.xml
similarity index 100%
rename from liquibase/src/main/resources/liquibase/db-changelog.xml
rename to persistence-modules/liquibase/src/main/resources/liquibase/db-changelog.xml
diff --git a/liquibase/src/main/resources/liquibase/liquibase.properties b/persistence-modules/liquibase/src/main/resources/liquibase/liquibase.properties
similarity index 100%
rename from liquibase/src/main/resources/liquibase/liquibase.properties
rename to persistence-modules/liquibase/src/main/resources/liquibase/liquibase.properties
diff --git a/querydsl/README.md b/persistence-modules/querydsl/README.md
similarity index 100%
rename from querydsl/README.md
rename to persistence-modules/querydsl/README.md
diff --git a/querydsl/pom.xml b/persistence-modules/querydsl/pom.xml
similarity index 99%
rename from querydsl/pom.xml
rename to persistence-modules/querydsl/pom.xml
index 6c968f01e4..c2943875f1 100644
--- a/querydsl/pom.xml
+++ b/persistence-modules/querydsl/pom.xml
@@ -15,6 +15,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/querydsl/src/main/java/org/baeldung/dao/PersonDao.java b/persistence-modules/querydsl/src/main/java/org/baeldung/dao/PersonDao.java
similarity index 100%
rename from querydsl/src/main/java/org/baeldung/dao/PersonDao.java
rename to persistence-modules/querydsl/src/main/java/org/baeldung/dao/PersonDao.java
diff --git a/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java b/persistence-modules/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
similarity index 100%
rename from querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
rename to persistence-modules/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
diff --git a/querydsl/src/main/java/org/baeldung/entity/Person.java b/persistence-modules/querydsl/src/main/java/org/baeldung/entity/Person.java
similarity index 100%
rename from querydsl/src/main/java/org/baeldung/entity/Person.java
rename to persistence-modules/querydsl/src/main/java/org/baeldung/entity/Person.java
diff --git a/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java b/persistence-modules/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java
similarity index 100%
rename from querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java
rename to persistence-modules/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java
diff --git a/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java b/persistence-modules/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java
similarity index 100%
rename from querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java
rename to persistence-modules/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java
diff --git a/querydsl/src/main/resources/META-INF/persistence.xml b/persistence-modules/querydsl/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from querydsl/src/main/resources/META-INF/persistence.xml
rename to persistence-modules/querydsl/src/main/resources/META-INF/persistence.xml
diff --git a/querydsl/src/main/resources/logback.xml b/persistence-modules/querydsl/src/main/resources/logback.xml
similarity index 100%
rename from querydsl/src/main/resources/logback.xml
rename to persistence-modules/querydsl/src/main/resources/logback.xml
diff --git a/querydsl/src/test/java/org/baeldung/dao/PersonDaoIntegrationTest.java b/persistence-modules/querydsl/src/test/java/org/baeldung/dao/PersonDaoIntegrationTest.java
similarity index 100%
rename from querydsl/src/test/java/org/baeldung/dao/PersonDaoIntegrationTest.java
rename to persistence-modules/querydsl/src/test/java/org/baeldung/dao/PersonDaoIntegrationTest.java
diff --git a/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLIntegrationTest.java b/persistence-modules/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLIntegrationTest.java
similarity index 100%
rename from querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLIntegrationTest.java
rename to persistence-modules/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLIntegrationTest.java
diff --git a/querydsl/src/test/resources/db.properties b/persistence-modules/querydsl/src/test/resources/db.properties
similarity index 100%
rename from querydsl/src/test/resources/db.properties
rename to persistence-modules/querydsl/src/test/resources/db.properties
diff --git a/querydsl/src/test/resources/test-context.xml b/persistence-modules/querydsl/src/test/resources/test-context.xml
similarity index 100%
rename from querydsl/src/test/resources/test-context.xml
rename to persistence-modules/querydsl/src/test/resources/test-context.xml
diff --git a/querydsl/src/test/resources/test-db.xml b/persistence-modules/querydsl/src/test/resources/test-db.xml
similarity index 100%
rename from querydsl/src/test/resources/test-db.xml
rename to persistence-modules/querydsl/src/test/resources/test-db.xml
diff --git a/redis/README.md b/persistence-modules/redis/README.md
similarity index 100%
rename from redis/README.md
rename to persistence-modules/redis/README.md
diff --git a/redis/pom.xml b/persistence-modules/redis/pom.xml
similarity index 96%
rename from redis/pom.xml
rename to persistence-modules/redis/pom.xml
index db454188a7..4321b491eb 100644
--- a/redis/pom.xml
+++ b/persistence-modules/redis/pom.xml
@@ -15,6 +15,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/redis/src/main/java/com/baeldung/CustomMessage.java b/persistence-modules/redis/src/main/java/com/baeldung/CustomMessage.java
similarity index 100%
rename from redis/src/main/java/com/baeldung/CustomMessage.java
rename to persistence-modules/redis/src/main/java/com/baeldung/CustomMessage.java
diff --git a/redis/src/main/java/com/baeldung/Ledger.java b/persistence-modules/redis/src/main/java/com/baeldung/Ledger.java
similarity index 100%
rename from redis/src/main/java/com/baeldung/Ledger.java
rename to persistence-modules/redis/src/main/java/com/baeldung/Ledger.java
diff --git a/redis/src/main/java/com/baeldung/LedgerLiveObject.java b/persistence-modules/redis/src/main/java/com/baeldung/LedgerLiveObject.java
similarity index 100%
rename from redis/src/main/java/com/baeldung/LedgerLiveObject.java
rename to persistence-modules/redis/src/main/java/com/baeldung/LedgerLiveObject.java
diff --git a/redis/src/main/java/com/baeldung/LedgerServiceImpl.java b/persistence-modules/redis/src/main/java/com/baeldung/LedgerServiceImpl.java
similarity index 100%
rename from redis/src/main/java/com/baeldung/LedgerServiceImpl.java
rename to persistence-modules/redis/src/main/java/com/baeldung/LedgerServiceImpl.java
diff --git a/redis/src/main/java/com/baeldung/LedgerServiceInterface.java b/persistence-modules/redis/src/main/java/com/baeldung/LedgerServiceInterface.java
similarity index 100%
rename from redis/src/main/java/com/baeldung/LedgerServiceInterface.java
rename to persistence-modules/redis/src/main/java/com/baeldung/LedgerServiceInterface.java
diff --git a/redis/src/main/resources/singleNodeConfig.json b/persistence-modules/redis/src/main/resources/singleNodeConfig.json
similarity index 100%
rename from redis/src/main/resources/singleNodeConfig.json
rename to persistence-modules/redis/src/main/resources/singleNodeConfig.json
diff --git a/redis/src/main/resources/singleNodeConfig.yaml b/persistence-modules/redis/src/main/resources/singleNodeConfig.yaml
similarity index 100%
rename from redis/src/main/resources/singleNodeConfig.yaml
rename to persistence-modules/redis/src/main/resources/singleNodeConfig.yaml
diff --git a/redis/src/test/java/com/baeldung/JedisIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java
similarity index 100%
rename from redis/src/test/java/com/baeldung/JedisIntegrationTest.java
rename to persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java
diff --git a/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java
similarity index 100%
rename from redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java
rename to persistence-modules/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java
diff --git a/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java
similarity index 100%
rename from redis/src/test/java/com/baeldung/RedissonIntegrationTest.java
rename to persistence-modules/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java
diff --git a/solr/README.md b/persistence-modules/solr/README.md
similarity index 100%
rename from solr/README.md
rename to persistence-modules/solr/README.md
diff --git a/solr/pom.xml b/persistence-modules/solr/pom.xml
similarity index 93%
rename from solr/pom.xml
rename to persistence-modules/solr/pom.xml
index 1b26a21edc..966bd8755b 100644
--- a/solr/pom.xml
+++ b/persistence-modules/solr/pom.xml
@@ -12,6 +12,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/solr/src/main/java/com/baeldung/solr/fulltext/search/model/Item.java b/persistence-modules/solr/src/main/java/com/baeldung/solr/fulltext/search/model/Item.java
similarity index 100%
rename from solr/src/main/java/com/baeldung/solr/fulltext/search/model/Item.java
rename to persistence-modules/solr/src/main/java/com/baeldung/solr/fulltext/search/model/Item.java
diff --git a/solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchService.java b/persistence-modules/solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchService.java
similarity index 100%
rename from solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchService.java
rename to persistence-modules/solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchService.java
diff --git a/solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceImpl.java b/persistence-modules/solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceImpl.java
similarity index 100%
rename from solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceImpl.java
rename to persistence-modules/solr/src/main/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceImpl.java
diff --git a/solr/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java b/persistence-modules/solr/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java
similarity index 100%
rename from solr/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java
rename to persistence-modules/solr/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java
diff --git a/spring-data-cassandra/README.md b/persistence-modules/spring-data-cassandra/README.md
similarity index 100%
rename from spring-data-cassandra/README.md
rename to persistence-modules/spring-data-cassandra/README.md
diff --git a/spring-data-cassandra/pom.xml b/persistence-modules/spring-data-cassandra/pom.xml
similarity index 98%
rename from spring-data-cassandra/pom.xml
rename to persistence-modules/spring-data-cassandra/pom.xml
index fbc2071134..1358210a45 100644
--- a/spring-data-cassandra/pom.xml
+++ b/persistence-modules/spring-data-cassandra/pom.xml
@@ -13,6 +13,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/config/CassandraConfig.java b/persistence-modules/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/config/CassandraConfig.java
similarity index 100%
rename from spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/config/CassandraConfig.java
rename to persistence-modules/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/config/CassandraConfig.java
diff --git a/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/model/Book.java b/persistence-modules/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/model/Book.java
similarity index 100%
rename from spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/model/Book.java
rename to persistence-modules/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/model/Book.java
diff --git a/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/repository/BookRepository.java b/persistence-modules/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/repository/BookRepository.java
similarity index 100%
rename from spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/repository/BookRepository.java
rename to persistence-modules/spring-data-cassandra/src/main/java/org/baeldung/spring/data/cassandra/repository/BookRepository.java
diff --git a/spring-data-cassandra/src/main/resources/cassandra.properties b/persistence-modules/spring-data-cassandra/src/main/resources/cassandra.properties
similarity index 100%
rename from spring-data-cassandra/src/main/resources/cassandra.properties
rename to persistence-modules/spring-data-cassandra/src/main/resources/cassandra.properties
diff --git a/rest-assured/src/test/resources/logback.xml b/persistence-modules/spring-data-cassandra/src/main/resources/logback.xml
similarity index 100%
rename from rest-assured/src/test/resources/logback.xml
rename to persistence-modules/spring-data-cassandra/src/main/resources/logback.xml
diff --git a/spring-data-cassandra/src/main/resources/test.png b/persistence-modules/spring-data-cassandra/src/main/resources/test.png
similarity index 100%
rename from spring-data-cassandra/src/main/resources/test.png
rename to persistence-modules/spring-data-cassandra/src/main/resources/test.png
diff --git a/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/BookRepositoryIntegrationTest.java b/persistence-modules/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/BookRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/BookRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/BookRepositoryIntegrationTest.java
diff --git a/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CassandraTemplateIntegrationTest.java b/persistence-modules/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CassandraTemplateIntegrationTest.java
similarity index 100%
rename from spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CassandraTemplateIntegrationTest.java
rename to persistence-modules/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CassandraTemplateIntegrationTest.java
diff --git a/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CqlQueriesIntegrationTest.java b/persistence-modules/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CqlQueriesIntegrationTest.java
similarity index 100%
rename from spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CqlQueriesIntegrationTest.java
rename to persistence-modules/spring-data-cassandra/src/test/java/org/baeldung/spring/data/cassandra/repository/CqlQueriesIntegrationTest.java
diff --git a/spring-data-dynamodb/.gitignore b/persistence-modules/spring-data-dynamodb/.gitignore
similarity index 100%
rename from spring-data-dynamodb/.gitignore
rename to persistence-modules/spring-data-dynamodb/.gitignore
diff --git a/spring-data-dynamodb/README.MD b/persistence-modules/spring-data-dynamodb/README.MD
similarity index 100%
rename from spring-data-dynamodb/README.MD
rename to persistence-modules/spring-data-dynamodb/README.MD
diff --git a/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml
similarity index 96%
rename from spring-data-dynamodb/pom.xml
rename to persistence-modules/spring-data-dynamodb/pom.xml
index 11bbbdf40f..bf90779c29 100644
--- a/spring-data-dynamodb/pom.xml
+++ b/persistence-modules/spring-data-dynamodb/pom.xml
@@ -12,7 +12,7 @@
parent-boot-5
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-5
+ ../../parent-boot-5
diff --git a/spring-data-dynamodb/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/Application.java
similarity index 100%
rename from spring-data-dynamodb/src/main/java/com/baeldung/Application.java
rename to persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/Application.java
diff --git a/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java
similarity index 100%
rename from spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java
rename to persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java
diff --git a/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/model/ProductInfo.java b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/model/ProductInfo.java
similarity index 100%
rename from spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/model/ProductInfo.java
rename to persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/model/ProductInfo.java
diff --git a/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java
similarity index 100%
rename from spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java
rename to persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java
diff --git a/spring-data-dynamodb/src/main/resources/application.properties b/persistence-modules/spring-data-dynamodb/src/main/resources/application.properties
similarity index 100%
rename from spring-data-dynamodb/src/main/resources/application.properties
rename to persistence-modules/spring-data-dynamodb/src/main/resources/application.properties
diff --git a/spring-data-dynamodb/src/main/resources/demo.properties b/persistence-modules/spring-data-dynamodb/src/main/resources/demo.properties
similarity index 100%
rename from spring-data-dynamodb/src/main/resources/demo.properties
rename to persistence-modules/spring-data-dynamodb/src/main/resources/demo.properties
diff --git a/rest-testing/src/main/resources/logback.xml b/persistence-modules/spring-data-dynamodb/src/main/resources/logback.xml
similarity index 100%
rename from rest-testing/src/main/resources/logback.xml
rename to persistence-modules/spring-data-dynamodb/src/main/resources/logback.xml
diff --git a/spring-data-dynamodb/src/main/resources/templates/index.html b/persistence-modules/spring-data-dynamodb/src/main/resources/templates/index.html
similarity index 100%
rename from spring-data-dynamodb/src/main/resources/templates/index.html
rename to persistence-modules/spring-data-dynamodb/src/main/resources/templates/index.html
diff --git a/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java
diff --git a/spring-data-dynamodb/src/test/resources/application.properties b/persistence-modules/spring-data-dynamodb/src/test/resources/application.properties
similarity index 100%
rename from spring-data-dynamodb/src/test/resources/application.properties
rename to persistence-modules/spring-data-dynamodb/src/test/resources/application.properties
diff --git a/spring-data-dynamodb/src/test/resources/exception-hibernate.properties b/persistence-modules/spring-data-dynamodb/src/test/resources/exception-hibernate.properties
similarity index 100%
rename from spring-data-dynamodb/src/test/resources/exception-hibernate.properties
rename to persistence-modules/spring-data-dynamodb/src/test/resources/exception-hibernate.properties
diff --git a/spring-data-dynamodb/src/test/resources/exception.properties b/persistence-modules/spring-data-dynamodb/src/test/resources/exception.properties
similarity index 100%
rename from spring-data-dynamodb/src/test/resources/exception.properties
rename to persistence-modules/spring-data-dynamodb/src/test/resources/exception.properties
diff --git a/spring-data-gemfire/README.md b/persistence-modules/spring-data-gemfire/README.md
similarity index 100%
rename from spring-data-gemfire/README.md
rename to persistence-modules/spring-data-gemfire/README.md
diff --git a/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml
similarity index 97%
rename from spring-data-gemfire/pom.xml
rename to persistence-modules/spring-data-gemfire/pom.xml
index ae7612d719..3f7fcd03e5 100644
--- a/spring-data-gemfire/pom.xml
+++ b/persistence-modules/spring-data-gemfire/pom.xml
@@ -12,6 +12,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionExecution.java b/persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionExecution.java
similarity index 100%
rename from spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionExecution.java
rename to persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionExecution.java
diff --git a/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionImpl.java b/persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionImpl.java
similarity index 100%
rename from spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionImpl.java
rename to persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/FunctionImpl.java
diff --git a/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/GemfireConfiguration.java b/persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/GemfireConfiguration.java
similarity index 100%
rename from spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/GemfireConfiguration.java
rename to persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/function/GemfireConfiguration.java
diff --git a/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/model/Employee.java b/persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/model/Employee.java
similarity index 100%
rename from spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/model/Employee.java
rename to persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/model/Employee.java
diff --git a/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepository.java b/persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepository.java
similarity index 100%
rename from spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepository.java
rename to persistence-modules/spring-data-gemfire/src/main/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepository.java
diff --git a/spring-data-gemfire/src/main/resources/application-context.xml b/persistence-modules/spring-data-gemfire/src/main/resources/application-context.xml
similarity index 100%
rename from spring-data-gemfire/src/main/resources/application-context.xml
rename to persistence-modules/spring-data-gemfire/src/main/resources/application-context.xml
diff --git a/spring-data-gemfire/src/test/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepositoryIntegrationTest.java b/persistence-modules/spring-data-gemfire/src/test/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-gemfire/src/test/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-gemfire/src/test/java/com/baeldung/spring/data/gemfire/repository/EmployeeRepositoryIntegrationTest.java
diff --git a/spring-data-neo4j/README.md b/persistence-modules/spring-data-neo4j/README.md
similarity index 100%
rename from spring-data-neo4j/README.md
rename to persistence-modules/spring-data-neo4j/README.md
diff --git a/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml
similarity index 99%
rename from spring-data-neo4j/pom.xml
rename to persistence-modules/spring-data-neo4j/pom.xml
index e01e7d7294..bdd51e9659 100644
--- a/spring-data-neo4j/pom.xml
+++ b/persistence-modules/spring-data-neo4j/pom.xml
@@ -10,6 +10,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/PersonRepository.java
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java
similarity index 100%
rename from spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java
rename to persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java
diff --git a/spring-data-cassandra/src/main/resources/logback.xml b/persistence-modules/spring-data-neo4j/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-cassandra/src/main/resources/logback.xml
rename to persistence-modules/spring-data-neo4j/src/main/resources/logback.xml
diff --git a/spring-data-neo4j/src/main/resources/test.png b/persistence-modules/spring-data-neo4j/src/main/resources/test.png
similarity index 100%
rename from spring-data-neo4j/src/main/resources/test.png
rename to persistence-modules/spring-data-neo4j/src/main/resources/test.png
diff --git a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java
similarity index 100%
rename from spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java
rename to persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java
diff --git a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java
similarity index 100%
rename from spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java
rename to persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java
diff --git a/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java
similarity index 100%
rename from spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java
rename to persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java
diff --git a/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java
diff --git a/spring-data-dynamodb/src/main/resources/logback.xml b/persistence-modules/spring-data-neo4j/src/test/resources/logback.xml
similarity index 100%
rename from spring-data-dynamodb/src/main/resources/logback.xml
rename to persistence-modules/spring-data-neo4j/src/test/resources/logback.xml
diff --git a/spring-data-redis/README.md b/persistence-modules/spring-data-redis/README.md
similarity index 100%
rename from spring-data-redis/README.md
rename to persistence-modules/spring-data-redis/README.md
diff --git a/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
similarity index 98%
rename from spring-data-redis/pom.xml
rename to persistence-modules/spring-data-redis/pom.xml
index d2835595da..6cb49f11cf 100644
--- a/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -11,6 +11,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/MessagePublisher.java
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessagePublisher.java
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/queue/RedisMessageSubscriber.java
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java
diff --git a/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
similarity index 100%
rename from spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
rename to persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java
diff --git a/spring-data-neo4j/src/main/resources/logback.xml b/persistence-modules/spring-data-redis/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-neo4j/src/main/resources/logback.xml
rename to persistence-modules/spring-data-redis/src/main/resources/logback.xml
diff --git a/spring-data-redis/src/main/resources/test.png b/persistence-modules/spring-data-redis/src/main/resources/test.png
similarity index 100%
rename from spring-data-redis/src/main/resources/test.png
rename to persistence-modules/spring-data-redis/src/main/resources/test.png
diff --git a/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
similarity index 100%
rename from spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
rename to persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
diff --git a/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
diff --git a/spring-data-solr/README.md b/persistence-modules/spring-data-solr/README.md
similarity index 100%
rename from spring-data-solr/README.md
rename to persistence-modules/spring-data-solr/README.md
diff --git a/spring-data-solr/pom.xml b/persistence-modules/spring-data-solr/pom.xml
similarity index 96%
rename from spring-data-solr/pom.xml
rename to persistence-modules/spring-data-solr/pom.xml
index 48ddaa7085..e24d8314ba 100644
--- a/spring-data-solr/pom.xml
+++ b/persistence-modules/spring-data-solr/pom.xml
@@ -12,6 +12,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java b/persistence-modules/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java
similarity index 100%
rename from spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java
rename to persistence-modules/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java
diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java b/persistence-modules/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java
similarity index 100%
rename from spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java
rename to persistence-modules/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java
diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java b/persistence-modules/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java
similarity index 100%
rename from spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java
rename to persistence-modules/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java
diff --git a/spring-data-solr/src/main/resources/solr-named-queries.properties b/persistence-modules/spring-data-solr/src/main/resources/solr-named-queries.properties
similarity index 100%
rename from spring-data-solr/src/main/resources/solr-named-queries.properties
rename to persistence-modules/spring-data-solr/src/main/resources/solr-named-queries.properties
diff --git a/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java b/persistence-modules/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java
diff --git a/spring-hibernate3/src/test/resources/.gitignore b/persistence-modules/spring-hibernate-3/.gitignore
similarity index 100%
rename from spring-hibernate3/src/test/resources/.gitignore
rename to persistence-modules/spring-hibernate-3/.gitignore
diff --git a/spring-hibernate3/README.md b/persistence-modules/spring-hibernate-3/README.md
similarity index 100%
rename from spring-hibernate3/README.md
rename to persistence-modules/spring-hibernate-3/README.md
diff --git a/spring-hibernate3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml
similarity index 95%
rename from spring-hibernate3/pom.xml
rename to persistence-modules/spring-hibernate-3/pom.xml
index d7607cac0a..f1873a84d3 100644
--- a/spring-hibernate3/pom.xml
+++ b/persistence-modules/spring-hibernate-3/pom.xml
@@ -2,15 +2,16 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
- spring-hibernate3
+ spring-hibernate-3
0.1-SNAPSHOT
- spring-hibernate3
+ spring-hibernate-3
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
@@ -87,7 +88,7 @@
- spring-hibernate3
+ spring-hibernate-3
src/main/resources
@@ -141,7 +142,7 @@
3.6.10.Final
5.1.40
- 7.0.73
+ 8.5.8
1.4.193
@@ -162,4 +163,4 @@
-
\ No newline at end of file
+
diff --git a/spring-hibernate3/src/main/java/org/baeldung/persistence/dao/AbstractHibernateDao.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/AbstractHibernateDao.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/persistence/dao/AbstractHibernateDao.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/AbstractHibernateDao.java
diff --git a/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/EventDao.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/EventDao.java
new file mode 100644
index 0000000000..74da643f35
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/EventDao.java
@@ -0,0 +1,18 @@
+package org.baeldung.persistence.dao;
+
+
+import org.baeldung.persistence.model.Event;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class EventDao extends AbstractHibernateDao implements IEventDao {
+
+ public EventDao() {
+ super();
+
+ setClazz(Event.class);
+ }
+
+ // API
+
+}
diff --git a/spring-hibernate3/src/main/java/org/baeldung/persistence/dao/FooDao.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/FooDao.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/persistence/dao/FooDao.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/FooDao.java
diff --git a/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IEventDao.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IEventDao.java
new file mode 100644
index 0000000000..f7be705905
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IEventDao.java
@@ -0,0 +1,9 @@
+package org.baeldung.persistence.dao;
+
+import org.baeldung.persistence.model.Event;
+
+
+
+public interface IEventDao extends IOperations {
+ //
+}
diff --git a/spring-hibernate3/src/main/java/org/baeldung/persistence/dao/IFooDao.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IFooDao.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/persistence/dao/IFooDao.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IFooDao.java
diff --git a/spring-hibernate3/src/main/java/org/baeldung/persistence/dao/IOperations.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IOperations.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/persistence/dao/IOperations.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/dao/IOperations.java
diff --git a/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/model/Event.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/model/Event.java
new file mode 100644
index 0000000000..1d659ed75c
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/model/Event.java
@@ -0,0 +1,45 @@
+package org.baeldung.persistence.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "EVENTS")
+public class Event implements Serializable {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String description;
+
+ public Event() {
+ }
+
+
+ public Event(String description) {
+ this.description = description;
+ }
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ }
\ No newline at end of file
diff --git a/spring-hibernate3/src/main/java/org/baeldung/persistence/model/Foo.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/model/Foo.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/persistence/model/Foo.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/model/Foo.java
diff --git a/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/service/EventService.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/service/EventService.java
new file mode 100644
index 0000000000..6171751cc5
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/service/EventService.java
@@ -0,0 +1,27 @@
+package org.baeldung.persistence.service;
+
+
+import org.baeldung.persistence.dao.IEventDao;
+import org.baeldung.persistence.model.Event;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class EventService {
+
+ @Autowired
+ private IEventDao dao;
+
+ public EventService() {
+ super();
+ }
+
+ // API
+
+ public void create(final Event entity) {
+ dao.create(entity);
+ }
+
+}
diff --git a/spring-hibernate3/src/main/java/org/baeldung/persistence/service/FooService.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/service/FooService.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/persistence/service/FooService.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/persistence/service/FooService.java
diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/spring/PersistenceConfig.java
similarity index 98%
rename from spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfig.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/spring/PersistenceConfig.java
index fea76dfc70..03b9bfac33 100644
--- a/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfig.java
+++ b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/spring/PersistenceConfig.java
@@ -4,7 +4,7 @@ import java.util.Properties;
import javax.sql.DataSource;
-import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@@ -75,4 +75,4 @@ public class PersistenceConfig {
return hibernateProperties;
}
-}
\ No newline at end of file
+}
diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceXmlConfig.java b/persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/spring/PersistenceXmlConfig.java
similarity index 100%
rename from spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceXmlConfig.java
rename to persistence-modules/spring-hibernate-3/src/main/java/org/baeldung/spring/PersistenceXmlConfig.java
diff --git a/persistence-modules/spring-hibernate-3/src/main/resources/exceptionDemo.cfg.xml b/persistence-modules/spring-hibernate-3/src/main/resources/exceptionDemo.cfg.xml
new file mode 100644
index 0000000000..8a710cc559
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/main/resources/exceptionDemo.cfg.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/persistence-modules/spring-hibernate-3/src/main/resources/exceptionDemoPersistenceConfig.xml b/persistence-modules/spring-hibernate-3/src/main/resources/exceptionDemoPersistenceConfig.xml
new file mode 100644
index 0000000000..09314c67b1
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/main/resources/exceptionDemoPersistenceConfig.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ classpath:exceptionDemo.cfg.xml
+
+
+
+ ${hibernate.dialect}
+ true
+ create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-data-neo4j/src/test/resources/logback.xml b/persistence-modules/spring-hibernate-3/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-neo4j/src/test/resources/logback.xml
rename to persistence-modules/spring-hibernate-3/src/main/resources/logback.xml
diff --git a/spring-hibernate3/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-3/src/main/resources/persistence-h2.properties
similarity index 100%
rename from spring-hibernate3/src/main/resources/persistence-h2.properties
rename to persistence-modules/spring-hibernate-3/src/main/resources/persistence-h2.properties
diff --git a/spring-hibernate3/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-hibernate-3/src/main/resources/persistence-mysql.properties
similarity index 100%
rename from spring-hibernate3/src/main/resources/persistence-mysql.properties
rename to persistence-modules/spring-hibernate-3/src/main/resources/persistence-mysql.properties
diff --git a/spring-hibernate3/src/main/resources/persistenceConfig.xml b/persistence-modules/spring-hibernate-3/src/main/resources/persistenceConfig.xml
similarity index 94%
rename from spring-hibernate3/src/main/resources/persistenceConfig.xml
rename to persistence-modules/spring-hibernate-3/src/main/resources/persistenceConfig.xml
index 347e85ee51..e7ef9ad765 100644
--- a/spring-hibernate3/src/main/resources/persistenceConfig.xml
+++ b/persistence-modules/spring-hibernate-3/src/main/resources/persistenceConfig.xml
@@ -18,7 +18,7 @@
-
+
@@ -31,4 +31,4 @@
-
\ No newline at end of file
+
diff --git a/spring-hibernate3/src/main/webapp/WEB-INF/view/sample.jsp b/persistence-modules/spring-hibernate-3/src/main/webapp/WEB-INF/view/sample.jsp
similarity index 100%
rename from spring-hibernate3/src/main/webapp/WEB-INF/view/sample.jsp
rename to persistence-modules/spring-hibernate-3/src/main/webapp/WEB-INF/view/sample.jsp
diff --git a/spring-hibernate3/src/main/webapp/WEB-INF/web.xml b/persistence-modules/spring-hibernate-3/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from spring-hibernate3/src/main/webapp/WEB-INF/web.xml
rename to persistence-modules/spring-hibernate-3/src/main/webapp/WEB-INF/web.xml
diff --git a/spring-hibernate3/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
similarity index 100%
rename from spring-hibernate3/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
rename to persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
diff --git a/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/NoHibernateSessBoundUsingAnnoSessionBeanMainIntegrationTest.java b/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/NoHibernateSessBoundUsingAnnoSessionBeanMainIntegrationTest.java
new file mode 100644
index 0000000000..2b29dcb7a9
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/NoHibernateSessBoundUsingAnnoSessionBeanMainIntegrationTest.java
@@ -0,0 +1,42 @@
+package org.baeldung.persistence.service;
+
+import org.baeldung.persistence.model.Event;
+import org.baeldung.spring.PersistenceXmlConfig;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.orm.hibernate3.HibernateSystemException;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceXmlConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class NoHibernateSessBoundUsingAnnoSessionBeanMainIntegrationTest {
+
+ @Autowired
+ EventService service;
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ @Test
+ public final void whenEntityIsCreated_thenNoExceptions() {
+ service.create(new Event("from Annotation Session Bean Factory"));
+ }
+
+ @Test
+ @Ignore
+ public final void whenNoTransBoundToSession_thenException() {
+ expectedEx.expect(HibernateSystemException.class);
+ expectedEx.expectMessage("No Hibernate Session bound to thread, "
+ + "and configuration does not allow creation of "
+ + "non-transactional one here");
+ service.create(new Event("from Annotation Session Bean Factory"));
+ }
+
+}
diff --git a/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/NoHibernateSessBoundUsingLocalSessionBeanMainIntegrationTest.java b/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/NoHibernateSessBoundUsingLocalSessionBeanMainIntegrationTest.java
new file mode 100644
index 0000000000..1bc6c07b18
--- /dev/null
+++ b/persistence-modules/spring-hibernate-3/src/test/java/org/baeldung/persistence/service/NoHibernateSessBoundUsingLocalSessionBeanMainIntegrationTest.java
@@ -0,0 +1,39 @@
+package org.baeldung.persistence.service;
+
+import org.baeldung.persistence.model.Event;
+import org.hibernate.HibernateException;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.orm.hibernate3.HibernateSystemException;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:exceptionDemoPersistenceConfig.xml" })
+public class NoHibernateSessBoundUsingLocalSessionBeanMainIntegrationTest {
+
+ @Autowired
+ EventService service;
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ @Test
+ public final void whenEntityIsCreated_thenNoExceptions() {
+ service.create(new Event("from local session bean factory"));
+ }
+
+ @Test
+ @Ignore
+ public final void whenNoTransBoundToSession_thenException() {
+ expectedEx.expect(HibernateException.class);
+ expectedEx.expectMessage("No Hibernate Session bound to thread, "
+ + "and configuration does not allow creation "
+ + "of non-transactional one here");
+ service.create(new Event("from local session bean factory"));
+ }
+}
diff --git a/spring-hibernate5/.gitignore b/persistence-modules/spring-hibernate-3/src/test/resources/.gitignore
similarity index 100%
rename from spring-hibernate5/.gitignore
rename to persistence-modules/spring-hibernate-3/src/test/resources/.gitignore
diff --git a/spring-hibernate5/src/test/resources/.gitignore b/persistence-modules/spring-hibernate-5/.gitignore
similarity index 100%
rename from spring-hibernate5/src/test/resources/.gitignore
rename to persistence-modules/spring-hibernate-5/.gitignore
diff --git a/spring-hibernate5/README.md b/persistence-modules/spring-hibernate-5/README.md
similarity index 100%
rename from spring-hibernate5/README.md
rename to persistence-modules/spring-hibernate-5/README.md
diff --git a/spring-hibernate5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml
similarity index 97%
rename from spring-hibernate5/pom.xml
rename to persistence-modules/spring-hibernate-5/pom.xml
index dac43c4dd3..57eb1aeffb 100644
--- a/spring-hibernate5/pom.xml
+++ b/persistence-modules/spring-hibernate-5/pom.xml
@@ -2,15 +2,16 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
- spring-hibernate5
+ spring-hibernate-5
0.1-SNAPSHOT
- spring-hibernate5
+ spring-hibernate-5
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
@@ -136,7 +137,7 @@
- spring-hibernate5
+ spring-hibernate-5
src/main/resources
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/dao/IFooDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/IFooDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/dao/IFooDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/IFooDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/dao/common/IOperations.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/common/IOperations.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/dao/common/IOperations.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/common/IOperations.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/dao/impl/FooHibernateDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/impl/FooHibernateDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/dao/impl/FooHibernateDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/dao/impl/FooHibernateDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/model/Foo.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/model/Foo.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/persistence/model/Foo.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/model/Foo.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/spring/PersistenceConfig.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java
diff --git a/spring-hibernate5/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java
similarity index 100%
rename from spring-hibernate5/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java
rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java
diff --git a/spring-hibernate5/src/main/resources/hibernate5Config.xml b/persistence-modules/spring-hibernate-5/src/main/resources/hibernate5Config.xml
similarity index 100%
rename from spring-hibernate5/src/main/resources/hibernate5Config.xml
rename to persistence-modules/spring-hibernate-5/src/main/resources/hibernate5Config.xml
diff --git a/spring-hibernate5/src/main/resources/immutable.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/immutable.cfg.xml
similarity index 100%
rename from spring-hibernate5/src/main/resources/immutable.cfg.xml
rename to persistence-modules/spring-hibernate-5/src/main/resources/immutable.cfg.xml
diff --git a/spring-data-redis/src/main/resources/logback.xml b/persistence-modules/spring-hibernate-5/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-redis/src/main/resources/logback.xml
rename to persistence-modules/spring-hibernate-5/src/main/resources/logback.xml
diff --git a/spring-hibernate5/src/main/resources/manytomany.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml
similarity index 100%
rename from spring-hibernate5/src/main/resources/manytomany.cfg.xml
rename to persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml
diff --git a/spring-hibernate5/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties
similarity index 100%
rename from spring-hibernate5/src/main/resources/persistence-h2.properties
rename to persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties
diff --git a/spring-hibernate5/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-mysql.properties
similarity index 100%
rename from spring-hibernate5/src/main/resources/persistence-mysql.properties
rename to persistence-modules/spring-hibernate-5/src/main/resources/persistence-mysql.properties
diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
similarity index 100%
rename from spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java
similarity index 73%
rename from spring-hibernate5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java
rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java
index 61d821e85e..614de6d3ad 100644
--- a/spring-hibernate5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java
+++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java
@@ -1,6 +1,5 @@
package com.baeldung.hibernate.manytomany;
-
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
@@ -17,10 +16,8 @@ import com.baeldung.hibernate.manytomany.model.Employee;
import com.baeldung.hibernate.manytomany.model.Project;
import com.baeldung.manytomany.spring.PersistenceConfig;
-
-
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = {PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest {
@Autowired
@@ -28,7 +25,6 @@ public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest {
private Session session;
-
@Before
public final void before() {
session = sessionFactory.openSession();
@@ -43,11 +39,11 @@ public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest {
@Test
public final void whenEntitiesAreCreated_thenNoExceptions() {
- Set projects = new HashSet();
- projects.add(new Project("IT Project"));
- projects.add(new Project("Networking Project"));
- session.persist(new Employee("Peter", "Oven", projects));
- session.persist(new Employee("Allan", "Norman", projects));
+ Set projects = new HashSet();
+ projects.add(new Project("IT Project"));
+ projects.add(new Project("Networking Project"));
+ session.persist(new Employee("Peter", "Oven", projects));
+ session.persist(new Employee("Allan", "Norman", projects));
}
}
diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java
similarity index 100%
rename from spring-hibernate5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java
rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java
diff --git a/spring-hibernate5/src/test/java/com/baeldung/persistence/dao/common/HibernateDaoIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/dao/common/HibernateDaoIntegrationTest.java
similarity index 100%
rename from spring-hibernate5/src/test/java/com/baeldung/persistence/dao/common/HibernateDaoIntegrationTest.java
rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/dao/common/HibernateDaoIntegrationTest.java
diff --git a/spring-jpa/.gitignore b/persistence-modules/spring-hibernate-5/src/test/resources/.gitignore
similarity index 100%
rename from spring-jpa/.gitignore
rename to persistence-modules/spring-hibernate-5/src/test/resources/.gitignore
diff --git a/spring-jpa/src/test/resources/.gitignore b/persistence-modules/spring-jpa/.gitignore
similarity index 100%
rename from spring-jpa/src/test/resources/.gitignore
rename to persistence-modules/spring-jpa/.gitignore
diff --git a/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md
similarity index 91%
rename from spring-jpa/README.md
rename to persistence-modules/spring-jpa/README.md
index 70f4404f98..d93271164c 100644
--- a/spring-jpa/README.md
+++ b/persistence-modules/spring-jpa/README.md
@@ -14,6 +14,7 @@
- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource)
- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate)
- [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database)
+- [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml
similarity index 98%
rename from spring-jpa/pom.xml
rename to persistence-modules/spring-jpa/pom.xml
index 960dcbc588..04c64fafc3 100644
--- a/spring-jpa/pom.xml
+++ b/persistence-modules/spring-jpa/pom.xml
@@ -13,6 +13,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../
diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/UserConfig.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java
diff --git a/spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDao.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDao.java
new file mode 100644
index 0000000000..180f54326e
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDao.java
@@ -0,0 +1,29 @@
+package org.baeldung.dsrouting;
+
+import javax.sql.DataSource;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+
+/**
+ * Database access code for datasource routing example.
+ */
+public class ClientDao {
+
+ private static final String SQL_GET_CLIENT_NAME = "select name from client";
+
+ private final JdbcTemplate jdbcTemplate;
+
+ public ClientDao(DataSource datasource) {
+ this.jdbcTemplate = new JdbcTemplate(datasource);
+ }
+
+ public String getClientName() {
+ return this.jdbcTemplate.query(SQL_GET_CLIENT_NAME, rowMapper)
+ .get(0);
+ }
+
+ private static RowMapper rowMapper = (rs, rowNum) -> {
+ return rs.getString("name");
+ };
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDataSourceRouter.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDataSourceRouter.java
new file mode 100644
index 0000000000..997e461cde
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDataSourceRouter.java
@@ -0,0 +1,14 @@
+package org.baeldung.dsrouting;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+/**
+ * Returns thread bound client lookup key for current context.
+ */
+public class ClientDataSourceRouter extends AbstractRoutingDataSource {
+
+ @Override
+ protected Object determineCurrentLookupKey() {
+ return ClientDatabaseContextHolder.getClientDatabase();
+ }
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabase.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabase.java
new file mode 100644
index 0000000000..619b8707d8
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabase.java
@@ -0,0 +1,7 @@
+package org.baeldung.dsrouting;
+
+public enum ClientDatabase {
+
+ CLIENT_A, CLIENT_B
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabaseContextHolder.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabaseContextHolder.java
new file mode 100644
index 0000000000..c08559e877
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabaseContextHolder.java
@@ -0,0 +1,26 @@
+package org.baeldung.dsrouting;
+
+import org.springframework.util.Assert;
+
+/**
+ * Thread shared context to point to the datasource which should be used. This
+ * enables context switches between different clients.
+ */
+public class ClientDatabaseContextHolder {
+
+ private static final ThreadLocal CONTEXT = new ThreadLocal<>();
+
+ public static void set(ClientDatabase clientDatabase) {
+ Assert.notNull(clientDatabase, "clientDatabase cannot be null");
+ CONTEXT.set(clientDatabase);
+ }
+
+ public static ClientDatabase getClientDatabase() {
+ return CONTEXT.get();
+ }
+
+ public static void clear() {
+ CONTEXT.remove();
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientService.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientService.java
new file mode 100644
index 0000000000..4b63c6333c
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientService.java
@@ -0,0 +1,21 @@
+package org.baeldung.dsrouting;
+
+/**
+ * Service layer code for datasource routing example. Here, the service methods are responsible
+ * for setting and clearing the context.
+ */
+public class ClientService {
+
+ private final ClientDao clientDao;
+
+ public ClientService(ClientDao clientDao) {
+ this.clientDao = clientDao;
+ }
+
+ public String getClientName(ClientDatabase clientDb) {
+ ClientDatabaseContextHolder.set(clientDb);
+ String clientName = this.clientDao.getClientName();
+ ClientDatabaseContextHolder.clear();
+ return clientName;
+ }
+}
diff --git a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java
diff --git a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java
diff --git a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java
diff --git a/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java
diff --git a/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/sqlfiles/Country.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/sqlfiles/Country.java
new file mode 100644
index 0000000000..0555c8186c
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/sqlfiles/Country.java
@@ -0,0 +1,33 @@
+package org.baeldung.sqlfiles;
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Country {
+
+ @Id
+ @GeneratedValue(strategy = IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+ public void setId(Integer id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/spring-jpa/src/main/java/org/baeldung/web/MainController.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/web/MainController.java
similarity index 100%
rename from spring-jpa/src/main/java/org/baeldung/web/MainController.java
rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/web/MainController.java
diff --git a/spring-jpa/src/main/resources/context.xml b/persistence-modules/spring-jpa/src/main/resources/context.xml
similarity index 100%
rename from spring-jpa/src/main/resources/context.xml
rename to persistence-modules/spring-jpa/src/main/resources/context.xml
diff --git a/spring-hibernate3/src/main/resources/logback.xml b/persistence-modules/spring-jpa/src/main/resources/logback.xml
similarity index 100%
rename from spring-hibernate3/src/main/resources/logback.xml
rename to persistence-modules/spring-jpa/src/main/resources/logback.xml
diff --git a/spring-jpa/src/main/resources/persistence-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties
similarity index 100%
rename from spring-jpa/src/main/resources/persistence-h2.properties
rename to persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties
diff --git a/spring-jpa/src/main/resources/persistence-jndi.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-jndi.properties
similarity index 100%
rename from spring-jpa/src/main/resources/persistence-jndi.properties
rename to persistence-modules/spring-jpa/src/main/resources/persistence-jndi.properties
diff --git a/spring-jpa/src/main/resources/persistence-multiple-db.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties
similarity index 100%
rename from spring-jpa/src/main/resources/persistence-multiple-db.properties
rename to persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties
diff --git a/spring-jpa/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties
similarity index 100%
rename from spring-jpa/src/main/resources/persistence-mysql.properties
rename to persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties
diff --git a/spring-jpa/src/main/resources/persistence-student-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties
similarity index 100%
rename from spring-jpa/src/main/resources/persistence-student-h2.properties
rename to persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties
diff --git a/spring-jpa/src/main/resources/persistence-student.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-student.properties
similarity index 100%
rename from spring-jpa/src/main/resources/persistence-student.properties
rename to persistence-modules/spring-jpa/src/main/resources/persistence-student.properties
diff --git a/spring-jpa/src/main/resources/persistence.xml b/persistence-modules/spring-jpa/src/main/resources/persistence.xml
similarity index 100%
rename from spring-jpa/src/main/resources/persistence.xml
rename to persistence-modules/spring-jpa/src/main/resources/persistence.xml
diff --git a/spring-jpa/src/main/resources/server.xml b/persistence-modules/spring-jpa/src/main/resources/server.xml
similarity index 100%
rename from spring-jpa/src/main/resources/server.xml
rename to persistence-modules/spring-jpa/src/main/resources/server.xml
diff --git a/persistence-modules/spring-jpa/src/main/resources/sqlfiles.properties b/persistence-modules/spring-jpa/src/main/resources/sqlfiles.properties
new file mode 100644
index 0000000000..0bea6adad1
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/resources/sqlfiles.properties
@@ -0,0 +1 @@
+spring.jpa.hibernate.ddl-auto=none
\ No newline at end of file
diff --git a/spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp b/persistence-modules/spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp
similarity index 100%
rename from spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp
rename to persistence-modules/spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp
diff --git a/spring-jpa/src/test/java/META-INF/persistence.xml b/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml
similarity index 100%
rename from spring-jpa/src/test/java/META-INF/persistence.xml
rename to persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java
new file mode 100644
index 0000000000..f81247e3cd
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java
@@ -0,0 +1,53 @@
+package org.baeldung.dsrouting;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.sql.DataSource;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = DataSourceRoutingTestConfiguration.class)
+public class DataSourceRoutingIntegrationTest {
+
+ @Autowired
+ DataSource routingDatasource;
+
+ @Autowired
+ ClientService clientService;
+
+ @Before
+ public void setup() {
+ final String SQL_CLIENT_A = "insert into client (id, name) values (1, 'CLIENT A')";
+ final String SQL_CLIENT_B = "insert into client (id, name) values (2, 'CLIENT B')";
+
+ JdbcTemplate jdbcTemplate = new JdbcTemplate();
+ jdbcTemplate.setDataSource(routingDatasource);
+
+ ClientDatabaseContextHolder.set(ClientDatabase.CLIENT_A);
+ jdbcTemplate.execute(SQL_CLIENT_A);
+ ClientDatabaseContextHolder.clear();
+
+ ClientDatabaseContextHolder.set(ClientDatabase.CLIENT_B);
+ jdbcTemplate.execute(SQL_CLIENT_B);
+ ClientDatabaseContextHolder.clear();
+ }
+
+ @Test
+ public void givenClientDbs_whenContextsSwitch_thenRouteToCorrectDatabase() throws Exception {
+
+ // test ACME WIDGETS
+ String clientName = clientService.getClientName(ClientDatabase.CLIENT_A);
+ assertEquals(clientName, "CLIENT A");
+
+ // test WIDGETS_ARE_US
+ clientName = clientService.getClientName(ClientDatabase.CLIENT_B);
+ assertEquals(clientName, "CLIENT B");
+ }
+}
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingTestConfiguration.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingTestConfiguration.java
new file mode 100644
index 0000000000..dee9d58722
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingTestConfiguration.java
@@ -0,0 +1,51 @@
+package org.baeldung.dsrouting;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sql.DataSource;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+@Configuration
+public class DataSourceRoutingTestConfiguration {
+
+ @Bean
+ public ClientService clientService() {
+ return new ClientService(new ClientDao(clientDatasource()));
+ }
+
+ @Bean
+ public DataSource clientDatasource() {
+ Map