diff --git a/core-java/README.md b/core-java/README.md
index b4b8d9062e..dcf77ff536 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -114,4 +114,5 @@
- [StringBuilder and StringBuffer in Java](http://www.baeldung.com/java-string-builder-string-buffer)
- [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int)
- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns)
+- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
diff --git a/drools/README.MD b/drools/README.MD
index e3f00f5047..b2259e2878 100644
--- a/drools/README.MD
+++ b/drools/README.MD
@@ -1,4 +1,3 @@
### Relevant Articles:
- [Introduction to Drools](http://www.baeldung.com/drools)
- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel)
-- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel)
diff --git a/drools/pom.xml b/drools/pom.xml
index 971bd5f4b8..5f228802fa 100644
--- a/drools/pom.xml
+++ b/drools/pom.xml
@@ -1,68 +1,87 @@
- 4.0.0
-
- drools
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ drools
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
4.4.6
- 7.1.0.Beta2
+ 7.4.1.Final
3.13
-
-
- org.apache.httpcomponents
- httpcore
- ${http-component-version}
-
-
-
- org.kie
- kie-ci
- ${drools-version}
-
-
- org.drools
- drools-decisiontables
- ${drools-version}
-
+
+
+ org.apache.httpcomponents
+ httpcore
+ ${http-component-version}
+
+
+
+ org.kie
+ kie-ci
+ ${drools-version}
+
+
+ org.drools
+ drools-decisiontables
+ ${drools-version}
+
-
- org.drools
- drools-core
- ${drools-version}
-
-
- org.drools
- drools-compiler
- ${drools-version}
-
-
- org.apache.poi
- poi
- ${apache-poi-version}
-
+
+ org.drools
+ drools-core
+ ${drools-version}
+
+
+ org.drools
+ drools-compiler
+ ${drools-version}
+
+
+ org.apache.poi
+ poi
+ ${apache-poi-version}
+
-
- org.apache.poi
- poi-ooxml
- ${apache-poi-version}
-
+
+ org.apache.poi
+ poi-ooxml
+ ${apache-poi-version}
+
-
- org.springframework
- spring-core
- 4.3.6.RELEASE
-
+
+ org.springframework
+ spring-core
+ 4.3.6.RELEASE
+
-
+
-
\ No newline at end of file
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
diff --git a/guava-modules/README.md b/guava-modules/README.md
new file mode 100644
index 0000000000..79e45a89e7
--- /dev/null
+++ b/guava-modules/README.md
@@ -0,0 +1,3 @@
+
+## Guava Modules
+
diff --git a/logging-modules/README.md b/logging-modules/README.md
new file mode 100644
index 0000000000..23458cf30b
--- /dev/null
+++ b/logging-modules/README.md
@@ -0,0 +1,3 @@
+
+## Logging Modules
+
diff --git a/lucene/pom.xml b/lucene/pom.xml
new file mode 100644
index 0000000000..42b81a7d4a
--- /dev/null
+++ b/lucene/pom.xml
@@ -0,0 +1,37 @@
+
+ 4.0.0
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+ lucene
+ 0.0.1-SNAPSHOT
+ lucene
+ An Apache Lucene demo application
+
+
+
+
+ org.apache.lucene
+ lucene-core
+ 7.1.0
+
+
+
+ org.apache.lucene
+ lucene-queryparser
+ 7.1.0
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
\ No newline at end of file
diff --git a/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java b/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java
new file mode 100644
index 0000000000..40a35fad86
--- /dev/null
+++ b/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java
@@ -0,0 +1,78 @@
+package com.baeldung.lucene;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.queryparser.classic.ParseException;
+import org.apache.lucene.queryparser.classic.QueryParser;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.Directory;
+
+public class InMemoryLuceneIndex {
+
+ private Directory memoryIndex;
+ private StandardAnalyzer analyzer;
+
+ public InMemoryLuceneIndex(Directory memoryIndex, StandardAnalyzer analyzer) {
+ super();
+ this.memoryIndex = memoryIndex;
+ this.analyzer = analyzer;
+ }
+
+ /**
+ *
+ * @param title
+ * @param body
+ */
+ public void indexDocument(String title, String body) {
+
+ IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
+ try {
+ IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig);
+ Document document = new Document();
+
+ document.add(new TextField("title", title, Field.Store.YES));
+ document.add(new TextField("body", body, Field.Store.YES));
+
+ writter.addDocument(document);
+ writter.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public List searchIndex(String inField, String queryString) {
+ try {
+ Query query = new QueryParser(inField, analyzer).parse(queryString);
+
+ IndexReader indexReader = DirectoryReader.open(memoryIndex);
+ IndexSearcher searcher = new IndexSearcher(indexReader);
+ TopDocs topDocs = searcher.search(query, 10);
+ List documents = new ArrayList<>();
+ for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+ documents.add(searcher.doc(scoreDoc.doc));
+ }
+
+ return documents;
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+}
+
+
diff --git a/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java b/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java
new file mode 100644
index 0000000000..c3a498a4b8
--- /dev/null
+++ b/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.lucene;
+
+import java.util.List;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.store.RAMDirectory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LuceneInMemorySearchTest {
+
+ @Test
+ public void givenSearchQueryWhenFetchedDocumentThenCorrect() {
+ InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
+ inMemoryLuceneIndex.indexDocument("Hello world", "Some hello world ");
+
+ List documents = inMemoryLuceneIndex.searchIndex("body", "world");
+
+ Assert.assertEquals("Hello world", documents.get(0).get("title"));
+ }
+
+}
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java
index 5570c2e1dd..bd383b4568 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java
@@ -1,11 +1,11 @@
package com.baeldung.templatemethodpattern.application;
import com.baeldung.templatemethodpattern.model.Computer;
+import com.baeldung.templatemethodpattern.model.StandardComputer;
+import com.baeldung.templatemethodpattern.model.HighEndComputer;
import com.baeldung.templatemethodpattern.model.ComputerBuilder;
import com.baeldung.templatemethodpattern.model.HighEndComputerBuilder;
import com.baeldung.templatemethodpattern.model.StandardComputerBuilder;
-import com.baeldung.templatemethodpattern.model.HighEndComputer;
-import com.baeldung.templatemethodpattern.model.StandardComputer;
public class Application {
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java
index d422204b82..128eec59ad 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java
@@ -5,33 +5,15 @@ import java.util.Map;
import java.util.ArrayList;
import java.util.List;
-public abstract class ComputerBuilder {
+public class Computer {
- protected Map computerParts = new HashMap<>();
- protected List moterboardSetupStatus = new ArrayList<>();
+ private Map computerParts = new HashMap<>();
- public final Computer buildComputer() {
- addMotherboard();
- setupMotherboard();
- addProcessor();
- return getComputer();
+ public Computer(Map computerParts) {
+ this.computerParts = computerParts;
}
- public abstract void addMotherboard();
-
- public abstract void setupMotherboard();
-
- public abstract void addProcessor();
-
- public List getMotherboardSetupStatus() {
- return moterboardSetupStatus;
- }
-
public Map getComputerParts() {
return computerParts;
}
-
- private Computer getComputer() {
- return new Computer(computerParts);
- }
}
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/ComputerBuilder.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/ComputerBuilder.java
index f264d33215..39052f4776 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/ComputerBuilder.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/ComputerBuilder.java
@@ -8,7 +8,7 @@ import java.util.Map;
public abstract class ComputerBuilder {
protected Map computerParts = new HashMap<>();
- protected List moterboardSetupStatus = new ArrayList<>();
+ protected List motherboardSetupStatus = new ArrayList<>();
public final Computer buildComputer() {
addMotherboard();
@@ -20,13 +20,13 @@ public abstract class ComputerBuilder {
public abstract void addMotherboard();
public abstract void setupMotherboard();
-
+
public abstract void addProcessor();
public List getMotherboardSetupStatus() {
- return moterboardSetupStatus;
+ return motherboardSetupStatus;
}
-
+
public Map getComputerParts() {
return computerParts;
}
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java
index 8d80e1e108..16d89f1ad6 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java
@@ -1,26 +1,10 @@
package com.baeldung.templatemethodpattern.model;
-public class HighEndComputer extends Computer {
+import java.util.Map;
- @Override
- public void addMotherboard() {
- computerParts.put("Motherboard", "High-end Motherboard");
- }
+public class HighEndComputer extends Computer {
- @Override
- public void setupMotherboard() {
- moterboardSetupStatus.add("Screwing the high-end motherboard to the case.");
- moterboardSetupStatus.add("Pluging in the power supply connectors.");
- moterboardSetupStatus.forEach(step -> System.out.println(step));
- }
-
- @Override
- public void addProcessor() {
- computerParts.put("Processor", "High-end Processor");
- }
-
- @Override
- public void addMotherboard() {
- computerParts.put("Motherboard", "High End Motherboard");
- }
+ public HighEndComputer(Map computerParts) {
+ super(computerParts);
+ }
}
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputerBuilder.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputerBuilder.java
index cf53a2ae6c..baa800ca8f 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputerBuilder.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputerBuilder.java
@@ -9,13 +9,13 @@ public class HighEndComputerBuilder extends ComputerBuilder {
@Override
public void setupMotherboard() {
- moterboardSetupStatus.add("Screwing the high-end motherboard to the case.");
- moterboardSetupStatus.add("Pluging in the power supply connectors.");
- moterboardSetupStatus.forEach(step -> System.out.println(step));
+ motherboardSetupStatus.add("Screwing the high-end motherboard to the case.");
+ motherboardSetupStatus.add("Pluging in the power supply connectors.");
+ motherboardSetupStatus.forEach(step -> System.out.println(step));
}
@Override
public void addProcessor() {
- computerParts.put("Processor", "High-end Processor");
+ computerParts.put("Processor", "High-end Processor");
}
}
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java
index 8410ad88ee..14d32d7b64 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java
@@ -1,25 +1,10 @@
package com.baeldung.templatemethodpattern.model;
-
+
+import java.util.Map;
+
public class StandardComputer extends Computer {
- public void addMotherboard() {
- computerParts.put("Motherboard", "Standard Motherboard");
- }
-
- @Override
- public void setupMotherboard() {
- moterboardSetupStatus.add("Screwing the standard motherboard to the case.");
- moterboardSetupStatus.add("Pluging in the power supply connectors.");
- moterboardSetupStatus.forEach(step -> System.out.println(step));
- }
-
- @Override
- public void addProcessor() {
- computerParts.put("Processor", "Standard Processor");
- }
-
- @Override
- public void addMotherboard() {
- computerParts.put("Motherboard", "Standard Motherboard");
- }
+ public StandardComputer(Map computerParts) {
+ super(computerParts);
+ }
}
diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputerBuilder.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputerBuilder.java
index 1d9bd0e00f..78547dc38b 100644
--- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputerBuilder.java
+++ b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputerBuilder.java
@@ -9,9 +9,9 @@ public class StandardComputerBuilder extends ComputerBuilder {
@Override
public void setupMotherboard() {
- moterboardSetupStatus.add("Screwing the standard motherboard to the case.");
- moterboardSetupStatus.add("Pluging in the power supply connectors.");
- moterboardSetupStatus.forEach(step -> System.out.println(step));
+ motherboardSetupStatus.add("Screwing the standard motherboard to the case.");
+ motherboardSetupStatus.add("Pluging in the power supply connectors.");
+ motherboardSetupStatus.forEach(step -> System.out.println(step));
}
@Override
diff --git a/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java b/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java
index df5751fb03..1d608ff2c2 100644
--- a/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java
+++ b/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java
@@ -29,12 +29,12 @@ public class TemplateMethodPatternTest {
@Test
public void givenStandardMotherBoard_whenAddingMotherBoard_thenEqualAssertion() {
- standardComputer.addMotherboard();
- assertEquals("Standard Motherboard", standardComputer.getComputerParts().get("Motherboard"));
+ standardComputerBuilder.addMotherboard();
+ assertEquals("Standard Motherboard", standardComputerBuilder.getComputerParts().get("Motherboard"));
}
@Test
- public void givenStandardMotheroboard_whenSetup_thenTwoEqualAssertions() {
+ public void givenStandardMotherboard_whenSetup_thenTwoEqualAssertions() {
standardComputerBuilder.setupMotherboard();
assertEquals("Screwing the standard motherboard to the case.", standardComputerBuilder.getMotherboardSetupStatus().get(0));
assertEquals("Pluging in the power supply connectors.", standardComputerBuilder.getMotherboardSetupStatus().get(1));
diff --git a/persistence-modules/README.md b/persistence-modules/README.md
new file mode 100644
index 0000000000..6c2b1d2ca9
--- /dev/null
+++ b/persistence-modules/README.md
@@ -0,0 +1,3 @@
+
+## Persistence Modules
+
diff --git a/pom.xml b/pom.xml
index b9186f9304..20f7c4ffad 100644
--- a/pom.xml
+++ b/pom.xml
@@ -261,6 +261,7 @@
saas
deeplearning4j
spring-boot-admin
+ lucene
diff --git a/spring-5/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java b/spring-5/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java
new file mode 100644
index 0000000000..c6d3b7ff10
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java
@@ -0,0 +1,18 @@
+package com.baeldung.jupiter;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.test.context.junit.jupiter.EnabledIf;
+
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@EnabledIf(
+ expression = "#{systemProperties['java.version'].startsWith('1.8')}",
+ reason = "Enabled on Java 8"
+)
+public @interface EnabledOnJava8 {
+
+}
diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java
new file mode 100644
index 0000000000..ae058bc8ba
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.jupiter;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.DisabledIf;
+import org.springframework.test.context.junit.jupiter.EnabledIf;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+@SpringJUnitConfig(Spring5EnabledAnnotationTest.Config.class)
+@TestPropertySource(properties = { "tests.enabled=true" })
+public class Spring5EnabledAnnotationTest {
+
+ @Configuration
+ static class Config {
+ }
+
+ @EnabledIf("true")
+ @Test
+ void givenEnabledIfLiteral_WhenTrue_ThenTestExecuted() {
+ assertTrue(true);
+ }
+
+ @EnabledIf(expression = "${tests.enabled}", loadContext = true)
+ @Test
+ void givenEnabledIfExpression_WhenTrue_ThenTestExecuted() {
+ assertTrue(true);
+ }
+
+ @EnabledIf("#{systemProperties['java.version'].startsWith('1.8')}")
+ @Test
+ void givenEnabledIfSpel_WhenTrue_ThenTestExecuted() {
+ assertTrue(true);
+ }
+
+ @EnabledOnJava8
+ @Test
+ void givenEnabledOnJava8_WhenTrue_ThenTestExecuted() {
+ assertTrue(true);
+ }
+
+ @DisabledIf("#{systemProperties['java.version'].startsWith('1.7')}")
+ @Test
+ void givenDisabledIf_WhenTrue_ThenTestNotExecuted() {
+ assertTrue(true);
+ }
+
+}
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index 93bf6ea74b..fd023a5ea5 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.spring.cloud
@@ -15,8 +15,9 @@
spring-cloud-ribbon-client
spring-cloud-rest
spring-cloud-zookeeper
- spring-cloud-gateway
- spring-cloud-connectors-heroku
+ spring-cloud-gateway
+ spring-cloud-stream
+ spring-cloud-connectors-heroku
pom
@@ -38,6 +39,7 @@
1.2.3.RELEASE
1.2.3.RELEASE
1.2.3.RELEASE
+ 1.3.0.RELEASE
1.4.2.RELEASE
3.6.0
1.4.2.RELEASE
diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml
new file mode 100644
index 0000000000..5ec24268d9
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+
+ org.baeldung
+ spring-cloud-stream
+ pom
+
+ spring-cloud-stream
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+
+
+
+ spring-cloud-stream-rabbit
+
+
+
+ UTF-8
+ 3.6.0
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+ ${spring-cloud-stream.version}
+
+
+
+ org.springframework.cloud
+ spring-cloud-stream
+ ${spring-cloud-stream.version}
+
+
+
+ org.springframework.cloud
+ spring-cloud-stream-test-support
+ ${spring-cloud-stream.version}
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-maven-plugin.version}
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml
new file mode 100644
index 0000000000..a954a7035e
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ spring-cloud-stream-rabbit
+ jar
+
+ spring-cloud-stream-rabbit
+ Simple Spring Cloud Stream
+
+
+ org.baeldung
+ spring-cloud-stream
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+ org.springframework.cloud
+ spring-cloud-stream-test-support
+ test
+
+
+
+
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java
new file mode 100644
index 0000000000..375494dfac
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java
@@ -0,0 +1,38 @@
+package com.baeldung.spring.cloud.stream.rabbit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+
+import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor;
+
+@SpringBootApplication
+@EnableBinding(MyProcessor.class)
+public class MultipleOutputsServiceApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(MultipleOutputsServiceApplication.class, args);
+ }
+
+ @Autowired
+ private MyProcessor processor;
+
+ @StreamListener(MyProcessor.INPUT)
+ public void routeValues(Integer val) {
+ if (val < 10) {
+ processor.anOutput()
+ .send(message(val));
+ } else {
+ processor.anotherOutput()
+ .send(message(val));
+ }
+ }
+
+ private static final Message message(T val) {
+ return MessageBuilder.withPayload(val)
+ .build();
+ }
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java
new file mode 100644
index 0000000000..4729e418b6
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java
@@ -0,0 +1,39 @@
+package com.baeldung.spring.cloud.stream.rabbit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+
+import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor;
+
+@SpringBootApplication
+@EnableBinding(MyProcessor.class)
+public class MultipleOutputsWithConditionsServiceApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(MultipleOutputsWithConditionsServiceApplication.class, args);
+ }
+
+ @Autowired
+ private MyProcessor processor;
+
+ @StreamListener(target = MyProcessor.INPUT, condition = "payload < 10")
+ public void routeValuesToAnOutput(Integer val) {
+ processor.anOutput()
+ .send(message(val));
+ }
+
+ @StreamListener(target = MyProcessor.INPUT, condition = "payload >= 10")
+ public void routeValuesToAnotherOutput(Integer val) {
+ processor.anotherOutput()
+ .send(message(val));
+ }
+
+ private static final Message message(T val) {
+ return MessageBuilder.withPayload(val)
+ .build();
+ }
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java
new file mode 100644
index 0000000000..aac551e544
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java
@@ -0,0 +1,32 @@
+package com.baeldung.spring.cloud.stream.rabbit;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.cloud.stream.messaging.Processor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.messaging.converter.MessageConverter;
+import org.springframework.messaging.handler.annotation.SendTo;
+
+import com.baeldung.spring.cloud.stream.rabbit.messages.TextPlainMessageConverter;
+import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage;
+
+@SpringBootApplication
+@EnableBinding(Processor.class)
+public class MyLoggerServiceApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(MyLoggerServiceApplication.class, args);
+ }
+
+ @Bean
+ public MessageConverter providesTextPlainMessageConverter() {
+ return new TextPlainMessageConverter();
+ }
+
+ @StreamListener(Processor.INPUT)
+ @SendTo(Processor.OUTPUT)
+ public LogMessage enrichLogMessage(LogMessage log) {
+ return new LogMessage(String.format("[1]: %s", log.getMessage()));
+ }
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java
new file mode 100644
index 0000000000..d690ee38a9
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java
@@ -0,0 +1,26 @@
+package com.baeldung.spring.cloud.stream.rabbit.messages;
+
+import org.springframework.messaging.Message;
+import org.springframework.messaging.converter.AbstractMessageConverter;
+import org.springframework.util.MimeType;
+
+import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage;
+
+public class TextPlainMessageConverter extends AbstractMessageConverter {
+
+ public TextPlainMessageConverter() {
+ super(new MimeType("text", "plain"));
+ }
+
+ @Override
+ protected boolean supports(Class> clazz) {
+ return (LogMessage.class == clazz);
+ }
+
+ @Override
+ protected Object convertFromInternal(Message> message, Class> targetClass, Object conversionHint) {
+ Object payload = message.getPayload();
+ String text = payload instanceof String ? (String) payload : new String((byte[]) payload);
+ return new LogMessage(text);
+ }
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java
new file mode 100644
index 0000000000..44a6ca4d4e
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java
@@ -0,0 +1,32 @@
+package com.baeldung.spring.cloud.stream.rabbit.model;
+
+import java.io.Serializable;
+
+public class LogMessage implements Serializable {
+
+ private static final long serialVersionUID = -5857383701708275796L;
+
+ private String message;
+
+ public LogMessage() {
+
+ }
+
+ public LogMessage(String message) {
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String toString() {
+ return message;
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java
new file mode 100644
index 0000000000..563ce06b6f
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.cloud.stream.rabbit.processor;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.SubscribableChannel;
+
+public interface MyProcessor {
+ String INPUT = "myInput";
+
+ @Input
+ SubscribableChannel myInput();
+
+ @Output("myOutput")
+ MessageChannel anOutput();
+
+ @Output
+ MessageChannel anotherOutput();
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml
new file mode 100644
index 0000000000..3d9d97a736
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml
@@ -0,0 +1,28 @@
+spring:
+ cloud:
+ stream:
+ bindings:
+ input:
+ destination: queue.log.messages
+ binder: local_rabbit
+ group: logMessageConsumers
+ output:
+ destination: queue.pretty.log.messages
+ binder: local_rabbit
+ binders:
+ local_rabbit:
+ type: rabbit
+ environment:
+ spring:
+ rabbitmq:
+ host: localhost
+ port: 5672
+ username: guest
+ password: guest
+ virtual-host: /
+server:
+ port: 0
+management:
+ health:
+ binders:
+ enabled: true
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java
new file mode 100644
index 0000000000..898d06897f
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.spring.cloud.stream.rabbit;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.test.binder.MessageCollector;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MultipleOutputsServiceApplication.class)
+@DirtiesContext
+public class MultipleOutputsServiceApplicationIntegrationTest {
+
+ @Autowired
+ private MyProcessor pipe;
+
+ @Autowired
+ private MessageCollector messageCollector;
+
+ @Test
+ public void whenSendMessage_thenResponseIsInAOutput() {
+ whenSendMessage(1);
+ thenPayloadInChannelIs(pipe.anOutput(), 1);
+ }
+
+ @Test
+ public void whenSendMessage_thenResponseIsInAnotherOutput() {
+ whenSendMessage(11);
+ thenPayloadInChannelIs(pipe.anotherOutput(), 11);
+ }
+
+ private void whenSendMessage(Integer val) {
+ pipe.myInput()
+ .send(MessageBuilder.withPayload(val)
+ .build());
+ }
+
+ private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) {
+ Object payload = messageCollector.forChannel(channel)
+ .poll()
+ .getPayload();
+ assertEquals(expectedValue, payload);
+ }
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java
new file mode 100644
index 0000000000..c3bf5a1205
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.spring.cloud.stream.rabbit;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.test.binder.MessageCollector;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MultipleOutputsWithConditionsServiceApplication.class)
+@DirtiesContext
+public class MultipleOutputsWithConditionsServiceIntegrationTest {
+
+ @Autowired
+ private MyProcessor pipe;
+
+ @Autowired
+ private MessageCollector messageCollector;
+
+ @Test
+ public void whenSendMessage_thenResponseIsInAOutput() {
+ whenSendMessage(1);
+ thenPayloadInChannelIs(pipe.anOutput(), 1);
+ }
+
+ @Test
+ public void whenSendMessage_thenResponseIsInAnotherOutput() {
+ whenSendMessage(11);
+ thenPayloadInChannelIs(pipe.anotherOutput(), 11);
+ }
+
+ private void whenSendMessage(Integer val) {
+ pipe.myInput()
+ .send(MessageBuilder.withPayload(val)
+ .build());
+ }
+
+ private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) {
+ Object payload = messageCollector.forChannel(channel)
+ .poll()
+ .getPayload();
+ assertEquals(expectedValue, payload);
+ }
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java
new file mode 100644
index 0000000000..21d84e79e0
--- /dev/null
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.spring.cloud.stream.rabbit;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.messaging.Processor;
+import org.springframework.cloud.stream.test.binder.MessageCollector;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MyLoggerServiceApplication.class)
+@DirtiesContext
+public class MyLoggerApplicationIntegrationTest {
+
+ @Autowired
+ private Processor pipe;
+
+ @Autowired
+ private MessageCollector messageCollector;
+
+ @Test
+ public void whenSendMessage_thenResponseShouldUpdateText() {
+ pipe.input()
+ .send(MessageBuilder.withPayload(new LogMessage("This is my message"))
+ .build());
+
+ Object payload = messageCollector.forChannel(pipe.output())
+ .poll()
+ .getPayload();
+
+ assertEquals("[1]: This is my message", payload.toString());
+ }
+}
diff --git a/spring-rest-shell/README.md b/spring-rest-shell/README.md
index 06e18450c6..901d9a51ee 100644
--- a/spring-rest-shell/README.md
+++ b/spring-rest-shell/README.md
@@ -2,4 +2,4 @@
### Relevant Articles
-- [Spring REST Shell](http://www.baeldung.com/)
\ No newline at end of file
+- [Spring REST Shell](http://www.baeldung.com/spring-rest-shell)
\ No newline at end of file
diff --git a/testing-modules/README.md b/testing-modules/README.md
new file mode 100644
index 0000000000..3fbeea6188
--- /dev/null
+++ b/testing-modules/README.md
@@ -0,0 +1,3 @@
+
+## Testing Modules
+
diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml
index 229703ccf5..2be8937d04 100644
--- a/testing-modules/junit-5/pom.xml
+++ b/testing-modules/junit-5/pom.xml
@@ -20,7 +20,7 @@
UTF-8
1.8
- 5.0.1
+ 5.0.2
1.0.1
4.12.1
2.8.2
@@ -127,4 +127,4 @@
-
\ No newline at end of file
+
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationTest.java
new file mode 100644
index 0000000000..43b39d6859
--- /dev/null
+++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.mockito.java8;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.mockito.exceptions.base.MockitoAssertionError;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.VerificationCollector;
+
+public class LazyVerificationTest {
+
+ @Test
+ public void whenLazilyVerified_thenReportsMultipleFailures() {
+ VerificationCollector collector = MockitoJUnit.collector()
+ .assertLazily();
+
+ List mockList = mock(List.class);
+ verify(mockList).add("one");
+ verify(mockList).clear();
+
+ try {
+ collector.collectAndReport();
+ } catch (MockitoAssertionError error) {
+ assertTrue(error.getMessage()
+ .contains("1. Wanted but not invoked:"));
+ assertTrue(error.getMessage()
+ .contains("2. Wanted but not invoked:"));
+ }
+ }
+}
diff --git a/testing-modules/mocks/README.md b/testing-modules/mocks/README.md
index 15370b812b..d7b817c518 100644
--- a/testing-modules/mocks/README.md
+++ b/testing-modules/mocks/README.md
@@ -1,6 +1,5 @@
## Relevant articles:
-- [Introduction to MockServer](http://www.baeldung.com/mockserver)
- [JMockit Advanced Usage](http://www.baeldung.com/jmockit-advanced-usage)
- [A Guide to JMockit Expectations](http://www.baeldung.com/jmockit-expectations)
- [JMockit 101](http://www.baeldung.com/jmockit-101)
diff --git a/testing-modules/rest-testing/README.md b/testing-modules/rest-testing/README.md
index 37a53dd815..c6185de05f 100644
--- a/testing-modules/rest-testing/README.md
+++ b/testing-modules/rest-testing/README.md
@@ -10,3 +10,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Introduction to WireMock](http://www.baeldung.com/introduction-to-wiremock)
- [REST API Testing with Cucumber](http://www.baeldung.com/cucumber-rest-api-testing)
- [Testing a REST API with JBehave](http://www.baeldung.com/jbehave-rest-testing)
+- [REST API Testing with Karate](http://www.baeldung.com/karate-rest-api-testing)