From 7d1499f5c3fa8c4d28764024a9ec4a251dc387c7 Mon Sep 17 00:00:00 2001 From: Jon Cook Date: Mon, 12 Aug 2019 13:37:48 +0200 Subject: [PATCH 01/16] BAEL-2947 - Guide to Junit 4 Rules --- testing-modules/junit-4/pom.xml | 18 ++++ .../junit-4/src/main/resources/logback.xml | 13 +++ .../com/baeldung/rules/MessageLogger.java | 34 +++++++ .../com/baeldung/rules/RuleChainUnitTest.java | 21 +++++ .../com/baeldung/rules/RulesUnitTest.java | 88 +++++++++++++++++++ .../baeldung/rules/TestMethodNameLogger.java | 32 +++++++ .../baeldung/rules/VerifierRuleUnitTest.java | 30 +++++++ testing-modules/pom.xml | 1 + 8 files changed, 237 insertions(+) create mode 100644 testing-modules/junit-4/pom.xml create mode 100644 testing-modules/junit-4/src/main/resources/logback.xml create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java diff --git a/testing-modules/junit-4/pom.xml b/testing-modules/junit-4/pom.xml new file mode 100644 index 0000000000..272a9380b5 --- /dev/null +++ b/testing-modules/junit-4/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + junit-4 + 1.0-SNAPSHOT + junit-4 + JUnit 4 Topics + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + diff --git a/testing-modules/junit-4/src/main/resources/logback.xml b/testing-modules/junit-4/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/testing-modules/junit-4/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java new file mode 100644 index 0000000000..45afc067d5 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java @@ -0,0 +1,34 @@ +package com.baeldung.rules; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MessageLogger implements TestRule { + + private static final Logger LOG = LoggerFactory.getLogger(MessageLogger.class); + + private String message; + + public MessageLogger(String message) { + this.message = message; + } + + @Override + public Statement apply(final Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + try { + LOG.info("Starting: {}", message); + base.evaluate(); + } finally { + LOG.info("Finished: {}", message); + } + } + }; + } + +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java new file mode 100644 index 0000000000..c66a62a3d0 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.rules; + +import static org.junit.Assert.assertTrue; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; + +public class RuleChainUnitTest { + + @Rule + public RuleChain chain = RuleChain.outerRule(new MessageLogger("First rule")) + .around(new MessageLogger("Second rule")) + .around(new MessageLogger("Third rule")); + + @Test + public void givenRuleChain_whenTestRuns_thenChainOrderApplied() { + assertTrue(true); + } + +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java new file mode 100644 index 0000000000..cc1cfa376d --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java @@ -0,0 +1,88 @@ +package com.baeldung.rules; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.isA; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.DisableOnDebug; +import org.junit.rules.ErrorCollector; +import org.junit.rules.ExpectedException; +import org.junit.rules.TemporaryFolder; +import org.junit.rules.TestName; +import org.junit.rules.Timeout; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RulesUnitTest { + + private static final Logger LOG = LoggerFactory.getLogger(RulesUnitTest.class); + + @Rule + public TemporaryFolder tmpFolder = new TemporaryFolder(); + + @Rule + public final ExpectedException thrown = ExpectedException.none(); + + @Rule + public TestName name = new TestName(); + + @Rule + public Timeout globalTimeout = Timeout.seconds(10); + + @Rule + public final ErrorCollector errorCollector = new ErrorCollector(); + + @Rule + public DisableOnDebug disableTimeout = new DisableOnDebug(Timeout.seconds(30)); + + @Rule + public TestMethodNameLogger testLogger = new TestMethodNameLogger(); + + @Test + public void givenTempFolderRule_whenNewFile_thenFileIsCreated() throws IOException { + File testFile = tmpFolder.newFile("test-file.txt"); + + assertTrue("The file should have been created: ", testFile.isFile()); + assertEquals("Temp folder and test file should match: ", tmpFolder.getRoot(), testFile.getParentFile()); + } + + @Test + public void givenIllegalArgument_whenExceptionThrown_thenMessageAndCauseMatches() { + thrown.expect(IllegalArgumentException.class); + thrown.expectCause(isA(NullPointerException.class)); + thrown.expectMessage("This is illegal"); + + throw new IllegalArgumentException("This is illegal", new NullPointerException()); + } + + @Test + public void givenAddition_whenPrintingTestName_thenTestNameIsDisplayed() { + LOG.info("Executing: {}", name.getMethodName()); + assertEquals("givenAddition_whenPrintingTestName_thenTestNameIsDisplayed", name.getMethodName()); + } + + @Ignore + @Test + public void givenLongRunningTest_whenTimout_thenTestFails() throws InterruptedException { + TimeUnit.SECONDS.sleep(20); + } + + @Ignore + @Test + public void givenMultipleErrors_whenTestRuns_thenCollectorReportsErrors() { + errorCollector.addError(new Throwable("First thing went wrong!")); + errorCollector.addError(new Throwable("Another thing went wrong!")); + + errorCollector.checkThat("Hello World", not(containsString("ERROR!"))); + } + +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java new file mode 100644 index 0000000000..df4de56131 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java @@ -0,0 +1,32 @@ +package com.baeldung.rules; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TestMethodNameLogger implements TestRule { + + private static final Logger LOG = LoggerFactory.getLogger(TestMethodNameLogger.class); + + @Override + public Statement apply(Statement base, Description description) { + logInfo("Before test", description); + try { + return new Statement() { + @Override + public void evaluate() throws Throwable { + base.evaluate(); + } + }; + } finally { + logInfo("After test", description); + } + } + + private void logInfo(String msg, Description description) { + LOG.info(msg + description.getMethodName()); + } + +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java new file mode 100644 index 0000000000..ffc3f611c3 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.rules; + +import static org.junit.Assert.assertFalse; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.Verifier; + +public class VerifierRuleUnitTest { + + private List messageLog = new ArrayList(); + + @Rule + public Verifier verifier = new Verifier() { + @Override + public void verify() { + assertFalse("Message Log is not Empty!", messageLog.isEmpty()); + } + }; + + @Test + public void givenNewMessage_whenVerified_thenMessageLogNotEmpty() { + // ... + messageLog.add("There is a new message!"); + } + +} diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 8d40c668c0..e15fdb4a37 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -37,5 +37,6 @@ easymock junit-5-advanced xmlunit-2 + junit-4 From c23cf58cd84a43e722f3cce6787c02250800154e Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Wed, 14 Aug 2019 17:13:49 +0200 Subject: [PATCH 02/16] Implemented the code to count words in a string in Java --- .../string/wordcount/WordCounter.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java new file mode 100644 index 0000000000..6b061c7925 --- /dev/null +++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java @@ -0,0 +1,58 @@ +package com.baeldung.string.wordcount; + +import java.util.StringTokenizer; + +/** + * Created by alfred on 14 August 2019 + */ +public class WordCounter { + public static void main(String[] args) { + //test string + String random = "Lorem%Ipsum is-simply dummy text."; + + System.out.printf("Using delimiter, word count: %d\n", countWordsUsingTokenizer(random)); + System.out.printf("Using no library method, word count: %d\n", countWordsManually(random)); + System.out.printf("Using punctuation regex, word count: %d\n", countWordsUsingRegex(random)); + System.out.printf("\n\n%s\n\n", random); + + } + + public static int countWordsUsingRegex(String arg) { + if (arg == null) { + return 0; + } + final String[] words = arg.split("\\pP|\\s+"); + return words.length; + } + + public static int countWordsUsingTokenizer(String arg) { + if (arg == null) { + return 0; + } + final StringTokenizer stringTokenizer = new StringTokenizer(arg); + return stringTokenizer.countTokens(); + } + + public static int countWordsManually(String arg) { + if (arg == null) { + return 0; + } + + int count = 0; + + boolean isAWord = false; + int argEnd = arg.length() - 1; + + for (int i = 0; i < arg.length(); i++) { + if (Character.isLetter(arg.charAt(i)) && i != argEnd) { + isAWord = true; + } else if (!Character.isLetter(arg.charAt(i)) && isAWord) { + count++; + isAWord = false; + } else if (Character.isLetter(arg.charAt(i)) && i == argEnd) { + count++; + } + } + return count; + } +} From 0dcf1268610cd24bdd5049073d3d9eaa10d20f4b Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Wed, 14 Aug 2019 20:39:00 +0200 Subject: [PATCH 03/16] Added test code for counting words in a string in Java --- .../main/java/com/baeldung/string/README.md | 3 --- .../string/wordcount/WordCounter.java | 12 +--------- .../string/wordcount/WordCountUnitTest.java | 24 +++++++++++++++++++ 3 files changed, 25 insertions(+), 14 deletions(-) delete mode 100644 java-strings-3/src/main/java/com/baeldung/string/README.md create mode 100644 java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java diff --git a/java-strings-3/src/main/java/com/baeldung/string/README.md b/java-strings-3/src/main/java/com/baeldung/string/README.md deleted file mode 100644 index e02980e93f..0000000000 --- a/java-strings-3/src/main/java/com/baeldung/string/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This file exists to ensure this empty directory is committed in Git. - -Please remove this file when this directory is populated. \ No newline at end of file diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java index 6b061c7925..1ee7e4a4ef 100644 --- a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java +++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java @@ -2,19 +2,9 @@ package com.baeldung.string.wordcount; import java.util.StringTokenizer; -/** - * Created by alfred on 14 August 2019 - */ public class WordCounter { public static void main(String[] args) { - //test string - String random = "Lorem%Ipsum is-simply dummy text."; - - System.out.printf("Using delimiter, word count: %d\n", countWordsUsingTokenizer(random)); - System.out.printf("Using no library method, word count: %d\n", countWordsManually(random)); - System.out.printf("Using punctuation regex, word count: %d\n", countWordsUsingRegex(random)); - System.out.printf("\n\n%s\n\n", random); - + } public static int countWordsUsingRegex(String arg) { diff --git a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java new file mode 100644 index 0000000000..a8f6a37434 --- /dev/null +++ b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.string.wordcount; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +public class WordCountUnitTest { + private String string1 = "This is a test sentence with eight words"; + private String string2 = "This#is%a test sentence with eight words"; + + @Test + public void givenStringWith8Words_whenUsingRegexCount_ThenResultEqual8() { + assertThat(WordCounter.countWordsUsingRegex(string2) == 8).isTrue(); + } + + @Test + public void givenStringWith8Words_whenUsingManualMethod_ThenWordCountEqual8() { + assertThat(WordCounter.countWordsManually(string1) == 8).isTrue(); + } + + @Test + public void givenAStringWith8Words_whenUsingTokenizer_ThenWordCountEqual8() { + assertThat(WordCounter.countWordsUsingTokenizer(string1) == 8).isTrue(); + } +} From a7c0f0b0d963e29e02dcc5108137bd023fe78910 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 17 Aug 2019 00:57:57 +0530 Subject: [PATCH 04/16] BAEL-16783 Slice 2 | The top 100 articles should have their own package in the module --- .../{java/io => writetofile}/JavaWriteToFileUnitTest.java | 2 +- .../persistence/{dao/user => jpaquery}/UserRepository.java | 2 +- .../{dao/user => jpaquery}/UserRepositoryCustom.java | 2 +- .../{dao/user => jpaquery}/UserRepositoryCustomImpl.java | 2 +- .../{dao/user => jpaquery}/UserRepositoryCommon.java | 3 ++- .../{dao/user => jpaquery}/UserRepositoryIntegrationTest.java | 2 +- .../BarMappingExamplesController.java | 2 +- .../BazzNewMappingsExampleController.java | 2 +- .../FooMappingExamplesController.java | 2 +- 9 files changed, 10 insertions(+), 9 deletions(-) rename core-java-modules/core-java-io/src/test/java/org/baeldung/{java/io => writetofile}/JavaWriteToFileUnitTest.java (99%) rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{dao/user => jpaquery}/UserRepository.java (98%) rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{dao/user => jpaquery}/UserRepositoryCustom.java (86%) rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{dao/user => jpaquery}/UserRepositoryCustomImpl.java (97%) rename persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/{dao/user => jpaquery}/UserRepositoryCommon.java (99%) rename persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/{dao/user => jpaquery}/UserRepositoryIntegrationTest.java (96%) rename spring-rest-simple/src/main/java/com/baeldung/{web/controller => requestmapping}/BarMappingExamplesController.java (97%) rename spring-rest-simple/src/main/java/com/baeldung/{web/controller => requestmapping}/BazzNewMappingsExampleController.java (98%) rename spring-rest-simple/src/main/java/com/baeldung/{web/controller => requestmapping}/FooMappingExamplesController.java (98%) diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java b/core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java similarity index 99% rename from core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java rename to core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java index 9ff95c4e16..bdc6b34b5c 100644 --- a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java +++ b/core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.io; +package org.baeldung.writetofile; import static org.junit.Assert.assertEquals; diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepository.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java similarity index 98% rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepository.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java index e8f95302ef..f22970c401 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepository.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.persistence.dao.user; +package com.baeldung.spring.data.persistence.jpaquery; import java.time.LocalDate; import java.util.Collection; diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCustom.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java similarity index 86% rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCustom.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java index ff92159077..8bfcb93158 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCustom.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.persistence.dao.user; +package com.baeldung.spring.data.persistence.jpaquery; import java.util.Collection; import java.util.List; diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCustomImpl.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java similarity index 97% rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCustomImpl.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java index 8bd8217e83..f264ca0b44 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCustomImpl.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.persistence.dao.user; +package com.baeldung.spring.data.persistence.jpaquery; import java.util.ArrayList; import java.util.Collection; diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCommon.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java similarity index 99% rename from persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCommon.java rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java index d002ff7575..69ddbb9b9f 100644 --- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryCommon.java +++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.persistence.dao.user; +package com.baeldung.spring.data.persistence.jpaquery; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; @@ -19,6 +19,7 @@ import javax.persistence.EntityManager; import javax.persistence.Query; import com.baeldung.spring.data.persistence.config.PersistenceConfig; +import com.baeldung.spring.data.persistence.jpaquery.UserRepository; import com.baeldung.spring.data.persistence.model.User; import org.junit.After; import org.junit.Test; diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryIntegrationTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java similarity index 96% rename from persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryIntegrationTest.java rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java index 2a9bffaeae..3bffb51917 100644 --- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/dao/user/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.persistence.dao.user; +package com.baeldung.spring.data.persistence.jpaquery; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/BarMappingExamplesController.java b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java similarity index 97% rename from spring-rest-simple/src/main/java/com/baeldung/web/controller/BarMappingExamplesController.java rename to spring-rest-simple/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java index 3611a4e6cc..e238c545cf 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/web/controller/BarMappingExamplesController.java +++ b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java @@ -1,4 +1,4 @@ -package com.baeldung.web.controller; +package com.baeldung.requestmapping; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/BazzNewMappingsExampleController.java b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java similarity index 98% rename from spring-rest-simple/src/main/java/com/baeldung/web/controller/BazzNewMappingsExampleController.java rename to spring-rest-simple/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java index 6c7da0296f..0c64006fd4 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/web/controller/BazzNewMappingsExampleController.java +++ b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java @@ -1,4 +1,4 @@ -package com.baeldung.web.controller; +package com.baeldung.requestmapping; import java.util.Arrays; import java.util.List; diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/FooMappingExamplesController.java b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java similarity index 98% rename from spring-rest-simple/src/main/java/com/baeldung/web/controller/FooMappingExamplesController.java rename to spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java index ec75e4c859..2c11e36141 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/web/controller/FooMappingExamplesController.java +++ b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java @@ -1,4 +1,4 @@ -package com.baeldung.web.controller; +package com.baeldung.requestmapping; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; From f9cf8eefe2a402b2d15aad66431228f87f6e4738 Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Sat, 17 Aug 2019 08:09:15 +0200 Subject: [PATCH 05/16] Removed unnecessary main method. Changed assert methods to the one for comparing integers --- .../java/com/baeldung/string/wordcount/WordCounter.java | 4 ---- .../com/baeldung/string/wordcount/WordCountUnitTest.java | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java index 1ee7e4a4ef..85d0efd242 100644 --- a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java +++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java @@ -3,10 +3,6 @@ package com.baeldung.string.wordcount; import java.util.StringTokenizer; public class WordCounter { - public static void main(String[] args) { - - } - public static int countWordsUsingRegex(String arg) { if (arg == null) { return 0; diff --git a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java index a8f6a37434..19e13572b7 100644 --- a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java +++ b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.string.wordcount; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; import org.junit.Test; public class WordCountUnitTest { @@ -9,16 +9,16 @@ public class WordCountUnitTest { @Test public void givenStringWith8Words_whenUsingRegexCount_ThenResultEqual8() { - assertThat(WordCounter.countWordsUsingRegex(string2) == 8).isTrue(); + assertEquals(8, WordCounter.countWordsUsingRegex(string2)); } @Test public void givenStringWith8Words_whenUsingManualMethod_ThenWordCountEqual8() { - assertThat(WordCounter.countWordsManually(string1) == 8).isTrue(); + assertEquals(8, WordCounter.countWordsManually(string1)); } @Test public void givenAStringWith8Words_whenUsingTokenizer_ThenWordCountEqual8() { - assertThat(WordCounter.countWordsUsingTokenizer(string1) == 8).isTrue(); + assertEquals(8, WordCounter.countWordsUsingTokenizer(string1)); } } From 0c27e46de32bd97c1c66afcf7502782c90a3ecdf Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Sun, 18 Aug 2019 20:31:07 +0200 Subject: [PATCH 06/16] Changed implementation of the method that manually count words in a string for originality. --- .../string/wordcount/WordCounter.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java index 85d0efd242..11c2fc7ae5 100644 --- a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java +++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java @@ -3,11 +3,14 @@ package com.baeldung.string.wordcount; import java.util.StringTokenizer; public class WordCounter { + static final int WORD = 0; + static final int SEPARATOR = 1; + public static int countWordsUsingRegex(String arg) { if (arg == null) { return 0; } - final String[] words = arg.split("\\pP|\\s+"); + final String[] words = arg.split("[\\pP\\s]+"); return words.length; } @@ -23,21 +26,19 @@ public class WordCounter { if (arg == null) { return 0; } - + int flag = SEPARATOR; int count = 0; + int stringLength = arg.length(); + int characterCounter = 0; - boolean isAWord = false; - int argEnd = arg.length() - 1; - - for (int i = 0; i < arg.length(); i++) { - if (Character.isLetter(arg.charAt(i)) && i != argEnd) { - isAWord = true; - } else if (!Character.isLetter(arg.charAt(i)) && isAWord) { - count++; - isAWord = false; - } else if (Character.isLetter(arg.charAt(i)) && i == argEnd) { + while (characterCounter < stringLength) { + if (Character.isLetter(arg.charAt(characterCounter)) && flag == SEPARATOR) { + flag = WORD; count++; + } else if (!Character.isLetter(arg.charAt(characterCounter))) { + flag = SEPARATOR; } + characterCounter++; } return count; } From 73bde4e2c3a4b8d17b8116d6ef0a28899629ae2c Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Thu, 22 Aug 2019 16:48:40 +0200 Subject: [PATCH 07/16] Updated Rejex to catter for apostrophes in words like John's --- .../java/com/baeldung/string/wordcount/WordCounter.java | 8 ++++++-- .../com/baeldung/string/wordcount/WordCountUnitTest.java | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java index 11c2fc7ae5..70a4042dc8 100644 --- a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java +++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java @@ -10,7 +10,7 @@ public class WordCounter { if (arg == null) { return 0; } - final String[] words = arg.split("[\\pP\\s]+"); + final String[] words = arg.split("[\\pP\\s&&[^']]+"); return words.length; } @@ -32,7 +32,7 @@ public class WordCounter { int characterCounter = 0; while (characterCounter < stringLength) { - if (Character.isLetter(arg.charAt(characterCounter)) && flag == SEPARATOR) { + if ((Character.isLetter(arg.charAt(characterCounter)) || isAllowedWordPunct(arg.charAt(characterCounter))) && flag == SEPARATOR) { flag = WORD; count++; } else if (!Character.isLetter(arg.charAt(characterCounter))) { @@ -42,4 +42,8 @@ public class WordCounter { } return count; } + + private static boolean isAllowedWordPunct(char charAt) { + return charAt == '\''; + } } diff --git a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java index 19e13572b7..357254f84c 100644 --- a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java +++ b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java @@ -3,6 +3,9 @@ package com.baeldung.string.wordcount; import static org.junit.Assert.assertEquals; import org.junit.Test; + +import java.util.StringTokenizer; + public class WordCountUnitTest { private String string1 = "This is a test sentence with eight words"; private String string2 = "This#is%a test sentence with eight words"; @@ -10,11 +13,15 @@ public class WordCountUnitTest { @Test public void givenStringWith8Words_whenUsingRegexCount_ThenResultEqual8() { assertEquals(8, WordCounter.countWordsUsingRegex(string2)); + assertEquals(9, WordCounter.countWordsUsingRegex("no&one#should%ever-write-like,this;but:well")); + assertEquals(7, WordCounter.countWordsUsingRegex("the farmer's wife--she was from Albuquerque")); } @Test public void givenStringWith8Words_whenUsingManualMethod_ThenWordCountEqual8() { assertEquals(8, WordCounter.countWordsManually(string1)); + assertEquals(9, WordCounter.countWordsManually("no&one#should%ever-write-like,this but well")); + assertEquals(7, WordCounter.countWordsManually("the farmer's wife--she was from Albuquerque")); } @Test From 3058af87a960f221f3af6c3f12c99c9e51894961 Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Thu, 22 Aug 2019 20:51:43 +0200 Subject: [PATCH 08/16] Updated manual word count code to catter for apostrophes in words like John's --- .../java/com/baeldung/string/wordcount/WordCounter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java index 70a4042dc8..30275773a6 100644 --- a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java +++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java @@ -32,10 +32,10 @@ public class WordCounter { int characterCounter = 0; while (characterCounter < stringLength) { - if ((Character.isLetter(arg.charAt(characterCounter)) || isAllowedWordPunct(arg.charAt(characterCounter))) && flag == SEPARATOR) { + if (isAllowedInWord(arg.charAt(characterCounter)) && flag == SEPARATOR) { flag = WORD; count++; - } else if (!Character.isLetter(arg.charAt(characterCounter))) { + } else if (!isAllowedInWord(arg.charAt(characterCounter))) { flag = SEPARATOR; } characterCounter++; @@ -43,7 +43,7 @@ public class WordCounter { return count; } - private static boolean isAllowedWordPunct(char charAt) { - return charAt == '\''; + private static boolean isAllowedInWord(char charAt) { + return charAt == '\'' || Character.isLetter(charAt); } } From 07b01f6dbc636f6ca15469ab2b30a2ea25994091 Mon Sep 17 00:00:00 2001 From: "alfred.samanga@gmail.com" Date: Thu, 22 Aug 2019 21:00:45 +0200 Subject: [PATCH 09/16] Updated Unit tests --- .../java/com/baeldung/string/wordcount/WordCountUnitTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java index 357254f84c..fdd045978f 100644 --- a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java +++ b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java @@ -27,5 +27,9 @@ public class WordCountUnitTest { @Test public void givenAStringWith8Words_whenUsingTokenizer_ThenWordCountEqual8() { assertEquals(8, WordCounter.countWordsUsingTokenizer(string1)); + assertEquals(3, new StringTokenizer("three blind mice").countTokens()); + assertEquals(4, new StringTokenizer("see\thow\tthey\trun").countTokens()); + assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque", " -").countTokens()); + assertEquals(10, new StringTokenizer("did,you,ever,see,such,a,sight,in,your,life", ",").countTokens()); } } From d3ba9f47efe8d5bb1cf160b356cb574ff94bb7cf Mon Sep 17 00:00:00 2001 From: Sandip Singh Date: Fri, 23 Aug 2019 18:10:59 +0530 Subject: [PATCH 10/16] Bael 2989 (#7609) * Added examples for building Java project with Bazel * Added examples for building Java project with Bazel --- bazel/WORKSPACE | 31 +++++++++++++++++++ bazel/bazelapp/BUILD | 7 +++++ bazel/bazelapp/pom.xml | 28 +++++++++++++++++ .../src/main/java/com/baeldung/BazelApp.java | 15 +++++++++ bazel/bazelgreeting/BUILD | 6 ++++ bazel/bazelgreeting/pom.xml | 15 +++++++++ .../src/main/java/com/baeldung/Greetings.java | 8 +++++ bazel/pom.xml | 20 ++++++++++++ 8 files changed, 130 insertions(+) create mode 100644 bazel/WORKSPACE create mode 100644 bazel/bazelapp/BUILD create mode 100644 bazel/bazelapp/pom.xml create mode 100644 bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java create mode 100644 bazel/bazelgreeting/BUILD create mode 100644 bazel/bazelgreeting/pom.xml create mode 100644 bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java create mode 100644 bazel/pom.xml diff --git a/bazel/WORKSPACE b/bazel/WORKSPACE new file mode 100644 index 0000000000..415aa398f9 --- /dev/null +++ b/bazel/WORKSPACE @@ -0,0 +1,31 @@ + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + + +RULES_JVM_EXTERNAL_TAG = "2.0.1" +RULES_JVM_EXTERNAL_SHA = "55e8d3951647ae3dffde22b4f7f8dee11b3f70f3f89424713debd7076197eaca" + +http_archive( + name = "rules_jvm_external", + strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, + sha256 = RULES_JVM_EXTERNAL_SHA, + url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG, +) + +load("@rules_jvm_external//:defs.bzl", "maven_install") + +maven_install( + artifacts = [ + "org.apache.commons:commons-lang3:3.9" + ], + repositories = [ + "https://repo1.maven.org/maven2", + ] +) + +http_jar ( + name = "apache-commons-lang", + url = "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar" +) + diff --git a/bazel/bazelapp/BUILD b/bazel/bazelapp/BUILD new file mode 100644 index 0000000000..1de95aada5 --- /dev/null +++ b/bazel/bazelapp/BUILD @@ -0,0 +1,7 @@ + +java_binary ( + name = "BazelApp", + srcs = glob(["src/main/java/com/baeldung/*.java"]), + main_class = "com.baeldung.BazelApp", + deps = ["//bazelgreeting:greeter", "@maven//:org_apache_commons_commons_lang3"] +) diff --git a/bazel/bazelapp/pom.xml b/bazel/bazelapp/pom.xml new file mode 100644 index 0000000000..b8c658eaae --- /dev/null +++ b/bazel/bazelapp/pom.xml @@ -0,0 +1,28 @@ + + + + bazel + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + bazelapp + + + + com.baeldung + bazelgreeting + 1.0.0-SNAPSHOT + + + org.apache.commons + commons-lang3 + 3.9 + + + + + \ No newline at end of file diff --git a/bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java b/bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java new file mode 100644 index 0000000000..e92d85018b --- /dev/null +++ b/bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import com.baeldung.Greetings; +import org.apache.commons.lang3.StringUtils; + +public class BazelApp { + + public static void main(String ... args) { + Greetings greetings = new Greetings(); + + System.out.println(greetings.greet("Bazel")); + + System.out.println(StringUtils.lowerCase("Bazel")); + } +} diff --git a/bazel/bazelgreeting/BUILD b/bazel/bazelgreeting/BUILD new file mode 100644 index 0000000000..6cd8bc13f7 --- /dev/null +++ b/bazel/bazelgreeting/BUILD @@ -0,0 +1,6 @@ + +java_library ( + name = "greeter", + srcs = glob(["src/main/java/com/baeldung/*.java"]), + visibility = ["//bazelapp:__pkg__"] +) diff --git a/bazel/bazelgreeting/pom.xml b/bazel/bazelgreeting/pom.xml new file mode 100644 index 0000000000..d02cc02cae --- /dev/null +++ b/bazel/bazelgreeting/pom.xml @@ -0,0 +1,15 @@ + + + + bazel + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + bazelgreeting + + + \ No newline at end of file diff --git a/bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java b/bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java new file mode 100644 index 0000000000..0e8fae7fbe --- /dev/null +++ b/bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java @@ -0,0 +1,8 @@ +package com.baeldung; + +public class Greetings { + + public String greet(String name) { + return "Hello ".concat(name); + } +} diff --git a/bazel/pom.xml b/bazel/pom.xml new file mode 100644 index 0000000000..7350d1dbe4 --- /dev/null +++ b/bazel/pom.xml @@ -0,0 +1,20 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + bazel + pom + + bazelgreeting + bazelapp + + + + \ No newline at end of file From 721542f2486492078a3802a873e83761acf0e643 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 23 Aug 2019 23:07:21 +0530 Subject: [PATCH 11/16] BAEL-16781 Moving top articles to their respective packages (#7594) --- .../com/baeldung/{swaggerboot => swagger2boot}/Application.java | 2 +- .../configuration/SpringFoxConfig.java | 2 +- .../controller/RegularRestController.java | 2 +- .../{client => resttemplate}/RestTemplateBasicLiveTest.java | 2 +- .../java/org/baeldung/{spring => swagger2}/SwaggerConfig.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename spring-boot-mvc/src/main/java/com/baeldung/{swaggerboot => swagger2boot}/Application.java (88%) rename spring-boot-mvc/src/main/java/com/baeldung/{swaggerboot => swagger2boot}/configuration/SpringFoxConfig.java (97%) rename spring-boot-mvc/src/main/java/com/baeldung/{swaggerboot => swagger2boot}/controller/RegularRestController.java (85%) rename spring-resttemplate/src/test/java/org/baeldung/{client => resttemplate}/RestTemplateBasicLiveTest.java (99%) rename spring-security-rest/src/main/java/org/baeldung/{spring => swagger2}/SwaggerConfig.java (98%) diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/Application.java similarity index 88% rename from spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java rename to spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/Application.java index 14e46b2306..51598aeacb 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/Application.java @@ -1,4 +1,4 @@ -package com.baeldung.swaggerboot; +package com.baeldung.swagger2boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java similarity index 97% rename from spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java rename to spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java index 3041dfdcc8..68e2c55deb 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.swaggerboot.configuration; +package com.baeldung.swagger2boot.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java similarity index 85% rename from spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java rename to spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java index 676937f7d7..df8714d041 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java @@ -1,4 +1,4 @@ -package com.baeldung.swaggerboot.controller; +package com.baeldung.swagger2boot.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/RestTemplateBasicLiveTest.java similarity index 99% rename from spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java rename to spring-resttemplate/src/test/java/org/baeldung/resttemplate/RestTemplateBasicLiveTest.java index ff3034a50d..54e416d008 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java +++ b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/RestTemplateBasicLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package org.baeldung.resttemplate; import static org.apache.commons.codec.binary.Base64.encodeBase64; import static org.baeldung.client.Consts.APPLICATION_PORT; diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java b/spring-security-rest/src/main/java/org/baeldung/swagger2/SwaggerConfig.java similarity index 98% rename from spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java rename to spring-security-rest/src/main/java/org/baeldung/swagger2/SwaggerConfig.java index aa00e8455e..67c760353d 100644 --- a/spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java +++ b/spring-security-rest/src/main/java/org/baeldung/swagger2/SwaggerConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package org.baeldung.swagger2; import static com.google.common.collect.Lists.newArrayList; From ce027707d09b90b81b4b9be46b4d15357bffda20 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Fri, 23 Aug 2019 11:38:48 -0600 Subject: [PATCH 12/16] BAEL-2741: JHipster authentication with external service (#7588) * BAEL-2741: JHipster authentication using 3rd party service * BAEL-2741: Remove Angular account mgmt routes * BAEL-2741: Remove password reset register links from navbar * BAEL-2741: Remove password and register links from login form * BAEL-2741: Cleanup CustomAuthenticationManager code * Update README.md * BAEL-2741: Fix unit test --- .../security/CustomAuthenticationManager.java | 126 ++++++++++++++++++ .../jhipster5/security/dto/LoginRequest.java | 30 +++++ .../jhipster5/security/dto/LoginResponse.java | 50 +++++++ .../main/webapp/app/account/account.route.ts | 4 +- .../app/layouts/navbar/navbar.component.html | 12 -- .../app/shared/login/login.component.html | 8 -- .../security/MockAuthenticationManager.java | 54 ++++++++ 7 files changed, 262 insertions(+), 22 deletions(-) create mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java create mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java create mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java create mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java new file mode 100644 index 0000000000..0a7dd66b24 --- /dev/null +++ b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java @@ -0,0 +1,126 @@ +package com.baeldung.jhipster5.security; + +import com.baeldung.jhipster5.domain.User; +import com.baeldung.jhipster5.security.dto.LoginRequest; +import com.baeldung.jhipster5.security.dto.LoginResponse; +import com.baeldung.jhipster5.service.UserService; +import com.baeldung.jhipster5.service.dto.UserDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.util.Collection; +import java.util.Collections; +import java.util.stream.Collectors; + +@Component +public class CustomAuthenticationManager implements AuthenticationManager { + + private final static Logger LOG = LoggerFactory.getLogger(CustomAuthenticationManager.class); + + private final String REMOTE_LOGIN_URL = "https://example.com/login"; + + private final RestTemplate restTemplate = new RestTemplate(); + + @Autowired + private UserService userService; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername(authentication.getPrincipal().toString()); + loginRequest.setPassword(authentication.getCredentials().toString()); + + try + { + ResponseEntity response = + restTemplate.postForEntity( + REMOTE_LOGIN_URL, + loginRequest, + LoginResponse.class); + + if(response.getStatusCode().is2xxSuccessful()) + { + // + // Need to create a new local user if this is the first time logging in; this + // is required so they can be issued JWTs. We can use this flow to also keep + // our local use entry up to date with data from the remote service if needed + // (for example, if the first and last name might change, this is where we would + // update the local user entry) + // + + User user = userService.getUserWithAuthoritiesByLogin(authentication.getPrincipal().toString()) + .orElseGet(() -> userService.createUser(createUserDTO(response.getBody(), authentication))); + return createAuthentication(authentication, user); + } + else + { + throw new BadCredentialsException("Invalid username or password"); + } + } + catch (Exception e) + { + LOG.warn("Failed to authenticate", e); + throw new AuthenticationServiceException("Failed to login", e); + } + } + + /** + * Creates a new authentication with basic roles + * @param auth Contains auth details that will be copied into the new one. + * @param user User object representing who is logging in + * @return Authentication + */ + private Authentication createAuthentication(Authentication auth, User user) { + + // + // Honor any roles the user already has set; default is just USER role + // but could be modified after account creation + // + + Collection authorities = user + .getAuthorities() + .stream() + .map(a -> new SimpleGrantedAuthority(a.getName())) + .collect(Collectors.toSet()); + + UsernamePasswordAuthenticationToken token + = new UsernamePasswordAuthenticationToken( + user.getId(), + auth.getCredentials().toString(), + authorities); + + return token; + } + + /** + * Creates a new UserDTO with basic info. + * @param loginResponse Response from peloton login API + * @param authentication Contains user login info (namely username and password) + * @return UserDTO + */ + private UserDTO createUserDTO(LoginResponse loginResponse, Authentication authentication) { + + UserDTO dto = new UserDTO(); + + dto.setActivated(true); + dto.setEmail(loginResponse.getEmail()); + dto.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + dto.setFirstName(loginResponse.getFirstName()); + dto.setLastName(loginResponse.getLastName()); + + return dto; + } +} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java new file mode 100644 index 0000000000..f45c23fa39 --- /dev/null +++ b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java @@ -0,0 +1,30 @@ +package com.baeldung.jhipster5.security.dto; + +/** + * Simple DTO representing a login request to a remote service. + */ +public class LoginRequest { + + private String username; + + private String password; + + public LoginRequest() { + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java new file mode 100644 index 0000000000..ad1fe37a2f --- /dev/null +++ b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java @@ -0,0 +1,50 @@ +package com.baeldung.jhipster5.security.dto; + +/** + * Simple DTO representing the response of logging in using a remote service. + */ +public class LoginResponse { + + private String username; + + private String firstName; + + private String lastName; + + private String email; + + public LoginResponse() { + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts index f849342e69..cba5d40716 100644 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts +++ b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts @@ -1,8 +1,8 @@ import { Routes } from '@angular/router'; -import { activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute } from './'; +import { settingsRoute } from './'; -const ACCOUNT_ROUTES = [activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute]; +const ACCOUNT_ROUTES = [settingsRoute]; export const accountState: Routes = [ { diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html index e58d234c22..4fab5c76ac 100644 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html +++ b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html @@ -114,12 +114,6 @@ Settings -
  • - - - Password - -
  • @@ -132,12 +126,6 @@ Sign in
  • -
  • - - - Register - -
  • diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html index 60d593bd4b..7eb35364b4 100644 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html +++ b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html @@ -30,14 +30,6 @@ -

    - -
    - You don't have an account yet? - Register a new account -
    diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java new file mode 100644 index 0000000000..bdcdba7644 --- /dev/null +++ b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java @@ -0,0 +1,54 @@ +package com.baeldung.jhipster5.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.Collections; + +/** + * AuthenticationManager used solely by unit tests. + */ +@Component +@Primary +public class MockAuthenticationManager implements AuthenticationManager +{ + private final static Collection ROLES = + Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")); + + @Autowired + private UserDetailsService userDetailsService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException + { + + UserDetails userDetails = userDetailsService.loadUserByUsername(authentication.getName()); + + if(userDetails == null || !passwordEncoder.matches(authentication.getCredentials().toString(), userDetails.getPassword())) + { + throw new BadCredentialsException("Invalid username/password"); + } + + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + authentication.getPrincipal().toString(), + authentication.getCredentials().toString(), + ROLES); + + return token; + } +} From 8e190c76af721cdae529b4a6d01f8dc9d8666379 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sat, 24 Aug 2019 02:02:02 +0530 Subject: [PATCH 13/16] Adding source code for the tutorial tracked under BAEL-3203. (#7600) --- apache-spark/data/iris.data | 150 ++++++++++++++++++ .../logistic-regression/data/._SUCCESS.crc | Bin 0 -> 8 bytes ...-80d9-8e1edf399601-c000.snappy.parquet.crc | Bin 0 -> 24 bytes .../model/logistic-regression/data/_SUCCESS | 0 ...41ff-80d9-8e1edf399601-c000.snappy.parquet | Bin 0 -> 1789 bytes .../metadata/._SUCCESS.crc | Bin 0 -> 8 bytes .../metadata/.part-00000.crc | Bin 0 -> 12 bytes .../logistic-regression/metadata/_SUCCESS | 0 .../logistic-regression/metadata/part-00000 | 1 + apache-spark/pom.xml | 132 +++++++-------- .../com/baeldung/ml/MachineLearningApp.java | 111 +++++++++++++ 11 files changed, 332 insertions(+), 62 deletions(-) create mode 100644 apache-spark/data/iris.data create mode 100644 apache-spark/model/logistic-regression/data/._SUCCESS.crc create mode 100644 apache-spark/model/logistic-regression/data/.part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet.crc create mode 100644 apache-spark/model/logistic-regression/data/_SUCCESS create mode 100644 apache-spark/model/logistic-regression/data/part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet create mode 100644 apache-spark/model/logistic-regression/metadata/._SUCCESS.crc create mode 100644 apache-spark/model/logistic-regression/metadata/.part-00000.crc create mode 100644 apache-spark/model/logistic-regression/metadata/_SUCCESS create mode 100644 apache-spark/model/logistic-regression/metadata/part-00000 create mode 100644 apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java diff --git a/apache-spark/data/iris.data b/apache-spark/data/iris.data new file mode 100644 index 0000000000..396653cc98 --- /dev/null +++ b/apache-spark/data/iris.data @@ -0,0 +1,150 @@ +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica \ No newline at end of file diff --git a/apache-spark/model/logistic-regression/data/._SUCCESS.crc b/apache-spark/model/logistic-regression/data/._SUCCESS.crc new file mode 100644 index 0000000000000000000000000000000000000000..3b7b044936a890cd8d651d349a752d819d71d22c GIT binary patch literal 8 PcmYc;N@ieSU}69O2$TUk literal 0 HcmV?d00001 diff --git a/apache-spark/model/logistic-regression/data/.part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet.crc b/apache-spark/model/logistic-regression/data/.part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet.crc new file mode 100644 index 0000000000000000000000000000000000000000..46311024cff2ce7756c0f80479f5268efd069597 GIT binary patch literal 24 gcmYc;N@ieSU}Bj6=FX}-{Q+{WxhI4AG>Jn!?q=Q-)j)TKNU z&>&KCNPALPhCV&d1-K9e6nmU9)0k9=4AQg$b9Kj+`QqM3#5Tj zLMTXT@(!`;3!aN)0ZBtJWUtdAL;KlAQsb_*NO+cIS1psca3p|=t8r?%9+G@Wl2Fnh zw#O0^w=r#Rkk=2?VIE?;9hU78$0RLJfW4&d@D?26E;MOXP^45kMYD1mL>FWskvbfx zSyl9eacIU|*Z`G6>BI%{lzX6a&HD}X zbA~g@boQyZo?;a!`qxr)C$gSlK=~;uzs2mTII)S_qSC&^IIk?EB6H(945gO+5(AFF zA-xs&AjgT>CjhRXt*IdtOo1T`_Y8IhYR~x^&q}jN^LR}j|%+C!m?J5J9 z6uXeG{ZqCtTSGZ{^NT1~b!=hUVHB4QS(}M1`@ulVET-YTuVA!I@Za|$lYw$3k&EZ`)h76%z>^Qgsue&$V z?y=GPjB2T1`8X*Gu|v=CIMWXfsrBZQtj1 - 4.0.0 - com.baeldung - apache-spark - 1.0-SNAPSHOT - apache-spark - jar - http://maven.apache.org + + 4.0.0 + com.baeldung + apache-spark + 1.0-SNAPSHOT + apache-spark + jar + http://maven.apache.org - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - org.apache.spark - spark-core_2.11 - ${org.apache.spark.spark-core.version} - provided - + - org.apache.spark - spark-sql_2.11 - ${org.apache.spark.spark-sql.version} - provided + org.apache.spark + spark-core_2.11 + ${org.apache.spark.spark-core.version} + provided + + + org.apache.spark + spark-sql_2.11 + ${org.apache.spark.spark-sql.version} + provided org.apache.spark @@ -33,6 +34,12 @@ ${org.apache.spark.spark-streaming.version} provided + + org.apache.spark + spark-mllib_2.11 + ${org.apache.spark.spark-mllib.version} + provided + org.apache.spark spark-streaming-kafka-0-10_2.11 @@ -48,46 +55,47 @@ spark-cassandra-connector-java_2.11 ${com.datastax.spark.spark-cassandra-connector-java.version} - + - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - - - - maven-assembly-plugin - - - package - - single - - - - - - jar-with-dependencies - - - - - + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + maven-assembly-plugin + + + package + + single + + + + + + jar-with-dependencies + + + + + - - 2.3.0 - 2.3.0 - 2.3.0 - 2.3.0 - 2.3.0 - 1.5.2 + + 2.3.0 + 2.3.0 + 2.3.0 + 2.3.0 + 2.3.0 + 2.3.0 + 1.5.2 3.2 - + diff --git a/apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java b/apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java new file mode 100644 index 0000000000..6094683031 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java @@ -0,0 +1,111 @@ +package com.baeldung.ml; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaPairRDD; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.mllib.classification.LogisticRegressionModel; +import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS; +import org.apache.spark.mllib.evaluation.MulticlassMetrics; +import org.apache.spark.mllib.linalg.Matrix; +import org.apache.spark.mllib.linalg.Vector; +import org.apache.spark.mllib.linalg.Vectors; +import org.apache.spark.mllib.regression.LabeledPoint; +import org.apache.spark.mllib.stat.MultivariateStatisticalSummary; +import org.apache.spark.mllib.stat.Statistics; + +import scala.Tuple2; + +public class MachineLearningApp { + + public static void main(String[] args) { + + // 1. Setting the Spark Context + SparkConf conf = new SparkConf().setAppName("Main") + .setMaster("local[2]") + .set("spark.executor.memory", "3g") + .set("spark.driver.memory", "3g"); + JavaSparkContext sc = new JavaSparkContext(conf); + Logger.getLogger("org") + .setLevel(Level.OFF); + Logger.getLogger("akka") + .setLevel(Level.OFF); + + // 2. Loading the Data-set + String dataFile = "data\\iris.data"; + JavaRDD data = sc.textFile(dataFile); + + // 3. Exploratory Data Analysis + // 3.1. Creating Vector of Input Data + JavaRDD inputData = data.map(line -> { + String[] parts = line.split(","); + double[] v = new double[parts.length - 1]; + for (int i = 0; i < parts.length - 1; i++) { + v[i] = Double.parseDouble(parts[i]); + } + return Vectors.dense(v); + }); + // 3.2. Performing Statistical Analysis + MultivariateStatisticalSummary summary = Statistics.colStats(inputData.rdd()); + System.out.println("Summary Mean:"); + System.out.println(summary.mean()); + System.out.println("Summary Variance:"); + System.out.println(summary.variance()); + System.out.println("Summary Non-zero:"); + System.out.println(summary.numNonzeros()); + // 3.3. Performing Correlation Analysis + Matrix correlMatrix = Statistics.corr(inputData.rdd(), "pearson"); + System.out.println("Correlation Matrix:"); + System.out.println(correlMatrix.toString()); + + // 4. Data Preparation + // 4.1. Creating Map for Textual Output Labels + Map map = new HashMap(); + map.put("Iris-setosa", 0); + map.put("Iris-versicolor", 1); + map.put("Iris-virginica", 2); + // 4.2. Creating LabeledPoint of Input and Output Data + JavaRDD parsedData = data.map(line -> { + String[] parts = line.split(","); + double[] v = new double[parts.length - 1]; + for (int i = 0; i < parts.length - 1; i++) { + v[i] = Double.parseDouble(parts[i]); + } + return new LabeledPoint(map.get(parts[parts.length - 1]), Vectors.dense(v)); + }); + + // 5. Data Splitting into 80% Training and 20% Test Sets + JavaRDD[] splits = parsedData.randomSplit(new double[] { 0.8, 0.2 }, 11L); + JavaRDD trainingData = splits[0].cache(); + JavaRDD testData = splits[1]; + + // 6. Modeling + // 6.1. Model Training + LogisticRegressionModel model = new LogisticRegressionWithLBFGS().setNumClasses(3) + .run(trainingData.rdd()); + // 6.2. Model Evaluation + JavaPairRDD predictionAndLabels = testData.mapToPair(p -> new Tuple2<>(model.predict(p.features()), p.label())); + MulticlassMetrics metrics = new MulticlassMetrics(predictionAndLabels.rdd()); + double accuracy = metrics.accuracy(); + System.out.println("Model Accuracy on Test Data: " + accuracy); + + // 7. Model Saving and Loading + // 7.1. Model Saving + model.save(sc.sc(), "model\\logistic-regression"); + // 7.2. Model Loading + LogisticRegressionModel sameModel = LogisticRegressionModel.load(sc.sc(), "model\\logistic-regression"); + // 7.3. Prediction on New Data + Vector newData = Vectors.dense(new double[] { 1, 1, 1, 1 }); + double prediction = sameModel.predict(newData); + System.out.println("Model Prediction on New Data = " + prediction); + + // 8. Clean-up + sc.close(); + } + +} From 00c5ecc8ef0fcd9edc485e118ccf702bd51a0b95 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Fri, 23 Aug 2019 21:58:03 -0500 Subject: [PATCH 14/16] BAEL-3126 BAEL-2463 add links to articles (#7640) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article * BAEL-2335: add link back to article * BAEL-2413: add link back to article * Update README.MD * BAEL-2577: add link back to article * BAEL-2490: add link back to article * BAEL-2471: add link back to article * BAEL-2583: add link back to article * BAEL-2738: add link back to article * BAEL-2711: Add spring-boot-angular module to root pom * BAEL-2544 BAEL-2711 BAEL-2575 BAEL-2657 Add links back to articles * BAEL-2736: Add link back to article * BAEL-2789: Add link back to article * BAEL-2489: add link back to article * BAEL-2840: add link back to article * BAEL-2655: add link back to article * BAEL-2884: add link back to article * BAEL-2985: Fix Spring Boot Apps in spring-data-rest module * BAEL-2898 BAEL-3057 BAEL-3020 add links back to articles * BAEL-3126 BAEL-2463 README --- algorithms-miscellaneous-3/README.md | 1 + jackson-2/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md index 6a38df484a..ce0fde0415 100644 --- a/algorithms-miscellaneous-3/README.md +++ b/algorithms-miscellaneous-3/README.md @@ -7,3 +7,4 @@ - [Checking If a List Is Sorted in Java](https://www.baeldung.com/java-check-if-list-sorted) - [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle) - [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique) +- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle) diff --git a/jackson-2/README.md b/jackson-2/README.md index bb2a58483f..920eaa91e8 100644 --- a/jackson-2/README.md +++ b/jackson-2/README.md @@ -11,3 +11,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Working with Tree Model Nodes in Jackson](https://www.baeldung.com/jackson-json-node-tree-model) - [Converting JSON to CSV in Java](https://www.baeldung.com/java-converting-json-to-csv) - [Compare Two JSON Objects with Jackson](https://www.baeldung.com/jackson-compare-two-json-objects) +- [Calling Default Serializer from Custom Serializer in Jackson](https://www.baeldung.com/jackson-call-default-serializer-from-custom-serializer) From 4be26bb3f021aa0f984a824ef3caad4599670244 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sat, 24 Aug 2019 11:07:03 +0530 Subject: [PATCH 15/16] Adding source code for article tracked under BAEL-3172. (#7540) * Adding source code for article tracked under BAEL-3172. * Adding source code for article tracked under BAEL-3172. * Adding source code for article tracked under BAEL-3172. * Incorporated the review comments. * Removing absolute URL from JS. * Removing absolute URL from JS. --- pom.xml | 5 + spring-boot-nashorn/README.md | 3 + spring-boot-nashorn/pom.xml | 51 + .../com/baeldung/nashorn/Application.java | 20 + .../nashorn/controller/MyRestController.java | 14 + .../nashorn/controller/MyWebController.java | 32 + .../src/main/resources/application.properties | 2 + .../src/main/resources/static/app.js | 37 + .../resources/static/js/react-dom-server.js | 42 + .../src/main/resources/static/js/react-dom.js | 42 + .../src/main/resources/static/js/react.js | 18794 ++++++++++++++++ .../src/main/webapp/WEB-INF/jsp/index.jsp | 19 + 12 files changed, 19061 insertions(+) create mode 100644 spring-boot-nashorn/README.md create mode 100644 spring-boot-nashorn/pom.xml create mode 100644 spring-boot-nashorn/src/main/java/com/baeldung/nashorn/Application.java create mode 100644 spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyRestController.java create mode 100644 spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyWebController.java create mode 100644 spring-boot-nashorn/src/main/resources/application.properties create mode 100644 spring-boot-nashorn/src/main/resources/static/app.js create mode 100644 spring-boot-nashorn/src/main/resources/static/js/react-dom-server.js create mode 100644 spring-boot-nashorn/src/main/resources/static/js/react-dom.js create mode 100644 spring-boot-nashorn/src/main/resources/static/js/react.js create mode 100644 spring-boot-nashorn/src/main/webapp/WEB-INF/jsp/index.jsp diff --git a/pom.xml b/pom.xml index 58c5473744..a4f2a13c28 100644 --- a/pom.xml +++ b/pom.xml @@ -564,6 +564,8 @@ spring-boot-flowable spring-security-kerberos oauth2-framework-impl + + spring-boot-nashorn @@ -798,6 +800,8 @@ tensorflow-java spring-boot-flowable spring-security-kerberos + + spring-boot-nashorn @@ -947,6 +951,7 @@ spring-boot-flowable spring-security-kerberos + spring-boot-nashorn diff --git a/spring-boot-nashorn/README.md b/spring-boot-nashorn/README.md new file mode 100644 index 0000000000..1ca43927ee --- /dev/null +++ b/spring-boot-nashorn/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- []() + diff --git a/spring-boot-nashorn/pom.xml b/spring-boot-nashorn/pom.xml new file mode 100644 index 0000000000..0f43752993 --- /dev/null +++ b/spring-boot-nashorn/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + com.baeldung.nashorn + spring-boot-nashorn + spring-boot-nashorn + 1.0 + jar + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + \ No newline at end of file diff --git a/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/Application.java b/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/Application.java new file mode 100644 index 0000000000..b3cf1acd79 --- /dev/null +++ b/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/Application.java @@ -0,0 +1,20 @@ +package com.baeldung.nashorn; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + public static void main(String[] args) throws Exception { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyRestController.java b/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyRestController.java new file mode 100644 index 0000000000..86340d3d6a --- /dev/null +++ b/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyRestController.java @@ -0,0 +1,14 @@ +package com.baeldung.nashorn.controller; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MyRestController { + + @RequestMapping("/next/{last}/{secondLast}") + public int index(@PathVariable("last") int last, @PathVariable("secondLast") int secondLast) throws Exception { + return last + secondLast; + } +} diff --git a/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyWebController.java b/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyWebController.java new file mode 100644 index 0000000000..78af6b966a --- /dev/null +++ b/spring-boot-nashorn/src/main/java/com/baeldung/nashorn/controller/MyWebController.java @@ -0,0 +1,32 @@ +package com.baeldung.nashorn.controller; + +import java.io.InputStreamReader; +import java.util.Map; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class MyWebController { + + @RequestMapping("/") + public String index(Map model) throws Exception { + + ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn"); + + getClass().getResource("classpath:storedProcedures.sql"); + + nashorn.eval(new InputStreamReader(new ClassPathResource("static/js/react.js").getInputStream())); + nashorn.eval(new InputStreamReader(new ClassPathResource("static/js/react-dom-server.js").getInputStream())); + + nashorn.eval(new InputStreamReader(new ClassPathResource("static/app.js").getInputStream())); + Object html = nashorn.eval("ReactDOMServer.renderToString(" + "React.createElement(App, {data: [0,1,1]})" + ");"); + + model.put("content", String.valueOf(html)); + return "index"; + } +} diff --git a/spring-boot-nashorn/src/main/resources/application.properties b/spring-boot-nashorn/src/main/resources/application.properties new file mode 100644 index 0000000000..ae00fe72f8 --- /dev/null +++ b/spring-boot-nashorn/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.mvc.view.prefix: /WEB-INF/jsp/ +spring.mvc.view.suffix: .jsp \ No newline at end of file diff --git a/spring-boot-nashorn/src/main/resources/static/app.js b/spring-boot-nashorn/src/main/resources/static/app.js new file mode 100644 index 0000000000..e5d79217dd --- /dev/null +++ b/spring-boot-nashorn/src/main/resources/static/app.js @@ -0,0 +1,37 @@ +var App = React.createClass({displayName: "App", + + handleSubmit: function () { + var last = this.state.data[this.state.data.length-1]; + var secondLast = this.state.data[this.state.data.length-2]; + $.ajax({ + url: '/next/'+last+'/'+secondLast, + dataType: 'text', + success: function (msg) { + var series = this.state.data; + series.push(msg); + this.setState({data: series}); + }.bind(this), + error: function (xhr, status, err) { + console.error("/next", status, err.toString()); + }.bind(this) + }); + }, + + componentDidMount: function() { + this.setState({data: this.props.data}); + }, + + getInitialState: function () { + return {data: []}; + }, + + render: function () { + return ( + React.createElement("div", {className: "app"}, + React.createElement("h2", null, "Fibonacci Generator"), + React.createElement("h2", null, this.state.data.toString()), + React.createElement("input", {type: "submit", value: "Next", onClick: this.handleSubmit}) + ) + ); + } +}); \ No newline at end of file diff --git a/spring-boot-nashorn/src/main/resources/static/js/react-dom-server.js b/spring-boot-nashorn/src/main/resources/static/js/react-dom-server.js new file mode 100644 index 0000000000..91050111c3 --- /dev/null +++ b/spring-boot-nashorn/src/main/resources/static/js/react-dom-server.js @@ -0,0 +1,42 @@ +/** + * ReactDOMServer v0.14.3 + * + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ +// Based off https://github.com/ForbesLindesay/umd/blob/master/template.js +;(function(f) { + // CommonJS + if (typeof exports === "object" && typeof module !== "undefined") { + module.exports = f(require('react')); + + // RequireJS + } else if (typeof define === "function" && define.amd) { + define(['react'], f); + + // + + + + +
    ${content}
    + + + + \ No newline at end of file From 0ff976ef779b2d931cd8c68e0e678c3488248932 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 24 Aug 2019 14:45:17 +0530 Subject: [PATCH 16/16] BAEL-16326 Week 34 | go through the integration test results and see what NEW failing tests we have (#7641) - fixing newly failing integration tests --- .../spring/data/persistence/config/PersistenceConfig.java | 2 +- .../src/main/java/com/baeldung/config/MvcConfig.java | 3 +-- .../BazzNewMappingsExampleIntegrationTest.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) rename spring-rest-simple/src/test/java/com/baeldung/{web/test => requestmapping}/BazzNewMappingsExampleIntegrationTest.java (98%) diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java index 717b9c3aa0..66b540a692 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java @@ -26,7 +26,7 @@ import com.google.common.base.Preconditions; @PropertySource({ "classpath:persistence-${envTarget:h2}.properties" }) @ComponentScan({ "com.baeldung.spring.data.persistence" }) // @ImportResource("classpath*:springDataPersistenceConfig.xml") -@EnableJpaRepositories(basePackages = "com.baeldung.spring.data.persistence.dao") +@EnableJpaRepositories(basePackages = { "com.baeldung.spring.data.persistence.dao", "com.baeldung.spring.data.persistence.jpaquery" }) public class PersistenceConfig { @Autowired diff --git a/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java b/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java index d169f7e9d4..48b627a344 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java +++ b/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java @@ -26,7 +26,7 @@ import java.util.List; */ @Configuration @EnableWebMvc -@ComponentScan({ "com.baeldung.web" }) +@ComponentScan({ "com.baeldung.web", "com.baeldung.requestmapping" }) public class MvcConfig implements WebMvcConfigurer { public MvcConfig() { @@ -66,7 +66,6 @@ public class MvcConfig implements WebMvcConfigurer { public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.defaultContentType(MediaType.APPLICATION_JSON); } - @Override public void addCorsMappings(CorsRegistry registry) { diff --git a/spring-rest-simple/src/test/java/com/baeldung/web/test/BazzNewMappingsExampleIntegrationTest.java b/spring-rest-simple/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java similarity index 98% rename from spring-rest-simple/src/test/java/com/baeldung/web/test/BazzNewMappingsExampleIntegrationTest.java rename to spring-rest-simple/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java index 4f0395e914..a6039b54c7 100644 --- a/spring-rest-simple/src/test/java/com/baeldung/web/test/BazzNewMappingsExampleIntegrationTest.java +++ b/spring-rest-simple/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java @@ -1,5 +1,5 @@ -package com.baeldung.web.test; +package com.baeldung.requestmapping; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is;