diff --git a/apache-cayenne/pom.xml b/apache-cayenne/pom.xml
new file mode 100644
index 0000000000..52631e8594
--- /dev/null
+++ b/apache-cayenne/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+ apache-cayenne
+ 0.0.1-SNAPSHOT
+ jar
+
+ apache-cayenne
+ Introduction to Apache Cayenne
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 5.1.44
+ 4.0.M5
+ 4.12
+
+
+
+
+ org.apache.cayenne
+ cayenne-server
+ ${cayenne.version}
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.connector.version}
+ runtime
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+
+
+ org.apache.cayenne.plugins
+ cayenne-modeler-maven-plugin
+ ${cayenne.version}
+
+
+
+
+
diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java
new file mode 100644
index 0000000000..303c180887
--- /dev/null
+++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Article.java
@@ -0,0 +1,9 @@
+package com.baeldung.apachecayenne.persistent;
+
+import com.baeldung.apachecayenne.persistent.auto._Article;
+
+public class Article extends _Article {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java
new file mode 100644
index 0000000000..5a8df57c6e
--- /dev/null
+++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/Author.java
@@ -0,0 +1,9 @@
+package com.baeldung.apachecayenne.persistent;
+
+import com.baeldung.apachecayenne.persistent.auto._Author;
+
+public class Author extends _Author {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java
new file mode 100644
index 0000000000..f6c179fcfd
--- /dev/null
+++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Article.java
@@ -0,0 +1,47 @@
+package com.baeldung.apachecayenne.persistent.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+
+import com.baeldung.apachecayenne.persistent.Author;
+
+/**
+ * Class _Article was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Article extends CayenneDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String ID_PK_COLUMN = "id";
+
+ public static final Property CONTENT = Property.create("content", String.class);
+ public static final Property TITLE = Property.create("title", String.class);
+ public static final Property AUTHOR = Property.create("author", Author.class);
+
+ public void setContent(String content) {
+ writeProperty("content", content);
+ }
+ public String getContent() {
+ return (String)readProperty("content");
+ }
+
+ public void setTitle(String title) {
+ writeProperty("title", title);
+ }
+ public String getTitle() {
+ return (String)readProperty("title");
+ }
+
+ public void setAuthor(Author author) {
+ setToOneTarget("author", author, true);
+ }
+
+ public Author getAuthor() {
+ return (Author)readProperty("author");
+ }
+
+
+}
diff --git a/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java
new file mode 100644
index 0000000000..3d068423c8
--- /dev/null
+++ b/apache-cayenne/src/main/java/com/baeldung/apachecayenne/persistent/auto/_Author.java
@@ -0,0 +1,52 @@
+package com.baeldung.apachecayenne.persistent.auto;
+
+import java.util.List;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+
+import com.baeldung.apachecayenne.persistent.Article;
+
+/**
+ * Class _Author was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Author extends CayenneDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String ID_PK_COLUMN = "id";
+
+ public static final Property FIRSTNAME = Property.create("firstname", String.class);
+ public static final Property LASTNAME = Property.create("lastname", String.class);
+ public static final Property> ARTICLES = Property.create("articles", List.class);
+
+ public void setFirstname(String firstname) {
+ writeProperty("firstname", firstname);
+ }
+ public String getFirstname() {
+ return (String)readProperty("firstname");
+ }
+
+ public void setLastname(String lastname) {
+ writeProperty("lastname", lastname);
+ }
+ public String getLastname() {
+ return (String)readProperty("lastname");
+ }
+
+ public void addToArticles(Article obj) {
+ addToManyTarget("articles", obj, true);
+ }
+ public void removeFromArticles(Article obj) {
+ removeToManyTarget("articles", obj, true);
+ }
+ @SuppressWarnings("unchecked")
+ public List getArticles() {
+ return (List)readProperty("articles");
+ }
+
+
+}
diff --git a/apache-cayenne/src/main/resources/cayenne-project.xml b/apache-cayenne/src/main/resources/cayenne-project.xml
new file mode 100644
index 0000000000..3f3c59e0e9
--- /dev/null
+++ b/apache-cayenne/src/main/resources/cayenne-project.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apache-cayenne/src/main/resources/datamap.map.xml b/apache-cayenne/src/main/resources/datamap.map.xml
new file mode 100644
index 0000000000..dc78ad4348
--- /dev/null
+++ b/apache-cayenne/src/main/resources/datamap.map.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java
new file mode 100644
index 0000000000..b92096c0fa
--- /dev/null
+++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java
@@ -0,0 +1,140 @@
+package com.baeldung.apachecayenne;
+
+import com.baeldung.apachecayenne.persistent.Article;
+import com.baeldung.apachecayenne.persistent.Author;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.query.ObjectSelect;
+import org.apache.cayenne.query.SQLTemplate;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+
+public class CayenneOperationTests {
+ private static ObjectContext context = null;
+
+ @BeforeClass
+ public static void setupTheCayenneContext() {
+ ServerRuntime cayenneRuntime = ServerRuntime.builder()
+ .addConfig("cayenne-project.xml")
+ .build();
+ context = cayenneRuntime.newContext();
+ }
+
+ @After
+ public void deleteAllRecords() {
+ SQLTemplate deleteArticles = new SQLTemplate(Article.class, "delete from article");
+ SQLTemplate deleteAuthors = new SQLTemplate(Author.class, "delete from author");
+
+ context.performGenericQuery(deleteArticles);
+ context.performGenericQuery(deleteAuthors);
+ }
+
+ @Test
+ public void givenAuthor_whenInsert_thenWeGetOneRecordInTheDatabase() {
+ Author author = context.newObject(Author.class);
+ author.setFirstname("Paul");
+ author.setLastname("Smith");
+
+ context.commitChanges();
+
+ long records = ObjectSelect.dataRowQuery(Author.class).selectCount(context);
+ assertEquals(1, records);
+ }
+
+ @Test
+ public void givenAuthor_whenInsert_andQueryByFirstName_thenWeGetTheAuthor() {
+ Author author = context.newObject(Author.class);
+ author.setFirstname("Paul");
+ author.setLastname("Smith");
+
+ context.commitChanges();
+
+ Author expectedAuthor = ObjectSelect.query(Author.class)
+ .where(Author.FIRSTNAME.eq("Paul"))
+ .selectOne(context);
+
+ assertEquals("Paul", expectedAuthor.getFirstname());
+ assertEquals("Smith", expectedAuthor.getLastname());
+ }
+
+ @Test
+ public void givenTwoAuthor_whenInsert_andQueryAll_thenWeGetTwoAuthors() {
+ Author firstAuthor = context.newObject(Author.class);
+ firstAuthor.setFirstname("Paul");
+ firstAuthor.setLastname("Smith");
+
+ Author secondAuthor = context.newObject(Author.class);
+ secondAuthor.setFirstname("Ludovic");
+ secondAuthor.setLastname("Garcia");
+
+ context.commitChanges();
+
+ List authors = ObjectSelect.query(Author.class).select(context);
+ assertEquals(2, authors.size());
+ }
+
+ @Test
+ public void givenAuthor_whenUpdating_thenWeGetAnUpatedeAuthor() {
+ Author author = context.newObject(Author.class);
+ author.setFirstname("Paul");
+ author.setLastname("Smith");
+ context.commitChanges();
+
+ Author expectedAuthor = ObjectSelect.query(Author.class)
+ .where(Author.FIRSTNAME.eq("Paul"))
+ .selectOne(context);
+ expectedAuthor.setLastname("Smith 2");
+ context.commitChanges();
+
+ assertEquals(author.getFirstname(), expectedAuthor.getFirstname());
+ assertEquals(author.getLastname(), expectedAuthor.getLastname());
+ }
+
+ @Test
+ public void givenAuthor_whenDeleting_thenWeLostHisDetails() {
+ Author author = context.newObject(Author.class);
+ author.setFirstname("Paul");
+ author.setLastname("Smith");
+ context.commitChanges();
+
+ Author savedAuthor = ObjectSelect.query(Author.class)
+ .where(Author.FIRSTNAME.eq("Paul")).selectOne(context);
+ if(savedAuthor != null) {
+ context.deleteObjects(author);
+ context.commitChanges();
+ }
+
+ Author expectedAuthor = ObjectSelect.query(Author.class)
+ .where(Author.FIRSTNAME.eq("Paul")).selectOne(context);
+ assertNull(expectedAuthor);
+ }
+
+ @Test
+ public void givenAuthor_whenAttachingToArticle_thenTheRelationIsMade() {
+ Author author = context.newObject(Author.class);
+ author.setFirstname("Paul");
+ author.setLastname("Smith");
+
+ Article article = context.newObject(Article.class);
+ article.setTitle("My post title");
+ article.setContent("The content");
+ article.setAuthor(author);
+
+ context.commitChanges();
+
+ Author expectedAuthor = ObjectSelect.query(Author.class)
+ .where(Author.LASTNAME.eq("Smith"))
+ .selectOne(context);
+
+ Article expectedArticle = (expectedAuthor.getArticles()).get(0);
+ assertEquals(article.getTitle(), expectedArticle.getTitle());
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/stream/SupplierStreamTest.java b/core-java-8/src/test/java/com/baeldung/stream/SupplierStreamTest.java
new file mode 100644
index 0000000000..d78c9fca35
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/stream/SupplierStreamTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.stream;
+
+import static org.junit.Assert.fail;
+
+import java.util.Optional;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+public class SupplierStreamTest {
+
+ @Test(expected = IllegalStateException.class)
+ public void givenStream_whenStreamUsedTwice_thenThrowException() {
+ Stream stringStream = Stream.of("A", "B", "C", "D");
+ Optional result1 = stringStream.findAny();
+ System.out.println(result1.get());
+ Optional result2 = stringStream.findFirst();
+ System.out.println(result2.get());
+ }
+
+ @Test
+ public void givenStream_whenUsingSupplier_thenNoExceptionIsThrown() {
+ try {
+ Supplier> streamSupplier = () -> Stream.of("A", "B", "C", "D");
+ Optional result1 = streamSupplier.get().findAny();
+ System.out.println(result1.get());
+ Optional result2 = streamSupplier.get().findFirst();
+ System.out.println(result2.get());
+ } catch (IllegalStateException e) {
+ fail();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/README.md b/core-java/README.md
index 0f0e4cc858..a251de1daa 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -106,3 +106,4 @@
- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string)
- [CharSequence vs. String in Java](http://www.baeldung.com/java-char-sequence-string)
- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
+- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
index 9d4fcf3574..79f618d038 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
@@ -5,16 +5,16 @@ import static com.baeldung.designpatterns.util.LogerUtil.LOG;
public class AdapterPatternDriver {
public static void main(String args[]) {
- LuxuryCars bugattiVeyron = new BugattiVeyron();
- LuxuryCarsAdapter bugattiVeyronAdapter = new LuxuryCarsAdapterImpl(bugattiVeyron);
- LOG.info("Bugatti Veyron Super Sport's top speed is " + bugattiVeyronAdapter.speedInKMPH() + " Kmph.");
+ Movable bugattiVeyron = new BugattiVeyron();
+ MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);
+ LOG.info("Bugatti Veyron Super Sport's top speed is " + bugattiVeyronAdapter.getSpeed() + " Kmph.");
- LuxuryCars mcLaren = new McLaren();
- LuxuryCarsAdapter mcLarenAdapter = new LuxuryCarsAdapterImpl(mcLaren);
- LOG.info("McLaren F1 top speed is " + mcLarenAdapter.speedInKMPH() + " Kmph.");
+ Movable mcLaren = new McLaren();
+ MovableAdapter mcLarenAdapter = new MovableAdapterImpl(mcLaren);
+ LOG.info("McLaren F1 top speed is " + mcLarenAdapter.getSpeed() + " Kmph.");
- LuxuryCars astonMartin = new AstonMartin();
- LuxuryCarsAdapter astonMartinAdapter = new LuxuryCarsAdapterImpl(astonMartin);
- LOG.info("McLaren F1 top speed is " + astonMartinAdapter.speedInKMPH() + " Kmph.");
+ Movable astonMartin = new AstonMartin();
+ MovableAdapter astonMartinAdapter = new MovableAdapterImpl(astonMartin);
+ LOG.info("McLaren F1 top speed is " + astonMartinAdapter.getSpeed() + " Kmph.");
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java
index b1fba0dae3..7dd83079a2 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java
@@ -1,8 +1,8 @@
package com.baeldung.designpatterns.adapter;
-public class AstonMartin implements LuxuryCars {
+public class AstonMartin implements Movable {
@Override
- public double speedInMPH() {
+ public double getSpeed() {
return 220;
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java
index 1b0b834448..a249d64b6f 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java
@@ -1,8 +1,8 @@
package com.baeldung.designpatterns.adapter;
-public class BugattiVeyron implements LuxuryCars {
+public class BugattiVeyron implements Movable {
@Override
- public double speedInMPH() {
+ public double getSpeed() {
return 268;
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCars.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCars.java
deleted file mode 100644
index 9926f5f8bc..0000000000
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCars.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baeldung.designpatterns.adapter;
-
-public interface LuxuryCars {
- public double speedInMPH();
-}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapter.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapter.java
deleted file mode 100644
index f945e1b389..0000000000
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapter.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baeldung.designpatterns.adapter;
-
-public interface LuxuryCarsAdapter {
- public double speedInKMPH();
-}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java
index e2ba2b830d..c807df67db 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java
@@ -1,8 +1,8 @@
package com.baeldung.designpatterns.adapter;
-public class McLaren implements LuxuryCars {
+public class McLaren implements Movable {
@Override
- public double speedInMPH() {
+ public double getSpeed() {
return 241;
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/Movable.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/Movable.java
new file mode 100644
index 0000000000..ec94e90af0
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/Movable.java
@@ -0,0 +1,6 @@
+package com.baeldung.designpatterns.adapter;
+
+public interface Movable {
+ // returns speed in MPH
+ double getSpeed();
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/MovableAdapter.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/MovableAdapter.java
new file mode 100644
index 0000000000..b9c7484446
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/MovableAdapter.java
@@ -0,0 +1,6 @@
+package com.baeldung.designpatterns.adapter;
+
+public interface MovableAdapter {
+ // returns speed in KMPH
+ double getSpeed();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapterImpl.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/MovableAdapterImpl.java
similarity index 50%
rename from core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapterImpl.java
rename to core-java/src/main/java/com/baeldung/designpatterns/adapter/MovableAdapterImpl.java
index f2bf553292..eb74641389 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapterImpl.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/MovableAdapterImpl.java
@@ -1,15 +1,15 @@
package com.baeldung.designpatterns.adapter;
-public class LuxuryCarsAdapterImpl implements LuxuryCarsAdapter {
- private LuxuryCars luxuryCars;
+public class MovableAdapterImpl implements MovableAdapter {
+ private Movable luxuryCars;
- public LuxuryCarsAdapterImpl(LuxuryCars luxuryCars) {
+ public MovableAdapterImpl(Movable luxuryCars) {
this.luxuryCars = luxuryCars;
}
@Override
- public double speedInKMPH() {
- double mph = luxuryCars.speedInMPH();
+ public double getSpeed() {
+ double mph = luxuryCars.getSpeed();
return convertMPHtoKMPH(mph);
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java
index ed3f75b4a1..da5d29617f 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Blue.java
@@ -1,12 +1,8 @@
package com.baeldung.designpatterns.bridge;
-import static com.baeldung.designpatterns.util.LogerUtil.LOG;
-
public class Blue implements Color {
-
@Override
- public void fillColor() {
- LOG.info("Color : Blue");
+ public String fill() {
+ return "Color is Blue";
}
-
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java
index 921deadcac..e6a7fb41c1 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/BridgePatternDriver.java
@@ -5,10 +5,10 @@ public class BridgePatternDriver {
public static void main(String[] args) {
//a square with red color
Shape square = new Square(new Red());
- square.drawShape();
+ System.out.println(square.draw());
//a triangle with blue color
Shape triangle = new Triangle(new Blue());
- triangle.drawShape();
+ System.out.println(triangle.draw());
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java
index 91d2b01609..05618e6d6e 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Color.java
@@ -1,5 +1,5 @@
package com.baeldung.designpatterns.bridge;
public interface Color {
- public void fillColor();
+ String fill();
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java
index 8c22a94f00..bc83199591 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Red.java
@@ -1,12 +1,10 @@
package com.baeldung.designpatterns.bridge;
-import static com.baeldung.designpatterns.util.LogerUtil.LOG;
-
public class Red implements Color {
@Override
- public void fillColor() {
- LOG.info("Color : Red");
+ public String fill() {
+ return "Color is Red";
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java
index c4daf7a821..75cd43dbc8 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Shape.java
@@ -7,5 +7,5 @@ public abstract class Shape {
this.color = color;
}
- abstract public void drawShape();
+ abstract public String draw();
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java
index 6b377197eb..7397f4bd47 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Square.java
@@ -1,7 +1,5 @@
package com.baeldung.designpatterns.bridge;
-import static com.baeldung.designpatterns.util.LogerUtil.LOG;
-
public class Square extends Shape {
public Square(Color color) {
@@ -9,8 +7,7 @@ public class Square extends Shape {
}
@Override
- public void drawShape() {
- LOG.info("Square drawn. ");
- color.fillColor();
+ public String draw() {
+ return "Square drawn. " + color.fill();
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java
index 900e78cf2b..46db66ee42 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/bridge/Triangle.java
@@ -1,7 +1,5 @@
package com.baeldung.designpatterns.bridge;
-import static com.baeldung.designpatterns.util.LogerUtil.LOG;
-
public class Triangle extends Shape {
public Triangle(Color color) {
@@ -9,8 +7,7 @@ public class Triangle extends Shape {
}
@Override
- public void drawShape() {
- LOG.info("Triangle drawn. ");
- color.fillColor();
+ public String draw() {
+ return "Triangle drawn. "+ color.fill();
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java b/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java
index 80a0865567..e5dca41dd8 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/decorator/ChristmasTree.java
@@ -1,5 +1,5 @@
package com.baeldung.designpatterns.decorator;
public interface ChristmasTree {
- public String decorate();
-}
+ String decorate();
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java
index 96a6bfb878..256b31bc84 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/proxy/ExpensiveObject.java
@@ -1,5 +1,5 @@
package com.baeldung.designpatterns.proxy;
public interface ExpensiveObject {
- public void process();
+ void process();
}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
index e56e271743..8cad1290d9 100644
--- a/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
+++ b/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
@@ -6,15 +6,25 @@ import org.junit.Test;
import com.baeldung.designpatterns.adapter.AstonMartin;
import com.baeldung.designpatterns.adapter.BugattiVeyron;
-import com.baeldung.designpatterns.adapter.LuxuryCarsAdapterImpl;
import com.baeldung.designpatterns.adapter.McLaren;
+import com.baeldung.designpatterns.adapter.Movable;
+import com.baeldung.designpatterns.adapter.MovableAdapter;
+import com.baeldung.designpatterns.adapter.MovableAdapterImpl;
public class AdapterPatternIntegrationTest {
@Test
- public void givenLuxuryCarsAdapter_WhenConvertingMPHToKMPH_thenSuccessfullyConverted() {
- assertEquals(new LuxuryCarsAdapterImpl(new BugattiVeyron()).speedInKMPH(), 431.30312, 0.00001);
- assertEquals(new LuxuryCarsAdapterImpl(new McLaren()).speedInKMPH(), 387.85094, 0.00001);
- assertEquals(new LuxuryCarsAdapterImpl(new AstonMartin()).speedInKMPH(), 354.0548, 0.00001);
+ public void givenMovableAdapter_WhenConvertingMPHToKMPH_thenSuccessfullyConverted() {
+ Movable bugattiVeyron = new BugattiVeyron();
+ MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);
+ assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001);
+
+ Movable mcLaren = new McLaren();
+ MovableAdapter mcLarenAdapter = new MovableAdapterImpl(mcLaren);
+ assertEquals(mcLarenAdapter.getSpeed(), 387.85094, 0.00001);
+
+ Movable astonMartin = new AstonMartin();
+ MovableAdapter astonMartinAdapter = new MovableAdapterImpl(astonMartin);
+ assertEquals(astonMartinAdapter.getSpeed(), 354.0548, 0.00001);
}
}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java
index 56a7a704f2..ed7eb0c453 100644
--- a/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java
+++ b/core-java/src/test/java/com/baeldung/designpatterns/BridgePatternIntegrationTest.java
@@ -1,14 +1,7 @@
package com.baeldung.designpatterns;
-import static com.baeldung.designpatterns.util.LogerUtil.LOG;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.*;
-import java.util.List;
-
-import org.apache.log4j.spi.LoggingEvent;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Test;
import com.baeldung.designpatterns.bridge.Blue;
@@ -18,35 +11,16 @@ import com.baeldung.designpatterns.bridge.Square;
import com.baeldung.designpatterns.bridge.Triangle;
public class BridgePatternIntegrationTest {
- public static TestAppenderDP appender;
-
- @Before
- public void setUp() {
- appender = new TestAppenderDP();
- LOG.addAppender(appender);
- }
-
+
@Test
public void whenBridgePatternInvoked_thenConfigSuccess() {
//a square with red color
Shape square = new Square(new Red());
- square.drawShape();
+ assertEquals(square.draw(), "Square drawn. Color is Red");
//a triangle with blue color
Shape triangle = new Triangle(new Blue());
- triangle.drawShape();
-
- final List log = appender.getLog();
-
- assertThat((String) log.get(0).getMessage(), is("Square drawn. "));
- assertThat((String) log.get(1).getMessage(), is("Color : Red"));
- assertThat((String) log.get(2).getMessage(), is("Triangle drawn. "));
- assertThat((String) log.get(3).getMessage(), is("Color : Blue"));
- }
-
- @After
- public void tearDown() {
- LOG.removeAppender(appender);
+ assertEquals(triangle.draw(), "Triangle drawn. Color is Blue");
}
}
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java
index b3b3f988f1..de0ca8a135 100644
--- a/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java
+++ b/core-java/src/test/java/com/baeldung/designpatterns/DecoratorPatternIntegrationTest.java
@@ -10,19 +10,16 @@ import com.baeldung.designpatterns.decorator.ChristmasTreeImpl;
import com.baeldung.designpatterns.decorator.Garland;
public class DecoratorPatternIntegrationTest {
- private ChristmasTree tree;
-
@Test
public void givenDecoratorPattern_WhenDecoratorsInjectedAtRuntime_thenConfigSuccess() {
- //christmas tree with just one Garland
- tree = new Garland(new ChristmasTreeImpl());
- assertEquals(tree.decorate(), "Christmas tree with Garland");
-
- //christmas tree with two Garlands and one Bubble lights
- tree = new BubbleLights(new Garland(
- new Garland(new ChristmasTreeImpl()))
- );
- assertEquals(tree.decorate(), "Christmas tree with Garland with Garland with Bubble Lights");
+ ChristmasTree tree1 = new Garland(new ChristmasTreeImpl());
+ assertEquals(tree1.decorate(),
+ "Christmas tree with Garland");
+
+ ChristmasTree tree2 = new BubbleLights(
+ new Garland(new Garland(new ChristmasTreeImpl())));
+ assertEquals(tree2.decorate(),
+ "Christmas tree with Garland with Garland with Bubble Lights");
}
}
diff --git a/kotlin/README.md b/core-kotlin/README.md
similarity index 100%
rename from kotlin/README.md
rename to core-kotlin/README.md
diff --git a/kotlin/pom.xml b/core-kotlin/pom.xml
similarity index 99%
rename from kotlin/pom.xml
rename to core-kotlin/pom.xml
index e88013ab69..856a37ded0 100644
--- a/kotlin/pom.xml
+++ b/core-kotlin/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
- kotlin
+ core-kotlin
1.0-SNAPSHOT
diff --git a/kotlin/src/main/java/com/baeldung/dataclass/Movie.java b/core-kotlin/src/main/java/com/baeldung/dataclass/Movie.java
similarity index 100%
rename from kotlin/src/main/java/com/baeldung/dataclass/Movie.java
rename to core-kotlin/src/main/java/com/baeldung/dataclass/Movie.java
diff --git a/kotlin/src/main/java/com/baeldung/java/ArrayExample.java b/core-kotlin/src/main/java/com/baeldung/java/ArrayExample.java
similarity index 100%
rename from kotlin/src/main/java/com/baeldung/java/ArrayExample.java
rename to core-kotlin/src/main/java/com/baeldung/java/ArrayExample.java
diff --git a/kotlin/src/main/java/com/baeldung/java/Customer.java b/core-kotlin/src/main/java/com/baeldung/java/Customer.java
similarity index 100%
rename from kotlin/src/main/java/com/baeldung/java/Customer.java
rename to core-kotlin/src/main/java/com/baeldung/java/Customer.java
diff --git a/kotlin/src/main/java/com/baeldung/java/StringUtils.java b/core-kotlin/src/main/java/com/baeldung/java/StringUtils.java
similarity index 100%
rename from kotlin/src/main/java/com/baeldung/java/StringUtils.java
rename to core-kotlin/src/main/java/com/baeldung/java/StringUtils.java
diff --git a/kotlin/src/main/java/com/baeldung/lazy/ClassWithHeavyInitialization.java b/core-kotlin/src/main/java/com/baeldung/lazy/ClassWithHeavyInitialization.java
similarity index 100%
rename from kotlin/src/main/java/com/baeldung/lazy/ClassWithHeavyInitialization.java
rename to core-kotlin/src/main/java/com/baeldung/lazy/ClassWithHeavyInitialization.java
diff --git a/kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt b/core-kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt b/core-kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Person.kt b/core-kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Person.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Person.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Person.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Result.kt b/core-kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Result.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Result.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Result.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Sandbox.kt b/core-kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Sandbox.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Sandbox.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/destructuringdeclarations/Sandbox.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/MathematicsOperations.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/MathematicsOperations.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/MathematicsOperations.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/MathematicsOperations.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/Sealed.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/User.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/User.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/User.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/User.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/WhenBlockTypes.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/WhenBlockTypes.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/WhenBlockTypes.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/WhenBlockTypes.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/Database.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/Database.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/Database.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/Database.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegate.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegate.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegate.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegate.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/User.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/User.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/User.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/delegates/User.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt
diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt
similarity index 100%
rename from kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt
rename to core-kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt
diff --git a/kotlin/src/test/java/com/baeldung/kotlin/JavaCallToKotlinUnitTest.java b/core-kotlin/src/test/java/com/baeldung/kotlin/JavaCallToKotlinUnitTest.java
similarity index 100%
rename from kotlin/src/test/java/com/baeldung/kotlin/JavaCallToKotlinUnitTest.java
rename to core-kotlin/src/test/java/com/baeldung/kotlin/JavaCallToKotlinUnitTest.java
diff --git a/kotlin/src/test/java/com/baeldung/kotlin/LazyJavaUnitTest.java b/core-kotlin/src/test/java/com/baeldung/kotlin/LazyJavaUnitTest.java
similarity index 100%
rename from kotlin/src/test/java/com/baeldung/kotlin/LazyJavaUnitTest.java
rename to core-kotlin/src/test/java/com/baeldung/kotlin/LazyJavaUnitTest.java
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ArrayTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ArrayTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/ArrayTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/ArrayTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/CollectionsTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/CollectionsTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/CollectionsTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/CollectionsTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/CustomerTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/CustomerTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/CustomerTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/CustomerTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/EqualityTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/EqualityTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/EqualityTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/EqualityTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/GenericsTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/KotlinJavaInteroperabilityTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/KotlinJavaInteroperabilityTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/KotlinJavaInteroperabilityTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/KotlinJavaInteroperabilityTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/LambdaTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/LambdaTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/LambdaTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/LambdaTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/LazyUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/LazyUnitTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/LazyUnitTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/LazyUnitTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/NullSafetyTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/NullSafetyTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/NullSafetyTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/NullSafetyTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/SealedTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/WhenBlockUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/WhenBlockUnitTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/WhenBlockUnitTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/WhenBlockUnitTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegatesTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegatesTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegatesTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/delegates/DatabaseDelegatesTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt
diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt
similarity index 100%
rename from kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt
rename to core-kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt
diff --git a/couchbase/.gitignore b/couchbase/.gitignore
new file mode 100644
index 0000000000..f6867e01bd
--- /dev/null
+++ b/couchbase/.gitignore
@@ -0,0 +1,6 @@
+# Created by .ignore support plugin (hsz.mobi)
+
+# IntelliJ project files
+.idea
+*.iml
+/target/
diff --git a/couchbase-sdk/README.md b/couchbase/README.md
similarity index 100%
rename from couchbase-sdk/README.md
rename to couchbase/README.md
diff --git a/couchbase-sdk/mvnw b/couchbase/mvnw
old mode 100755
new mode 100644
similarity index 100%
rename from couchbase-sdk/mvnw
rename to couchbase/mvnw
diff --git a/couchbase-sdk/mvnw.cmd b/couchbase/mvnw.cmd
similarity index 100%
rename from couchbase-sdk/mvnw.cmd
rename to couchbase/mvnw.cmd
diff --git a/couchbase-sdk/pom.xml b/couchbase/pom.xml
similarity index 88%
rename from couchbase-sdk/pom.xml
rename to couchbase/pom.xml
index fd9e1b08f6..c79ce853d0 100644
--- a/couchbase-sdk/pom.xml
+++ b/couchbase/pom.xml
@@ -6,7 +6,7 @@
couchbase-sdk
0.1-SNAPSHOT
jar
- couchbase-sdk
+ couchbase
Couchbase SDK Tutorials
@@ -23,6 +23,12 @@
${couchbase.client.version}
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson-version}
+
+
org.springframework
@@ -67,9 +73,10 @@
1.8
UTF-8
- 2.4.0
+ 2.5.0
4.3.5.RELEASE
3.5
+ 2.9.1
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java b/couchbase/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/Person.java b/couchbase/src/main/java/com/baeldung/couchbase/async/person/Person.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/Person.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/person/Person.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java b/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/BucketService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/BucketService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/BucketService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/BucketService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/CrudService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/CrudService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/CrudService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/CrudService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java b/couchbase/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java b/couchbase/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java
rename to couchbase/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java b/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java
diff --git a/couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java b/couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java
new file mode 100644
index 0000000000..98fbe17e60
--- /dev/null
+++ b/couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java
@@ -0,0 +1,26 @@
+package com.baeldung.couchbase.n1ql;
+
+import com.couchbase.client.java.Bucket;
+import com.couchbase.client.java.Cluster;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BucketFactory {
+
+ @Autowired
+ private Cluster cluster;
+
+ private Bucket travelSampleBucket;
+ private Bucket testBucket;
+
+ public Bucket getTravelSampleBucket() {
+ return (travelSampleBucket != null) ?
+ travelSampleBucket : cluster.openBucket("travel-sample");
+ }
+
+ public Bucket getTestBucket() {
+ return (testBucket != null) ?
+ testBucket : cluster.openBucket("test");
+ }
+}
diff --git a/couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java b/couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java
new file mode 100644
index 0000000000..45067911cb
--- /dev/null
+++ b/couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java
@@ -0,0 +1,34 @@
+package com.baeldung.couchbase.n1ql;
+
+import com.couchbase.client.java.query.N1qlQueryResult;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+public class CodeSnippets {
+
+ private static ObjectMapper objectMapper = new ObjectMapper();
+
+ private static final Logger logger = Logger.getLogger(CodeSnippets.class.getName());
+
+ public static List extractJsonResult(N1qlQueryResult result) {
+ return result.allRows().stream()
+ .map(row -> {
+ try {
+ return objectMapper.readTree(row.value().toString());
+ }catch (IOException e) {
+ logger.log(Level.WARNING, e.getLocalizedMessage());
+ return null;
+ }
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+}
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/Person.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/person/Person.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/Person.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/person/Person.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java
diff --git a/couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java b/couchbase/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java
similarity index 100%
rename from couchbase-sdk/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java
rename to couchbase/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java
diff --git a/couchbase-sdk/src/main/resources/application.properties b/couchbase/src/main/resources/application.properties
similarity index 100%
rename from couchbase-sdk/src/main/resources/application.properties
rename to couchbase/src/main/resources/application.properties
diff --git a/couchbase-sdk/src/main/resources/logback.xml b/couchbase/src/main/resources/logback.xml
similarity index 100%
rename from couchbase-sdk/src/main/resources/logback.xml
rename to couchbase/src/main/resources/logback.xml
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java b/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java
rename to couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTest.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceIntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceIntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceIntegrationTest.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceIntegrationTest.java
diff --git a/couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java b/couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java
new file mode 100644
index 0000000000..ef7e31b224
--- /dev/null
+++ b/couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java
@@ -0,0 +1,26 @@
+package com.baeldung.couchbase.n1ql;
+
+import com.couchbase.client.java.Cluster;
+import com.couchbase.client.java.CouchbaseCluster;
+import com.couchbase.client.java.env.CouchbaseEnvironment;
+import com.couchbase.client.java.env.DefaultCouchbaseEnvironment;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+@ComponentScan(basePackages = { "com.baeldung.couchbase.n1ql" })
+public class IntegrationTestConfig {
+
+ @Bean
+ public Cluster cluster() {
+ CouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()
+ .connectTimeout(60000)
+ .build();
+ return CouchbaseCluster.create(env, "127.0.0.1");
+ }
+
+
+}
diff --git a/couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLIntegrationTest.java
new file mode 100644
index 0000000000..8112d7d222
--- /dev/null
+++ b/couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLIntegrationTest.java
@@ -0,0 +1,248 @@
+package com.baeldung.couchbase.n1ql;
+
+import com.couchbase.client.java.Bucket;
+import com.couchbase.client.java.Cluster;
+import com.couchbase.client.java.document.JsonDocument;
+import com.couchbase.client.java.document.json.JsonArray;
+import com.couchbase.client.java.document.json.JsonObject;
+import com.couchbase.client.java.query.N1qlQuery;
+import com.couchbase.client.java.query.N1qlQueryResult;
+import com.couchbase.client.java.query.N1qlQueryRow;
+import com.couchbase.client.java.query.Statement;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import rx.Observable;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import static com.baeldung.couchbase.n1ql.CodeSnippets.extractJsonResult;
+import static com.couchbase.client.java.query.Select.select;
+import static com.couchbase.client.java.query.dsl.Expression.*;
+import static org.junit.Assert.assertNotNull;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { IntegrationTestConfig.class })
+public class N1QLIntegrationTest {
+
+
+ @Autowired
+ private Cluster cluster;
+
+ @Autowired
+ private BucketFactory bucketFactory;
+
+ @Test
+ public void givenAutowiredCluster_whenNotNull_thenNotNull() {
+ assertNotNull(cluster);
+ }
+
+ @Test
+ public void givenBucketFactory_whenGetTestBucket_thenNotNull() {
+ assertNotNull(bucketFactory.getTestBucket());
+ }
+
+ @Test
+ public void givenBucketFactory_whenGetTravelSampleBucket_thenNotNull() {
+ assertNotNull(bucketFactory.getTravelSampleBucket());
+ }
+
+ @Test
+ public void givenDocument_whenInsert_thenResult() {
+ Bucket bucket = bucketFactory.getTestBucket();
+ JsonObject personObj = JsonObject.create()
+ .put("name", "John")
+ .put("email", "john@doe.com")
+ .put("interests", JsonArray.from("Java", "Nigerian Jollof"));
+
+ String id = UUID.randomUUID().toString();
+ JsonDocument doc = JsonDocument.create(id, personObj);
+ bucket.insert(doc);
+ assertNotNull(bucket.get(id));
+ }
+
+ @Test
+ public void whenBasicSelectQuery_thenGetQueryResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ N1qlQueryResult result
+ = bucket.query(N1qlQuery.simple("SELECT * FROM test"));
+
+ result.forEach(System.out::println);
+
+ System.out.println("result count: " + result.info().resultCount());
+ System.out.println("error count: " + result.info().errorCount());
+ }
+
+ @Test
+ public void givenSelectStatement_whenQuery_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query = "SELECT name FROM `travel-sample` " +
+ "WHERE type = 'airport' LIMIT 100";
+ N1qlQueryResult result1 = bucket.query(N1qlQuery.simple(query));
+
+ System.out.println("Result Count " + result1.info().resultCount());
+
+ N1qlQueryRow row = result1.allRows().get(0);
+ JsonObject rowJson = row.value();
+ System.out.println("Name in First Row " + rowJson.get("name"));
+
+ }
+
+ @Test
+ public void givenSelectStatement2_whenQuery_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ JsonObject pVal = JsonObject.create().put("type", "airport");
+ String query = "SELECT * FROM `travel-sample` " +
+ "WHERE type = $type LIMIT 100";
+ N1qlQueryResult r2 = bucket.query(N1qlQuery.parameterized(query, pVal));
+
+ System.out.println(r2.allRows());
+
+ List list = extractJsonResult(r2);
+ System.out.println(
+ list.get(0).get("travel-sample").get("airportname").asText());
+ }
+
+ @Test
+ public void givenSelectDSL_whenQuery_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ Statement statement = select("*")
+ .from(i("travel-sample"))
+ .where(x("type").eq(s("airport")))
+ .limit(100);
+ N1qlQueryResult r3 = bucket.query(N1qlQuery.simple(statement));
+
+ List list2 = extractJsonResult(r3);
+ System.out.println("First Airport Name: " + list2.get(0).get("travel-sample").get("airportname").asText());
+
+ }
+
+ @Test
+ public void givenSelectStatementWithOperators_whenQuery_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query2 = "SELECT t.city, " +
+ "t.airportname || \" (\" || t.faa || \")\" AS portname_faa " +
+ "FROM `travel-sample` t " +
+ "WHERE t.type=\"airport\"" +
+ "AND t.country LIKE '%States'" +
+ "AND t.geo.lat >= 70 " +
+ "LIMIT 2";
+ N1qlQueryResult r4 = bucket.query(N1qlQuery.simple(query2));
+ List list3 = extractJsonResult(r4);
+ System.out.println("First Doc : " + list3.get(0));
+ }
+
+ @Test
+ public void givenSelectStatementWithDSL2_whenQuery_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ Statement st2 = select(
+ x("t.city, t.airportname")
+ .concat(s(" (")).concat(x("t.faa")).concat(s(")")).as("portname_faa"))
+ .from(i("travel-sample").as("t"))
+ .where( x("t.type").eq(s("airport"))
+ .and(x("t.country").like(s("%States")))
+ .and(x("t.geo.lat").gte(70)))
+ .limit(2);
+ N1qlQueryResult r5 = bucket.query(N1qlQuery.simple(st2));
+ List list5 = extractJsonResult(r5);
+ System.out.println("First Doc : " + list5.get(0));
+ System.out.println("Query from Statement2: " + st2.toString());
+ }
+
+ @Test
+ public void givenInsertStatement_whenQuery_thenUpdate() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query = "INSERT INTO `travel-sample` (KEY, VALUE) " +
+ " VALUES(" +
+ "\"cust1293\", " +
+ "{\"id\":\"1293\",\"name\":\"Sample Airline\", \"type\":\"airline\"})" +
+ " RETURNING META().id as docid, *";
+ N1qlQueryResult r1 = bucket.query(N1qlQuery.simple(query));
+ r1.forEach(System.out::println);
+ }
+
+ @Test
+ public void givenDocument_whenInsert_thenResults() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ JsonObject ob = JsonObject.create()
+ .put("id", "1293")
+ .put("name", "Sample Airline")
+ .put("type", "airline");
+ bucket.insert(JsonDocument.create("cust1295", ob));
+ }
+
+ @Test
+ public void givenDocuments_whenBatchInsert_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+
+ List documents = IntStream.rangeClosed(0,10)
+ .mapToObj( i -> {
+ JsonObject content = JsonObject.create()
+ .put("id", i)
+ .put("type", "airline")
+ .put("name", "Sample Airline " + i);
+ return JsonDocument.create("cust_" + i, content);
+ })
+ .collect(Collectors.toList());
+
+ List r5 = Observable
+ .from(documents)
+ .flatMap(doc -> bucket.async().insert(doc))
+ .toList()
+ .last()
+ .toBlocking()
+ .single();
+
+ r5.forEach(System.out::println);
+ }
+
+ @Test
+ public void givenUpdateStatement_whenQuery_thenUpdate() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query2 = "UPDATE `travel-sample` USE KEYS \"cust_1\" " +
+ "SET name=\"Sample Airline Updated\" RETURNING name";
+ N1qlQueryResult result = bucket.query(N1qlQuery.simple(query2));
+ result.forEach(System.out::println);
+ }
+
+ @Test
+ public void givenDocument_whenUpsert_thenUpdate() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ JsonObject o2 = JsonObject.create()
+ .put("name", "Sample Airline Updated");
+ bucket.upsert(JsonDocument.create("cust_1", o2));
+ }
+
+ @Test
+ public void givenUnestUpdateStatement_whenQuery_thenResult() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query3 = "UPDATE `travel-sample` USE KEYS \"cust_2\" " +
+ "UNSET name RETURNING *";
+ N1qlQueryResult result1 = bucket.query(N1qlQuery.simple(query3));
+ result1.forEach(System.out::println);
+ }
+
+ @Test
+ public void givenDeleteStatement_whenQuery_thenDelete() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query4 = "DELETE FROM `travel-sample` USE KEYS \"cust_50\"";
+ N1qlQueryResult result4 = bucket.query(N1qlQuery.simple(query4));
+ }
+
+ @Test
+ public void givenDeleteStatement2_whenQuery_thenDelete() {
+ Bucket bucket = bucketFactory.getTravelSampleBucket();
+ String query5 = "DELETE FROM `travel-sample` WHERE id = 0 RETURNING *";
+ N1qlQueryResult result5 = bucket.query(N1qlQuery.simple(query5));
+ }
+
+
+}
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java b/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java
rename to couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceIntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceIntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceIntegrationTest.java
diff --git a/couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceIntegrationTest.java b/couchbase/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceIntegrationTest.java
similarity index 100%
rename from couchbase-sdk/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceIntegrationTest.java
rename to couchbase/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceIntegrationTest.java
diff --git a/couchbase-sdk/src/test/resources/logback.xml b/couchbase/src/test/resources/logback.xml
similarity index 100%
rename from couchbase-sdk/src/test/resources/logback.xml
rename to couchbase/src/test/resources/logback.xml
diff --git a/ethereumj/.gitgnore b/ethereumj/.gitgnore
new file mode 100644
index 0000000000..9cff80e071
--- /dev/null
+++ b/ethereumj/.gitgnore
@@ -0,0 +1,6 @@
+.idea
+target
+database
+logs
+target
+*.iml
\ No newline at end of file
diff --git a/ethereumj/README.md b/ethereumj/README.md
new file mode 100644
index 0000000000..54da91b4f7
--- /dev/null
+++ b/ethereumj/README.md
@@ -0,0 +1,4 @@
+## EthereumJ
+
+### Relevant Articles:
+- [Introduction to EthereumJ](http://www.baeldung.com/intro-to-ethereumj)
\ No newline at end of file
diff --git a/ethereumj/pom.xml b/ethereumj/pom.xml
new file mode 100644
index 0000000000..c9f5924d7a
--- /dev/null
+++ b/ethereumj/pom.xml
@@ -0,0 +1,110 @@
+
+
+ 4.0.0
+ com.baeldung.ethereumj
+ ethereumj
+ war
+ 1.0.0
+ ethereumj
+
+
+ UTF-8
+ 1.8
+ 8.5.4
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.6.RELEASE
+
+
+
+
+ Ethereum
+ Ethereum
+ https://dl.bintray.com/ethereum/maven/
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 1.5.6.RELEASE
+ test
+
+
+
+
+ org.ethereum
+ ethereumj-core
+ 1.5.0-RELEASE
+
+
+
+
+ javax.servlet
+ jstl
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.5.0
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ ethereumj
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ none
+
+
+ */EthControllerTestOne.java
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java b/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java
new file mode 100644
index 0000000000..4735548bd1
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java
@@ -0,0 +1,16 @@
+package com.baeldung.ethereumj;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
+
+@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
+@SpringBootApplication
+public class ApplicationMain extends SpringBootServletInitializer {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ApplicationMain.class, args);
+ }
+}
\ No newline at end of file
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java b/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java
new file mode 100644
index 0000000000..919958be35
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java
@@ -0,0 +1,9 @@
+package com.baeldung.ethereumj;
+
+public class Constants {
+
+ public static final String ENDPOINT_ONE = "/api/get/bestblock/";
+ public static final String ENDPOINT_TWO = "/api/get/difficulty/";
+ public static final String RESPONSE_TYPE ="application/json/";
+
+}
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java b/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java
new file mode 100644
index 0000000000..7680473c6e
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java
@@ -0,0 +1,25 @@
+package com.baeldung.ethereumj.beans;
+
+import com.baeldung.ethereumj.listeners.EthListener;
+import org.ethereum.core.Block;
+import org.ethereum.facade.Ethereum;
+import org.ethereum.facade.EthereumFactory;
+
+import java.math.BigInteger;
+
+public class EthBean {
+ private Ethereum ethereum;
+
+ public void start() {
+ this.ethereum = EthereumFactory.createEthereum();
+ this.ethereum.addListener(new EthListener(ethereum));
+ }
+
+ public Block getBestBlock() {
+ return this.ethereum.getBlockchain().getBestBlock();
+ }
+
+ public BigInteger getTotalDifficulty() {
+ return this.ethereum.getBlockchain().getTotalDifficulty();
+ }
+}
\ No newline at end of file
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java b/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java
new file mode 100644
index 0000000000..8180cc3ce2
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java
@@ -0,0 +1,18 @@
+package com.baeldung.ethereumj.config;
+
+import com.baeldung.ethereumj.beans.EthBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.Executors;
+
+@Configuration
+public class EthConfig {
+
+ @Bean
+ EthBean ethBeanConfig() throws Exception {
+ EthBean eBean = new EthBean();
+ Executors.newSingleThreadExecutor().submit(eBean::start);
+ return eBean;
+ }
+}
\ No newline at end of file
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java b/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java
new file mode 100644
index 0000000000..8240d60e30
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java
@@ -0,0 +1,44 @@
+package com.baeldung.ethereumj.controllers;
+
+import com.baeldung.ethereumj.Constants;
+import com.baeldung.ethereumj.beans.EthBean;
+import com.baeldung.ethereumj.transfer.EthResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.ServletContext;
+
+@RestController
+public class EthController {
+
+ @Autowired
+ EthBean ethBean;
+ @Autowired
+ private ServletContext servletContext;
+ private Logger l = LoggerFactory.getLogger(EthController.class);
+
+ @RequestMapping(Constants.ENDPOINT_ONE)
+ public EthResponse getBestBlock() {
+ l.debug("Request received - fetching best block.");
+ EthResponse r = new EthResponse();
+ r.setResponse(ethBean.getBestBlock().toString());
+ return r;
+ }
+
+ @RequestMapping(Constants.ENDPOINT_TWO)
+ public EthResponse getTotalDifficulty() {
+ l.debug("Request received - calculating total difficulty.");
+ EthResponse r = new EthResponse();
+ r.setResponse(ethBean.getTotalDifficulty().toString());
+ return r;
+ }
+
+ @PostConstruct
+ public void showIt() {
+ l.debug(servletContext.getContextPath());
+ }
+}
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java b/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java
new file mode 100644
index 0000000000..c3a5143fdb
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java
@@ -0,0 +1,71 @@
+package com.baeldung.ethereumj.listeners;
+
+import org.ethereum.core.Block;
+import org.ethereum.core.TransactionReceipt;
+import org.ethereum.facade.Ethereum;
+import org.ethereum.listener.EthereumListenerAdapter;
+import org.ethereum.util.BIUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigInteger;
+import java.util.List;
+
+public class EthListener extends EthereumListenerAdapter {
+
+ private Logger l = LoggerFactory.getLogger(EthListener.class);
+ private Ethereum ethereum;
+ private boolean syncDone = false;
+ private static final int thou = 1000;
+
+ private void out(String t) {
+ l.info(t);
+ }
+
+ private String calcNetHashRate(Block block) {
+ String response = "Net hash rate not available";
+ if (block.getNumber() > thou) {
+ long timeDelta = 0;
+ for (int i = 0; i < thou; ++i) {
+ Block parent = ethereum
+ .getBlockchain()
+ .getBlockByHash(block.getParentHash());
+ timeDelta += Math.abs(block.getTimestamp() - parent.getTimestamp());
+ }
+ response = String.valueOf(block
+ .getDifficultyBI()
+ .divide(BIUtil.toBI(timeDelta / thou))
+ .divide(new BigInteger("1000000000"))
+ .doubleValue()) + " GH/s";
+ }
+ return response;
+ }
+
+ public EthListener(Ethereum ethereum) {
+ this.ethereum = ethereum;
+ }
+
+ @Override
+ public void onBlock(Block block, List receipts) {
+ if (syncDone) {
+ out("Net hash rate: " + calcNetHashRate(block));
+ out("Block difficulty: " + block.getDifficultyBI().toString());
+ out("Block transactions: " + block.getTransactionsList().toString());
+ out("Best block (last block): " + ethereum
+ .getBlockchain()
+ .getBestBlock().toString());
+ out("Total difficulty: " + ethereum
+ .getBlockchain()
+ .getTotalDifficulty().toString());
+ }
+ }
+
+ @Override
+ public void onSyncDone(SyncState state) {
+ out("onSyncDone " + state);
+ if (!syncDone) {
+ out(" ** SYNC DONE ** ");
+ syncDone = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java b/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java
new file mode 100644
index 0000000000..e8cfb3113b
--- /dev/null
+++ b/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java
@@ -0,0 +1,14 @@
+package com.baeldung.ethereumj.transfer;
+
+public class EthResponse {
+
+ private String response;
+
+ public String getResponse() {
+ return response;
+ }
+
+ public void setResponse(String response) {
+ this.response = response;
+ }
+}
diff --git a/ethereumj/src/main/resources/application.properties b/ethereumj/src/main/resources/application.properties
new file mode 100644
index 0000000000..033e543fe8
--- /dev/null
+++ b/ethereumj/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+server.servlet-path=/
+server.port=8080
\ No newline at end of file
diff --git a/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerTestOne.java b/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerTestOne.java
new file mode 100644
index 0000000000..9298c34ec2
--- /dev/null
+++ b/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerTestOne.java
@@ -0,0 +1,72 @@
+package com.baeldung.ethereumj.controllers;
+
+import com.baeldung.ethereumj.ApplicationMain;
+import com.baeldung.ethereumj.Constants;
+import com.baeldung.ethereumj.transfer.EthResponse;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.context.embedded.LocalServerPort;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.*;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestTemplate;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ApplicationMain.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+@TestPropertySource(properties = "server.port=8080")
+public class EthControllerTestOne {
+
+ @LocalServerPort
+ int port;
+
+ private RestTemplate restTemplate = new RestTemplate();
+
+ private String url(String uri) {
+ String s = "http://localhost:" + port + uri;
+ System.out.println(s);
+ return s;
+ }
+
+ @Before
+ public void setup() {
+ restTemplate = new RestTemplate();
+ }
+
+ @Test()
+ public void bestBlockTest() throws Exception {
+
+ Thread.sleep(20000);
+
+ EthResponse a = restTemplate.getForObject(url(Constants.ENDPOINT_ONE), EthResponse.class);
+ assertNotNull(a);
+
+ ResponseEntity b = restTemplate.exchange(
+ url(Constants.ENDPOINT_ONE),
+ HttpMethod.GET, new HttpEntity(null, new HttpHeaders()), EthResponse.class);
+
+ assertTrue("Status 200?", b.getStatusCode().equals(HttpStatus.OK));
+ System.out.println("Status 200?: " + b.getStatusCode().equals(HttpStatus.OK));
+ assertTrue("Dynamic data returned?", b.hasBody());
+ System.out.println("Dynamic data returned?: " + b.hasBody());
+ }
+
+ @Test()
+ public void difficultyTest() throws Exception {
+
+ Thread.sleep(20000);
+
+ ResponseEntity a = restTemplate.exchange(
+ url(Constants.ENDPOINT_TWO),
+ HttpMethod.GET, new HttpEntity(null, new HttpHeaders()), EthResponse.class);
+
+ assertTrue("Status 200?", a.getStatusCode().equals(HttpStatus.OK));
+ System.out.println("Status 200?: " + a.getStatusCode().equals(HttpStatus.OK));
+ assertTrue("Dynamic data returned?", a.hasBody());
+ System.out.println("Dynamic data returned?: " + a.hasBody());
+ }
+}
diff --git a/geotools/README.md b/geotools/README.md
new file mode 100644
index 0000000000..188ff0fddb
--- /dev/null
+++ b/geotools/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+[Introduction to GeoTools](http://www.baeldung.com/geo-tools)
diff --git a/libraries/pom.xml b/libraries/pom.xml
index e38fcd6522..27fff02eb4 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -635,6 +635,7 @@
8.2.0
0.6.5
0.9.0
+ 15.2
2.9.9
1.5.1
2.3.0
diff --git a/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java b/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
new file mode 100644
index 0000000000..ca425339fa
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.pairs;
+
+import static org.junit.Assert.*;
+
+import java.util.AbstractMap;
+
+import org.junit.Test;
+
+public class CoreJavaSimpleEntryUnitTest {
+
+ @Test
+ public void givenSimpleEntry_whenGetValue_thenOk() {
+ AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry(1, "one");
+ Integer key = entry.getKey();
+ String value = entry.getValue();
+
+ assertEquals(key.intValue(), 1);
+ assertEquals(value, "one");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void givenSimpleImmutableEntry_whenSetValue_thenException() {
+ AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one");
+
+ entry.setValue("two");
+
+ }
+
+ @Test
+ public void givenSimpleImmutableEntry_whenGetValue_thenOk() {
+ AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one");
+ Integer key = entry.getKey();
+ String value = entry.getValue();
+
+ assertEquals(key.intValue(), 1);
+ assertEquals(value, "one");
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java b/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java
index 4fd21ec508..cf6a1e5ec5 100644
--- a/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java
+++ b/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java
@@ -16,7 +16,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
public class CollectorUtilsTests {
@Test
- public void maxByWithProjectionAndDefaultComparer() {
+ public void givenIntegerStream_whenCollectOnMaxByProjection_shouldReturnOptionalMaxValue() {
Stream integerStream = Stream.of("a", "bb", "ccc", "1");
Optional max = integerStream.collect(maxBy(String::length));
@@ -25,7 +25,7 @@ public class CollectorUtilsTests {
}
@Test
- public void minByWithProjectionAndDefaultComparer() {
+ public void givenIntegerStream_whenCollectOnMinByProjection_shouldReturnOptionalMinValue() {
Stream integerStream = Stream.of("abc", "bb", "ccc", "1");
Optional max = integerStream.collect(minBy(String::length));
@@ -34,14 +34,14 @@ public class CollectorUtilsTests {
}
@Test
- public void returnsEmptyForEmptyStream() {
+ public void givenEmptyStream_withCollectorUnique_shouldReturnEmpty() {
assertThat(Stream
.empty()
.collect(CollectorUtils.unique()), equalTo(Optional.empty()));
}
@Test
- public void returnsUniqueItem() {
+ public void givenIntegerStream_withCollectorUnique_shouldReturnUniqueValue() {
assertThat(Stream
.of(1, 2, 3)
.filter(i -> i > 2)
@@ -49,7 +49,7 @@ public class CollectorUtilsTests {
}
@Test
- public void returnsUniqueNullableItem() {
+ public void givenIntegerStream_withUniqueNullable_shouldReturnUniqueValue() {
assertThat(Stream
.of(1, 2, 3)
.filter(i -> i > 2)
@@ -57,7 +57,7 @@ public class CollectorUtilsTests {
}
@Test(expected = NonUniqueValueException.class)
- public void throwsExceptionIfItemIsNotUnique() {
+ public void givenIntegerStream_withCollectorUnique_shouldThrowNonUniqueValueException() {
Stream
.of(1, 2, 3)
.filter(i -> i > 1)
diff --git a/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java b/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java
index 282a41e0df..37ca71287f 100644
--- a/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java
+++ b/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java
@@ -21,15 +21,7 @@ import static org.hamcrest.Matchers.*;
public class StreamUtilsTests {
@Test
- public void createInfiniteIndex() {
- LongStream indices = StreamUtils
- .indices()
- .limit(500);
-
- }
-
- @Test
- public void zipAStreamWithIndex() {
+ public void givenStream_whenZipWithIndex_shouldReturnZippedStreamWithIndex() {
Stream source = Stream.of("Foo", "Bar", "Baz");
List> zipped = StreamUtils
@@ -40,7 +32,7 @@ public class StreamUtilsTests {
}
@Test
- public void zipAPairOfStreams() {
+ public void givenTwoStreams_whenZip_shouldReturnZippedStream() {
Stream streamA = Stream.of("A", "B", "C");
Stream streamB = Stream.of("Apple", "Banana", "Carrot");
@@ -52,7 +44,7 @@ public class StreamUtilsTests {
}
@Test
- public void zipThreeStreams() {
+ public void givenThreeStreams_whenZip_shouldReturnZippedStream() {
Stream streamA = Stream.of("A", "B", "C");
Stream streamB = Stream.of("aggravating", "banausic", "complaisant");
Stream streamC = Stream.of("Apple", "Banana", "Carrot");
@@ -65,7 +57,8 @@ public class StreamUtilsTests {
}
@Test
- public void mergeThreeStreams() {
+ //givenThreeStreams_whenMerge_shouldReturnMergedStream
+ public void givenThreeStreams_whenMerge_shouldReturnMergedStream() {
Stream streamA = Stream.of("A", "B", "C");
Stream streamB = Stream.of("apple", "banana", "carrot", "date");
Stream streamC = Stream.of("fritter", "split", "cake", "roll", "pastry");
@@ -76,7 +69,8 @@ public class StreamUtilsTests {
}
@Test
- public void roundRobinInterleaving() {
+ //givenThreeStreams_whenInterleave_shouldReturnRoundRobinInterleavingStream
+ public void givenThreeStreams_whenInterleave_shouldReturnRoundRobinInterleavingStream() {
Stream streamA = Stream.of("Peter", "Paul", "Mary");
Stream streamB = Stream.of("A", "B", "C", "D", "E");
Stream streamC = Stream.of("foo", "bar", "baz", "xyzzy");
@@ -87,7 +81,8 @@ public class StreamUtilsTests {
}
@Test
- public void takeWhileConditionIsMet() {
+ //givenInfiniteStream_whenTakeWhile10_shouldReturnStreamOfSize10
+ public void givenInfiniteStream_whenTakeWhile10_shouldReturnStream() {
Stream infiniteInts = Stream.iterate(0, i -> i + 1);
Stream finiteInts = StreamUtils.takeWhile(infiniteInts, i -> i < 10);
@@ -95,7 +90,7 @@ public class StreamUtilsTests {
}
@Test
- public void takeUntilConditionIsNotMet() {
+ public void givenInfiniteStream_whenTakeUntil10_shouldReturnStreamUpto10() {
Stream infiniteInts = Stream.iterate(0, i -> i + 1);
Stream finiteInts = StreamUtils.takeUntil(infiniteInts, i -> i > 10);
@@ -103,7 +98,7 @@ public class StreamUtilsTests {
}
@Test
- public void skipWhileConditionMet() {
+ public void givenIntegerStreamOfTen_whenSkipWhileLessThanFour_shouldReturnStreamFromFourToTen() {
Stream ints = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream skipped = StreamUtils.skipWhile(ints, i -> i < 4);
List collected = skipped.collect(Collectors.toList());
@@ -112,7 +107,7 @@ public class StreamUtilsTests {
}
@Test
- public void skipUntilConditionMet() {
+ public void givenIntegerStreamOfTen_whenSkipUntilFour_shouldReturnStreamFromFiveToTen() {
Stream ints = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream skipped = StreamUtils.skipUntil(ints, i -> i > 4);
List collected = skipped.collect(Collectors.toList());
@@ -121,14 +116,14 @@ public class StreamUtilsTests {
}
@Test
- public void unfoldUntilEmptyIsReturned() {
+ public void givenSeedValue_withUnfold_shouldReturnStreamAccordingToGeneratorMethod() {
Stream unfolded = StreamUtils.unfold(1, i -> (i < 10) ? Optional.of(i + 1) : Optional.empty());
assertThat(unfolded.collect(Collectors.toList()), contains(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
}
@Test
- public void groupRunsStreamTest() {
+ public void giveIntegerStream_whenGroupRuns_shouldReturnListGroupItems() {
Stream integerStream = Stream.of(1, 1, 2, 2, 3, 4, 5);
List> runs = StreamUtils
.groupRuns(integerStream)
@@ -138,14 +133,14 @@ public class StreamUtilsTests {
}
@Test
- public void aggreagateOnBiElementPredicate() {
+ public void givenAStream_whenAggregate_shouldReturnAggregatedStreamOnTheBasisOfBiFunction() {
Stream stream = Stream.of("a1", "b1", "b2", "c1");
Stream> aggregated = StreamUtils.aggregate(stream, (e1, e2) -> e1.charAt(0) == e2.charAt(0));
assertThat(aggregated.collect(toList()), contains(asList("a1"), asList("b1", "b2"), asList("c1")));
}
@Test
- public void windowingOnList() {
+ public void givenIntegerStream_whenWindowed_shouldReturnListOfListOfItemsOfWindowSize() {
Stream integerStream = Stream.of(1, 2, 3, 4, 5);
List> windows = StreamUtils
@@ -156,7 +151,8 @@ public class StreamUtilsTests {
}
@Test
- public void windowingOnListTwoOverlap() {
+ //givenIntegerStream_whenWindowedWithWindowSizeAndSkip_shouldReturnListOfListOfWindowSizeAddingASkip
+ public void givenIntegerStream_whenWindowedWithWindowSizeAndSkip_shouldReturnListOfListOfWindowSizeAddingASkip() {
Stream integerStream = Stream.of(1, 2, 3, 4, 5);
List> windows = StreamUtils
@@ -167,7 +163,7 @@ public class StreamUtilsTests {
}
@Test
- public void windowingOnEmptyList() {
+ public void givenEmptyStream_whenWindowed_shouldReturnIterableWithSizeZero() {
ArrayList ints = new ArrayList<>();
ints
@@ -184,7 +180,7 @@ public class StreamUtilsTests {
}
@Test
- public void windowingOnListTwoOverlapAllowLesserSize() {
+ public void givenIntegerStream_whenWindowedWithWindowSizeAndSkipAndAllowLesserSize_shouldReturnListOfListOfInteger() {
Stream integerStream = Stream.of(1, 2, 3, 4, 5);
List> windows = StreamUtils
@@ -195,14 +191,12 @@ public class StreamUtilsTests {
}
@Test
- public void windowingOnListOneOverlapAllowLesserSizeMultipleLesserWindows() {
- Stream integerStream = Stream.of(1, 2, 3, 4, 5);
+ public void givenLimit_withIndices_shouldReturnLongStreamUptoLimit() {
+ LongStream indices = StreamUtils
+ .indices()
+ .limit(500);
- List> windows = StreamUtils
- .windowed(integerStream, 3, 1, true)
- .collect(toList());
-
- assertThat(windows, contains(asList(1, 2, 3), asList(2, 3, 4), asList(3, 4, 5), asList(4, 5), asList(5)));
+ assertThat(indices.count(), equalTo(500));
}
}
diff --git a/linkrest/WebContent/META-INF/MANIFEST.MF b/linkrest/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..254272e1c0
--- /dev/null
+++ b/linkrest/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/linkrest/WebContent/WEB-INF/web.xml b/linkrest/WebContent/WEB-INF/web.xml
new file mode 100644
index 0000000000..046c82b08a
--- /dev/null
+++ b/linkrest/WebContent/WEB-INF/web.xml
@@ -0,0 +1,20 @@
+
+
+ linkrest
+
+ linkrest
+ org.glassfish.jersey.servlet.ServletContainer
+
+ javax.ws.rs.Application
+ com.baeldung.LinkRestApplication
+
+ 1
+
+
+ linkrest
+ /*
+
+
\ No newline at end of file
diff --git a/linkrest/pom.xml b/linkrest/pom.xml
new file mode 100644
index 0000000000..aa2f0f8bda
--- /dev/null
+++ b/linkrest/pom.xml
@@ -0,0 +1,81 @@
+
+ 4.0.0
+ com.baeldung
+ linkrest
+ 0.0.1-SNAPSHOT
+ war
+
+
+
+ com.nhl.link.rest
+ link-rest
+ ${linkrest.version}
+
+
+ org.glassfish.jersey.containers
+ jersey-container-servlet
+ ${jersey.version}
+
+
+ org.glassfish.jersey.media
+ jersey-media-moxy
+ ${jersey.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.5
+
+ 1.8
+ 1.8
+
+
+
+ maven-war-plugin
+ 2.6
+
+ WebContent
+ false
+
+
+
+ org.apache.cayenne.plugins
+ cayenne-maven-plugin
+ ${cayenne.version}
+
+
+
+
+
+
+
+
+ cgen
+
+
+
+
+
+ org.apache.cayenne.plugins
+ cayenne-modeler-maven-plugin
+ ${cayenne.version}
+
+
+
+
+
+ 2.9
+ 4.0.B1
+ 1.4.196
+ 2.25.1
+
+
\ No newline at end of file
diff --git a/linkrest/src/main/java/com/baeldung/LinkRestApplication.java b/linkrest/src/main/java/com/baeldung/LinkRestApplication.java
new file mode 100644
index 0000000000..7a2f7c8903
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/LinkRestApplication.java
@@ -0,0 +1,24 @@
+package com.baeldung;
+
+
+import javax.ws.rs.ApplicationPath;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.glassfish.jersey.server.ResourceConfig;
+
+import com.nhl.link.rest.runtime.LinkRestBuilder;
+import com.nhl.link.rest.runtime.LinkRestRuntime;
+
+@ApplicationPath("/linkrest")
+public class LinkRestApplication extends ResourceConfig {
+
+ public LinkRestApplication() {
+ ServerRuntime cayenneRuntime = ServerRuntime.builder()
+ .addConfig("cayenne-linkrest-project.xml")
+ .build();
+ LinkRestRuntime lrRuntime = LinkRestBuilder.build(cayenneRuntime);
+ super.register(lrRuntime);
+ packages("com.baeldung.linkrest.apis");
+ }
+
+}
diff --git a/linkrest/src/main/java/com/baeldung/cayenne/Department.java b/linkrest/src/main/java/com/baeldung/cayenne/Department.java
new file mode 100644
index 0000000000..ed7a2bd795
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/cayenne/Department.java
@@ -0,0 +1,9 @@
+package com.baeldung.cayenne;
+
+import com.baeldung.cayenne.auto._Department;
+
+public class Department extends _Department {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/linkrest/src/main/java/com/baeldung/cayenne/Employee.java b/linkrest/src/main/java/com/baeldung/cayenne/Employee.java
new file mode 100644
index 0000000000..632ea4fbf9
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/cayenne/Employee.java
@@ -0,0 +1,9 @@
+package com.baeldung.cayenne;
+
+import com.baeldung.cayenne.auto._Employee;
+
+public class Employee extends _Employee {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/linkrest/src/main/java/com/baeldung/cayenne/auto/_Department.java b/linkrest/src/main/java/com/baeldung/cayenne/auto/_Department.java
new file mode 100644
index 0000000000..4111a8c8b2
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/cayenne/auto/_Department.java
@@ -0,0 +1,44 @@
+package com.baeldung.cayenne.auto;
+
+import java.util.List;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+
+import com.baeldung.cayenne.Employee;
+
+/**
+ * Class _Department was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Department extends CayenneDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String DEP_ID_PK_COLUMN = "dep_id";
+
+ public static final Property NAME = Property.create("name", String.class);
+ public static final Property> EMPLOYEES = Property.create("employees", List.class);
+
+ public void setName(String name) {
+ writeProperty("name", name);
+ }
+ public String getName() {
+ return (String)readProperty("name");
+ }
+
+ public void addToEmployees(Employee obj) {
+ addToManyTarget("employees", obj, true);
+ }
+ public void removeFromEmployees(Employee obj) {
+ removeToManyTarget("employees", obj, true);
+ }
+ @SuppressWarnings("unchecked")
+ public List getEmployees() {
+ return (List)readProperty("employees");
+ }
+
+
+}
diff --git a/linkrest/src/main/java/com/baeldung/cayenne/auto/_Employee.java b/linkrest/src/main/java/com/baeldung/cayenne/auto/_Employee.java
new file mode 100644
index 0000000000..50e1880a56
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/cayenne/auto/_Employee.java
@@ -0,0 +1,39 @@
+package com.baeldung.cayenne.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+
+import com.baeldung.cayenne.Department;
+
+/**
+ * Class _Employee was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Employee extends CayenneDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String EMP_ID_PK_COLUMN = "emp_id";
+
+ public static final Property NAME = Property.create("name", String.class);
+ public static final Property DEPARTMENT = Property.create("department", Department.class);
+
+ public void setName(String name) {
+ writeProperty("name", name);
+ }
+ public String getName() {
+ return (String)readProperty("name");
+ }
+
+ public void setDepartment(Department department) {
+ setToOneTarget("department", department, true);
+ }
+
+ public Department getDepartment() {
+ return (Department)readProperty("department");
+ }
+
+
+}
diff --git a/linkrest/src/main/java/com/baeldung/linkrest/apis/DepartmentResource.java b/linkrest/src/main/java/com/baeldung/linkrest/apis/DepartmentResource.java
new file mode 100644
index 0000000000..f4090b580e
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/linkrest/apis/DepartmentResource.java
@@ -0,0 +1,58 @@
+package com.baeldung.linkrest.apis;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Configuration;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+
+import com.baeldung.cayenne.Department;
+import com.nhl.link.rest.DataResponse;
+import com.nhl.link.rest.LinkRest;
+import com.nhl.link.rest.SimpleResponse;
+
+@Path("department")
+@Produces(MediaType.APPLICATION_JSON)
+public class DepartmentResource {
+
+ @Context
+ private Configuration config;
+
+ @GET
+ public DataResponse getAll(@Context UriInfo uriInfo) {
+ return LinkRest.select(Department.class, config).uri(uriInfo).get();
+ }
+
+ @GET
+ @Path("{id}")
+ public DataResponse getOne(@PathParam("id") int id, @Context UriInfo uriInfo) {
+ return LinkRest.select(Department.class, config).byId(id).uri(uriInfo).getOne();
+ }
+
+ @POST
+ public SimpleResponse create(String data) {
+ return LinkRest.create(Department.class, config).sync(data);
+ }
+
+ @PUT
+ public SimpleResponse createOrUpdate(String data) {
+ return LinkRest.createOrUpdate(Department.class, config).sync(data);
+ }
+
+ @Path("{id}/employees")
+ public EmployeeSubResource getEmployees(@PathParam("id") int id, @Context UriInfo uriInfo) {
+ return new EmployeeSubResource(id, config);
+ }
+
+ @DELETE
+ @Path("{id}")
+ public SimpleResponse delete(@PathParam("id") int id) {
+ return LinkRest.delete(Department.class, config).id(id).delete();
+ }
+}
diff --git a/linkrest/src/main/java/com/baeldung/linkrest/apis/EmployeeSubResource.java b/linkrest/src/main/java/com/baeldung/linkrest/apis/EmployeeSubResource.java
new file mode 100644
index 0000000000..ba9c3759bb
--- /dev/null
+++ b/linkrest/src/main/java/com/baeldung/linkrest/apis/EmployeeSubResource.java
@@ -0,0 +1,65 @@
+package com.baeldung.linkrest.apis;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Configuration;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+
+import com.baeldung.cayenne.Department;
+import com.baeldung.cayenne.Employee;
+import com.nhl.link.rest.DataResponse;
+import com.nhl.link.rest.LinkRest;
+import com.nhl.link.rest.SimpleResponse;
+
+@Produces(MediaType.APPLICATION_JSON)
+public class EmployeeSubResource {
+
+ private Configuration config;
+
+ private int departmentId;
+
+ public EmployeeSubResource(int departmentId, Configuration config) {
+ this.departmentId = departmentId;
+ this.config = config;
+ }
+
+ public EmployeeSubResource() {
+ }
+
+ @GET
+ public DataResponse getAll(@Context UriInfo uriInfo) {
+ return LinkRest.select(Employee.class, config).toManyParent(Department.class, departmentId, Department.EMPLOYEES).uri(uriInfo).get();
+ }
+
+ @GET
+ @Path("{id}")
+ public DataResponse getOne(@PathParam("id") int id, @Context UriInfo uriInfo) {
+ return LinkRest.select(Employee.class, config).toManyParent(Department.class, departmentId, Department.EMPLOYEES).byId(id).uri(uriInfo).getOne();
+ }
+
+ @POST
+ public SimpleResponse create(String data) {
+
+ return LinkRest.create(Employee.class, config).toManyParent(Department.class, departmentId, Department.EMPLOYEES).sync(data);
+ }
+
+ @PUT
+ public SimpleResponse createOrUpdate(String data) {
+ return LinkRest.create(Employee.class, config).toManyParent(Department.class, departmentId, Department.EMPLOYEES).sync(data);
+ }
+
+ @DELETE
+ @Path("{id}")
+ public SimpleResponse delete(@PathParam("id") int id) {
+ return LinkRest.delete(Employee.class, config).toManyParent(Department.class, departmentId, Department.EMPLOYEES).id(id).delete();
+
+ }
+
+}
diff --git a/linkrest/src/main/resources/cayenne-linkrest-project.xml b/linkrest/src/main/resources/cayenne-linkrest-project.xml
new file mode 100644
index 0000000000..8a4ba39c4d
--- /dev/null
+++ b/linkrest/src/main/resources/cayenne-linkrest-project.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/linkrest/src/main/resources/linkrest.map.xml b/linkrest/src/main/resources/linkrest.map.xml
new file mode 100644
index 0000000000..105d7d9d14
--- /dev/null
+++ b/linkrest/src/main/resources/linkrest.map.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index c501dddd3c..dd0871ae79 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,7 @@
+ apache-cayenne
aws
akka-streams
algorithms
@@ -45,11 +46,13 @@
core-java
core-java-8
core-java-concurrency
- couchbase-sdk
+ couchbase
deltaspike
dozer
+ ethereumj
+
feign
@@ -95,7 +98,8 @@
jws
libraries
- libraries-data
+ libraries-data
+ linkrest
log-mdc
log4j
log4j2
diff --git a/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java b/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java
new file mode 100644
index 0000000000..8ce370e356
--- /dev/null
+++ b/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java
@@ -0,0 +1,273 @@
+package com.baeldung.rxjava;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import rx.Observable;
+import rx.Observer;
+import rx.exceptions.OnErrorNotImplementedException;
+import rx.schedulers.Schedulers;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertTrue;
+
+public class UtilityOperatorsTest {
+
+ int emittedTotal = 0;
+ int receivedTotal = 0;
+ String result = "";
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void givenObservable_whenObserveOnAfterOnNext_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
+
+ Observable.range(1, 5)
+ .map(i -> i * 100)
+ .doOnNext(i -> {
+ emittedTotal += i;
+ System.out.println("Emitting " + i
+ + " on thread " + Thread.currentThread().getName());
+ })
+ .observeOn(Schedulers.computation())
+ .map(i -> i * 10)
+ .subscribe(i -> {
+ receivedTotal += i;
+ System.out.println("Received " + i + " on thread "
+ + Thread.currentThread().getName());
+ });
+
+ Thread.sleep(2000);
+ assertTrue(emittedTotal == 1500);
+ assertTrue(receivedTotal == 15000);
+ }
+
+
+ @Test
+ public void givenObservable_whenObserveOnBeforeOnNext_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
+
+ Observable.range(1, 5)
+ .map(i -> i * 100)
+ .observeOn(Schedulers.computation())
+ .doOnNext(i -> {
+ emittedTotal += i;
+ System.out.println("Emitting " + i
+ + " on thread " + Thread.currentThread().getName());
+ })
+ .map(i -> i * 10)
+ .subscribe(i -> {
+ receivedTotal += i;
+ System.out.println("Received " + i + " on thread "
+ + Thread.currentThread().getName());
+ });
+
+ Thread.sleep(2000);
+ assertTrue(emittedTotal == 1500);
+ assertTrue(receivedTotal == 15000);
+ }
+
+
+ @Test
+ public void givenObservable_whenSubscribeOn_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
+
+ Observable.range(1, 5)
+ .map(i -> i * 100)
+ .doOnNext(i -> {
+ emittedTotal += i;
+ System.out.println("Emitting " + i
+ + " on thread " + Thread.currentThread().getName());
+ })
+ .subscribeOn(Schedulers.computation())
+ .map(i -> i * 10)
+ .subscribe(i -> {
+ receivedTotal += i;
+ System.out.println("Received " + i + " on thread "
+ + Thread.currentThread().getName());
+ });
+
+ Thread.sleep(2000);
+ assertTrue(emittedTotal == 1500);
+ assertTrue(receivedTotal == 15000);
+ }
+
+
+ @Test
+ public void givenObservableWithOneEvent_whenSingle_thenEmitEvent() {
+
+ Observable.range(1, 1)
+ .single()
+ .subscribe(i -> receivedTotal += i);
+ assertTrue(receivedTotal == 1);
+ }
+
+ @Test
+ public void givenObservableWithNoEvents_whenSingle_thenThrowException() {
+
+ Observable.range(1, 3)
+ .single()
+ .onErrorReturn(e -> receivedTotal += 10)
+ .subscribe();
+ assertTrue(receivedTotal == 10);
+ }
+
+ @Test
+ public void givenObservableWihNoEvents_whenSingleOrDefault_thenDefaultMessage() {
+
+ Observable.empty()
+ .singleOrDefault("Default")
+ .subscribe(i -> result += i);
+ assertTrue(result.equals("Default"));
+ }
+
+ @Test
+ public void givenObservableWithManyEvents_whenSingleOrDefault_thenThrowException() {
+
+ Observable.range(1, 3)
+ .singleOrDefault(5)
+ .onErrorReturn(e -> receivedTotal += 10)
+ .subscribe();
+ assertTrue(receivedTotal == 10);
+ }
+
+ @Test
+ public void givenObservable_whenDoOnNextAndDoOnCompleted_thenSumAllEventsAndShowMessage() {
+
+ Observable.range(1, 10)
+ .doOnNext(r -> receivedTotal += r)
+ .doOnCompleted(() -> result = "Completed")
+ .subscribe();
+ assertTrue(receivedTotal == 55);
+ assertTrue(result.equals("Completed"));
+ }
+
+ @Test
+ public void givenObservable_whenDoOnEachAndDoOnSubscribe_thenSumAllValuesAndShowMessage() {
+
+ Observable.range(1, 10)
+ .doOnEach(new Observer() {
+ @Override
+ public void onCompleted() {
+ System.out.println("Complete");
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ e.printStackTrace();
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ receivedTotal += value;
+ }
+ })
+ .doOnSubscribe(() -> result = "Subscribed")
+ .subscribe();
+ assertTrue(receivedTotal == 55);
+ assertTrue(result.equals("Subscribed"));
+ }
+
+ @Test
+ public void givenObservable_whenDoOnErrorDoOnTerminateAndDoAfterTerminate_thenShowErrorTerminateAndAfterTerminateMessages() {
+
+ thrown.expect(OnErrorNotImplementedException.class);
+ Observable.empty()
+ .single()
+ .doOnError(throwable -> {
+ throw new RuntimeException("error");
+ })
+ .doOnTerminate(() -> result += "doOnTerminate")
+ .doAfterTerminate(() -> result += "_doAfterTerminate")
+ .subscribe();
+ assertTrue(result.equals("doOnTerminate_doAfterTerminate"));
+ }
+
+ @Test
+ public void givenObservable_whenTimestamp_thenEventsShouldAppearTimestamped() {
+
+ Observable.range(1, 10)
+ .timestamp()
+ .map(o -> result = o.getClass().toString())
+ .last()
+ .subscribe();
+ assertTrue(result.equals("class rx.schedulers.Timestamped"));
+ }
+
+ @Test
+ public void givenObservables_whenDelay_thenEventsStartAppearAfterATime() throws InterruptedException {
+
+ Observable source
+ = Observable.interval(1, TimeUnit.SECONDS)
+ .take(5)
+ .timestamp();
+
+ Observable delay
+ = source.delaySubscription(2, TimeUnit.SECONDS);
+
+ source.subscribe(
+ value -> System.out.println("source :" + value),
+ t -> System.out.println("source error"),
+ () -> System.out.println("source completed"));
+
+ delay.subscribe(
+ value -> System.out.println("delay : " + value),
+ t -> System.out.println("delay error"),
+ () -> System.out.println("delay completed"));
+ Thread.sleep(8000);
+ }
+
+ @Test
+ public void givenObservable_whenRepeat_thenSumNumbersThreeTimes() {
+
+ Observable.range(1, 3)
+ .repeat(3)
+ .subscribe(i -> receivedTotal += i);
+ assertTrue(receivedTotal == 18);
+ }
+
+ @Test
+ public void givenObservable_whenUsing_thenReturnCreatedResource() {
+
+ Observable values = Observable.using(
+ () -> "resource",
+ r -> {
+ return Observable.create(o -> {
+ for (Character c : r.toCharArray()) {
+ o.onNext(c);
+ }
+ o.onCompleted();
+ });
+ },
+ r -> System.out.println("Disposed: " + r)
+ );
+ values.subscribe(
+ v -> result += v,
+ e -> result += e
+ );
+ assertTrue(result.equals("resource"));
+ }
+
+
+ @Test
+ public void givenObservableCached_whenSubscribesWith2Actions_thenEmitsCachedValues() {
+
+ Observable source =
+ Observable.create(subscriber -> {
+ System.out.println("Create");
+ subscriber.onNext(receivedTotal += 5);
+ subscriber.onCompleted();
+ }
+ ).cache();
+ source.subscribe(i -> {
+ System.out.println("element 1");
+ receivedTotal += 1;
+ });
+ source.subscribe(i -> {
+ System.out.println("element 2");
+ receivedTotal += 2;
+ });
+ assertTrue(receivedTotal == 8);
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/controller/controller/PassParametersController.java b/spring-all/src/main/java/org/baeldung/controller/controller/PassParametersController.java
index 54047cedf3..c282ae6a62 100644
--- a/spring-all/src/main/java/org/baeldung/controller/controller/PassParametersController.java
+++ b/spring-all/src/main/java/org/baeldung/controller/controller/PassParametersController.java
@@ -3,8 +3,7 @@ package org.baeldung.controller.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
/**
@@ -16,23 +15,23 @@ import org.springframework.web.servlet.ModelAndView;
*/
@Controller
public class PassParametersController {
- @RequestMapping(value = "/showViewPage", method = RequestMethod.GET)
+ @GetMapping("/showViewPage")
public String passParametersWithModel(Model model) {
model.addAttribute("message", "Baeldung");
return "viewPage";
}
- @RequestMapping(value = "/printViewPage", method = RequestMethod.GET)
+ @GetMapping("/printViewPage")
public String passParametersWithModelMap(ModelMap map) {
map.addAttribute("welcomeMessage", "welcome");
map.addAttribute("message", "Baeldung");
return "viewPage";
}
- @RequestMapping(value = "/goToViewPage", method = RequestMethod.GET)
+ @GetMapping("/goToViewPage")
public ModelAndView passParametersWithModelAndView() {
ModelAndView modelAndView = new ModelAndView("viewPage");
modelAndView.addObject("message", "Baeldung");
return modelAndView;
}
-}
\ No newline at end of file
+}
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index e36f5265b2..44e72535f8 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -15,6 +15,7 @@
spring-cloud-ribbon-client
spring-cloud-rest
spring-cloud-zookeeper
+ spring-cloud-gateway
pom
diff --git a/spring-cloud/spring-cloud-gateway/README.MD b/spring-cloud/spring-cloud-gateway/README.MD
new file mode 100644
index 0000000000..48fbf41b8e
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/README.MD
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Explore the new Spring Cloud Gateway](http://www.baeldung.com/spring-cloud-gateway)
diff --git a/spring-cloud/spring-cloud-gateway/gateway-service/pom.xml b/spring-cloud/spring-cloud-gateway/gateway-service/pom.xml
new file mode 100644
index 0000000000..14cde4901a
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/gateway-service/pom.xml
@@ -0,0 +1,79 @@
+
+ 4.0.0
+
+ gateway-service
+ 1.0.0-SNAPSHOT
+ jar
+
+ Spring Cloud Gateway Service
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-gateway
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ 2.0.0.M2
+
+
+
+
+ org.springframework.boot
+ spring-boot-actuator
+ ${version}
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+ ${version}
+
+
+ org.springframework.cloud
+ spring-cloud-gateway-core
+ ${version}
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+ ${version}
+
+
+ org.hibernate
+ hibernate-validator-cdi
+ 6.0.2.Final
+
+
+ javax.validation
+ validation-api
+ 2.0.0.Final
+
+
+ io.projectreactor.ipc
+ reactor-netty
+ 0.7.0.M1
+
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ https://repo.spring.io/snapshot
+
+ true
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/gateway-service/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java b/spring-cloud/spring-cloud-gateway/gateway-service/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java
new file mode 100644
index 0000000000..4d5f61315f
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/gateway-service/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.cloud;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/gateway-service/src/main/resources/application.yml b/spring-cloud/spring-cloud-gateway/gateway-service/src/main/resources/application.yml
new file mode 100644
index 0000000000..8b981f8071
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/gateway-service/src/main/resources/application.yml
@@ -0,0 +1,13 @@
+server:
+ port: 80
+spring:
+ cloud:
+ gateway:
+ routes:
+ - id: baeldung_route
+ uri: http://www.baeldung.com
+ predicates:
+ - Path=/baeldung
+management:
+ security:
+ enabled: false
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml
new file mode 100644
index 0000000000..095ca4ea31
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ com.baeldung.spring.cloud
+ spring-cloud-gateway
+ 1.0.0-SNAPSHOT
+
+ gateway-service
+
+ pom
+
+ Spring Cloud Gateway
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ UTF-8
+ 3.6.0
+ 1.4.2.RELEASE
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-maven-plugin.version}
+
+
+
+
+
diff --git a/testing/pom.xml b/testing/pom.xml
index 72ec2b2f0c..8f5c6ddb3d 100644
--- a/testing/pom.xml
+++ b/testing/pom.xml
@@ -86,6 +86,12 @@
jgotesting
${jgotesting.version}
test
+
+
+ org.jukito
+ jukito
+ 1.5
+ test
diff --git a/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java b/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java
new file mode 100644
index 0000000000..fd75e1bd9e
--- /dev/null
+++ b/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java
@@ -0,0 +1,7 @@
+package com.baeldung.introductionjukito;
+
+public interface Calculator {
+
+ public double add(double a, double b);
+
+}
diff --git a/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java b/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java
new file mode 100644
index 0000000000..2501569afc
--- /dev/null
+++ b/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java
@@ -0,0 +1,5 @@
+package com.baeldung.introductionjukito;
+
+public class ScientificCalculator extends SimpleCalculator {
+
+}
diff --git a/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java b/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java
new file mode 100644
index 0000000000..933baa3cd0
--- /dev/null
+++ b/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java
@@ -0,0 +1,10 @@
+package com.baeldung.introductionjukito;
+
+public class SimpleCalculator implements Calculator {
+
+ @Override
+ public double add(double a, double b) {
+ return a+b;
+ }
+
+}
diff --git a/testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java b/testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java
new file mode 100644
index 0000000000..313e1d2938
--- /dev/null
+++ b/testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.introductionjukito;
+
+import org.jukito.All;
+import org.jukito.JukitoModule;
+import org.jukito.JukitoRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import static org.junit.Assert.*;
+
+@RunWith(JukitoRunner.class)
+public class CalculatorTest {
+
+ public static class Module extends JukitoModule {
+
+ @Override
+ protected void configureTest() {
+ bindMany(Calculator.class, SimpleCalculator.class,
+ ScientificCalculator.class);
+ bindManyInstances(AdditionTest.class, new AdditionTest(1, 1, 2),
+ new AdditionTest(10, 10, 20),
+ new AdditionTest(18, 24, 42));
+ bindManyNamedInstances(Integer.class, "even", 2, 4, 6);
+ bindManyNamedInstances(Integer.class, "odd", 1, 3, 5);
+ }
+ }
+
+ public static class AdditionTest {
+
+ int a;
+ int b;
+ int expected;
+
+ public AdditionTest(int a, int b, int expected) {
+ this.a = a;
+ this.b = b;
+ this.expected = expected;
+ }
+ }
+
+ @Test
+ public void givenTwoNumbers_WhenAdd_ThenSumBoth(@All Calculator calc) {
+ double result = calc.add(1, 1);
+ assertEquals(2, result, .1);
+ }
+
+ @Test
+ public void givenTwoNumbers_WhenAdd_ThenSumBoth(@All Calculator calc,
+ @All AdditionTest addTest) {
+ double result = calc.add(addTest.a, addTest.b);
+ assertEquals(addTest.expected, result, .1);
+ }
+
+ @Test
+ public void givenEvenNumbers_whenPrint_thenOutput(@All("even") Integer i) {
+ System.out.println("even " + i);
+ }
+
+ @Test
+ public void givenOddNumbers_whenPrint_thenOutput(@All("odd") Integer i) {
+ System.out.println("odd " + i);
+ }
+}
diff --git a/vavr/pom.xml b/vavr/pom.xml
index 53cd07ddf7..2efaf7fd8c 100644
--- a/vavr/pom.xml
+++ b/vavr/pom.xml
@@ -74,7 +74,7 @@
1.8
- 0.9.0
+ 0.9.1
4.12
3.0.0
diff --git a/vavr/src/test/java/com/baeldung/vavr/collections/CollectionFactoryMethodsUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/collections/CollectionFactoryMethodsUnitTest.java
new file mode 100644
index 0000000000..60359d6803
--- /dev/null
+++ b/vavr/src/test/java/com/baeldung/vavr/collections/CollectionFactoryMethodsUnitTest.java
@@ -0,0 +1,107 @@
+package com.baeldung.vavr.collections;
+
+import static io.vavr.API.Array;
+import static io.vavr.API.Failure;
+import static io.vavr.API.List;
+import static io.vavr.API.None;
+import static io.vavr.API.Some;
+import static io.vavr.API.Stream;
+import static io.vavr.API.Success;
+import static io.vavr.API.Tuple;
+import static io.vavr.API.Vector;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import io.vavr.Tuple3;
+import io.vavr.collection.Array;
+import io.vavr.collection.List;
+import io.vavr.collection.Stream;
+import io.vavr.collection.Vector;
+import io.vavr.control.Option;
+import io.vavr.control.Try;
+
+public class CollectionFactoryMethodsUnitTest {
+
+ @Test
+ public void givenANoneOptionElement_whenCreated_thenCorrect() {
+ Option none = None();
+ assertFalse(none == null);
+ assertEquals(none, Option.none());
+ }
+
+ @Test
+ public void givenASomeOptionElement_whenCreated_thenCorrect() {
+ Option some = Some(1);
+ assertFalse(some == null);
+ assertTrue(some.contains(1));
+ }
+
+ @Test
+ public void givenATupleElement_whenCreated_thenCorrect() {
+ Tuple3 tuple = Tuple('a', "chain", 2);
+ assertTrue(tuple!=null);
+ assertEquals(tuple._1(), new Character('a'));
+ assertEquals(tuple._2(), "chain");
+ assertEquals(tuple._3().intValue(), 2);
+ }
+
+ @Test
+ public void givenASuccessObject_whenEvaluated_thenSuccess() {
+ Try integer = Success(55);
+ assertEquals(integer.get().intValue(), 55);
+ }
+ @Test
+ public void givenAFailureObject_whenEvaluated_thenExceptionThrown() {
+ Try failure = Failure(new Exception("Exception X encapsulated here"));
+
+ try {
+ Integer i = failure.get();// evaluate a failure raise the exception
+ System.out.println(i);// not executed
+ } catch (Exception e) {
+ assertEquals(e.getMessage(), "Exception X encapsulated here");
+ }
+ }
+
+ @Test
+ public void givenAList_whenCreated_thenCorrect() {
+ List list = List(1, 2, 3, 4, 5);
+
+ assertEquals(list.size(), 5);
+ assertEquals(list.get(0).intValue(), 1);
+ }
+
+ @Test
+ public void givenAnEmptyList_whenCreated_thenCorrect() {
+ List empty = List();
+
+ assertEquals(empty.size(), 0);
+ assertEquals(empty, List.empty());
+ }
+
+ @Test
+ public void givenAnArray_whenCreated_thenCorrect() {
+ Array array = Array(1, 2, 3, 4, 5);
+
+ assertEquals(array.size(), 5);
+ assertEquals(array.get(0).intValue(), 1);
+ }
+
+ @Test
+ public void givenAStream_whenCreated_thenCorrect() {
+ Stream stream = Stream(1, 2, 3, 4, 5);
+
+ assertEquals(stream.size(), 5);
+ assertEquals(stream.get(0).intValue(), 1);
+ }
+
+ @Test
+ public void givenAVector_whenCreated_thenCorrect() {
+ Vector vector = Vector(1, 2, 3, 4, 5);
+
+ assertEquals(vector.size(), 5);
+ assertEquals(vector.get(0).intValue(), 1);
+ }
+}
diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java
index 84621e3a68..437742c964 100644
--- a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java
+++ b/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java
@@ -5,17 +5,23 @@ import static io.vavr.API.Case;
import static io.vavr.API.Match;
import static io.vavr.Predicates.exists;
import static io.vavr.Predicates.forAll;
-import static org.awaitility.Awaitility.await;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.CancellationException;
+import java.util.function.Consumer;
import java.util.function.Predicate;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.internal.verification.VerificationModeFactory;
+import org.mockito.verification.Timeout;
+import io.vavr.Tuple;
+import io.vavr.Tuple2;
import io.vavr.collection.List;
import io.vavr.concurrent.Future;
+import io.vavr.control.Try;
public class FutureUnitTest {
@@ -26,8 +32,7 @@ public class FutureUnitTest {
public void givenFunctionReturnInteger_WhenCallWithFuture_ShouldReturnFunctionValue() {
Future future = Future.of(() -> 1);
- assertEquals(1, future.get()
- .intValue());
+ assertEquals(1, future.get().intValue());
}
@Test
@@ -57,33 +62,29 @@ public class FutureUnitTest {
@Test
public void givenFunction_WhenCallWithFutureAndRegisterConsumerForSuccess_ShouldCallConsumerToStoreValue() {
- final int[] store = new int[] { 0 };
Future future = Future.of(() -> 1);
- future.onSuccess(i -> {
- store[0] = i;
- });
- await().until(() -> store[0] == 1);
+ MockConsumer consumer = Mockito.mock(MockConsumer.class);
+ future.onSuccess(consumer);
+ Mockito.verify(consumer, new Timeout(1000, VerificationModeFactory.times(1))).accept(1);
}
@Test
public void givenFunctionThrowException_WhenCallWithFutureAndRegisterConsumerForFailer_ShouldCallConsumerToStoreException() {
- final Throwable[] store = new Throwable[] { null };
Future future = Future.of(() -> getResourceThrowException(""));
- future.onFailure(err -> store[0] = err);
- await().until(() -> RuntimeException.class.isInstance(store[0]));
+ MockThrowableConsumer consumer = Mockito.mock(MockThrowableConsumer.class);
+ future.onFailure(consumer);
+ Mockito.verify(consumer, new Timeout(1000, VerificationModeFactory.times(1))).accept(Mockito.any());
}
@Test
public void givenAFuture_WhenAddAndThenConsumer_ShouldCallConsumerWithResultOfFutureAction() {
- int[] store1 = new int[1];
- int[] store2 = new int[1];
+ MockTryConsumer consumer1 = Mockito.mock(MockTryConsumer.class);
+ MockTryConsumer consumer2 = Mockito.mock(MockTryConsumer.class);
Future future = Future.of(() -> 1);
- Future andThenFuture = future.andThen(i -> store1[0] = i.get() + 1)
- .andThen(i -> store2[0] = store1[0] + 1);
+ Future andThenFuture = future.andThen(consumer1).andThen(consumer2);
andThenFuture.await();
-
- assertEquals(2, store1[0]);
- assertEquals(3, store2[0]);
+ Mockito.verify(consumer1, VerificationModeFactory.times(1)).accept(Try.success(1));
+ Mockito.verify(consumer2, VerificationModeFactory.times(1)).accept(Try.success(1));
}
@Test
@@ -91,8 +92,7 @@ public class FutureUnitTest {
Future future = Future.failed(new RuntimeException());
Future future2 = future.orElse(Future.of(() -> 2));
- assertEquals(2, future2.get()
- .intValue());
+ assertEquals(2, future2.get().intValue());
}
@Test(expected = CancellationException.class)
@@ -124,17 +124,46 @@ public class FutureUnitTest {
Future future = Future.failed(new RuntimeException());
Future fallbackFuture = Future.of(() -> expectedResult);
Future futureResult = future.fallbackTo(fallbackFuture);
- futureResult.await();
assertEquals(expectedResult, futureResult.get());
}
+
+ @Test
+ public void givenAFuture_WhenTransformByAddingOne_ShouldReturn() {
+ Future